Current state
5001
public/js/ColladaLoader.js
Normal file
5
public/js/captify.tiny.js
Normal file
@@ -0,0 +1,5 @@
|
||||
jQuery.fn.extend({captify:function(n){var a=$.extend({speedOver:"fast",speedOut:"normal",hideDelay:500,animation:"slide",prefix:"",opacity:"0.45",className:"caption-bottom",position:"bottom",spanWidth:"100%"},n);$(this).each(function(){var c=this;$(this).load(function(){if(c.hasInit)return false;c.hasInit=true;var i=false,k=false,e=$("#"+$(this).attr("rel")),g=!e.length?$(this).attr("alt"):e.html();e.remove();e=this.parent&&this.parent.tagName=="a"?this.parent:$(this);var h=e.wrap("<div></div>").parent().css({overflow:"hidden",
|
||||
padding:0,fontSize:0.1}).addClass("caption-wrapper").width($(this).width()).height($(this).height());$.map(["top","right","bottom","left"],function(f){h.css("margin-"+f,$(c).css("margin-"+f));$.map(["style","width","color"],function(j){j="border-"+f+"-"+j;h.css(j,$(c).css(j))})});$(c).css({border:"0 none"});var b=$("div:last",h.append("<div></div>")).addClass(a.className),d=$("div:last",h.append("<div></div>")).addClass(a.className).append(a.prefix).append(g);$("*",h).css({margin:0}).show();g=jQuery.browser.msie?
|
||||
"static":"relative";b.css({zIndex:1,position:g,opacity:a.animation=="fade"?0:a.opacity,width:a.spanWidth});if(a.position=="bottom"){e=parseInt(b.css("border-top-width").replace("px",""))+parseInt(d.css("padding-top").replace("px",""))-1;d.css("paddingTop",e)}d.css({position:g,zIndex:2,background:"none",border:"0 none",opacity:a.animation=="fade"?0:1,width:a.spanWidth});b.width(d.outerWidth());b.height(d.height());g=a.position=="bottom"&&jQuery.browser.msie?-4:0;var l=a.position=="top"?{hide:-$(c).height()-
|
||||
b.outerHeight()-1,show:-$(c).height()}:{hide:0,show:-b.outerHeight()+g};d.css("marginTop",-b.outerHeight());b.css("marginTop",l[a.animation=="fade"||a.animation=="always-on"?"show":"hide"]);var m=function(){if(!i&&!k){var f=a.animation=="fade"?{opacity:0}:{marginTop:l.hide};b.animate(f,a.speedOut);a.animation=="fade"&&d.animate({opacity:0},a.speedOver)}};if(a.animation!="always-on"){$(this).hover(function(){k=true;if(!i){var f=a.animation=="fade"?{opacity:a.opacity}:{marginTop:l.show};b.animate(f,
|
||||
a.speedOver);a.animation=="fade"&&d.animate({opacity:1},a.speedOver/2)}},function(){k=false;window.setTimeout(m,a.hideDelay)});$("div",h).hover(function(){i=true},function(){i=false;window.setTimeout(m,a.hideDelay)})}});if(this.complete||this.naturalWidth>0)$(c).trigger("load")})}});
|
||||
414
public/js/chat.js
Normal file
@@ -0,0 +1,414 @@
|
||||
/*
|
||||
|
||||
Copyright (c) 2009 Anant Garg (anantgarg.com | inscripts.com)
|
||||
|
||||
This script may be used for non-commercial purposes only. For any
|
||||
commercial purposes, please contact the author at
|
||||
anant.garg@inscripts.com
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
*/
|
||||
|
||||
var windowFocus = true;
|
||||
var username;
|
||||
var chatHeartbeatCount = 0;
|
||||
var minChatHeartbeat = 2000;
|
||||
var maxChatHeartbeat = 33000;
|
||||
var chatHeartbeatTime = minChatHeartbeat;
|
||||
var originalTitle;
|
||||
var blinkOrder = 0;
|
||||
|
||||
var chatboxFocus = new Array();
|
||||
var newMessages = new Array();
|
||||
var newMessagesWin = new Array();
|
||||
var chatBoxes = new Array();
|
||||
|
||||
$(document).ready(function(){
|
||||
originalTitle = document.title;
|
||||
startChatSession();
|
||||
|
||||
$([window, document]).blur(function(){
|
||||
windowFocus = false;
|
||||
}).focus(function(){
|
||||
windowFocus = true;
|
||||
document.title = originalTitle;
|
||||
});
|
||||
});
|
||||
|
||||
function restructureChatBoxes() {
|
||||
align = 0;
|
||||
for (x in chatBoxes) {
|
||||
chatboxtitle = chatBoxes[x];
|
||||
|
||||
if ($("#chatbox_"+chatboxtitle).css('display') != 'none') {
|
||||
if (align == 0) {
|
||||
$("#chatbox_"+chatboxtitle).css('right', '20px');
|
||||
} else {
|
||||
width = (align)*(225+7)+20;
|
||||
$("#chatbox_"+chatboxtitle).css('right', width+'px');
|
||||
}
|
||||
align++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function chatWith(chatuser) {
|
||||
createChatBox(chatuser);
|
||||
$("#chatbox_"+chatuser+" .chatboxtextarea").focus();
|
||||
}
|
||||
|
||||
function createChatBox(chatboxtitle,minimizeChatBox) {
|
||||
if ($("#chatbox_"+chatboxtitle).length > 0) {
|
||||
if ($("#chatbox_"+chatboxtitle).css('display') == 'none') {
|
||||
$("#chatbox_"+chatboxtitle).css('display','block');
|
||||
restructureChatBoxes();
|
||||
}
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxtextarea").focus();
|
||||
return;
|
||||
}
|
||||
|
||||
$(" <div />" ).attr("id","chatbox_"+chatboxtitle)
|
||||
.addClass("chatbox")
|
||||
.html('<div class="chatboxhead"><div class="chatboxtitle">'+chatboxtitle+'</div><div class="chatboxoptions"><a href="javascript:void(0)" onclick="javascript:toggleChatBoxGrowth(\''+chatboxtitle+'\')">-</a> <a href="javascript:void(0)" onclick="javascript:closeChatBox(\''+chatboxtitle+'\')">X</a></div><br clear="all"/></div><div class="chatboxcontent"></div><div class="chatboxinput"><textarea class="chatboxtextarea" onkeydown="javascript:return checkChatBoxInputKey(event,this,\''+chatboxtitle+'\');"></textarea></div>')
|
||||
.appendTo($( "body" ));
|
||||
|
||||
$("#chatbox_"+chatboxtitle).css('bottom', '0px');
|
||||
|
||||
chatBoxeslength = 0;
|
||||
|
||||
for (x in chatBoxes) {
|
||||
if ($("#chatbox_"+chatBoxes[x]).css('display') != 'none') {
|
||||
chatBoxeslength++;
|
||||
}
|
||||
}
|
||||
|
||||
if (chatBoxeslength == 0) {
|
||||
$("#chatbox_"+chatboxtitle).css('right', '20px');
|
||||
} else {
|
||||
width = (chatBoxeslength)*(225+7)+20;
|
||||
$("#chatbox_"+chatboxtitle).css('right', width+'px');
|
||||
}
|
||||
|
||||
chatBoxes.push(chatboxtitle);
|
||||
|
||||
if (minimizeChatBox == 1) {
|
||||
minimizedChatBoxes = new Array();
|
||||
|
||||
if ($.cookie('chatbox_minimized')) {
|
||||
minimizedChatBoxes = $.cookie('chatbox_minimized').split(/\|/);
|
||||
}
|
||||
minimize = 0;
|
||||
for (j=0;j<minimizedChatBoxes.length;j++) {
|
||||
if (minimizedChatBoxes[j] == chatboxtitle) {
|
||||
minimize = 1;
|
||||
}
|
||||
}
|
||||
|
||||
if (minimize == 1) {
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxcontent').css('display','none');
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxinput').css('display','none');
|
||||
}
|
||||
}
|
||||
|
||||
chatboxFocus[chatboxtitle] = false;
|
||||
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxtextarea").blur(function(){
|
||||
chatboxFocus[chatboxtitle] = false;
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxtextarea").removeClass('chatboxtextareaselected');
|
||||
}).focus(function(){
|
||||
chatboxFocus[chatboxtitle] = true;
|
||||
newMessages[chatboxtitle] = false;
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxhead').removeClass('chatboxblink');
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxtextarea").addClass('chatboxtextareaselected');
|
||||
});
|
||||
|
||||
$("#chatbox_"+chatboxtitle).click(function() {
|
||||
if ($('#chatbox_'+chatboxtitle+' .chatboxcontent').css('display') != 'none') {
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxtextarea").focus();
|
||||
}
|
||||
});
|
||||
|
||||
$("#chatbox_"+chatboxtitle).show();
|
||||
}
|
||||
|
||||
|
||||
function chatHeartbeat(){
|
||||
|
||||
var itemsfound = 0;
|
||||
|
||||
if (windowFocus == false) {
|
||||
|
||||
var blinkNumber = 0;
|
||||
var titleChanged = 0;
|
||||
for (x in newMessagesWin) {
|
||||
if (newMessagesWin[x] == true) {
|
||||
++blinkNumber;
|
||||
if (blinkNumber >= blinkOrder) {
|
||||
document.title = x+' says...';
|
||||
titleChanged = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (titleChanged == 0) {
|
||||
document.title = originalTitle;
|
||||
blinkOrder = 0;
|
||||
} else {
|
||||
++blinkOrder;
|
||||
}
|
||||
|
||||
} else {
|
||||
for (x in newMessagesWin) {
|
||||
newMessagesWin[x] = false;
|
||||
}
|
||||
}
|
||||
|
||||
for (x in newMessages) {
|
||||
if (newMessages[x] == true) {
|
||||
if (chatboxFocus[x] == false) {
|
||||
//FIXME: add toggle all or none policy, otherwise it looks funny
|
||||
$('#chatbox_'+x+' .chatboxhead').toggleClass('chatboxblink');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$.ajax({
|
||||
url: "/include/chat.php?action=chatheartbeat",
|
||||
cache: false,
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
|
||||
$.each(data.items, function(i,item){
|
||||
if (item) { // fix strange ie bug
|
||||
|
||||
chatboxtitle = item.f;
|
||||
|
||||
if ($("#chatbox_"+chatboxtitle).length <= 0) {
|
||||
createChatBox(chatboxtitle);
|
||||
}
|
||||
if ($("#chatbox_"+chatboxtitle).css('display') == 'none') {
|
||||
$("#chatbox_"+chatboxtitle).css('display','block');
|
||||
restructureChatBoxes();
|
||||
}
|
||||
|
||||
if (item.s == 1) {
|
||||
item.f = username;
|
||||
}
|
||||
|
||||
if (item.s == 2) {
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").append('<div class="chatboxmessage"><span class="chatboxinfo">'+item.m+'</span></div>');
|
||||
} else {
|
||||
newMessages[chatboxtitle] = true;
|
||||
newMessagesWin[chatboxtitle] = true;
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").append('<div class="chatboxmessage"><span class="chatboxmessagefrom">'+item.f+': </span><span class="chatboxmessagecontent">'+item.m+'</span></div>');
|
||||
}
|
||||
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").scrollTop($("#chatbox_"+chatboxtitle+" .chatboxcontent")[0].scrollHeight);
|
||||
itemsfound += 1;
|
||||
}
|
||||
});
|
||||
|
||||
chatHeartbeatCount++;
|
||||
|
||||
if (itemsfound > 0) {
|
||||
chatHeartbeatTime = minChatHeartbeat;
|
||||
chatHeartbeatCount = 1;
|
||||
} else if (chatHeartbeatCount >= 10) {
|
||||
chatHeartbeatTime *= 2;
|
||||
chatHeartbeatCount = 1;
|
||||
if (chatHeartbeatTime > maxChatHeartbeat) {
|
||||
chatHeartbeatTime = maxChatHeartbeat;
|
||||
}
|
||||
}
|
||||
|
||||
setTimeout('chatHeartbeat();',chatHeartbeatTime);
|
||||
}});
|
||||
}
|
||||
|
||||
function closeChatBox(chatboxtitle) {
|
||||
$('#chatbox_'+chatboxtitle).css('display','none');
|
||||
restructureChatBoxes();
|
||||
|
||||
$.post("/include/chat.php?action=closechat", { chatbox: chatboxtitle} , function(data){
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function toggleChatBoxGrowth(chatboxtitle) {
|
||||
if ($('#chatbox_'+chatboxtitle+' .chatboxcontent').css('display') == 'none') {
|
||||
|
||||
var minimizedChatBoxes = new Array();
|
||||
|
||||
if ($.cookie('chatbox_minimized')) {
|
||||
minimizedChatBoxes = $.cookie('chatbox_minimized').split(/\|/);
|
||||
}
|
||||
|
||||
var newCookie = '';
|
||||
|
||||
for (i=0;i<minimizedChatBoxes.length;i++) {
|
||||
if (minimizedChatBoxes[i] != chatboxtitle) {
|
||||
newCookie += chatboxtitle+'|';
|
||||
}
|
||||
}
|
||||
|
||||
newCookie = newCookie.slice(0, -1)
|
||||
|
||||
|
||||
$.cookie('chatbox_minimized', newCookie);
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxcontent').css('display','block');
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxinput').css('display','block');
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").scrollTop($("#chatbox_"+chatboxtitle+" .chatboxcontent")[0].scrollHeight);
|
||||
} else {
|
||||
|
||||
var newCookie = chatboxtitle;
|
||||
|
||||
if ($.cookie('chatbox_minimized')) {
|
||||
newCookie += '|'+$.cookie('chatbox_minimized');
|
||||
}
|
||||
|
||||
|
||||
$.cookie('chatbox_minimized',newCookie);
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxcontent').css('display','none');
|
||||
$('#chatbox_'+chatboxtitle+' .chatboxinput').css('display','none');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function checkChatBoxInputKey(event,chatboxtextarea,chatboxtitle) {
|
||||
|
||||
if(event.keyCode == 13 && event.shiftKey == 0) {
|
||||
message = $(chatboxtextarea).val();
|
||||
message = message.replace(/^\s+|\s+$/g,"");
|
||||
|
||||
$(chatboxtextarea).val('');
|
||||
$(chatboxtextarea).focus();
|
||||
$(chatboxtextarea).css('height','44px');
|
||||
if (message != '') {
|
||||
$.post("/include/chat.php?action=sendchat", {to: chatboxtitle, message: message} , function(data){
|
||||
message = message.replace(/</g,"<").replace(/>/g,">").replace(/\"/g,""");
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").append('<div class="chatboxmessage"><span class="chatboxmessagefrom">'+username+': </span><span class="chatboxmessagecontent">'+message+'</span></div>');
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").scrollTop($("#chatbox_"+chatboxtitle+" .chatboxcontent")[0].scrollHeight);
|
||||
});
|
||||
}
|
||||
chatHeartbeatTime = minChatHeartbeat;
|
||||
chatHeartbeatCount = 1;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
var adjustedHeight = chatboxtextarea.clientHeight;
|
||||
var maxHeight = 94;
|
||||
|
||||
if (maxHeight > adjustedHeight) {
|
||||
adjustedHeight = Math.max(chatboxtextarea.scrollHeight, adjustedHeight);
|
||||
if (maxHeight)
|
||||
adjustedHeight = Math.min(maxHeight, adjustedHeight);
|
||||
if (adjustedHeight > chatboxtextarea.clientHeight)
|
||||
$(chatboxtextarea).css('height',adjustedHeight+8 +'px');
|
||||
} else {
|
||||
$(chatboxtextarea).css('overflow','auto');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function startChatSession(){
|
||||
$.ajax({
|
||||
url: "/include/chat.php?action=startchatsession",
|
||||
cache: false,
|
||||
dataType: "json",
|
||||
success: function(data) {
|
||||
|
||||
username = data.username;
|
||||
|
||||
$.each(data.items, function(i,item){
|
||||
if (item) { // fix strange ie bug
|
||||
|
||||
chatboxtitle = item.f;
|
||||
|
||||
if ($("#chatbox_"+chatboxtitle).length <= 0) {
|
||||
createChatBox(chatboxtitle,1);
|
||||
}
|
||||
|
||||
if (item.s == 1) {
|
||||
item.f = username;
|
||||
}
|
||||
|
||||
if (item.s == 2) {
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").append('<div class="chatboxmessage"><span class="chatboxinfo">'+item.m+'x</span></div>');
|
||||
} else {
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").append('<div class="chatboxmessage"><span class="chatboxmessagefrom">'+item.f+': </span><span class="chatboxmessagecontent">'+item.m+'</span></div>');
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
for (i=0;i<chatBoxes.length;i++) {
|
||||
chatboxtitle = chatBoxes[i];
|
||||
$("#chatbox_"+chatboxtitle+" .chatboxcontent").scrollTop($("#chatbox_"+chatboxtitle+" .chatboxcontent")[0].scrollHeight);
|
||||
setTimeout('$("#chatbox_"+chatboxtitle+" .chatboxcontent").scrollTop($("#chatbox_"+chatboxtitle+" .chatboxcontent")[0].scrollHeight);', 100); // yet another strange ie bug
|
||||
}
|
||||
|
||||
setTimeout('chatHeartbeat();',chatHeartbeatTime);
|
||||
|
||||
}});
|
||||
}
|
||||
|
||||
/**
|
||||
* Cookie plugin
|
||||
*
|
||||
* Copyright (c) 2006 Klaus Hartl (stilbuero.de)
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*
|
||||
*/
|
||||
|
||||
jQuery.cookie = function(name, value, options) {
|
||||
if (typeof value != 'undefined') { // name and value given, set cookie
|
||||
options = options || {};
|
||||
if (value === null) {
|
||||
value = '';
|
||||
options.expires = -1;
|
||||
}
|
||||
var expires = '';
|
||||
if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
|
||||
var date;
|
||||
if (typeof options.expires == 'number') {
|
||||
date = new Date();
|
||||
date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
|
||||
} else {
|
||||
date = options.expires;
|
||||
}
|
||||
expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
|
||||
}
|
||||
// CAUTION: Needed to parenthesize options.path and options.domain
|
||||
// in the following expressions, otherwise they evaluate to undefined
|
||||
// in the packed version for some reason...
|
||||
var path = options.path ? '; path=' + (options.path) : '';
|
||||
var domain = options.domain ? '; domain=' + (options.domain) : '';
|
||||
var secure = options.secure ? '; secure' : '';
|
||||
document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
|
||||
} else { // only name given, get cookie
|
||||
var cookieValue = null;
|
||||
if (document.cookie && document.cookie != '') {
|
||||
var cookies = document.cookie.split(';');
|
||||
for (var i = 0; i < cookies.length; i++) {
|
||||
var cookie = jQuery.trim(cookies[i]);
|
||||
// Does this cookie string begin with the name we want?
|
||||
if (cookie.substring(0, name.length + 1) == (name + '=')) {
|
||||
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
return cookieValue;
|
||||
}
|
||||
};
|
||||
8
public/js/consent.js
Normal file
@@ -0,0 +1,8 @@
|
||||
!function(o){var e=!1;if('function'==typeof define&&define.amd&&(define(o),e=!0),'object'==typeof exports&&(module.exports=o(),e=!0),!e){var c=window.Cookies,i=window.Cookies=o();i.noConflict=function(){return window.Cookies=c,i}}}(function(){function o(){for(var o=0,c={};o<arguments.length;o++){var i=arguments[o];for(var e in i)c[e]=i[e]};return c};return function e(i){function c(e,n,t){var s;if('undefined'!=typeof document){if(1<arguments.length){if('number'==typeof(t=o({path:'/'},c.defaults,t)).expires){var l=new Date;l.setMilliseconds(l.getMilliseconds()+864e5*t.expires),t.expires=l};t.expires=t.expires?t.expires.toUTCString():'';try{s=JSON.stringify(n),/^[\{\[]/.test(s)&&(n=s)}catch(p){};n=i.write?i.write(n,e):encodeURIComponent(String(n)).replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g,decodeURIComponent),e=(e=(e=encodeURIComponent(String(e))).replace(/%(23|24|26|2B|5E|60|7C)/g,decodeURIComponent)).replace(/[\(\)]/g,escape);var u='';for(var d in t)t[d]&&(u+='; '+d,!0!==t[d]&&(u+='='+t[d]));return document.cookie=e+'='+n+u};e||(s={});for(var h=document.cookie?document.cookie.split('; '):[],S=/(%[0-9A-Z]{2})+/g,k=0;k<h.length;k++){var f=h[k].split('='),r=f.slice(1).join('=');this.json||'"'!==r.charAt(0)||(r=r.slice(1,-1));try{var a=f[0].replace(S,decodeURIComponent);if(r=i.read?i.read(r,a):i(r,a)||r.replace(S,decodeURIComponent),this.json)try{r=JSON.parse(r)}catch(p){};if(e===a){s=r;break};e||(s[a]=r)}catch(p){}};return s}};return(c.set=c).get=function(o){return c.call(c,o)},c.getJSON=function(){return c.apply({json:!0},[].slice.call(arguments))},c.defaults={},c.remove=function(e,i){c(e,'',o(i,{expires:-1}))},c.withConverter=e,c}(function(){})});var csCookies=Cookies.noConflict(),cookieScriptWindow=window.document,cookieScripts=document.getElementsByTagName('script'),cookieScriptSrc=cookieScripts[cookieScripts.length-1].src,cookieQuery=null,cookieScriptPosition='bottom',cookieScriptSource='cookie-script.com',cookieScriptDomain='skinbase.org',cookieScriptReadMore='/privacy.php',cookieId='e8362906c1ccdaada7b88f41b456df7c',cookieScriptDebug=0,cookieScriptShowBadge=!0,cookieScriptCurrentUrl=window.location.href,cookieScriptTitle='<h4 id="cookiescript_header">This website uses cookies</h4>',cookieScriptDesc='This website uses cookies to improve user experience. By using our website you consent to all cookies in accordance with our Cookie Policy.<br \/>',cookieScriptAccept='I agree',cookieScriptMore='Read more',cookieScriptCopyrights='I agree',cookieBackground='#111';cookieScriptReject='<div id="cookiescript_reject">I disagree</div>',cookieScriptLoadJavaScript=function(e,i){var c=document.getElementsByTagName('head')[0],o=document.createElement('script');o.type='text/javascript',o.src=e,i!=undefined&&(o.onload=o.onreadystatechange=function(){(!o.readyState||/loaded|complete/.test(o.readyState))&&(o.onload=o.onreadystatechange=null,c&&o.parentNode&&c.removeChild(o),o=undefined,i())}),c.insertBefore(o,c.firstChild)},InjectCookieScript=function(){cookieScriptDropfromFlag=0;if(cookieScriptSrc!='http://'+cookieScriptSource+'/s/'+cookieId+'.js'&&cookieScriptSrc!='http://chs02.'+cookieScriptSource+'/s/'+cookieId+'.js'&&cookieScriptSrc!='http://chs03.'+cookieScriptSource+'/s/'+cookieId+'.js'&&cookieScriptSrc!='https://'+cookieScriptSource+'/s/'+cookieId+'.js'&&''!=cookieScriptSrc)return!1;cookieScriptDroptoFlag=0;if(window.location.protocol=='https:')cookieScriptStatsDomain='';else cookieScriptStatsDomain='chs03.';cookieScriptCreateCookie=function(o,e,c){if(window.location.protocol=='https:')var n=';secure';else var n='';var r='',i,t;c&&(i=new Date,i.setTime(i.getTime()+c*864e5),r='; expires='+i.toGMTString()),t='',cookieScriptDomain!=''&&(t='; domain='+cookieScriptDomain),document.cookie=o+'='+e+r+t+'; path=/'+n},cookieScriptReadCookie=function(o){for(var c=o+'=',t=document.cookie.split(';'),e,i=0;i<t.length;i++){for(e=t[i];e.charAt(0)==' ';)e=e.substring(1,e.length);if(e.indexOf(c)==0)return e.substring(c.length,e.length)};return null};cookieQuery(function(){cookieQuery('#cookiescript_injected',cookieScriptWindow).remove();cookieScriptAddBox=function(){cookieQuery('body',cookieScriptWindow).append('<div id="cookiescript_injected"><div id="cookiescript_wrapper">'+cookieScriptTitle+cookieScriptDesc+'<div id="cookiescript_buttons"><div id="cookiescript_accept">'+cookieScriptAccept+'</div>'+cookieScriptReject+'<div id="cookiescript_readmore">'+cookieScriptMore+'</div></div><a href="//'+cookieScriptSource+'" target="_blank" id="cookiescript_link" style="display:block !important">Free cookie consent by cookie-script.com</a><div id="cookiescript_pixel"></div></div>');if(cookieScriptPosition=='top'){cookieQuery('#cookiescript_injected',cookieScriptWindow).css('top',0)}
|
||||
else{cookieQuery('#cookiescript_injected',cookieScriptWindow).css('bottom',0)};cookieQuery('#cookiescript_injected',cookieScriptWindow).css({'background-color':'#111111','z-index':'999999','opacity':'1','position':'fixed','padding':'15px 0px 5px 0','width':'100%','left':'0','font-size':'13px','font-weight':'normal','text-align':'left','letter-spacing':'normal','color':'#FFFFFF','font-family':'Arial, sans-serif','display':'none','-moz-box-shadow':'0px 0px 8px #000000','-webkit-box-shadow':'0px 0px 8px #000000','box-shadow':'0px 0px 8px #000000'});cookieQuery('#cookiescript_buttons',cookieScriptWindow).css({'margin':'10px auto 5px auto','font-size':'13px','font-weight':'normal','text-align':'center','font-family':'Arial, sans-serif'});cookieQuery('#cookiescript_wrapper',cookieScriptWindow).css({'width':'100%','margin':'0 auto','font-size':'13px','font-weight':'normal','text-align':'center','color':'#FFFFFF','font-family':'Arial, sans-serif','line-height':'18px','letter-spacing':'normal','padding':'0 5px'});cookieQuery('#cookiescript_injected h4#cookiescript_header',cookieScriptWindow).css({'background-color':'#111111','z-index':'999999','padding':'0 0 7px 0','text-align':'center','color':'#FFFFFF','font-family':'Arial, sans-serif','display':'block','font-size':'15px','font-weight':'bold','margin':'0'});cookieQuery('#cookiescript_injected span',cookieScriptWindow).css({'display':'block','font-size':'100%','margin':'5px 0'});cookieQuery('#cookiescript_injected a',cookieScriptWindow).css({'text-decoration':'underline','color':'#FFFFFF'});cookieQuery('#cookiescript_injected a#cookiescript_link',cookieScriptWindow).css({'text-decoration':'none','color':'#FFFFFF','font-size':'85%','padding':'0px 10px 0 0','float':'right'});cookieQuery('#cookiescript_injected div#cookiescript_accept,#cookiescript_injected div#cookiescript_readmore, #cookiescript_injected div#cookiescript_reject',cookieScriptWindow).css({'-webkit-border-radius':'5px','-khtml-border-radius':'5px','-moz-border-radius':'5px','border-radius':'5px','border':'0','padding':'6px 10px','font-weight':'bold','font-size':'13px','cursor':'pointer','margin':'0 15px 0 0','-webkit-transition':'0.25s','-moz-transition':'0.25s','transition':'0.25s','text-shadow':'rgb(0, 0, 0) 0px 0px 2px','display':'inline-block'});cookieQuery('#cookiescript_injected div#cookiescript_readmore',cookieScriptWindow).css({'background-color':'#697677','color':'#FFFFFF'});cookieQuery('#cookiescript_injected div#cookiescript_reject',cookieScriptWindow).css({'background-color':'#B75B5B','color':'#FFFFFF'});cookieQuery('#cookiescript_injected div#cookiescript_accept',cookieScriptWindow).css({'background-color':'#5BB75B','color':'#FFFFFF'});cookieQuery('#cookiescript_injected div#cookiescript_pixel',cookieScriptWindow).css({'width':'1px','height':'1px','float':'left'});cookieQuery('#cookiescript_injected',cookieScriptWindow).fadeIn(1000);cookieQuery('#cookiescript_injected div#cookiescript_accept',cookieScriptWindow).click(function(){i()});cookieQuery('#cookiescript_injected div#cookiescript_reject',cookieScriptWindow).click(function(){c()});cookieQuery('#cookiescript_injected div#cookiescript_readmore',cookieScriptWindow).click(function(){window.open(cookieScriptReadMore,'_blank');return!1})};cookieScriptCurrentValue=o('action');if(cookieScriptCurrentValue=='accept')p();if(cookieScriptCurrentValue=='accept'||cookieScriptCurrentValue=='reject'){e();return!1};cookieScriptAddBox();a()});function a(){cookieQuery('iframe[data-cookiescript="accepted"]').not(':has([src])').each(function(){var o=this;o=(o.contentWindow)?o.contentWindow:(o.contentDocument.document)?o.contentDocument.document:o.contentDocument;o.document.open();o.document.write(cookieQuery(this).attr('alt'));o.document.close()})};function i(){cookieQuery('#cookiescript_injected',cookieScriptWindow).fadeOut(200);t('action','accept');p();cookieQuery('#csconsentcheckbox').prop('checked',!0);if(typeof cookieScriptShowBadge==='undefined')cookieScriptShowBadge=!0;if(!cookieScriptShowBadge)return!1;e()};function c(){t('action','reject');s();cookieQuery('#cookiescript_injected',cookieScriptWindow).fadeOut(200);cookieQuery('#csconsentcheckbox').prop('checked',!1);if(typeof cookieScriptShowBadge==='undefined')cookieScriptShowBadge=!0;if(!cookieScriptShowBadge)return!1;e()};function t(o,i){var t='CookieScriptConsent';try{var c=JSON.parse(cookieScriptReadCookie(t))}catch(e){console.log(e);return!1};if(c==null){var c={};c[o]=i}
|
||||
else{c[o]=i};try{var r=JSON.stringify(c)}catch(e){console.log(e);return!1};cookieScriptCreateCookie(t,r,365)};function o(o){var c='CookieScriptConsent';try{var i=JSON.parse(cookieScriptReadCookie(c))}catch(e){console.log(e);return null};if(i==null){return null}
|
||||
else{return i[o]}};function e(){if(cookieQuery('#cookiescript_badge').length){cookieQuery('#cookiescript_badge',cookieScriptWindow).fadeIn(500)}
|
||||
else{cookieQuery('body',cookieScriptWindow).append('<div id="cookiescript_badge">Cookie settings</div>');cookieQuery('#cookiescript_badge',cookieScriptWindow).css({'position':'fixed','font':'13px Arial','line-height':'20px','color':'#FFFFFF','display':'none','cursor':'pointer','z-index':'999','background':'#111111','padding':'6px 11px 2px','-moz-box-shadow':'0px 0px 3px #000000','-webkit-box-shadow':'0px 0px 3px #000000','box-shadow':'0px 0px 3px #000000','left':'10px','bottom':'0px','-webkit-border-top-left-radius':'5px','-webkit-border-top-right-radius':'5px','-moz-border-radius-topleft':'5px','-moz-border-radius-topright':'5px','border-top-left-radius':'5px','border-top-right-radius':'5px'});cookieQuery('#cookiescript_badgeimage',cookieScriptWindow).css({'width':'100%','height':'100%'});cookieQuery('#cookiescript_badge',cookieScriptWindow).fadeIn(500);cookieQuery('#cookiescript_badge').click(r)}};function r(){if(cookieQuery('#cookiescript_badge').length){cookieQuery('#cookiescript_badge',cookieScriptWindow).fadeOut(200)};if(cookieQuery('#cookiescript_injected').length){cookieQuery('#cookiescript_injected',cookieScriptWindow).fadeIn(200)}
|
||||
else{cookieScriptAddBox()}};function n(o){if(n)console.log(o)};function d(){if(o('action')=='accept'){cookieQuery('#csconsentcheckbox').prop('checked',!0)};cookieQuery('#csconsentcheckbox').change(function(){if(this.checked){i()}
|
||||
else{c()}});cookieQuery('#csconsentlink').click(function(){r()})};d();function s(){var r=csCookies.get();for(var o in r){if(o=='CookieScriptConsent'){continue};if(!csCookies.remove(o)){cookiePossibleHosts=[window.location.host,'.'+window.location.host];var c=new RegExp('[a-z\-0-9]{2,63}\.[a-z\.]{2,5}$'),t=c.exec(window.location.host),i=window.location.host.replace(t[0],'').slice(0,-1);if(i!='')cookiePossibleHosts.push(window.location.host.substr(i.length));for(var e in cookiePossibleHosts){if(csCookies.remove(o,{path:'/',domain:cookiePossibleHosts[e]})&&n)console.log('deleting cookie:'+o+'| domain:'+cookiePossibleHosts[e])}}}};if(o('action')!='accept')setTimeout(s,500);function p(){cookieQuery('img[data-cookiescript="accepted"]').each(function(){cookieQuery(this).attr('src',cookieQuery(this).attr('data-src'))});cookieQuery('script[type="text/plain"][data-cookiescript="accepted"]').each(function(){if(cookieQuery(this).attr('src')){cookieQuery(this).after('<script type="text/javascript" src="'+cookieQuery(this).attr('src')+'"><\/script>')}
|
||||
else{cookieQuery(this).after('<script type="text/javascript">'+cookieQuery(this).html()+'<\/script>')};cookieQuery(this).empty()});cookieQuery('iframe[data-cookiescript="accepted"]').each(function(){cookieQuery(this).attr('src',cookieQuery(this).attr('data-src'))});cookieQuery('embed[data-cookiescript="accepted"]').each(function(){cookieQuery(this).replaceWith(cookieQuery(this).attr('src',cookieQuery(this).attr('data-src'))[0].outerHTML)});cookieQuery('object[data-cookiescript="accepted"]').each(function(){cookieQuery(this).replaceWith(cookieQuery(this).attr('data',cookieQuery(this).attr('data-data'))[0].outerHTML)});cookieQuery('link[data-cookiescript="accepted"]').each(function(){cookieQuery(this).attr('href',cookieQuery(this).attr('data-href'))})}};window.jQuery&&jQuery.fn&&/^(1\.[8-9]|2\.[0-9]|1\.1[0-2]|3\.[0-9])/.test(jQuery.fn.jquery)?(cookieScriptDebug&&window.console&&console.log('Using existing jQuery version '+jQuery.fn.jquery),cookieQuery=window.jQuery,InjectCookieScript()):(cookieScriptDebug&&window.console&&console.log('Loading jQuery 1.8.1 from ajax.googleapis.com'),cookieScriptLoadJavaScript(('https:'==document.location.protocol?'https://':'http://')+'ajax.googleapis.com/ajax/libs/jquery/1.8.1/jquery.min.js',function(){cookieQuery=jQuery.noConflict(!0),InjectCookieScript()}));
|
||||
365
public/js/custom.js
Normal file
@@ -0,0 +1,365 @@
|
||||
$(document).on("click", ".btnSubmitChat", function() {
|
||||
var msg = $(".chatInputBox").attr("value");
|
||||
$(".chatInputBox").attr("value", "");
|
||||
$.post("/chat_post", {'message' : msg}, function(data) {
|
||||
$("#sideBarChat").html(data);
|
||||
});
|
||||
});
|
||||
|
||||
$(document).on("click", "#btn_UploadArtwork", function() {
|
||||
$("#btn_UploadArtwork").html('Uploading.... <i class="fa fa-spinner fa-spin"></i>');
|
||||
$("#btn_UploadArtwork").attr("class", "btn btn-warning");
|
||||
$("#btn_UploadArtwork").hide(1000);
|
||||
$("#uploadInfo").html('<div class="alert alert-info">Please wait <i class="fa fa-spinner fa-spin"></i> Uploading in progress ...</div>');
|
||||
$("#uploadArtworkForm").submit();
|
||||
});
|
||||
|
||||
$(document).on("change", "#section_filter", function() {
|
||||
var id = $("#section_filter option:selected").val();
|
||||
$("#mySectionList").html('<div align="center"><br><br><i class="fa fa-spinner fa-spin fa-4x"></i></div>');
|
||||
$("#mySectionList").load("/uploads.php?ajax=true&action=updateCats&id=" + id);
|
||||
});
|
||||
|
||||
$(document).on("change", ".quickThumbShow", function(evt) {
|
||||
|
||||
var preview = $(this).data("preview_id");
|
||||
var files = evt.target.files;
|
||||
var f = files[0];
|
||||
var reader = new FileReader();
|
||||
|
||||
reader.onload = (function(theFile) {
|
||||
return function(e) {
|
||||
fname = (theFile.name);
|
||||
if (!fname.match(/\.(gif|jpg|jpeg|tiff|png)$/i)) {
|
||||
$("#" + preview).html("Selected file: <b>" + theFile.name + "</b></h1>");
|
||||
$("#preview_box").show();
|
||||
console.log("no image - ", preview, theFile.name);
|
||||
} else {
|
||||
document.getElementById(preview).innerHTML = ['<img src="', e.target.result,'" title="', theFile.name, '" style="max-height:300px;max-width:300px;" class="img-responsive">'].join('');
|
||||
}
|
||||
};
|
||||
})(f);
|
||||
|
||||
reader.readAsDataURL(f);
|
||||
});
|
||||
|
||||
var numCols = 4;
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
var $container1 = $('.container_photo');
|
||||
$(".scrollContent").mCustomScrollbar();
|
||||
|
||||
var size = function () {
|
||||
|
||||
var w = $container1.width();
|
||||
var c = Math.floor(w / 260);
|
||||
var wc = parseInt($container1.width() / c);
|
||||
numCols = c;
|
||||
|
||||
console.log(w, c, wc);
|
||||
|
||||
if (c == 1) {
|
||||
$(".photo_frame").css("width", "99%");
|
||||
} else if (c == 2) {
|
||||
$(".photo_frame").css("width", "48%");
|
||||
} else if (c == 3) {
|
||||
$(".photo_frame").css("width", "28%");
|
||||
} else if (c == 4) {
|
||||
$(".photo_frame").css("width", "22%");
|
||||
} else {
|
||||
$(".photo_frame").css("width", "250px");
|
||||
}
|
||||
|
||||
$container1.isotope({
|
||||
masonry: { columnWidth: wc }
|
||||
});
|
||||
|
||||
|
||||
}
|
||||
|
||||
$container1.imagesLoaded( function() {
|
||||
$container1.isotope({
|
||||
itemSelector : '.photo_frame',
|
||||
layoutMode : 'masonry'
|
||||
});
|
||||
size();
|
||||
});
|
||||
|
||||
$(window).smartresize(size);
|
||||
|
||||
$(".summernote").summernote();
|
||||
$(".summernote_lite").summernote({
|
||||
toolbar: [
|
||||
['style', ['bold', 'italic', 'underline', 'clear']],
|
||||
['font', ['strikethrough']],
|
||||
['fontsize', ['fontsize']],
|
||||
['color', ['color']],
|
||||
]
|
||||
});
|
||||
|
||||
var $container = $('.container_gallery');
|
||||
$container.imagesLoaded( function(){
|
||||
$container.isotope({
|
||||
itemSelector : '.photo_frame',
|
||||
layoutMode : 'masonry'
|
||||
});
|
||||
size();
|
||||
});
|
||||
|
||||
var $container = $('.container_news');
|
||||
$container.imagesLoaded( function(){
|
||||
$container.isotope({
|
||||
itemSelector : '.news_frame',
|
||||
layoutMode : 'masonry'
|
||||
});
|
||||
});
|
||||
|
||||
if ($("a[rel^='prettyPhoto']").length > 0) {
|
||||
$("a[rel^='prettyPhoto']").prettyPhoto({theme:'dark_rounded'});
|
||||
}
|
||||
|
||||
$("#sideBarSep").click(function() {
|
||||
|
||||
|
||||
|
||||
if(sbc == 0) {
|
||||
|
||||
$("#sideBarChat").animate({
|
||||
height: '700px'
|
||||
}, 1000, function(){
|
||||
// Complete
|
||||
sbc = 1;
|
||||
$("#sideBarSep").addClass("chat_opened");
|
||||
});
|
||||
|
||||
} else {
|
||||
|
||||
$("#sideBarChat").animate({
|
||||
height: '550px'
|
||||
}, 1000, function(){
|
||||
// Complete
|
||||
sbc = 0;
|
||||
$("#sideBarSep").removeClass("chat_opened");
|
||||
});
|
||||
|
||||
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
if ($(".followingButton").length > 0) {
|
||||
$(".followingButton").click(function() {
|
||||
$("#showNoticeBox").load("/include/hideNoticeBox.php?show=following");
|
||||
});
|
||||
}
|
||||
|
||||
if ($(".streamPost").length > 0) {
|
||||
var remme = false;
|
||||
$(".stream_Remove").click(function() {
|
||||
var wid = $(this).attr("rel");
|
||||
if (confirm("Remove this notice?")) {
|
||||
$("#"+wid).hide();
|
||||
$("#showNoticeBox").load("/include/hideNoticeBox.php?id="+wid);
|
||||
remme = true;
|
||||
}
|
||||
});
|
||||
|
||||
$(".streamPost").click(function() {
|
||||
$("BODY").scrollTop(0);
|
||||
var wid = $(this).attr("rel");
|
||||
var id = $(this).attr("id");
|
||||
if (remme == false) {
|
||||
$(".streamContent").removeClass("StreamSelected");
|
||||
$("#"+id+" > .streamContent").addClass("StreamSelected");
|
||||
$("#showNoticeBox").load("/include/loadNoticeBox.php?id="+wid);
|
||||
}
|
||||
remme = false;
|
||||
});
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
if ($("#js-news").length >0) {
|
||||
$('#js-news').ticker();
|
||||
}
|
||||
|
||||
if ($("#imageTicker").length >0) {
|
||||
$("#imageTicker").slideDown().newsticker();
|
||||
}
|
||||
|
||||
if ($(".changeCoverArt").length > 0) {
|
||||
$(".changeCoverArt").click(function() {
|
||||
$("#mywindow").center();
|
||||
$("#mywindow").show();
|
||||
});
|
||||
}
|
||||
|
||||
//$(".openwin").fancybox({});
|
||||
|
||||
$('#ajaxForm').submit(function() {
|
||||
alert('Handler for .submit() called.');
|
||||
return false;
|
||||
});
|
||||
//$('.nav_left').stickySidebar({speed: 400, padding: 70, constrain: true})
|
||||
|
||||
$("#next_page").click(function() {
|
||||
//http://www.skinbase.org/Skins/WindowBlinds/125?page=2&order=2&sorted=dates&display=1
|
||||
//alert(data);
|
||||
var data = ($(".next").attr("href"));
|
||||
data.replace("?","&");
|
||||
$("#artBox").load("/pages/loadArtWork.php?url="+data);
|
||||
});
|
||||
/*
|
||||
$(".category_btn").fancybox({
|
||||
'href' : '/include/skinCategories.php',
|
||||
'width' : 600,
|
||||
'height' : 200,
|
||||
'transitionIn' : 'fade'
|
||||
});
|
||||
|
||||
$(".category_btn2").fancybox({
|
||||
'href' : '/include/skinCategories.php',
|
||||
'width' : 600,
|
||||
'height' : 200,
|
||||
'transitionIn' : 'fade'
|
||||
});
|
||||
*/
|
||||
|
||||
if ($("#boks").length > 0) {
|
||||
InitChat();
|
||||
}
|
||||
|
||||
$("#loginMenu span").click(function() {
|
||||
$("#subLoginMenu").toggle();
|
||||
});
|
||||
|
||||
if ($("#browseMenu").length > 0){
|
||||
$("#browseMenu").click(function(){
|
||||
//showCategories();
|
||||
$("#browserMenuList").toggle();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
if ($("#butCategories").length > 0){
|
||||
$("#butCategories").click(function(){
|
||||
var catID = $("#butCategories").attr("rootid");
|
||||
showCategories(catID);
|
||||
});
|
||||
}
|
||||
|
||||
$("#messageLink").click(function(){
|
||||
$("#streamType").val("message");
|
||||
$("#update_button").html("Publish");
|
||||
$("#streamMessage").val("");
|
||||
});
|
||||
|
||||
$("#pageLink").click(function(){
|
||||
$("#streamType").val("link");
|
||||
$("#update_button").html("Attach link");
|
||||
$("#streamMessage").val("http://");
|
||||
});
|
||||
|
||||
$("#publishButton").click(function(){
|
||||
//event.preventDefault();
|
||||
var type = $("#streamType").val();
|
||||
var data = encodeURI($("#streamMessage").val());
|
||||
//alert("/social/getStreamData.php?type="+type+"&data="+data);
|
||||
$("#streamWork").load("/social/getStreamData.php?type="+type+"&data="+data);
|
||||
$("#streamMessage").val("");
|
||||
|
||||
});
|
||||
|
||||
$("#shareBox textarea").elastic();
|
||||
|
||||
/*if($("#total_msgs").length > 0) {
|
||||
showDownloadCounter();
|
||||
}*/
|
||||
|
||||
$(".addFavourites").click(function() {
|
||||
var id = $(this).attr("rel");
|
||||
$(".af-"+id).load("/include/add2favourites.php?id="+id);
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
$('textarea.tinymce').tinymce({
|
||||
// Location of TinyMCE script
|
||||
script_url : '/js/tiny_mce/tiny_mce.js',
|
||||
|
||||
// General options
|
||||
theme : "advanced",
|
||||
plugins : "smileys,sdcode,pagebreak,style,layer,table,save,advhr,advimage,advlink,emotions,iespell,inlinepopups,insertdatetime,preview,media,searchreplace,print,contextmenu,paste,directionality,fullscreen,noneditable,visualchars,nonbreaking,xhtmlxtras,template,youtube",
|
||||
|
||||
// Theme options
|
||||
theme_advanced_buttons1 : "smileys,bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,fontselect,fontsizeselect,removeformat,sub,sup,emotions,image,media,youtube",
|
||||
theme_advanced_buttons2 : "pastetext,pasteword,|,bullist,numlist,|,outdent,indent,blockquote,|,link,unlink,anchor,cleanup,forecolor,backcolor",
|
||||
theme_advanced_buttons3 : "",
|
||||
theme_advanced_toolbar_location : "top",
|
||||
theme_advanced_toolbar_align : "left",
|
||||
theme_advanced_statusbar_location : "",
|
||||
theme_advanced_resizing : true,
|
||||
|
||||
valid_elements: "@[style],img[src|class|alt],a[href|target=_blank],-span,-strong,-em,-strike,u,#p,br,-ol,-ul,-li,-sub,-sup,-pre,-address,-h1,-h2,-h3,-h4,-h5,-h6",
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}); // Document ready
|
||||
|
||||
|
||||
|
||||
|
||||
/***********************************************/
|
||||
/** **/
|
||||
/** PRIVATE MESSAGES **/
|
||||
/** **/
|
||||
/** **/
|
||||
/***********************************************/
|
||||
var m_html = '';
|
||||
|
||||
function updatePrivMsgBox() {
|
||||
$.get("include/updatePrivMsgBox.php");
|
||||
$("#msgBox").hide();
|
||||
$("#msgBoxTxt").hide();
|
||||
$("#msgBoxX").hide();
|
||||
}
|
||||
|
||||
function ShowPrivateMessage(id) {
|
||||
$("#msgShow").html(m_html);
|
||||
//$("#news-"+id).css('font-weight','bold');
|
||||
$("#msgShow").load("/privmsg.php?ajax=true&action=ShowMsg&id="+id);
|
||||
}
|
||||
|
||||
function ShowPrivateMessageList(box, id) {
|
||||
|
||||
if (box !== 'new') {
|
||||
$("#msgList").html(m_html);
|
||||
$("#msgShow").html('');
|
||||
}
|
||||
|
||||
if (box == 'new') {
|
||||
//alert ("/privmsg.php?ajax=true&action=msgList&box="+box+"&id=" + id);
|
||||
$("#msgShow").load("/privmsg.php?ajax=true&action=msgList&box="+box+"&id=" + id);
|
||||
} else {
|
||||
$("#msgList").load("/privmsg.php?ajax=true&action=msgList&box="+box+"&id=" + id);
|
||||
}
|
||||
}
|
||||
|
||||
function SaveMessage(id) {
|
||||
$("#msgList").html(m_html);
|
||||
$("#msgShow").html('');
|
||||
$("#msgList").load("/privmsg.php?ajax=true&action=SaveMsg&id=" + id);
|
||||
}
|
||||
|
||||
function DeleteMessage(id,box) {
|
||||
|
||||
$("#msgList").html(m_html);
|
||||
$("#msgShow").html('');
|
||||
$("#msgList").load("/privmsg.php?ajax=true&action=DelMsg&box="+box+"&id="+id);
|
||||
}
|
||||
49
public/js/dropdown.js
Normal file
@@ -0,0 +1,49 @@
|
||||
//reusable/////////////////////////////
|
||||
var zindex=100
|
||||
function dropit2(whichone){
|
||||
if (window.themenu&&themenu.id!=whichone.id)
|
||||
themenu.style.visibility="hidden"
|
||||
themenu=whichone
|
||||
if (document.all){
|
||||
themenu.style.left=document.body.scrollLeft+event.clientX-event.offsetX
|
||||
themenu.style.top=document.body.scrollTop+event.clientY-event.offsetY+18
|
||||
if (themenu.style.visibility=="hidden"){
|
||||
themenu.style.visibility="visible"
|
||||
themenu.style.zIndex=zindex++
|
||||
}
|
||||
else{
|
||||
hidemenu()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function dropit(e,whichone){
|
||||
if (window.themenu&&themenu.id!=eval(whichone).id)
|
||||
themenu.visibility="hide"
|
||||
themenu=eval(whichone)
|
||||
if (themenu.visibility=="hide")
|
||||
themenu.visibility="show"
|
||||
else
|
||||
themenu.visibility="hide"
|
||||
themenu.zIndex++
|
||||
themenu.left=e.pageX-e.layerX
|
||||
themenu.top=e.pageY-e.layerY+19
|
||||
return false
|
||||
}
|
||||
|
||||
function hidemenu(whichone){
|
||||
if (window.themenu)
|
||||
themenu.style.visibility="hidden"
|
||||
}
|
||||
|
||||
function hidemenu2(){
|
||||
themenu.visibility="hide"
|
||||
}
|
||||
|
||||
if (document.all)
|
||||
document.body.onclick=hidemenu
|
||||
|
||||
//reusable/////////////////////////////
|
||||
|
||||
|
||||
|
||||
347
public/js/dtree.js
Normal file
@@ -0,0 +1,347 @@
|
||||
/*--------------------------------------------------|
|
||||
| dTree 2.05 | www.destroydrop.com/javascript/tree/ |
|
||||
|---------------------------------------------------|
|
||||
| Copyright (c) 2002-2003 Geir Landrö |
|
||||
| |
|
||||
| This script can be used freely as long as all |
|
||||
| copyright messages are intact. |
|
||||
| |
|
||||
| Updated: 17.04.2003 |
|
||||
|--------------------------------------------------*/
|
||||
|
||||
// Node object
|
||||
function Node(id, pid, name, url, title, target, icon, iconOpen, open) {
|
||||
this.id = id;
|
||||
this.pid = pid;
|
||||
this.name = name;
|
||||
this.url = url;
|
||||
this.title = title;
|
||||
this.target = target;
|
||||
this.icon = icon;
|
||||
this.iconOpen = iconOpen;
|
||||
this._io = open || false;
|
||||
this._is = false;
|
||||
this._ls = false;
|
||||
this._hc = false;
|
||||
this._ai = 0;
|
||||
this._p;
|
||||
};
|
||||
|
||||
// Tree object
|
||||
function dTree(objName) {
|
||||
this.config = {
|
||||
target : null,
|
||||
folderLinks : true,
|
||||
useSelection : true,
|
||||
useCookies : true,
|
||||
useLines : true,
|
||||
useIcons : true,
|
||||
useStatusText : false,
|
||||
closeSameLevel : false,
|
||||
inOrder : false
|
||||
}
|
||||
this.icon = {
|
||||
root : 'img/empty.gif',
|
||||
folder : 'gfx/tree_expand.gif',
|
||||
folderOpen : 'gfx/tree_collapse.gif',
|
||||
node : 'gfx/icons/noicons.gif',
|
||||
empty : 'img/empty.gif',
|
||||
line : 'img/line.gif',
|
||||
join : 'img/join.gif',
|
||||
joinBottom : 'img/joinbottom.gif',
|
||||
plus : 'img/plus.gif',
|
||||
plusBottom : 'img/plusbottom.gif',
|
||||
minus : 'img/minus.gif',
|
||||
minusBottom : 'img/minusbottom.gif',
|
||||
nlPlus : 'img/nolines_plus.gif',
|
||||
nlMinus : 'img/nolines_minus.gif'
|
||||
};
|
||||
this.obj = objName;
|
||||
this.aNodes = [];
|
||||
this.aIndent = [];
|
||||
this.root = new Node(-1);
|
||||
this.selectedNode = null;
|
||||
this.selectedFound = false;
|
||||
this.completed = false;
|
||||
};
|
||||
|
||||
// Adds a new node to the node array
|
||||
dTree.prototype.add = function(id, pid, name, url, title, target, icon, iconOpen, open) {
|
||||
this.aNodes[this.aNodes.length] = new Node(id, pid, name, url, title, target, icon, iconOpen, open);
|
||||
};
|
||||
|
||||
// Open/close all nodes
|
||||
dTree.prototype.openAll = function() {
|
||||
this.oAll(true);
|
||||
};
|
||||
dTree.prototype.closeAll = function() {
|
||||
this.oAll(false);
|
||||
};
|
||||
|
||||
// Outputs the tree to the page
|
||||
dTree.prototype.toString = function() {
|
||||
var str = '<div class="dtree">\n';
|
||||
if (document.getElementById) {
|
||||
if (this.config.useCookies) this.selectedNode = this.getSelected();
|
||||
str += this.addNode(this.root);
|
||||
} else str += 'Browser not supported.';
|
||||
str += '</div>';
|
||||
if (!this.selectedFound) this.selectedNode = null;
|
||||
this.completed = true;
|
||||
return str;
|
||||
};
|
||||
|
||||
// Creates the tree structure
|
||||
dTree.prototype.addNode = function(pNode) {
|
||||
var str = '';
|
||||
var n=0;
|
||||
if (this.config.inOrder) n = pNode._ai;
|
||||
for (n; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n].pid == pNode.id) {
|
||||
var cn = this.aNodes[n];
|
||||
cn._p = pNode;
|
||||
cn._ai = n;
|
||||
this.setCS(cn);
|
||||
if (!cn.target && this.config.target) cn.target = this.config.target;
|
||||
if (cn._hc && !cn._io && this.config.useCookies) cn._io = this.isOpen(cn.id);
|
||||
if (!this.config.folderLinks && cn._hc) cn.url = null;
|
||||
if (this.config.useSelection && cn.id == this.selectedNode && !this.selectedFound) {
|
||||
cn._is = true;
|
||||
this.selectedNode = n;
|
||||
this.selectedFound = true;
|
||||
}
|
||||
str += this.node(cn, n);
|
||||
if (cn._ls) break;
|
||||
}
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
// Creates the node icon, url and text
|
||||
dTree.prototype.node = function(node, nodeId) {
|
||||
var str = '<div class="dTreeNode">' + this.indent(node, nodeId);
|
||||
if (this.config.useIcons) {
|
||||
if (!node.icon) node.icon = (this.root.id == node.pid) ? this.icon.root : ((node._hc) ? this.icon.folder : this.icon.node);
|
||||
if (!node.iconOpen) node.iconOpen = (node._hc) ? this.icon.folderOpen : this.icon.node;
|
||||
if (this.root.id == node.pid) {
|
||||
node.icon = this.icon.root;
|
||||
node.iconOpen = this.icon.root;
|
||||
}
|
||||
str += '<img id="i' + this.obj + nodeId + '" border="0" src="' + ((node._io) ? node.iconOpen : node.icon) + '" alt="" />';
|
||||
}
|
||||
if (node.url) {
|
||||
str += '<a id="s' + this.obj + nodeId + '" class="' + ((this.config.useSelection) ? ((node._is ? 'nodeSel' : 'node')) : 'node') + '" href="' + node.url + '"';
|
||||
if (node.title) str += ' title="' + node.title + '"';
|
||||
if (node.target) str += ' target="' + node.target + '"';
|
||||
if (this.config.useStatusText) str += ' onmouseover="window.status=\'' + node.name + '\';return true;" onmouseout="window.status=\'\';return true;" ';
|
||||
if (this.config.useSelection && ((node._hc && this.config.folderLinks) || !node._hc))
|
||||
str += ' onclick="javascript: ' + this.obj + '.s(' + nodeId + ');"';
|
||||
str += '>';
|
||||
}
|
||||
else if ((!this.config.folderLinks || !node.url) && node._hc && node.pid != this.root.id)
|
||||
str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');" class="node">';
|
||||
str += node.name;
|
||||
if (node.url || ((!this.config.folderLinks || !node.url) && node._hc)) str += '</a>';
|
||||
str += '</div>';
|
||||
if (node._hc) {
|
||||
str += '<div id="d' + this.obj + nodeId + '" class="clip" style="display:' + ((this.root.id == node.pid || node._io) ? 'block' : 'none') + ';">';
|
||||
str += this.addNode(node);
|
||||
str += '</div>';
|
||||
}
|
||||
this.aIndent.pop();
|
||||
return str;
|
||||
};
|
||||
|
||||
// Adds the empty and line icons
|
||||
dTree.prototype.indent = function(node, nodeId) {
|
||||
var str = '';
|
||||
if (this.root.id != node.pid) {
|
||||
for (var n=0; n<this.aIndent.length; n++)
|
||||
str += '<img border="0" src="' + ( (this.aIndent[n] == 1 && this.config.useLines) ? this.icon.line : this.icon.empty ) + '" width="1" alt="" />';
|
||||
(node._ls) ? this.aIndent.push(0) : this.aIndent.push(1);
|
||||
if (node._hc) {
|
||||
str += '<a href="javascript: ' + this.obj + '.o(' + nodeId + ');"><img id="j' + this.obj + nodeId + '" border="0" width="0" src="';
|
||||
if (!this.config.useLines) str += (node._io) ? this.icon.nlMinus : this.icon.nlPlus;
|
||||
else str += ( (node._io) ? ((node._ls && this.config.useLines) ? this.icon.minusBottom : this.icon.minus) : ((node._ls && this.config.useLines) ? this.icon.plusBottom : this.icon.plus ) );
|
||||
str += '" alt="" /></a>';
|
||||
} else str += '<img border="0" src="' + ( (this.config.useLines) ? ((node._ls) ? this.icon.joinBottom : this.icon.join ) : this.icon.empty) + '" width="0" alt="" />';
|
||||
}
|
||||
return str;
|
||||
};
|
||||
|
||||
// Checks if a node has any children and if it is the last sibling
|
||||
dTree.prototype.setCS = function(node) {
|
||||
var lastId;
|
||||
for (var n=0; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n].pid == node.id) node._hc = true;
|
||||
if (this.aNodes[n].pid == node.pid) lastId = this.aNodes[n].id;
|
||||
}
|
||||
if (lastId==node.id) node._ls = true;
|
||||
};
|
||||
|
||||
// Returns the selected node
|
||||
dTree.prototype.getSelected = function() {
|
||||
var sn = this.getCookie('cs' + this.obj);
|
||||
return (sn) ? sn : null;
|
||||
};
|
||||
|
||||
// Highlights the selected node
|
||||
dTree.prototype.s = function(id) {
|
||||
if (!this.config.useSelection) return;
|
||||
var cn = this.aNodes[id];
|
||||
if (cn._hc && !this.config.folderLinks) return;
|
||||
if (this.selectedNode != id) {
|
||||
if (this.selectedNode || this.selectedNode==0) {
|
||||
eOld = document.getElementById("s" + this.obj + this.selectedNode);
|
||||
eOld.className = "node";
|
||||
}
|
||||
eNew = document.getElementById("s" + this.obj + id);
|
||||
eNew.className = "nodeSel";
|
||||
this.selectedNode = id;
|
||||
if (this.config.useCookies) this.setCookie('cs' + this.obj, cn.id);
|
||||
}
|
||||
};
|
||||
|
||||
// Toggle Open or close
|
||||
dTree.prototype.o = function(id) {
|
||||
var cn = this.aNodes[id];
|
||||
this.nodeStatus(!cn._io, id, cn._ls);
|
||||
cn._io = !cn._io;
|
||||
if (this.config.closeSameLevel) this.closeLevel(cn);
|
||||
if (this.config.useCookies) this.updateCookie();
|
||||
};
|
||||
|
||||
// Open or close all nodes
|
||||
dTree.prototype.oAll = function(status) {
|
||||
for (var n=0; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n]._hc && this.aNodes[n].pid != this.root.id) {
|
||||
this.nodeStatus(status, n, this.aNodes[n]._ls)
|
||||
this.aNodes[n]._io = status;
|
||||
}
|
||||
}
|
||||
if (this.config.useCookies) this.updateCookie();
|
||||
};
|
||||
|
||||
// Opens the tree to a specific node
|
||||
dTree.prototype.openTo = function(nId, bSelect, bFirst) {
|
||||
if (!bFirst) {
|
||||
for (var n=0; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n].id == nId) {
|
||||
nId=n;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
var cn=this.aNodes[nId];
|
||||
if (cn.pid==this.root.id || !cn._p) return;
|
||||
cn._io = true;
|
||||
cn._is = bSelect;
|
||||
if (this.completed && cn._hc) this.nodeStatus(true, cn._ai, cn._ls);
|
||||
if (this.completed && bSelect) this.s(cn._ai);
|
||||
else if (bSelect) this._sn=cn._ai;
|
||||
this.openTo(cn._p._ai, false, true);
|
||||
};
|
||||
|
||||
// Closes all nodes on the same level as certain node
|
||||
dTree.prototype.closeLevel = function(node) {
|
||||
for (var n=0; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n].pid == node.pid && this.aNodes[n].id != node.id && this.aNodes[n]._hc) {
|
||||
this.nodeStatus(false, n, this.aNodes[n]._ls);
|
||||
this.aNodes[n]._io = false;
|
||||
this.closeAllChildren(this.aNodes[n]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Closes all children of a node
|
||||
dTree.prototype.closeAllChildren = function(node) {
|
||||
for (var n=0; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n].pid == node.id && this.aNodes[n]._hc) {
|
||||
if (this.aNodes[n]._io) this.nodeStatus(false, n, this.aNodes[n]._ls);
|
||||
this.aNodes[n]._io = false;
|
||||
this.closeAllChildren(this.aNodes[n]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Change the status of a node(open or closed)
|
||||
dTree.prototype.nodeStatus = function(status, id, bottom) {
|
||||
eDiv = document.getElementById('d' + this.obj + id);
|
||||
eJoin = document.getElementById('j' + this.obj + id);
|
||||
if (this.config.useIcons) {
|
||||
eIcon = document.getElementById('i' + this.obj + id);
|
||||
eIcon.src = (status) ? this.aNodes[id].iconOpen : this.aNodes[id].icon;
|
||||
}
|
||||
eJoin.src = (this.config.useLines)?
|
||||
((status)?((bottom)?this.icon.minusBottom:this.icon.minus):((bottom)?this.icon.plusBottom:this.icon.plus)):
|
||||
((status)?this.icon.nlMinus:this.icon.nlPlus);
|
||||
eDiv.style.display = (status) ? 'block': 'none';
|
||||
};
|
||||
|
||||
|
||||
// [Cookie] Clears a cookie
|
||||
dTree.prototype.clearCookie = function() {
|
||||
var now = new Date();
|
||||
var yesterday = new Date(now.getTime() - 1000 * 60 * 60 * 24);
|
||||
this.setCookie('co'+this.obj, 'cookieValue', yesterday);
|
||||
this.setCookie('cs'+this.obj, 'cookieValue', yesterday);
|
||||
};
|
||||
|
||||
// [Cookie] Sets value in a cookie
|
||||
dTree.prototype.setCookie = function(cookieName, cookieValue, expires, path, domain, secure) {
|
||||
document.cookie =
|
||||
escape(cookieName) + '=' + escape(cookieValue)
|
||||
+ (expires ? '; expires=' + expires.toGMTString() : '')
|
||||
+ (path ? '; path=' + path : '')
|
||||
+ (domain ? '; domain=' + domain : '')
|
||||
+ (secure ? '; secure' : '');
|
||||
};
|
||||
|
||||
// [Cookie] Gets a value from a cookie
|
||||
dTree.prototype.getCookie = function(cookieName) {
|
||||
var cookieValue = '';
|
||||
var posName = document.cookie.indexOf(escape(cookieName) + '=');
|
||||
if (posName != -1) {
|
||||
var posValue = posName + (escape(cookieName) + '=').length;
|
||||
var endPos = document.cookie.indexOf(';', posValue);
|
||||
if (endPos != -1) cookieValue = unescape(document.cookie.substring(posValue, endPos));
|
||||
else cookieValue = unescape(document.cookie.substring(posValue));
|
||||
}
|
||||
return (cookieValue);
|
||||
};
|
||||
|
||||
// [Cookie] Returns ids of open nodes as a string
|
||||
dTree.prototype.updateCookie = function() {
|
||||
var str = '';
|
||||
for (var n=0; n<this.aNodes.length; n++) {
|
||||
if (this.aNodes[n]._io && this.aNodes[n].pid != this.root.id) {
|
||||
if (str) str += '.';
|
||||
str += this.aNodes[n].id;
|
||||
}
|
||||
}
|
||||
this.setCookie('co' + this.obj, str);
|
||||
};
|
||||
|
||||
// [Cookie] Checks if a node id is in a cookie
|
||||
dTree.prototype.isOpen = function(id) {
|
||||
var aOpen = this.getCookie('co' + this.obj).split('.');
|
||||
for (var n=0; n<aOpen.length; n++)
|
||||
if (aOpen[n] == id) return true;
|
||||
return false;
|
||||
};
|
||||
|
||||
// If Push and pop is not implemented by the browser
|
||||
if (!Array.prototype.push) {
|
||||
Array.prototype.push = function array_push() {
|
||||
for(var i=0;i<arguments.length;i++)
|
||||
this[this.length]=arguments[i];
|
||||
return this.length;
|
||||
}
|
||||
};
|
||||
if (!Array.prototype.pop) {
|
||||
Array.prototype.pop = function array_pop() {
|
||||
lastElement = this[this.length-1];
|
||||
this.length = Math.max(this.length-1,0);
|
||||
return lastElement;
|
||||
}
|
||||
};
|
||||
402
public/js/editor.js
Normal file
@@ -0,0 +1,402 @@
|
||||
/**
|
||||
* bbCode control by subBlue design [ www.subBlue.com ]
|
||||
* Includes unixsafe colour palette selector by SHS`
|
||||
*/
|
||||
|
||||
// Startup variables
|
||||
var imageTag = false;
|
||||
var theSelection = false;
|
||||
|
||||
// Check for Browser & Platform for PC & IE specific bits
|
||||
// More details from: http://www.mozilla.org/docs/web-developer/sniffer/browser_type.html
|
||||
var clientPC = navigator.userAgent.toLowerCase(); // Get client info
|
||||
var clientVer = parseInt(navigator.appVersion); // Get browser version
|
||||
|
||||
var is_ie = ((clientPC.indexOf('msie') != -1) && (clientPC.indexOf('opera') == -1));
|
||||
var is_win = ((clientPC.indexOf('win') != -1) || (clientPC.indexOf('16bit') != -1));
|
||||
|
||||
var baseHeight;
|
||||
|
||||
/**
|
||||
* Shows the help messages in the helpline window
|
||||
*/
|
||||
function helpline(help)
|
||||
{
|
||||
document.forms[form_name].helpbox.value = help_line[help];
|
||||
}
|
||||
|
||||
/**
|
||||
* Fix a bug involving the TextRange object. From
|
||||
* http://www.frostjedi.com/terra/scripts/demo/caretBug.html
|
||||
*/
|
||||
function initInsertions()
|
||||
{
|
||||
var doc;
|
||||
|
||||
if (document.forms[form_name])
|
||||
{
|
||||
doc = document;
|
||||
}
|
||||
else
|
||||
{
|
||||
doc = opener.document;
|
||||
}
|
||||
|
||||
var textarea = doc.forms[form_name].elements[text_name];
|
||||
|
||||
if (is_ie && typeof(baseHeight) != 'number')
|
||||
{
|
||||
textarea.focus();
|
||||
baseHeight = doc.selection.createRange().duplicate().boundingHeight;
|
||||
|
||||
if (!document.forms[form_name])
|
||||
{
|
||||
document.body.focus();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* bbstyle
|
||||
*/
|
||||
function bbstyle(bbnumber)
|
||||
{
|
||||
if (bbnumber != -1)
|
||||
{
|
||||
bbfontstyle(bbtags[bbnumber], bbtags[bbnumber+1]);
|
||||
}
|
||||
else
|
||||
{
|
||||
insert_text('[*]');
|
||||
document.forms[form_name].elements[text_name].focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply bbcodes
|
||||
*/
|
||||
function bbfontstyle(bbopen, bbclose)
|
||||
{
|
||||
theSelection = false;
|
||||
|
||||
var textarea = document.forms[form_name].elements[text_name];
|
||||
|
||||
textarea.focus();
|
||||
|
||||
if ((clientVer >= 4) && is_ie && is_win)
|
||||
{
|
||||
// Get text selection
|
||||
theSelection = document.selection.createRange().text;
|
||||
|
||||
if (theSelection)
|
||||
{
|
||||
// Add tags around selection
|
||||
document.selection.createRange().text = bbopen + theSelection + bbclose;
|
||||
document.forms[form_name].elements[text_name].focus();
|
||||
theSelection = '';
|
||||
return;
|
||||
}
|
||||
}
|
||||
else if (document.forms[form_name].elements[text_name].selectionEnd && (document.forms[form_name].elements[text_name].selectionEnd - document.forms[form_name].elements[text_name].selectionStart > 0))
|
||||
{
|
||||
mozWrap(document.forms[form_name].elements[text_name], bbopen, bbclose);
|
||||
document.forms[form_name].elements[text_name].focus();
|
||||
theSelection = '';
|
||||
return;
|
||||
}
|
||||
|
||||
//The new position for the cursor after adding the bbcode
|
||||
var caret_pos = getCaretPosition(textarea).start;
|
||||
var new_pos = caret_pos + bbopen.length;
|
||||
|
||||
// Open tag
|
||||
insert_text(bbopen + bbclose);
|
||||
|
||||
// Center the cursor when we don't have a selection
|
||||
// Gecko and proper browsers
|
||||
if (!isNaN(textarea.selectionStart))
|
||||
{
|
||||
textarea.selectionStart = new_pos;
|
||||
textarea.selectionEnd = new_pos;
|
||||
}
|
||||
// IE
|
||||
else if (document.selection)
|
||||
{
|
||||
var range = textarea.createTextRange();
|
||||
range.move("character", new_pos);
|
||||
range.select();
|
||||
storeCaret(textarea);
|
||||
}
|
||||
|
||||
textarea.focus();
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert text at position
|
||||
*/
|
||||
function insert_text(text, spaces, popup)
|
||||
{
|
||||
var textarea;
|
||||
|
||||
if (!popup)
|
||||
{
|
||||
textarea = document.forms[form_name].elements[text_name];
|
||||
}
|
||||
else
|
||||
{
|
||||
textarea = opener.document.forms[form_name].elements[text_name];
|
||||
}
|
||||
if (spaces)
|
||||
{
|
||||
text = ' ' + text + ' ';
|
||||
}
|
||||
|
||||
if (!isNaN(textarea.selectionStart))
|
||||
{
|
||||
var sel_start = textarea.selectionStart;
|
||||
var sel_end = textarea.selectionEnd;
|
||||
|
||||
mozWrap(textarea, text, '')
|
||||
textarea.selectionStart = sel_start + text.length;
|
||||
textarea.selectionEnd = sel_end + text.length;
|
||||
}
|
||||
else if (textarea.createTextRange && textarea.caretPos)
|
||||
{
|
||||
if (baseHeight != textarea.caretPos.boundingHeight)
|
||||
{
|
||||
textarea.focus();
|
||||
storeCaret(textarea);
|
||||
}
|
||||
|
||||
var caret_pos = textarea.caretPos;
|
||||
caret_pos.text = caret_pos.text.charAt(caret_pos.text.length - 1) == ' ' ? caret_pos.text + text + ' ' : caret_pos.text + text;
|
||||
}
|
||||
else
|
||||
{
|
||||
textarea.value = textarea.value + text;
|
||||
}
|
||||
if (!popup)
|
||||
{
|
||||
textarea.focus();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Add inline attachment at position
|
||||
*/
|
||||
function attach_inline(index, filename)
|
||||
{
|
||||
insert_text('[attachment=' + index + ']' + filename + '[/attachment]');
|
||||
document.forms[form_name].elements[text_name].focus();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add quote text to message
|
||||
*/
|
||||
function addquote(post_id, username)
|
||||
{
|
||||
var message_name = 'message_' + post_id;
|
||||
var theSelection = '';
|
||||
var divarea = false;
|
||||
|
||||
if (document.all)
|
||||
{
|
||||
divarea = document.all[message_name];
|
||||
}
|
||||
else
|
||||
{
|
||||
divarea = document.getElementById(message_name);
|
||||
}
|
||||
|
||||
// Get text selection - not only the post content :(
|
||||
if (window.getSelection)
|
||||
{
|
||||
theSelection = window.getSelection().toString();
|
||||
}
|
||||
else if (document.getSelection)
|
||||
{
|
||||
theSelection = document.getSelection();
|
||||
}
|
||||
else if (document.selection)
|
||||
{
|
||||
theSelection = document.selection.createRange().text;
|
||||
}
|
||||
|
||||
if (theSelection == '' || typeof theSelection == 'undefined' || theSelection == null)
|
||||
{
|
||||
if (divarea.innerHTML)
|
||||
{
|
||||
theSelection = divarea.innerHTML.replace(/<br>/ig, '\n');
|
||||
theSelection = theSelection.replace(/<br\/>/ig, '\n');
|
||||
theSelection = theSelection.replace(/<\;/ig, '<');
|
||||
theSelection = theSelection.replace(/>\;/ig, '>');
|
||||
theSelection = theSelection.replace(/&\;/ig, '&');
|
||||
theSelection = theSelection.replace(/ \;/ig, ' ');
|
||||
}
|
||||
else if (document.all)
|
||||
{
|
||||
theSelection = divarea.innerText;
|
||||
}
|
||||
else if (divarea.textContent)
|
||||
{
|
||||
theSelection = divarea.textContent;
|
||||
}
|
||||
else if (divarea.firstChild.nodeValue)
|
||||
{
|
||||
theSelection = divarea.firstChild.nodeValue;
|
||||
}
|
||||
}
|
||||
|
||||
if (theSelection)
|
||||
{
|
||||
insert_text('[quote="' + username + '"]' + theSelection + '[/quote]');
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* From http://www.massless.org/mozedit/
|
||||
*/
|
||||
function mozWrap(txtarea, open, close)
|
||||
{
|
||||
var selLength = txtarea.textLength;
|
||||
var selStart = txtarea.selectionStart;
|
||||
var selEnd = txtarea.selectionEnd;
|
||||
var scrollTop = txtarea.scrollTop;
|
||||
|
||||
if (selEnd == 1 || selEnd == 2)
|
||||
{
|
||||
selEnd = selLength;
|
||||
}
|
||||
|
||||
var s1 = (txtarea.value).substring(0,selStart);
|
||||
var s2 = (txtarea.value).substring(selStart, selEnd)
|
||||
var s3 = (txtarea.value).substring(selEnd, selLength);
|
||||
|
||||
txtarea.value = s1 + open + s2 + close + s3;
|
||||
txtarea.selectionStart = selEnd + open.length + close.length;
|
||||
txtarea.selectionEnd = txtarea.selectionStart;
|
||||
txtarea.focus();
|
||||
txtarea.scrollTop = scrollTop;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* Insert at Caret position. Code from
|
||||
* http://www.faqts.com/knowledge_base/view.phtml/aid/1052/fid/130
|
||||
*/
|
||||
function storeCaret(textEl)
|
||||
{
|
||||
if (textEl.createTextRange)
|
||||
{
|
||||
textEl.caretPos = document.selection.createRange().duplicate();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Color pallette
|
||||
*/
|
||||
function colorPalette(dir, width, height)
|
||||
{
|
||||
var r = 0, g = 0, b = 0;
|
||||
var numberList = new Array(6);
|
||||
var color = '';
|
||||
|
||||
numberList[0] = '00';
|
||||
numberList[1] = '40';
|
||||
numberList[2] = '80';
|
||||
numberList[3] = 'BF';
|
||||
numberList[4] = 'FF';
|
||||
|
||||
document.writeln('<table cellspacing="1" cellpadding="0" border="0">');
|
||||
|
||||
for (r = 0; r < 5; r++)
|
||||
{
|
||||
if (dir == 'h')
|
||||
{
|
||||
document.writeln('<tr>');
|
||||
}
|
||||
|
||||
for (g = 0; g < 5; g++)
|
||||
{
|
||||
if (dir == 'v')
|
||||
{
|
||||
document.writeln('<tr>');
|
||||
}
|
||||
|
||||
for (b = 0; b < 5; b++)
|
||||
{
|
||||
color = String(numberList[r]) + String(numberList[g]) + String(numberList[b]);
|
||||
document.write('<td bgcolor="#' + color + '" style="width: ' + width + 'px; height: ' + height + 'px;">');
|
||||
document.write('<a href="#" onclick="bbfontstyle(\'[color=#' + color + ']\', \'[/color]\'); return false;"><img src="images/spacer.gif" width="' + width + '" height="' + height + '" alt="#' + color + '" title="#' + color + '" /></a>');
|
||||
document.writeln('</td>');
|
||||
}
|
||||
|
||||
if (dir == 'v')
|
||||
{
|
||||
document.writeln('</tr>');
|
||||
}
|
||||
}
|
||||
|
||||
if (dir == 'h')
|
||||
{
|
||||
document.writeln('</tr>');
|
||||
}
|
||||
}
|
||||
document.writeln('</table>');
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Caret Position object
|
||||
*/
|
||||
function caretPosition()
|
||||
{
|
||||
var start = null;
|
||||
var end = null;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get the caret position in an textarea
|
||||
*/
|
||||
function getCaretPosition(txtarea)
|
||||
{
|
||||
var caretPos = new caretPosition();
|
||||
|
||||
// simple Gecko/Opera way
|
||||
if(txtarea.selectionStart || txtarea.selectionStart == 0)
|
||||
{
|
||||
caretPos.start = txtarea.selectionStart;
|
||||
caretPos.end = txtarea.selectionEnd;
|
||||
}
|
||||
// dirty and slow IE way
|
||||
else if(document.selection)
|
||||
{
|
||||
|
||||
// get current selection
|
||||
var range = document.selection.createRange();
|
||||
|
||||
// a new selection of the whole textarea
|
||||
var range_all = document.body.createTextRange();
|
||||
range_all.moveToElementText(txtarea);
|
||||
|
||||
// calculate selection start point by moving beginning of range_all to beginning of range
|
||||
var sel_start;
|
||||
for (sel_start = 0; range_all.compareEndPoints('StartToStart', range) < 0; sel_start++)
|
||||
{
|
||||
range_all.moveStart('character', 1);
|
||||
}
|
||||
|
||||
txtarea.sel_start = sel_start;
|
||||
|
||||
// we ignore the end value for IE, this is already dirty enough and we don't need it
|
||||
caretPos.start = txtarea.sel_start;
|
||||
caretPos.end = txtarea.sel_start;
|
||||
}
|
||||
|
||||
return caretPos;
|
||||
}
|
||||
903
public/js/effects.js
vendored
Normal file
@@ -0,0 +1,903 @@
|
||||
// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// Contributors:
|
||||
// Justin Palmer (http://encytemedia.com/)
|
||||
// Mark Pilgrim (http://diveintomark.org/)
|
||||
// Martin Bialasinki
|
||||
//
|
||||
// See scriptaculous.js for full license.
|
||||
|
||||
/* ------------- element ext -------------- */
|
||||
|
||||
// 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.collectTextNodes(node) : ''));
|
||||
}).flatten().join('');
|
||||
}
|
||||
|
||||
Element.setStyle = function(element, style) {
|
||||
element = $(element);
|
||||
for(k in style) element.style[k.camelize()] = style[k];
|
||||
}
|
||||
|
||||
Element.setContentZoom = function(element, percent) {
|
||||
Element.setStyle(element, {fontSize: (percent/100) + 'em'});
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
||||
}
|
||||
|
||||
Element.getOpacity = function(element){
|
||||
var opacity;
|
||||
if (opacity = Element.getStyle(element, 'opacity'))
|
||||
return parseFloat(opacity);
|
||||
if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/))
|
||||
if(opacity[1]) return parseFloat(opacity[1]) / 100;
|
||||
return 1.0;
|
||||
}
|
||||
|
||||
Element.setOpacity = function(element, value){
|
||||
element= $(element);
|
||||
if (value == 1){
|
||||
Element.setStyle(element, { opacity:
|
||||
(/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ?
|
||||
0.999999 : null });
|
||||
if(/MSIE/.test(navigator.userAgent))
|
||||
Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')});
|
||||
} else {
|
||||
if(value < 0.00001) value = 0;
|
||||
Element.setStyle(element, {opacity: value});
|
||||
if(/MSIE/.test(navigator.userAgent))
|
||||
Element.setStyle(element,
|
||||
{ filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') +
|
||||
'alpha(opacity='+value*100+')' });
|
||||
}
|
||||
}
|
||||
|
||||
Element.getInlineOpacity = function(element){
|
||||
return $(element).style.opacity || '';
|
||||
}
|
||||
|
||||
Element.childrenWithClassName = function(element, className) {
|
||||
return $A($(element).getElementsByTagName('*')).select(
|
||||
function(c) { return Element.hasClassName(c, className) });
|
||||
}
|
||||
|
||||
Array.prototype.call = function() {
|
||||
var args = arguments;
|
||||
this.each(function(f){ f.apply(this, args) });
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var Effect = {
|
||||
tagifyText: function(element) {
|
||||
var tagifyStyle = 'position:relative';
|
||||
if(/MSIE/.test(navigator.userAgent)) 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') }
|
||||
}, arguments[2] || {});
|
||||
Effect[Element.visible(element) ?
|
||||
Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
|
||||
}
|
||||
};
|
||||
|
||||
var Effect2 = Effect; // deprecated
|
||||
|
||||
/* ------------- transitions ------------- */
|
||||
|
||||
Effect.Transitions = {}
|
||||
|
||||
Effect.Transitions.linear = function(pos) {
|
||||
return pos;
|
||||
}
|
||||
Effect.Transitions.sinoidal = function(pos) {
|
||||
return (-Math.cos(pos*Math.PI)/2) + 0.5;
|
||||
}
|
||||
Effect.Transitions.reverse = function(pos) {
|
||||
return 1-pos;
|
||||
}
|
||||
Effect.Transitions.flicker = function(pos) {
|
||||
return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
|
||||
}
|
||||
Effect.Transitions.wobble = function(pos) {
|
||||
return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
|
||||
}
|
||||
Effect.Transitions.pulse = function(pos) {
|
||||
return (Math.floor(pos*10) % 2 == 0 ?
|
||||
(pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10)));
|
||||
}
|
||||
Effect.Transitions.none = function(pos) {
|
||||
return 0;
|
||||
}
|
||||
Effect.Transitions.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 'end':
|
||||
// start effect after last queued effect has finished
|
||||
timestamp = this.effects.pluck('finishOn').max() || timestamp;
|
||||
break;
|
||||
}
|
||||
|
||||
effect.startOn += timestamp;
|
||||
effect.finishOn += timestamp;
|
||||
this.effects.push(effect);
|
||||
if(!this.interval)
|
||||
this.interval = setInterval(this.loop.bind(this), 40);
|
||||
},
|
||||
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();
|
||||
this.effects.invoke('loop', timePos);
|
||||
}
|
||||
});
|
||||
|
||||
Effect.Queues = {
|
||||
instances: $H(),
|
||||
get: function(queueName) {
|
||||
if(typeof queueName != 'string') return queueName;
|
||||
|
||||
if(!this.instances[queueName])
|
||||
this.instances[queueName] = new Effect.ScopedQueue();
|
||||
|
||||
return this.instances[queueName];
|
||||
}
|
||||
}
|
||||
Effect.Queue = Effect.Queues.get('global');
|
||||
|
||||
Effect.DefaultOptions = {
|
||||
transition: Effect.Transitions.sinoidal,
|
||||
duration: 1.0, // seconds
|
||||
fps: 25.0, // max. 25fps due to Effect.Queue implementation
|
||||
sync: false, // true for combining
|
||||
from: 0.0,
|
||||
to: 1.0,
|
||||
delay: 0.0,
|
||||
queue: 'parallel'
|
||||
}
|
||||
|
||||
Effect.Base = function() {};
|
||||
Effect.Base.prototype = {
|
||||
position: null,
|
||||
start: function(options) {
|
||||
this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {});
|
||||
this.currentFrame = 0;
|
||||
this.state = 'idle';
|
||||
this.startOn = this.options.delay*1000;
|
||||
this.finishOn = this.startOn + (this.options.duration*1000);
|
||||
this.event('beforeStart');
|
||||
if(!this.options.sync)
|
||||
Effect.Queues.get(typeof this.options.queue == 'string' ?
|
||||
'global' : this.options.queue.scope).add(this);
|
||||
},
|
||||
loop: function(timePos) {
|
||||
if(timePos >= 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.finishOn - this.startOn);
|
||||
var frame = Math.round(pos * this.options.fps * this.options.duration);
|
||||
if(frame > this.currentFrame) {
|
||||
this.render(pos);
|
||||
this.currentFrame = frame;
|
||||
}
|
||||
}
|
||||
},
|
||||
render: function(pos) {
|
||||
if(this.state == 'idle') {
|
||||
this.state = 'running';
|
||||
this.event('beforeSetup');
|
||||
if(this.setup) this.setup();
|
||||
this.event('afterSetup');
|
||||
}
|
||||
if(this.state == 'running') {
|
||||
if(this.options.transition) pos = this.options.transition(pos);
|
||||
pos *= (this.options.to-this.options.from);
|
||||
pos += this.options.from;
|
||||
this.position = pos;
|
||||
this.event('beforeUpdate');
|
||||
if(this.update) this.update(pos);
|
||||
this.event('afterUpdate');
|
||||
}
|
||||
},
|
||||
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() {
|
||||
return '#<Effect:' + $H(this).inspect() + ',options:' + $H(this.options).inspect() + '>';
|
||||
}
|
||||
}
|
||||
|
||||
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.Opacity = Class.create();
|
||||
Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), {
|
||||
initialize: function(element) {
|
||||
this.element = $(element);
|
||||
// make this work on IE on elements without 'layout'
|
||||
if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout))
|
||||
Element.setStyle(this.element, {zoom: 1});
|
||||
var options = Object.extend({
|
||||
from: Element.getOpacity(this.element) || 0.0,
|
||||
to: 1.0
|
||||
}, arguments[1] || {});
|
||||
this.start(options);
|
||||
},
|
||||
update: function(position) {
|
||||
Element.setOpacity(this.element, position);
|
||||
}
|
||||
});
|
||||
|
||||
Effect.Move = Class.create();
|
||||
Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), {
|
||||
initialize: function(element) {
|
||||
this.element = $(element);
|
||||
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)
|
||||
Element.makePositioned(this.element);
|
||||
this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0');
|
||||
this.originalTop = parseFloat(Element.getStyle(this.element,'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) {
|
||||
Element.setStyle(this.element, {
|
||||
left: this.options.x * position + this.originalLeft + 'px',
|
||||
top: 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)
|
||||
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 = Element.getStyle(this.element,'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 = Element.getStyle(this.element,'font-size') || '100%';
|
||||
['em','px','%'].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)
|
||||
Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType });
|
||||
this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
|
||||
},
|
||||
finish: function(position) {
|
||||
if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle);
|
||||
},
|
||||
setDimensions: function(height, width) {
|
||||
var d = {};
|
||||
if(this.options.scaleX) d.width = width + 'px';
|
||||
if(this.options.scaleY) d.height = 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';
|
||||
}
|
||||
}
|
||||
Element.setStyle(this.element, d);
|
||||
}
|
||||
});
|
||||
|
||||
Effect.Highlight = Class.create();
|
||||
Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), {
|
||||
initialize: function(element) {
|
||||
this.element = $(element);
|
||||
var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {});
|
||||
this.start(options);
|
||||
},
|
||||
setup: function() {
|
||||
// Prevent executing on elements not in the layout flow
|
||||
if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; }
|
||||
// Disable background image during the effect
|
||||
this.oldStyle = {
|
||||
backgroundImage: Element.getStyle(this.element, 'background-image') };
|
||||
Element.setStyle(this.element, {backgroundImage: 'none'});
|
||||
if(!this.options.endcolor)
|
||||
this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff');
|
||||
if(!this.options.restorecolor)
|
||||
this.options.restorecolor = Element.getStyle(this.element, '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) {
|
||||
Element.setStyle(this.element,{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() {
|
||||
Element.setStyle(this.element, 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) {
|
||||
var oldOpacity = Element.getInlineOpacity(element);
|
||||
var options = Object.extend({
|
||||
from: Element.getOpacity(element) || 1.0,
|
||||
to: 0.0,
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
if(effect.options.to!=0) return;
|
||||
hide(effect.element);
|
||||
setStyle(effect.element, {opacity: oldOpacity}); }}
|
||||
}, arguments[1] || {});
|
||||
return new Effect.Opacity(element,options);
|
||||
}
|
||||
|
||||
Effect.Appear = function(element) {
|
||||
var options = Object.extend({
|
||||
from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0),
|
||||
to: 1.0,
|
||||
beforeSetup: function(effect) { with(Element) {
|
||||
setOpacity(effect.element, effect.options.from);
|
||||
show(effect.element); }}
|
||||
}, arguments[1] || {});
|
||||
return new Effect.Opacity(element,options);
|
||||
}
|
||||
|
||||
Effect.Puff = function(element) {
|
||||
element = $(element);
|
||||
var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') };
|
||||
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) { with(Element) {
|
||||
setStyle(effect.effects[0].element, {position: 'absolute'}); }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
hide(effect.effects[0].element);
|
||||
setStyle(effect.effects[0].element, oldStyle); }}
|
||||
}, arguments[1] || {})
|
||||
);
|
||||
}
|
||||
|
||||
Effect.BlindUp = function(element) {
|
||||
element = $(element);
|
||||
Element.makeClipping(element);
|
||||
return new Effect.Scale(element, 0,
|
||||
Object.extend({ scaleContent: false,
|
||||
scaleX: false,
|
||||
restoreAfterFinish: true,
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
[hide, undoClipping].call(effect.element); }}
|
||||
}, arguments[1] || {})
|
||||
);
|
||||
}
|
||||
|
||||
Effect.BlindDown = function(element) {
|
||||
element = $(element);
|
||||
var oldHeight = Element.getStyle(element, 'height');
|
||||
var elementDimensions = Element.getDimensions(element);
|
||||
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) { with(Element) {
|
||||
makeClipping(effect.element);
|
||||
setStyle(effect.element, {height: '0px'});
|
||||
show(effect.element);
|
||||
}},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
undoClipping(effect.element);
|
||||
setStyle(effect.element, {height: oldHeight});
|
||||
}}
|
||||
}, arguments[1] || {})
|
||||
);
|
||||
}
|
||||
|
||||
Effect.SwitchOff = function(element) {
|
||||
element = $(element);
|
||||
var oldOpacity = Element.getInlineOpacity(element);
|
||||
return new Effect.Appear(element, {
|
||||
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) { with(Element) {
|
||||
[makePositioned,makeClipping].call(effect.element);
|
||||
}},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
[hide,undoClipping,undoPositioned].call(effect.element);
|
||||
setStyle(effect.element, {opacity: oldOpacity});
|
||||
}}
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Effect.DropOut = function(element) {
|
||||
element = $(element);
|
||||
var oldStyle = {
|
||||
top: Element.getStyle(element, 'top'),
|
||||
left: Element.getStyle(element, 'left'),
|
||||
opacity: Element.getInlineOpacity(element) };
|
||||
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) { with(Element) {
|
||||
makePositioned(effect.effects[0].element); }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
[hide, undoPositioned].call(effect.effects[0].element);
|
||||
setStyle(effect.effects[0].element, oldStyle); }}
|
||||
}, arguments[1] || {}));
|
||||
}
|
||||
|
||||
Effect.Shake = function(element) {
|
||||
element = $(element);
|
||||
var oldStyle = {
|
||||
top: Element.getStyle(element, 'top'),
|
||||
left: Element.getStyle(element, '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) { with(Element) {
|
||||
undoPositioned(effect.element);
|
||||
setStyle(effect.element, oldStyle);
|
||||
}}}) }}) }}) }}) }}) }});
|
||||
}
|
||||
|
||||
Effect.SlideDown = 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 oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
|
||||
var elementDimensions = Element.getDimensions(element);
|
||||
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) { with(Element) {
|
||||
makePositioned(effect.element);
|
||||
makePositioned(effect.element.firstChild);
|
||||
if(window.opera) setStyle(effect.element, {top: ''});
|
||||
makeClipping(effect.element);
|
||||
setStyle(effect.element, {height: '0px'});
|
||||
show(element); }},
|
||||
afterUpdateInternal: function(effect) { with(Element) {
|
||||
setStyle(effect.element.firstChild, {bottom:
|
||||
(effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
undoClipping(effect.element);
|
||||
undoPositioned(effect.element.firstChild);
|
||||
undoPositioned(effect.element);
|
||||
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
|
||||
}, arguments[1] || {})
|
||||
);
|
||||
}
|
||||
|
||||
Effect.SlideUp = function(element) {
|
||||
element = $(element);
|
||||
Element.cleanWhitespace(element);
|
||||
var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom');
|
||||
return new Effect.Scale(element, 0,
|
||||
Object.extend({ scaleContent: false,
|
||||
scaleX: 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, {bottom:
|
||||
(effect.dims[0] - effect.element.clientHeight) + 'px' }); }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
[hide, undoClipping].call(effect.element);
|
||||
undoPositioned(effect.element.firstChild);
|
||||
undoPositioned(effect.element);
|
||||
setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }}
|
||||
}, 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) { with(Element) {
|
||||
makeClipping(effect.element); }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
hide(effect.element);
|
||||
undoClipping(effect.element); }}
|
||||
});
|
||||
}
|
||||
|
||||
Effect.Grow = function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend({
|
||||
direction: 'center',
|
||||
moveTransistion: 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(element) };
|
||||
|
||||
var dims = Element.getDimensions(element);
|
||||
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) { with(Element) {
|
||||
hide(effect.element);
|
||||
makeClipping(effect.element);
|
||||
makePositioned(effect.element);
|
||||
}},
|
||||
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) { with(Element) {
|
||||
setStyle(effect.effects[0].element, {height: '0px'});
|
||||
show(effect.effects[0].element); }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
[undoClipping, undoPositioned].call(effect.effects[0].element);
|
||||
setStyle(effect.effects[0].element, oldStyle); }}
|
||||
}, options)
|
||||
)
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Effect.Shrink = function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend({
|
||||
direction: 'center',
|
||||
moveTransistion: 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(element) };
|
||||
|
||||
var dims = Element.getDimensions(element);
|
||||
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) { with(Element) {
|
||||
[makePositioned, makeClipping].call(effect.effects[0].element) }},
|
||||
afterFinishInternal: function(effect) { with(Element) {
|
||||
[hide, undoClipping, undoPositioned].call(effect.effects[0].element);
|
||||
setStyle(effect.effects[0].element, oldStyle); }}
|
||||
}, options)
|
||||
);
|
||||
}
|
||||
|
||||
Effect.Pulsate = function(element) {
|
||||
element = $(element);
|
||||
var options = arguments[1] || {};
|
||||
var oldOpacity = Element.getInlineOpacity(element);
|
||||
var transition = options.transition || Effect.Transitions.sinoidal;
|
||||
var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) };
|
||||
reverser.bind(transition);
|
||||
return new Effect.Opacity(element,
|
||||
Object.extend(Object.extend({ duration: 3.0, from: 0,
|
||||
afterFinishInternal: function(effect) { Element.setStyle(effect.element, {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(element);
|
||||
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) { with(Element) {
|
||||
[hide, undoClipping].call(effect.element);
|
||||
setStyle(effect.element, oldStyle);
|
||||
}} });
|
||||
}}, arguments[1] || {}));
|
||||
}
|
||||
BIN
public/js/fancybox/blank.gif
Normal file
|
After Width: | Height: | Size: 43 B |
BIN
public/js/fancybox/fancy_close.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
BIN
public/js/fancybox/fancy_loading.png
Normal file
|
After Width: | Height: | Size: 10 KiB |
BIN
public/js/fancybox/fancy_nav_left.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/js/fancybox/fancy_nav_right.png
Normal file
|
After Width: | Height: | Size: 1.4 KiB |
BIN
public/js/fancybox/fancy_shadow_e.png
Normal file
|
After Width: | Height: | Size: 107 B |
BIN
public/js/fancybox/fancy_shadow_n.png
Normal file
|
After Width: | Height: | Size: 106 B |
BIN
public/js/fancybox/fancy_shadow_ne.png
Normal file
|
After Width: | Height: | Size: 347 B |
BIN
public/js/fancybox/fancy_shadow_nw.png
Normal file
|
After Width: | Height: | Size: 324 B |
BIN
public/js/fancybox/fancy_shadow_s.png
Normal file
|
After Width: | Height: | Size: 111 B |
BIN
public/js/fancybox/fancy_shadow_se.png
Normal file
|
After Width: | Height: | Size: 352 B |
BIN
public/js/fancybox/fancy_shadow_sw.png
Normal file
|
After Width: | Height: | Size: 340 B |
BIN
public/js/fancybox/fancy_shadow_w.png
Normal file
|
After Width: | Height: | Size: 103 B |
BIN
public/js/fancybox/fancy_title_left.png
Normal file
|
After Width: | Height: | Size: 503 B |
BIN
public/js/fancybox/fancy_title_main.png
Normal file
|
After Width: | Height: | Size: 96 B |
BIN
public/js/fancybox/fancy_title_over.png
Normal file
|
After Width: | Height: | Size: 70 B |
BIN
public/js/fancybox/fancy_title_right.png
Normal file
|
After Width: | Height: | Size: 506 B |
BIN
public/js/fancybox/fancybox-x.png
Normal file
|
After Width: | Height: | Size: 203 B |
BIN
public/js/fancybox/fancybox-y.png
Normal file
|
After Width: | Height: | Size: 176 B |
BIN
public/js/fancybox/fancybox.png
Normal file
|
After Width: | Height: | Size: 15 KiB |
72
public/js/fancybox/jquery.easing-1.3.pack.js
Normal file
@@ -0,0 +1,72 @@
|
||||
/*
|
||||
* jQuery Easing v1.3 - http://gsgd.co.uk/sandbox/jquery/easing/
|
||||
*
|
||||
* Uses the built in easing capabilities added In jQuery 1.1
|
||||
* to offer multiple easing options
|
||||
*
|
||||
* TERMS OF USE - jQuery Easing
|
||||
*
|
||||
* Open source under the BSD License.
|
||||
*
|
||||
* Copyright © 2008 George McGinley Smith
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* Neither the name of the author nor the names of contributors may be used to endorse
|
||||
* or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
|
||||
// t: current time, b: begInnIng value, c: change In value, d: duration
|
||||
eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('h.i[\'1a\']=h.i[\'z\'];h.O(h.i,{y:\'D\',z:9(x,t,b,c,d){6 h.i[h.i.y](x,t,b,c,d)},17:9(x,t,b,c,d){6 c*(t/=d)*t+b},D:9(x,t,b,c,d){6-c*(t/=d)*(t-2)+b},13:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t+b;6-c/2*((--t)*(t-2)-1)+b},X:9(x,t,b,c,d){6 c*(t/=d)*t*t+b},U:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t+1)+b},R:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t+b;6 c/2*((t-=2)*t*t+2)+b},N:9(x,t,b,c,d){6 c*(t/=d)*t*t*t+b},M:9(x,t,b,c,d){6-c*((t=t/d-1)*t*t*t-1)+b},L:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t+b;6-c/2*((t-=2)*t*t*t-2)+b},K:9(x,t,b,c,d){6 c*(t/=d)*t*t*t*t+b},J:9(x,t,b,c,d){6 c*((t=t/d-1)*t*t*t*t+1)+b},I:9(x,t,b,c,d){e((t/=d/2)<1)6 c/2*t*t*t*t*t+b;6 c/2*((t-=2)*t*t*t*t+2)+b},G:9(x,t,b,c,d){6-c*8.C(t/d*(8.g/2))+c+b},15:9(x,t,b,c,d){6 c*8.n(t/d*(8.g/2))+b},12:9(x,t,b,c,d){6-c/2*(8.C(8.g*t/d)-1)+b},Z:9(x,t,b,c,d){6(t==0)?b:c*8.j(2,10*(t/d-1))+b},Y:9(x,t,b,c,d){6(t==d)?b+c:c*(-8.j(2,-10*t/d)+1)+b},W:9(x,t,b,c,d){e(t==0)6 b;e(t==d)6 b+c;e((t/=d/2)<1)6 c/2*8.j(2,10*(t-1))+b;6 c/2*(-8.j(2,-10*--t)+2)+b},V:9(x,t,b,c,d){6-c*(8.o(1-(t/=d)*t)-1)+b},S:9(x,t,b,c,d){6 c*8.o(1-(t=t/d-1)*t)+b},Q:9(x,t,b,c,d){e((t/=d/2)<1)6-c/2*(8.o(1-t*t)-1)+b;6 c/2*(8.o(1-(t-=2)*t)+1)+b},P:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6-(a*8.j(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b},H:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d)==1)6 b+c;e(!p)p=d*.3;e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);6 a*8.j(2,-10*t)*8.n((t*d-s)*(2*8.g)/p)+c+b},T:9(x,t,b,c,d){f s=1.l;f p=0;f a=c;e(t==0)6 b;e((t/=d/2)==2)6 b+c;e(!p)p=d*(.3*1.5);e(a<8.w(c)){a=c;f s=p/4}m f s=p/(2*8.g)*8.r(c/a);e(t<1)6-.5*(a*8.j(2,10*(t-=1))*8.n((t*d-s)*(2*8.g)/p))+b;6 a*8.j(2,-10*(t-=1))*8.n((t*d-s)*(2*8.g)/p)*.5+c+b},F:9(x,t,b,c,d,s){e(s==u)s=1.l;6 c*(t/=d)*t*((s+1)*t-s)+b},E:9(x,t,b,c,d,s){e(s==u)s=1.l;6 c*((t=t/d-1)*t*((s+1)*t+s)+1)+b},16:9(x,t,b,c,d,s){e(s==u)s=1.l;e((t/=d/2)<1)6 c/2*(t*t*(((s*=(1.B))+1)*t-s))+b;6 c/2*((t-=2)*t*(((s*=(1.B))+1)*t+s)+2)+b},A:9(x,t,b,c,d){6 c-h.i.v(x,d-t,0,c,d)+b},v:9(x,t,b,c,d){e((t/=d)<(1/2.k)){6 c*(7.q*t*t)+b}m e(t<(2/2.k)){6 c*(7.q*(t-=(1.5/2.k))*t+.k)+b}m e(t<(2.5/2.k)){6 c*(7.q*(t-=(2.14/2.k))*t+.11)+b}m{6 c*(7.q*(t-=(2.18/2.k))*t+.19)+b}},1b:9(x,t,b,c,d){e(t<d/2)6 h.i.A(x,t*2,0,c,d)*.5+b;6 h.i.v(x,t*2-d,0,c,d)*.5+c*.5+b}});',62,74,'||||||return||Math|function|||||if|var|PI|jQuery|easing|pow|75|70158|else|sin|sqrt||5625|asin|||undefined|easeOutBounce|abs||def|swing|easeInBounce|525|cos|easeOutQuad|easeOutBack|easeInBack|easeInSine|easeOutElastic|easeInOutQuint|easeOutQuint|easeInQuint|easeInOutQuart|easeOutQuart|easeInQuart|extend|easeInElastic|easeInOutCirc|easeInOutCubic|easeOutCirc|easeInOutElastic|easeOutCubic|easeInCirc|easeInOutExpo|easeInCubic|easeOutExpo|easeInExpo||9375|easeInOutSine|easeInOutQuad|25|easeOutSine|easeInOutBack|easeInQuad|625|984375|jswing|easeInOutBounce'.split('|'),0,{}))
|
||||
|
||||
/*
|
||||
*
|
||||
* TERMS OF USE - EASING EQUATIONS
|
||||
*
|
||||
* Open source under the BSD License.
|
||||
*
|
||||
* Copyright © 2001 Robert Penner
|
||||
* All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without modification,
|
||||
* are permitted provided that the following conditions are met:
|
||||
*
|
||||
* Redistributions of source code must retain the above copyright notice, this list of
|
||||
* conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above copyright notice, this list
|
||||
* of conditions and the following disclaimer in the documentation and/or other materials
|
||||
* provided with the distribution.
|
||||
*
|
||||
* Neither the name of the author nor the names of contributors may be used to endorse
|
||||
* or promote products derived from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
|
||||
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
* GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
*/
|
||||
367
public/js/fancybox/jquery.fancybox-1.3.4.css
Normal file
@@ -0,0 +1,367 @@
|
||||
/*
|
||||
* FancyBox - jQuery Plugin
|
||||
* Simple and fancy lightbox alternative
|
||||
*
|
||||
* Examples and documentation at: http://fancybox.net
|
||||
*
|
||||
* Copyright (c) 2008 - 2010 Janis Skarnelis
|
||||
* That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
|
||||
*
|
||||
* Version: 1.3.4 (11/11/2010)
|
||||
* Requires: jQuery v1.3+
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
#fancybox-loading {
|
||||
position: fixed;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
margin-top: -20px;
|
||||
margin-left: -20px;
|
||||
cursor: pointer;
|
||||
overflow: hidden;
|
||||
z-index: 1104;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fancybox-loading div {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 40px;
|
||||
height: 480px;
|
||||
background-image: url('fancybox.png');
|
||||
}
|
||||
|
||||
#fancybox-overlay {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
z-index: 1100;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fancybox-tmp {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
overflow: auto;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fancybox-wrap {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
padding: 20px;
|
||||
z-index: 1101;
|
||||
outline: none;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fancybox-outer {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: #fff;
|
||||
border-radius:20px;
|
||||
-webkit-border-radius:20px;
|
||||
-moz-border-radius:20px;
|
||||
}
|
||||
|
||||
#fancybox-content {
|
||||
width: 0;
|
||||
height: 0;
|
||||
padding: 0;
|
||||
outline: none;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
z-index: 1102;
|
||||
border: 0px solid #fff;
|
||||
border-radius:5px;
|
||||
-webkit-border-radius:5px;
|
||||
-moz-border-radius:5px;
|
||||
background:#fff;
|
||||
|
||||
}
|
||||
|
||||
#fancybox-hide-sel-frame {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background: transparent;
|
||||
z-index: 1101;
|
||||
}
|
||||
|
||||
#fancybox-close {
|
||||
position: absolute;
|
||||
top: -15px;
|
||||
right: -15px;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
background: transparent url('fancybox.png') -40px 0px;
|
||||
cursor: pointer;
|
||||
z-index: 1103;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fancybox-error {
|
||||
color: #444;
|
||||
font: normal 12px/20px Arial;
|
||||
padding: 14px;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
#fancybox-img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: none;
|
||||
outline: none;
|
||||
line-height: 0;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
#fancybox-frame {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
border: none;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#fancybox-left, #fancybox-right {
|
||||
position: absolute;
|
||||
bottom: 0px;
|
||||
height: 100%;
|
||||
width: 35%;
|
||||
cursor: pointer;
|
||||
outline: none;
|
||||
background: transparent url('blank.gif');
|
||||
z-index: 1102;
|
||||
display: none;
|
||||
}
|
||||
|
||||
#fancybox-left {
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
#fancybox-right {
|
||||
right: 0px;
|
||||
}
|
||||
|
||||
#fancybox-left-ico, #fancybox-right-ico {
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: -9999px;
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
margin-top: -15px;
|
||||
cursor: pointer;
|
||||
z-index: 1102;
|
||||
display: block;
|
||||
}
|
||||
|
||||
#fancybox-left-ico {
|
||||
background-image: url('fancybox.png');
|
||||
background-position: -40px -30px;
|
||||
}
|
||||
|
||||
#fancybox-right-ico {
|
||||
background-image: url('fancybox.png');
|
||||
background-position: -40px -60px;
|
||||
}
|
||||
|
||||
#fancybox-left:hover, #fancybox-right:hover {
|
||||
visibility: visible; /* IE6 */
|
||||
}
|
||||
|
||||
#fancybox-left:hover span {
|
||||
left: 20px;
|
||||
}
|
||||
|
||||
#fancybox-right:hover span {
|
||||
left: auto;
|
||||
right: 20px;
|
||||
}
|
||||
|
||||
.fancybox-bg {
|
||||
position: absolute;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
z-index: 1001;
|
||||
}
|
||||
|
||||
#fancybox-bg-n {
|
||||
top: -20px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
background-image: url('fancybox-x.png');
|
||||
}
|
||||
|
||||
#fancybox-bg-ne {
|
||||
top: -20px;
|
||||
right: -20px;
|
||||
background-image: url('fancybox.png');
|
||||
background-position: -40px -162px;
|
||||
}
|
||||
|
||||
#fancybox-bg-e {
|
||||
top: 0;
|
||||
right: -20px;
|
||||
height: 100%;
|
||||
background-image: url('fancybox-y.png');
|
||||
background-position: -20px 0px;
|
||||
}
|
||||
|
||||
#fancybox-bg-se {
|
||||
bottom: -20px;
|
||||
right: -20px;
|
||||
background-image: url('fancybox.png');
|
||||
background-position: -40px -182px;
|
||||
}
|
||||
|
||||
#fancybox-bg-s {
|
||||
bottom: -20px;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
background-image: url('fancybox-x.png');
|
||||
background-position: 0px -20px;
|
||||
}
|
||||
|
||||
#fancybox-bg-sw {
|
||||
bottom: -20px;
|
||||
left: -20px;
|
||||
background-image: url('fancybox.png');
|
||||
background-position: -40px -142px;
|
||||
}
|
||||
|
||||
#fancybox-bg-w {
|
||||
top: 0;
|
||||
left: -20px;
|
||||
height: 100%;
|
||||
background-image: url('fancybox-y.png');
|
||||
}
|
||||
|
||||
#fancybox-bg-nw {
|
||||
top: -20px;
|
||||
left: -20px;
|
||||
background-image: url('fancybox.png');
|
||||
background-position: -40px -122px;
|
||||
}
|
||||
|
||||
#fancybox-title {
|
||||
font-family: Helvetica;
|
||||
font-size: 12px;
|
||||
z-index: 1102;
|
||||
}
|
||||
|
||||
.fancybox-title-inside {
|
||||
padding-bottom: 10px;
|
||||
text-align: center;
|
||||
color: #333;
|
||||
background: #fff;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.fancybox-title-outside {
|
||||
padding-top: 10px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.fancybox-title-over {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
color: #FFF;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
#fancybox-title-over {
|
||||
padding: 10px;
|
||||
background-image: url('fancy_title_over.png');
|
||||
display: block;
|
||||
}
|
||||
|
||||
.fancybox-title-float {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
bottom: -20px;
|
||||
height: 32px;
|
||||
}
|
||||
|
||||
#fancybox-title-float-wrap {
|
||||
border: none;
|
||||
border-collapse: collapse;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
#fancybox-title-float-wrap td {
|
||||
border: none;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
#fancybox-title-float-left {
|
||||
padding: 0 0 0 15px;
|
||||
background: url('fancybox.png') -40px -90px no-repeat;
|
||||
}
|
||||
|
||||
#fancybox-title-float-main {
|
||||
color: #FFF;
|
||||
line-height: 29px;
|
||||
font-weight: bold;
|
||||
padding: 0 0 3px 0;
|
||||
background: url('fancybox-x.png') 0px -40px;
|
||||
}
|
||||
|
||||
#fancybox-title-float-right {
|
||||
padding: 0 0 0 15px;
|
||||
background: url('fancybox.png') -55px -90px no-repeat;
|
||||
}
|
||||
|
||||
/* IE6 */
|
||||
|
||||
.fancybox-ie6 #fancybox-close { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_close.png', sizingMethod='scale'); }
|
||||
|
||||
.fancybox-ie6 #fancybox-left-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_left.png', sizingMethod='scale'); }
|
||||
.fancybox-ie6 #fancybox-right-ico { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_nav_right.png', sizingMethod='scale'); }
|
||||
|
||||
.fancybox-ie6 #fancybox-title-over { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_over.png', sizingMethod='scale'); zoom: 1; }
|
||||
.fancybox-ie6 #fancybox-title-float-left { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_left.png', sizingMethod='scale'); }
|
||||
.fancybox-ie6 #fancybox-title-float-main { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_main.png', sizingMethod='scale'); }
|
||||
.fancybox-ie6 #fancybox-title-float-right { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_title_right.png', sizingMethod='scale'); }
|
||||
|
||||
.fancybox-ie6 #fancybox-bg-w, .fancybox-ie6 #fancybox-bg-e, .fancybox-ie6 #fancybox-left, .fancybox-ie6 #fancybox-right, #fancybox-hide-sel-frame {
|
||||
height: expression(this.parentNode.clientHeight + "px");
|
||||
}
|
||||
|
||||
#fancybox-loading.fancybox-ie6 {
|
||||
position: absolute; margin-top: 0;
|
||||
top: expression( (-20 + (document.documentElement.clientHeight ? document.documentElement.clientHeight/2 : document.body.clientHeight/2 ) + ( ignoreMe = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop )) + 'px');
|
||||
}
|
||||
|
||||
#fancybox-loading.fancybox-ie6 div { background: transparent; filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_loading.png', sizingMethod='scale'); }
|
||||
|
||||
/* IE6, IE7, IE8 */
|
||||
|
||||
.fancybox-ie .fancybox-bg { background: transparent !important; }
|
||||
|
||||
.fancybox-ie #fancybox-bg-n { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_n.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-ne { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_ne.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-e { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_e.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-se { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_se.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-s { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_s.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-sw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_sw.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-w { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_w.png', sizingMethod='scale'); }
|
||||
.fancybox-ie #fancybox-bg-nw { filter: progid:DXImageTransform.Microsoft.AlphaImageLoader(src='fancybox/fancy_shadow_nw.png', sizingMethod='scale'); }
|
||||
1156
public/js/fancybox/jquery.fancybox-1.3.4.js
Normal file
46
public/js/fancybox/jquery.fancybox-1.3.4.pack.js
Normal file
@@ -0,0 +1,46 @@
|
||||
/*
|
||||
* FancyBox - jQuery Plugin
|
||||
* Simple and fancy lightbox alternative
|
||||
*
|
||||
* Examples and documentation at: http://fancybox.net
|
||||
*
|
||||
* Copyright (c) 2008 - 2010 Janis Skarnelis
|
||||
* That said, it is hardly a one-person project. Many people have submitted bugs, code, and offered their advice freely. Their support is greatly appreciated.
|
||||
*
|
||||
* Version: 1.3.4 (11/11/2010)
|
||||
* Requires: jQuery v1.3+
|
||||
*
|
||||
* Dual licensed under the MIT and GPL licenses:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
* http://www.gnu.org/licenses/gpl.html
|
||||
*/
|
||||
|
||||
;(function(b){var m,t,u,f,D,j,E,n,z,A,q=0,e={},o=[],p=0,d={},l=[],G=null,v=new Image,J=/\.(jpg|gif|png|bmp|jpeg)(.*)?$/i,W=/[^\.]\.(swf)\s*$/i,K,L=1,y=0,s="",r,i,h=false,B=b.extend(b("<div/>")[0],{prop:0}),M=b.browser.msie&&b.browser.version<7&&!window.XMLHttpRequest,N=function(){t.hide();v.onerror=v.onload=null;G&&G.abort();m.empty()},O=function(){if(false===e.onError(o,q,e)){t.hide();h=false}else{e.titleShow=false;e.width="auto";e.height="auto";m.html('<p id="fancybox-error">The requested content cannot be loaded.<br />Please try again later.</p>');
|
||||
F()}},I=function(){var a=o[q],c,g,k,C,P,w;N();e=b.extend({},b.fn.fancybox.defaults,typeof b(a).data("fancybox")=="undefined"?e:b(a).data("fancybox"));w=e.onStart(o,q,e);if(w===false)h=false;else{if(typeof w=="object")e=b.extend(e,w);k=e.title||(a.nodeName?b(a).attr("title"):a.title)||"";if(a.nodeName&&!e.orig)e.orig=b(a).children("img:first").length?b(a).children("img:first"):b(a);if(k===""&&e.orig&&e.titleFromAlt)k=e.orig.attr("alt");c=e.href||(a.nodeName?b(a).attr("href"):a.href)||null;if(/^(?:javascript)/i.test(c)||
|
||||
c=="#")c=null;if(e.type){g=e.type;if(!c)c=e.content}else if(e.content)g="html";else if(c)g=c.match(J)?"image":c.match(W)?"swf":b(a).hasClass("iframe")?"iframe":c.indexOf("#")===0?"inline":"ajax";if(g){if(g=="inline"){a=c.substr(c.indexOf("#"));g=b(a).length>0?"inline":"ajax"}e.type=g;e.href=c;e.title=k;if(e.autoDimensions)if(e.type=="html"||e.type=="inline"||e.type=="ajax"){e.width="auto";e.height="auto"}else e.autoDimensions=false;if(e.modal){e.overlayShow=true;e.hideOnOverlayClick=false;e.hideOnContentClick=
|
||||
false;e.enableEscapeButton=false;e.showCloseButton=false}e.padding=parseInt(e.padding,10);e.margin=parseInt(e.margin,10);m.css("padding",e.padding+e.margin);b(".fancybox-inline-tmp").unbind("fancybox-cancel").bind("fancybox-change",function(){b(this).replaceWith(j.children())});switch(g){case "html":m.html(e.content);F();break;case "inline":if(b(a).parent().is("#fancybox-content")===true){h=false;break}b('<div class="fancybox-inline-tmp" />').hide().insertBefore(b(a)).bind("fancybox-cleanup",function(){b(this).replaceWith(j.children())}).bind("fancybox-cancel",
|
||||
function(){b(this).replaceWith(m.children())});b(a).appendTo(m);F();break;case "image":h=false;b.fancybox.showActivity();v=new Image;v.onerror=function(){O()};v.onload=function(){h=true;v.onerror=v.onload=null;e.width=v.width;e.height=v.height;b("<img />").attr({id:"fancybox-img",src:v.src,alt:e.title}).appendTo(m);Q()};v.src=c;break;case "swf":e.scrolling="no";C='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="'+e.width+'" height="'+e.height+'"><param name="movie" value="'+c+
|
||||
'"></param>';P="";b.each(e.swf,function(x,H){C+='<param name="'+x+'" value="'+H+'"></param>';P+=" "+x+'="'+H+'"'});C+='<embed src="'+c+'" type="application/x-shockwave-flash" width="'+e.width+'" height="'+e.height+'"'+P+"></embed></object>";m.html(C);F();break;case "ajax":h=false;b.fancybox.showActivity();e.ajax.win=e.ajax.success;G=b.ajax(b.extend({},e.ajax,{url:c,data:e.ajax.data||{},error:function(x){x.status>0&&O()},success:function(x,H,R){if((typeof R=="object"?R:G).status==200){if(typeof e.ajax.win==
|
||||
"function"){w=e.ajax.win(c,x,H,R);if(w===false){t.hide();return}else if(typeof w=="string"||typeof w=="object")x=w}m.html(x);F()}}}));break;case "iframe":Q()}}else O()}},F=function(){var a=e.width,c=e.height;a=a.toString().indexOf("%")>-1?parseInt((b(window).width()-e.margin*2)*parseFloat(a)/100,10)+"px":a=="auto"?"auto":a+"px";c=c.toString().indexOf("%")>-1?parseInt((b(window).height()-e.margin*2)*parseFloat(c)/100,10)+"px":c=="auto"?"auto":c+"px";m.wrapInner('<div style="width:'+a+";height:"+c+
|
||||
";overflow: "+(e.scrolling=="auto"?"auto":e.scrolling=="yes"?"scroll":"hidden")+';position:relative;"></div>');e.width=m.width();e.height=m.height();Q()},Q=function(){var a,c;t.hide();if(f.is(":visible")&&false===d.onCleanup(l,p,d)){b.event.trigger("fancybox-cancel");h=false}else{h=true;b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");f.is(":visible")&&d.titlePosition!=="outside"&&f.css("height",f.height());l=o;p=q;d=e;if(d.overlayShow){u.css({"background-color":d.overlayColor,
|
||||
opacity:d.overlayOpacity,cursor:d.hideOnOverlayClick?"pointer":"auto",height:b(document).height()});if(!u.is(":visible")){M&&b("select:not(#fancybox-tmp select)").filter(function(){return this.style.visibility!=="hidden"}).css({visibility:"hidden"}).one("fancybox-cleanup",function(){this.style.visibility="inherit"});u.show()}}else u.hide();i=X();s=d.title||"";y=0;n.empty().removeAttr("style").removeClass();if(d.titleShow!==false){if(b.isFunction(d.titleFormat))a=d.titleFormat(s,l,p,d);else a=s&&s.length?
|
||||
d.titlePosition=="float"?'<table id="fancybox-title-float-wrap" cellpadding="0" cellspacing="0"><tr><td id="fancybox-title-float-left"></td><td id="fancybox-title-float-main">'+s+'</td><td id="fancybox-title-float-right"></td></tr></table>':'<div id="fancybox-title-'+d.titlePosition+'">'+s+"</div>":false;s=a;if(!(!s||s==="")){n.addClass("fancybox-title-"+d.titlePosition).html(s).appendTo("body").show();switch(d.titlePosition){case "inside":n.css({width:i.width-d.padding*2,marginLeft:d.padding,marginRight:d.padding});
|
||||
y=n.outerHeight(true);n.appendTo(D);i.height+=y;break;case "over":n.css({marginLeft:d.padding,width:i.width-d.padding*2,bottom:d.padding}).appendTo(D);break;case "float":n.css("left",parseInt((n.width()-i.width-40)/2,10)*-1).appendTo(f);break;default:n.css({width:i.width-d.padding*2,paddingLeft:d.padding,paddingRight:d.padding}).appendTo(f)}}}n.hide();if(f.is(":visible")){b(E.add(z).add(A)).hide();a=f.position();r={top:a.top,left:a.left,width:f.width(),height:f.height()};c=r.width==i.width&&r.height==
|
||||
i.height;j.fadeTo(d.changeFade,0.3,function(){var g=function(){j.html(m.contents()).fadeTo(d.changeFade,1,S)};b.event.trigger("fancybox-change");j.empty().removeAttr("filter").css({"border-width":d.padding,width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2});if(c)g();else{B.prop=0;b(B).animate({prop:1},{duration:d.changeSpeed,easing:d.easingChange,step:T,complete:g})}})}else{f.removeAttr("style");j.css("border-width",d.padding);if(d.transitionIn=="elastic"){r=V();j.html(m.contents());
|
||||
f.show();if(d.opacity)i.opacity=0;B.prop=0;b(B).animate({prop:1},{duration:d.speedIn,easing:d.easingIn,step:T,complete:S})}else{d.titlePosition=="inside"&&y>0&&n.show();j.css({width:i.width-d.padding*2,height:e.autoDimensions?"auto":i.height-y-d.padding*2}).html(m.contents());f.css(i).fadeIn(d.transitionIn=="none"?0:d.speedIn,S)}}}},Y=function(){if(d.enableEscapeButton||d.enableKeyboardNav)b(document).bind("keydown.fb",function(a){if(a.keyCode==27&&d.enableEscapeButton){a.preventDefault();b.fancybox.close()}else if((a.keyCode==
|
||||
37||a.keyCode==39)&&d.enableKeyboardNav&&a.target.tagName!=="INPUT"&&a.target.tagName!=="TEXTAREA"&&a.target.tagName!=="SELECT"){a.preventDefault();b.fancybox[a.keyCode==37?"prev":"next"]()}});if(d.showNavArrows){if(d.cyclic&&l.length>1||p!==0)z.show();if(d.cyclic&&l.length>1||p!=l.length-1)A.show()}else{z.hide();A.hide()}},S=function(){if(!b.support.opacity){j.get(0).style.removeAttribute("filter");f.get(0).style.removeAttribute("filter")}e.autoDimensions&&j.css("height","auto");f.css("height","auto");
|
||||
s&&s.length&&n.show();d.showCloseButton&&E.show();Y();d.hideOnContentClick&&j.bind("click",b.fancybox.close);d.hideOnOverlayClick&&u.bind("click",b.fancybox.close);b(window).bind("resize.fb",b.fancybox.resize);d.centerOnScroll&&b(window).bind("scroll.fb",b.fancybox.center);if(d.type=="iframe")b('<iframe id="fancybox-frame" name="fancybox-frame'+(new Date).getTime()+'" frameborder="0" hspace="0" '+(b.browser.msie?'allowtransparency="true""':"")+' scrolling="'+e.scrolling+'" src="'+d.href+'"></iframe>').appendTo(j);
|
||||
f.show();h=false;b.fancybox.center();d.onComplete(l,p,d);var a,c;if(l.length-1>p){a=l[p+1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}if(p>0){a=l[p-1].href;if(typeof a!=="undefined"&&a.match(J)){c=new Image;c.src=a}}},T=function(a){var c={width:parseInt(r.width+(i.width-r.width)*a,10),height:parseInt(r.height+(i.height-r.height)*a,10),top:parseInt(r.top+(i.top-r.top)*a,10),left:parseInt(r.left+(i.left-r.left)*a,10)};if(typeof i.opacity!=="undefined")c.opacity=a<0.5?0.5:a;f.css(c);
|
||||
j.css({width:c.width-d.padding*2,height:c.height-y*a-d.padding*2})},U=function(){return[b(window).width()-d.margin*2,b(window).height()-d.margin*2,b(document).scrollLeft()+d.margin,b(document).scrollTop()+d.margin]},X=function(){var a=U(),c={},g=d.autoScale,k=d.padding*2;c.width=d.width.toString().indexOf("%")>-1?parseInt(a[0]*parseFloat(d.width)/100,10):d.width+k;c.height=d.height.toString().indexOf("%")>-1?parseInt(a[1]*parseFloat(d.height)/100,10):d.height+k;if(g&&(c.width>a[0]||c.height>a[1]))if(e.type==
|
||||
"image"||e.type=="swf"){g=d.width/d.height;if(c.width>a[0]){c.width=a[0];c.height=parseInt((c.width-k)/g+k,10)}if(c.height>a[1]){c.height=a[1];c.width=parseInt((c.height-k)*g+k,10)}}else{c.width=Math.min(c.width,a[0]);c.height=Math.min(c.height,a[1])}c.top=parseInt(Math.max(a[3]-20,a[3]+(a[1]-c.height-40)*0.5),10);c.left=parseInt(Math.max(a[2]-20,a[2]+(a[0]-c.width-40)*0.5),10);return c},V=function(){var a=e.orig?b(e.orig):false,c={};if(a&&a.length){c=a.offset();c.top+=parseInt(a.css("paddingTop"),
|
||||
10)||0;c.left+=parseInt(a.css("paddingLeft"),10)||0;c.top+=parseInt(a.css("border-top-width"),10)||0;c.left+=parseInt(a.css("border-left-width"),10)||0;c.width=a.width();c.height=a.height();c={width:c.width+d.padding*2,height:c.height+d.padding*2,top:c.top-d.padding-20,left:c.left-d.padding-20}}else{a=U();c={width:d.padding*2,height:d.padding*2,top:parseInt(a[3]+a[1]*0.5,10),left:parseInt(a[2]+a[0]*0.5,10)}}return c},Z=function(){if(t.is(":visible")){b("div",t).css("top",L*-40+"px");L=(L+1)%12}else clearInterval(K)};
|
||||
b.fn.fancybox=function(a){if(!b(this).length)return this;b(this).data("fancybox",b.extend({},a,b.metadata?b(this).metadata():{})).unbind("click.fb").bind("click.fb",function(c){c.preventDefault();if(!h){h=true;b(this).blur();o=[];q=0;c=b(this).attr("rel")||"";if(!c||c==""||c==="nofollow")o.push(this);else{o=b("a[rel="+c+"], area[rel="+c+"]");q=o.index(this)}I()}});return this};b.fancybox=function(a,c){var g;if(!h){h=true;g=typeof c!=="undefined"?c:{};o=[];q=parseInt(g.index,10)||0;if(b.isArray(a)){for(var k=
|
||||
0,C=a.length;k<C;k++)if(typeof a[k]=="object")b(a[k]).data("fancybox",b.extend({},g,a[k]));else a[k]=b({}).data("fancybox",b.extend({content:a[k]},g));o=jQuery.merge(o,a)}else{if(typeof a=="object")b(a).data("fancybox",b.extend({},g,a));else a=b({}).data("fancybox",b.extend({content:a},g));o.push(a)}if(q>o.length||q<0)q=0;I()}};b.fancybox.showActivity=function(){clearInterval(K);t.show();K=setInterval(Z,66)};b.fancybox.hideActivity=function(){t.hide()};b.fancybox.next=function(){return b.fancybox.pos(p+
|
||||
1)};b.fancybox.prev=function(){return b.fancybox.pos(p-1)};b.fancybox.pos=function(a){if(!h){a=parseInt(a);o=l;if(a>-1&&a<l.length){q=a;I()}else if(d.cyclic&&l.length>1){q=a>=l.length?0:l.length-1;I()}}};b.fancybox.cancel=function(){if(!h){h=true;b.event.trigger("fancybox-cancel");N();e.onCancel(o,q,e);h=false}};b.fancybox.close=function(){function a(){u.fadeOut("fast");n.empty().hide();f.hide();b.event.trigger("fancybox-cleanup");j.empty();d.onClosed(l,p,d);l=e=[];p=q=0;d=e={};h=false}if(!(h||f.is(":hidden"))){h=
|
||||
true;if(d&&false===d.onCleanup(l,p,d))h=false;else{N();b(E.add(z).add(A)).hide();b(j.add(u)).unbind();b(window).unbind("resize.fb scroll.fb");b(document).unbind("keydown.fb");j.find("iframe").attr("src",M&&/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank");d.titlePosition!=="inside"&&n.empty();f.stop();if(d.transitionOut=="elastic"){r=V();var c=f.position();i={top:c.top,left:c.left,width:f.width(),height:f.height()};if(d.opacity)i.opacity=1;n.empty().hide();B.prop=1;
|
||||
b(B).animate({prop:0},{duration:d.speedOut,easing:d.easingOut,step:T,complete:a})}else f.fadeOut(d.transitionOut=="none"?0:d.speedOut,a)}}};b.fancybox.resize=function(){u.is(":visible")&&u.css("height",b(document).height());b.fancybox.center(true)};b.fancybox.center=function(a){var c,g;if(!h){g=a===true?1:0;c=U();!g&&(f.width()>c[0]||f.height()>c[1])||f.stop().animate({top:parseInt(Math.max(c[3]-20,c[3]+(c[1]-j.height()-40)*0.5-d.padding)),left:parseInt(Math.max(c[2]-20,c[2]+(c[0]-j.width()-40)*0.5-
|
||||
d.padding))},typeof a=="number"?a:200)}};b.fancybox.init=function(){if(!b("#fancybox-wrap").length){b("body").append(m=b('<div id="fancybox-tmp"></div>'),t=b('<div id="fancybox-loading"><div></div></div>'),u=b('<div id="fancybox-overlay"></div>'),f=b('<div id="fancybox-wrap"></div>'));D=b('<div id="fancybox-outer"></div>').append('<div class="fancybox-bg" id="fancybox-bg-n"></div><div class="fancybox-bg" id="fancybox-bg-ne"></div><div class="fancybox-bg" id="fancybox-bg-e"></div><div class="fancybox-bg" id="fancybox-bg-se"></div><div class="fancybox-bg" id="fancybox-bg-s"></div><div class="fancybox-bg" id="fancybox-bg-sw"></div><div class="fancybox-bg" id="fancybox-bg-w"></div><div class="fancybox-bg" id="fancybox-bg-nw"></div>').appendTo(f);
|
||||
D.append(j=b('<div id="fancybox-content"></div>'),E=b('<a id="fancybox-close"></a>'),n=b('<div id="fancybox-title"></div>'),z=b('<a href="javascript:;" id="fancybox-left"><span class="fancy-ico" id="fancybox-left-ico"></span></a>'),A=b('<a href="javascript:;" id="fancybox-right"><span class="fancy-ico" id="fancybox-right-ico"></span></a>'));E.click(b.fancybox.close);t.click(b.fancybox.cancel);z.click(function(a){a.preventDefault();b.fancybox.prev()});A.click(function(a){a.preventDefault();b.fancybox.next()});
|
||||
b.fn.mousewheel&&f.bind("mousewheel.fb",function(a,c){if(h)a.preventDefault();else if(b(a.target).get(0).clientHeight==0||b(a.target).get(0).scrollHeight===b(a.target).get(0).clientHeight){a.preventDefault();b.fancybox[c>0?"prev":"next"]()}});b.support.opacity||f.addClass("fancybox-ie");if(M){t.addClass("fancybox-ie6");f.addClass("fancybox-ie6");b('<iframe id="fancybox-hide-sel-frame" src="'+(/^https/i.test(window.location.href||"")?"javascript:void(false)":"about:blank")+'" scrolling="no" border="0" frameborder="0" tabindex="-1"></iframe>').prependTo(D)}}};
|
||||
b.fn.fancybox.defaults={padding:10,margin:40,opacity:false,modal:false,cyclic:false,scrolling:"auto",width:560,height:340,autoScale:true,autoDimensions:true,centerOnScroll:false,ajax:{},swf:{wmode:"transparent"},hideOnOverlayClick:true,hideOnContentClick:false,overlayShow:true,overlayOpacity:0.7,overlayColor:"#777",titleShow:true,titlePosition:"float",titleFormat:null,titleFromAlt:false,transitionIn:"fade",transitionOut:"fade",speedIn:300,speedOut:300,changeSpeed:300,changeFade:"fast",easingIn:"swing",
|
||||
easingOut:"swing",showCloseButton:true,showNavArrows:true,enableEscapeButton:true,enableKeyboardNav:true,onStart:function(){},onCancel:function(){},onComplete:function(){},onCleanup:function(){},onClosed:function(){},onError:function(){}};b(document).ready(function(){b.fancybox.init()})})(jQuery);
|
||||
14
public/js/fancybox/jquery.mousewheel-3.0.4.pack.js
Normal file
@@ -0,0 +1,14 @@
|
||||
/*! Copyright (c) 2010 Brandon Aaron (http://brandonaaron.net)
|
||||
* Licensed under the MIT License (LICENSE.txt).
|
||||
*
|
||||
* Thanks to: http://adomas.org/javascript-mouse-wheel/ for some pointers.
|
||||
* Thanks to: Mathias Bank(http://www.mathias-bank.de) for a scope bug fix.
|
||||
* Thanks to: Seamus Leahy for adding deltaX and deltaY
|
||||
*
|
||||
* Version: 3.0.4
|
||||
*
|
||||
* Requires: 1.2.2+
|
||||
*/
|
||||
|
||||
(function(d){function g(a){var b=a||window.event,i=[].slice.call(arguments,1),c=0,h=0,e=0;a=d.event.fix(b);a.type="mousewheel";if(a.wheelDelta)c=a.wheelDelta/120;if(a.detail)c=-a.detail/3;e=c;if(b.axis!==undefined&&b.axis===b.HORIZONTAL_AXIS){e=0;h=-1*c}if(b.wheelDeltaY!==undefined)e=b.wheelDeltaY/120;if(b.wheelDeltaX!==undefined)h=-1*b.wheelDeltaX/120;i.unshift(a,c,h,e);return d.event.handle.apply(this,i)}var f=["DOMMouseScroll","mousewheel"];d.event.special.mousewheel={setup:function(){if(this.addEventListener)for(var a=
|
||||
f.length;a;)this.addEventListener(f[--a],g,false);else this.onmousewheel=g},teardown:function(){if(this.removeEventListener)for(var a=f.length;a;)this.removeEventListener(f[--a],g,false);else this.onmousewheel=null}};d.fn.extend({mousewheel:function(a){return a?this.bind("mousewheel",a):this.trigger("mousewheel")},unmousewheel:function(a){return this.unbind("mousewheel",a)}})})(jQuery);
|
||||
13
public/js/flickity.pkgd.min.js
vendored
Normal file
270
public/js/forum_fn.js
Normal file
@@ -0,0 +1,270 @@
|
||||
/**
|
||||
* phpBB3 forum functions
|
||||
*/
|
||||
|
||||
/**
|
||||
* Window popup
|
||||
*/
|
||||
function popup(url, width, height, name)
|
||||
{
|
||||
if (!name)
|
||||
{
|
||||
name = '_popup';
|
||||
}
|
||||
|
||||
window.open(url.replace(/&/g, '&'), name, 'height=' + height + ',resizable=yes,scrollbars=yes, width=' + width);
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Jump to page
|
||||
*/
|
||||
function jumpto()
|
||||
{
|
||||
var page = prompt(jump_page, on_page);
|
||||
|
||||
if (page !== null && !isNaN(page) && page == Math.floor(page) && page > 0)
|
||||
{
|
||||
if (base_url.indexOf('?') == -1)
|
||||
{
|
||||
document.location.href = base_url + '?start=' + ((page - 1) * per_page);
|
||||
}
|
||||
else
|
||||
{
|
||||
document.location.href = base_url.replace(/&/g, '&') + '&start=' + ((page - 1) * per_page);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark/unmark checklist
|
||||
* id = ID of parent container, name = name prefix, state = state [true/false]
|
||||
*/
|
||||
function marklist(id, name, state)
|
||||
{
|
||||
var parent = document.getElementById(id);
|
||||
if (!parent)
|
||||
{
|
||||
eval('parent = document.' + id);
|
||||
}
|
||||
|
||||
if (!parent)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
var rb = parent.getElementsByTagName('input');
|
||||
|
||||
for (var r = 0; r < rb.length; r++)
|
||||
{
|
||||
if (rb[r].name.substr(0, name.length) == name)
|
||||
{
|
||||
rb[r].checked = state;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Resize viewable area for attached image or topic review panel (possibly others to come)
|
||||
* e = element
|
||||
*/
|
||||
function viewableArea(e, itself)
|
||||
{
|
||||
if (!e) return;
|
||||
if (!itself)
|
||||
{
|
||||
e = e.parentNode;
|
||||
}
|
||||
|
||||
if (!e.vaHeight)
|
||||
{
|
||||
// Store viewable area height before changing style to auto
|
||||
e.vaHeight = e.offsetHeight;
|
||||
e.vaMaxHeight = e.style.maxHeight;
|
||||
e.style.height = 'auto';
|
||||
e.style.maxHeight = 'none';
|
||||
e.style.overflow = 'visible';
|
||||
}
|
||||
else
|
||||
{
|
||||
// Restore viewable area height to the default
|
||||
e.style.height = e.vaHeight + 'px';
|
||||
e.style.overflow = 'auto';
|
||||
e.style.maxHeight = e.vaMaxHeight;
|
||||
e.vaHeight = false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set display of page element
|
||||
* s[-1,0,1] = hide,toggle display,show
|
||||
*/
|
||||
function dE(n, s)
|
||||
{
|
||||
var e = document.getElementById(n);
|
||||
|
||||
if (!s)
|
||||
{
|
||||
s = (e.style.display == '' || e.style.display == 'block') ? -1 : 1;
|
||||
}
|
||||
e.style.display = (s == 1) ? 'block' : 'none';
|
||||
}
|
||||
|
||||
/**
|
||||
* Alternate display of subPanels
|
||||
*/
|
||||
function subPanels(p)
|
||||
{
|
||||
var i, e, t;
|
||||
|
||||
if (typeof(p) == 'string')
|
||||
{
|
||||
show_panel = p;
|
||||
}
|
||||
|
||||
for (i = 0; i < panels.length; i++)
|
||||
{
|
||||
e = document.getElementById(panels[i]);
|
||||
t = document.getElementById(panels[i] + '-tab');
|
||||
|
||||
if (e)
|
||||
{
|
||||
if (panels[i] == show_panel)
|
||||
{
|
||||
e.style.display = 'block';
|
||||
if (t)
|
||||
{
|
||||
t.className = 'activetab';
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
e.style.display = 'none';
|
||||
if (t)
|
||||
{
|
||||
t.className = '';
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Call print preview
|
||||
*/
|
||||
function printPage()
|
||||
{
|
||||
if (is_ie)
|
||||
{
|
||||
printPreview();
|
||||
}
|
||||
else
|
||||
{
|
||||
window.print();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Show/hide groups of blocks
|
||||
* c = CSS style name
|
||||
* e = checkbox element
|
||||
* t = toggle dispay state (used to show 'grip-show' image in the profile block when hiding the profiles)
|
||||
*/
|
||||
function displayBlocks(c, e, t)
|
||||
{
|
||||
var s = (e.checked == true) ? 1 : -1;
|
||||
|
||||
if (t)
|
||||
{
|
||||
s *= -1;
|
||||
}
|
||||
|
||||
var divs = document.getElementsByTagName("DIV");
|
||||
|
||||
for (var d = 0; d < divs.length; d++)
|
||||
{
|
||||
if (divs[d].className.indexOf(c) == 0)
|
||||
{
|
||||
divs[d].style.display = (s == 1) ? 'none' : 'block';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function selectCode(a)
|
||||
{
|
||||
// Get ID of code block
|
||||
var e = a.parentNode.parentNode.getElementsByTagName('CODE')[0];
|
||||
|
||||
// Not IE
|
||||
if (window.getSelection)
|
||||
{
|
||||
var s = window.getSelection();
|
||||
// Safari
|
||||
if (s.setBaseAndExtent)
|
||||
{
|
||||
s.setBaseAndExtent(e, 0, e, e.innerText.length - 1);
|
||||
}
|
||||
// Firefox and Opera
|
||||
else
|
||||
{
|
||||
// workaround for bug # 42885
|
||||
if (window.opera && e.innerHTML.substring(e.innerHTML.length - 4) == '<BR>')
|
||||
{
|
||||
e.innerHTML = e.innerHTML + ' ';
|
||||
}
|
||||
|
||||
var r = document.createRange();
|
||||
r.selectNodeContents(e);
|
||||
s.removeAllRanges();
|
||||
s.addRange(r);
|
||||
}
|
||||
}
|
||||
// Some older browsers
|
||||
else if (document.getSelection)
|
||||
{
|
||||
var s = document.getSelection();
|
||||
var r = document.createRange();
|
||||
r.selectNodeContents(e);
|
||||
s.removeAllRanges();
|
||||
s.addRange(r);
|
||||
}
|
||||
// IE
|
||||
else if (document.selection)
|
||||
{
|
||||
var r = document.body.createTextRange();
|
||||
r.moveToElementText(e);
|
||||
r.select();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Play quicktime file by determining it's width/height
|
||||
* from the displayed rectangle area
|
||||
*/
|
||||
function play_qt_file(obj)
|
||||
{
|
||||
var rectangle = obj.GetRectangle();
|
||||
|
||||
if (rectangle)
|
||||
{
|
||||
rectangle = rectangle.split(',');
|
||||
var x1 = parseInt(rectangle[0]);
|
||||
var x2 = parseInt(rectangle[2]);
|
||||
var y1 = parseInt(rectangle[1]);
|
||||
var y2 = parseInt(rectangle[3]);
|
||||
|
||||
var width = (x1 < 0) ? (x1 * -1) + x2 : x2 - x1;
|
||||
var height = (y1 < 0) ? (y1 * -1) + y2 : y2 - y1;
|
||||
}
|
||||
else
|
||||
{
|
||||
var width = 200;
|
||||
var height = 0;
|
||||
}
|
||||
|
||||
obj.width = width;
|
||||
obj.height = height + 16;
|
||||
|
||||
obj.SetControllerVisible(true);
|
||||
obj.Play();
|
||||
}
|
||||
480
public/js/global.js
Normal file
@@ -0,0 +1,480 @@
|
||||
//Initial js functions to run when js document is loaded
|
||||
checkBrowserWidth();
|
||||
|
||||
//Load when the page is ready - Using jQuery to run events
|
||||
$(document).ready(function(){
|
||||
|
||||
parseCode('thickbox-code/thickbox.js','ajaxJS');
|
||||
parseCode('thickbox-code/thickbox.css','ajaxCSS');
|
||||
|
||||
$(window).resize(checkBrowserWidth);
|
||||
$('div.roundbox').corner('round 9px');
|
||||
$('div.anchor').corner('round bottom 9px');
|
||||
$.tabs('container-1');
|
||||
$.tabs('container-2');
|
||||
$.tabs('container-3');
|
||||
$.tabs('container-4');
|
||||
$.tabs('container-5');
|
||||
$.tabs('container-6');
|
||||
|
||||
$('#overviewBtn').click(function(){
|
||||
$('#overviewTitle').ScrollTo(800)
|
||||
if(document.getElementById('overview').style.display == "none"){$('#overview').slideDown(500);$('#toggleBtnOverview').html('-')};
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#examplesBtn').click(function(){
|
||||
$('#examplesTitle').ScrollTo(800);
|
||||
if(document.getElementById('examples').style.display == "none"){$('#examples').slideDown(500);$('#toggleBtnExample').html('-')};
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#qaBtn').click(function(){
|
||||
$('#qaTitle').ScrollTo(800);
|
||||
if(document.getElementById('qa').style.display == "none"){$('#qa').slideDown(500);$('#toggleBtnQa').html('-')};
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#supportBtn').click(function(){
|
||||
$('#supportTitle').ScrollTo(800);
|
||||
if(document.getElementById('support').style.display == "none"){$('#support').slideDown(500);$('#toggleBtnSupport').html('-')};
|
||||
return false;
|
||||
});
|
||||
|
||||
$('#donateBtn').click(function(){
|
||||
$('#donateTitle').ScrollTo(800);
|
||||
if(document.getElementById('donate').style.display == "none"){$('#donate').slideDown(500);$('#toggleBtnDonate').html('-')};
|
||||
return false;
|
||||
});
|
||||
|
||||
$('.BTT').click(function(){$('#pageTop').ScrollTo(800);return false});
|
||||
|
||||
$(".toggleBtn").toggle(function(){
|
||||
if(document.getElementById(this.rel).style.display == "none"){$("#" + this.rel).slideDown(500);this.innerHTML = "-";return};
|
||||
this.innerHTML = "+";
|
||||
|
||||
$("#" + this.rel).slideUp(500);
|
||||
},function(){
|
||||
if(document.getElementById(this.rel).style.display == "block"){$("#" + this.rel).slideUp(500); this.innerHTML = "+";return};
|
||||
this.innerHTML = "-";
|
||||
$("#" + this.rel).slideDown(500);
|
||||
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
/////////////////////////// ajax call to get code off the server for display dependent code ///////////////////////////////////////
|
||||
function parseCode(o,placement){
|
||||
$.get(o,function(code){
|
||||
code=code.replace(/&/mg,'&');
|
||||
code=code.replace(/</mg,'<');
|
||||
code=code.replace(/>/mg,'>');
|
||||
code=code.replace(/\"/mg,'"');
|
||||
code=code.replace(/\t/g,' ');
|
||||
code=code.replace(/\r?\n/g,'<br>');
|
||||
code=code.replace(/<br><br>/g,'<br>');
|
||||
code=code.replace(/ /g,' ');
|
||||
$('#'+placement).html(code);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/////////////////////////// resolution dependent code ////////////////////////////////////////////////////////////////////////////////
|
||||
function checkBrowserWidth(){
|
||||
var theWidth = getBrowserWidth();
|
||||
if (theWidth == 0){
|
||||
var resolutionCookie = document.cookie.match(/(^|;)tmib_res_layout[^;]*(;|$)/);
|
||||
|
||||
if (resolutionCookie != null){
|
||||
setStylesheet(unescape(resolutionCookie[0].split("=")[1]));
|
||||
}
|
||||
|
||||
$(document).load(checkBrowserWidth);
|
||||
return false;
|
||||
}
|
||||
|
||||
if (theWidth > 900){
|
||||
setStylesheet("1024 x 768");
|
||||
document.cookie = "tmib_res_layout=" + escape("1024 x 768");
|
||||
}else{
|
||||
setStylesheet("");
|
||||
document.cookie = "tmib_res_layout=";
|
||||
}
|
||||
return true;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
function getBrowserWidth(){
|
||||
if (window.innerWidth){
|
||||
return window.innerWidth;
|
||||
}else if (document.documentElement && document.documentElement.clientWidth != 0){
|
||||
return document.documentElement.clientWidth;}
|
||||
else if (document.body){
|
||||
return document.body.clientWidth;
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
function setStylesheet(styleTitle){
|
||||
var currTag;
|
||||
|
||||
if (document.getElementsByTagName){
|
||||
for (var i = 0; (currTag = document.getElementsByTagName("link")[i]); i++){
|
||||
if (currTag.getAttribute("rel").indexOf("style") != -1 && currTag.getAttribute("title")){
|
||||
currTag.disabled = true;
|
||||
if(currTag.getAttribute("title") == styleTitle){
|
||||
currTag.disabled = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
};
|
||||
|
||||
/////////////////////////// round corners jquery plugin ////////////////////////////////////////////////////////////////////////////////
|
||||
$.fn.corner = function(o)
|
||||
{
|
||||
o = o || "";
|
||||
var width = parseInt((o.match(/(\d+)px/)||[])[1]) || 10;
|
||||
var fx = (o.match(/round|bevel|fold|notch/)||["round"])[0];
|
||||
var opts = {
|
||||
TL: /top|tl/i.test(o), TR: /top|tr/i.test(o),
|
||||
BL: /bottom|bl/i.test(o), BR: /bottom|br/i.test(o)//,
|
||||
};
|
||||
if ( !opts.TL && !opts.TR && !opts.BL && !opts.BR )
|
||||
opts = { TL:1, TR:1, BL:1, BR:1 };
|
||||
var strip = document.createElement("div");
|
||||
strip.style.overflow = "hidden";
|
||||
strip.style.height = "1px";
|
||||
strip.style.backgroundColor = "transparent";
|
||||
strip.style.borderStyle = "solid";
|
||||
return this.each(function(){
|
||||
var pad = {
|
||||
T: parseInt($.css(this,"paddingTop"))||0,
|
||||
R: parseInt($.css(this,"paddingRight"))||0,
|
||||
B: parseInt($.css(this,"paddingBottom"))||0,
|
||||
L: parseInt($.css(this,"paddingLeft"))||0
|
||||
};
|
||||
strip.style.borderColor = "#ffffff";
|
||||
if ( opts.TL || opts.TR ) {
|
||||
strip.style.borderStyle = "none "+(opts.TR?"solid":"none")+" none "+(opts.TL?"solid":"none");
|
||||
var t=document.createElement("div");
|
||||
t.style.margin = "-"+pad.T+"px -"+pad.R+"px "+(pad.T-width)+"px -"+pad.L+"px";
|
||||
t.style.backgroundColor = "transparent";
|
||||
for ( var i=0; i < width; i++ ) {
|
||||
var w = fx=="round" ? Math.round(width*(1-Math.cos(Math.asin(i/width)))) : i+1;
|
||||
var e = strip.cloneNode(false);
|
||||
e.style.borderWidth = "0 "+(opts.TR?w:0)+"px 0 "+(opts.TL?w:0)+"px";
|
||||
t.insertBefore(e, t.firstChild);
|
||||
}
|
||||
this.insertBefore(t, this.firstChild);
|
||||
}
|
||||
if ( opts.BL || opts.BR ) {
|
||||
strip.style.borderStyle = "none "+(opts.BR?"solid":"none")+" none "+(opts.BL?"solid":"none");
|
||||
var b=document.createElement("div");
|
||||
b.style.margin = (pad.B-width)+"px -"+pad.R+"px -"+pad.B+"px -"+pad.L+"px";
|
||||
b.style.backgroundColor = "transparent";
|
||||
for ( var i=0; i < width; i++ ) {
|
||||
var w = fx=="round" ? Math.round(width*(1-Math.cos(Math.asin(i/width)))) : i+1;
|
||||
var e = strip.cloneNode(false);
|
||||
e.style.borderWidth = "0 "+(opts.BR?w:0)+"px 0 "+(opts.BL?w:0)+"px";
|
||||
b.appendChild(e);
|
||||
}
|
||||
this.appendChild(b);
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
//////////////////// tabs jquery plugin ////////////////////////////////////////////////////////////////////////////
|
||||
$.tabs = function(containerId, start) {
|
||||
var ON_CLASS = 'on';
|
||||
var id = '#' + containerId;
|
||||
var i = (typeof start == "number") ? start - 1 : 0;
|
||||
$(id + '>div:eq(' + i + ')').css({display:"block"});
|
||||
$(id + '>ul>li:nth-child(' + (i+1) + ')').addClass(ON_CLASS);
|
||||
$(id + '>ul>li>a').click(function() {
|
||||
if (!$(this.parentNode).is('.' + ON_CLASS)) {
|
||||
var re = /([_\-\w]+$)/i;
|
||||
var target = $('#' + re.exec(this.href)[1]);
|
||||
if (target.size() > 0) {
|
||||
$(id + '>div:visible').css({display:"none"});
|
||||
target.css({display:"block"});
|
||||
$(id + '>ul>li').removeClass(ON_CLASS);
|
||||
$(this.parentNode).addClass(ON_CLASS);
|
||||
} else {
|
||||
alert('There is no such container.');
|
||||
}
|
||||
}
|
||||
return false;
|
||||
});
|
||||
};
|
||||
|
||||
//////////////////// Unobtrustive Code Highlighter By Dan Webb ////////////////////////////////////////////////////////////////////////////
|
||||
var CodeHighlighter = { styleSets : new Array };
|
||||
|
||||
CodeHighlighter.addStyle = function(name, rules) {
|
||||
// using push test to disallow older browsers from adding styleSets
|
||||
if ([].push) this.styleSets.push({
|
||||
name : name,
|
||||
rules : rules,
|
||||
ignoreCase : arguments[2] || false
|
||||
})
|
||||
|
||||
function setEvent() {
|
||||
setTimeout('$(document).ready(function(){CodeHighlighter.init()})',1000)
|
||||
}
|
||||
|
||||
// only set the event when the first style is added
|
||||
if (this.styleSets.length==1) setEvent();
|
||||
}
|
||||
|
||||
CodeHighlighter.init = function() {
|
||||
if (!document.getElementsByTagName) return;
|
||||
if ("a".replace(/a/, function() {return "b"}) != "b") return; // throw out Safari versions that don't support replace function
|
||||
// throw out older browsers
|
||||
|
||||
var codeEls = document.getElementsByTagName("CODE");
|
||||
// collect array of all pre elements
|
||||
codeEls.filter = function(f) {
|
||||
var a = new Array;
|
||||
for (var i = 0; i < this.length; i++) if (f(this[i])) a[a.length] = this[i];
|
||||
return a;
|
||||
}
|
||||
|
||||
var rules = new Array;
|
||||
rules.toString = function() {
|
||||
// joins regexes into one big parallel regex
|
||||
var exps = new Array;
|
||||
for (var i = 0; i < this.length; i++) exps.push(this[i].exp);
|
||||
return exps.join("|");
|
||||
}
|
||||
|
||||
function addRule(className, rule) {
|
||||
// add a replace rule
|
||||
var exp = (typeof rule.exp != "string")?String(rule.exp).substr(1, String(rule.exp).length-2):rule.exp;
|
||||
// converts regex rules to strings and chops of the slashes
|
||||
rules.push({
|
||||
className : className,
|
||||
exp : "(" + exp + ")",
|
||||
length : (exp.match(/(^|[^\\])\([^?]/g) || "").length + 1, // number of subexps in rule
|
||||
replacement : rule.replacement || null
|
||||
});
|
||||
}
|
||||
|
||||
function parse(text, ignoreCase) {
|
||||
// main text parsing and replacement
|
||||
return text.replace(new RegExp(rules, (ignoreCase)?"gi":"g"), function() {
|
||||
var i = 0, j = 1, rule;
|
||||
while (rule = rules[i++]) {
|
||||
if (arguments[j]) {
|
||||
// if no custom replacement defined do the simple replacement
|
||||
if (!rule.replacement) return "<span class=\"" + rule.className + "\">" + arguments[0] + "</span>";
|
||||
else {
|
||||
// replace $0 with the className then do normal replaces
|
||||
var str = rule.replacement.replace("$0", rule.className);
|
||||
for (var k = 1; k <= rule.length - 1; k++) str = str.replace("$" + k, arguments[j + k]);
|
||||
return str;
|
||||
}
|
||||
} else j+= rule.length;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function highlightCode(styleSet) {
|
||||
// clear rules array
|
||||
var parsed;
|
||||
rules.length = 0;
|
||||
|
||||
// get stylable elements by filtering out all code elements without the correct className
|
||||
var stylableEls = codeEls.filter(function(item) {return (item.className.indexOf(styleSet.name)>=0)});
|
||||
|
||||
// add style rules to parser
|
||||
for (var className in styleSet.rules) addRule(className, styleSet.rules[className]);
|
||||
|
||||
|
||||
// replace for all elements
|
||||
for (var i = 0; i < stylableEls.length; i++) {
|
||||
// EVIL hack to fix IE whitespace badness if it's inside a <pre>
|
||||
if (/MSIE/.test(navigator.appVersion) && stylableEls[i].parentNode.nodeName == 'PRE') {
|
||||
stylableEls[i] = stylableEls[i].parentNode;
|
||||
|
||||
parsed = stylableEls[i].innerHTML.replace(/(<code[^>]*>)([^<]*)<\/code>/i, function() {
|
||||
return arguments[1] + parse(arguments[2], styleSet.ignoreCase) + "</code>"
|
||||
});
|
||||
parsed = parsed.replace(/\n( *)/g, function() {
|
||||
var spaces = "";
|
||||
for (var i = 0; i < arguments[1].length; i++) spaces+= " ";
|
||||
return "\n" + spaces;
|
||||
});
|
||||
parsed = parsed.replace(/\t/g, " ");
|
||||
parsed = parsed.replace(/\n(<\/\w+>)?/g, "<br />$1").replace(/<br \/>[\n\r\s]*<br \/>/g, "<p><br></p>");
|
||||
|
||||
} else parsed = parse(stylableEls[i].innerHTML, styleSet.ignoreCase);
|
||||
|
||||
stylableEls[i].innerHTML = parsed;
|
||||
}
|
||||
}
|
||||
|
||||
// run highlighter on all stylesets
|
||||
for (var i in this.styleSets) highlightCode(this.styleSets[i]);
|
||||
}
|
||||
|
||||
CodeHighlighter.addStyle("javascript",{
|
||||
comment : {
|
||||
exp : /(\/\/[^\n]*\n)|(\/\*[^*]*\*+([^\/][^*]*\*+)*\/)/
|
||||
},
|
||||
brackets : {
|
||||
exp : /\(|\)/
|
||||
},
|
||||
string : {
|
||||
exp : /'[^']*'|"[^"]*"/
|
||||
},
|
||||
keywords : {
|
||||
exp : /\b(arguments|break|case|continue|default|delete|do|else|false|for|function|if|in|instanceof|new|null|return|switch|this|true|typeof|var|void|while|with)\b/
|
||||
},
|
||||
global : {
|
||||
exp : /\b(toString|valueOf|window|element|prototype|constructor|document|escape|unescape|parseInt|parseFloat|setTimeout|clearTimeout|setInterval|clearInterval|NaN|isNaN|Infinity)\b/
|
||||
}
|
||||
});
|
||||
|
||||
CodeHighlighter.addStyle("html", {
|
||||
comment : {
|
||||
exp: /<!\s*(--([^-]|[\r\n]|-[^-])*--\s*)>/
|
||||
},
|
||||
tag : {
|
||||
exp: /(<\/?)([a-zA-Z]+\s?)/,
|
||||
replacement: "$1<span class=\"$0\">$2</span>"
|
||||
},
|
||||
string : {
|
||||
exp : /'[^']*'|"[^"]*"/
|
||||
},
|
||||
attribute : {
|
||||
exp: /\b([a-zA-Z-:]+)(=)/,
|
||||
replacement: "<span class=\"$0\">$1</span>$2"
|
||||
},
|
||||
doctype : {
|
||||
exp: /<!DOCTYPE([^&]|&[^g]|&g[^t])*>/
|
||||
}
|
||||
});
|
||||
|
||||
CodeHighlighter.addStyle("css", {
|
||||
comment : {
|
||||
exp : /\/\*[^*]*\*+([^\/][^*]*\*+)*\//
|
||||
},
|
||||
keywords : {
|
||||
exp : /@\w[\w\s]*/
|
||||
},
|
||||
selectors : {
|
||||
exp : "([\\w-:\\[.#][^{};>]*)(?={)"
|
||||
},
|
||||
properties : {
|
||||
exp : "([\\w-]+)(?=\\s*:)"
|
||||
},
|
||||
units : {
|
||||
exp : /([0-9])(em|en|px|%|pt)\b/,
|
||||
replacement : "$1<span class=\"$0\">$2</span>"
|
||||
},
|
||||
urls : {
|
||||
exp : /url\([^\)]*\)/
|
||||
}
|
||||
});
|
||||
|
||||
//////////////////// scroll ////////////////////////////////////////////////////////////////////////////
|
||||
jQuery.getPos = function (e)
|
||||
{
|
||||
var l = 0;
|
||||
var t = 0;
|
||||
var w = jQuery.intval(jQuery.css(e,'width'));
|
||||
var h = jQuery.intval(jQuery.css(e,'height'));
|
||||
var wb = e.offsetWidth;
|
||||
var hb = e.offsetHeight;
|
||||
while (e.offsetParent){
|
||||
l += e.offsetLeft + (e.currentStyle?jQuery.intval(e.currentStyle.borderLeftWidth):0);
|
||||
t += e.offsetTop + (e.currentStyle?jQuery.intval(e.currentStyle.borderTopWidth):0);
|
||||
e = e.offsetParent;
|
||||
}
|
||||
l += e.offsetLeft + (e.currentStyle?jQuery.intval(e.currentStyle.borderLeftWidth):0);
|
||||
t += e.offsetTop + (e.currentStyle?jQuery.intval(e.currentStyle.borderTopWidth):0);
|
||||
return {x:l, y:t, w:w, h:h, wb:wb, hb:hb};
|
||||
};
|
||||
jQuery.getClient = function(e)
|
||||
{
|
||||
if (e) {
|
||||
w = e.clientWidth;
|
||||
h = e.clientHeight;
|
||||
} else {
|
||||
w = (window.innerWidth) ? window.innerWidth : (document.documentElement && document.documentElement.clientWidth) ? document.documentElement.clientWidth : document.body.offsetWidth;
|
||||
h = (window.innerHeight) ? window.innerHeight : (document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : document.body.offsetHeight;
|
||||
}
|
||||
return {w:w,h:h};
|
||||
};
|
||||
jQuery.getScroll = function (e)
|
||||
{
|
||||
if (e) {
|
||||
t = e.scrollTop;
|
||||
l = e.scrollLeft;
|
||||
w = e.scrollWidth;
|
||||
h = e.scrollHeight;
|
||||
} else {
|
||||
if (document.documentElement && document.documentElement.scrollTop) {
|
||||
t = document.documentElement.scrollTop;
|
||||
l = document.documentElement.scrollLeft;
|
||||
w = document.documentElement.scrollWidth;
|
||||
h = document.documentElement.scrollHeight;
|
||||
} else if (document.body) {
|
||||
t = document.body.scrollTop;
|
||||
l = document.body.scrollLeft;
|
||||
w = document.body.scrollWidth;
|
||||
h = document.body.scrollHeight;
|
||||
}
|
||||
}
|
||||
return { t: t, l: l, w: w, h: h };
|
||||
};
|
||||
|
||||
jQuery.intval = function (v)
|
||||
{
|
||||
v = parseInt(v);
|
||||
return isNaN(v) ? 0 : v;
|
||||
};
|
||||
|
||||
jQuery.fn.ScrollTo = function(s) {
|
||||
o = jQuery.speed(s);
|
||||
return this.each(function(){
|
||||
new jQuery.fx.ScrollTo(this, o);
|
||||
});
|
||||
};
|
||||
|
||||
jQuery.fx.ScrollTo = function (e, o)
|
||||
{
|
||||
var z = this;
|
||||
z.o = o;
|
||||
z.e = e;
|
||||
z.p = jQuery.getPos(e);
|
||||
z.s = jQuery.getScroll();
|
||||
z.clear = function(){clearInterval(z.timer);z.timer=null};
|
||||
z.t=(new Date).getTime();
|
||||
z.step = function(){
|
||||
var t = (new Date).getTime();
|
||||
var p = (t - z.t) / z.o.duration;
|
||||
if (t >= z.o.duration+z.t) {
|
||||
z.clear();
|
||||
setTimeout(function(){z.scroll(z.p.y, z.p.x)},13);
|
||||
} else {
|
||||
st = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.y-z.s.t) + z.s.t;
|
||||
sl = ((-Math.cos(p*Math.PI)/2) + 0.5) * (z.p.x-z.s.l) + z.s.l;
|
||||
z.scroll(st, sl);
|
||||
}
|
||||
};
|
||||
z.scroll = function (t, l){window.scrollTo(l, t)};
|
||||
z.timer=setInterval(function(){z.step();},13);
|
||||
};
|
||||
7
public/js/imagesloaded.pkgd.min.js
vendored
Normal file
19
public/js/jquery-1.3.2.min.js
vendored
Normal file
1
public/js/jquery-latest.pack.js
Normal file
9
public/js/jquery.bootstrap-autohidingnavbar.min.js
vendored
Normal file
@@ -0,0 +1,9 @@
|
||||
/*
|
||||
* Bootstrap Auto-Hiding Navbar - v1.0.0
|
||||
* An extension for Bootstrap's fixed navbar which hides the navbar while the page is scrolling downwards and shows it the other way. The plugin is able to show/hide the navbar programmatically as well.
|
||||
* http://www.virtuosoft.eu/code/bootstrap-autohidingnavbar/
|
||||
*
|
||||
* Made by István Ujj-Mészáros
|
||||
* Under Apache License v2.0 License
|
||||
*/
|
||||
!function(a,b,c,d){function e(b,c){this.element=a(b),this.settings=a.extend({},w,c),this._defaults=w,this._name=m,this.init()}function f(b){v&&(b.element.addClass("navbar-hidden").animate({top:-b.element.height()},{queue:!1,duration:b.settings.animationDuration}),a(".dropdown.open .dropdown-toggle",b.element).dropdown("toggle"),v=!1)}function g(a){v||(a.element.removeClass("navbar-hidden").animate({top:0},{queue:!1,duration:a.settings.animationDuration}),v=!0)}function h(a){var b=n.scrollTop(),c=b-t;if(t=b,0>c){if(v)return;(a.settings.showOnUpscroll||l>=b)&&g(a)}else if(c>0){if(!v)return void(a.settings.showOnBottom&&b+u===o.height()&&g(a));b>=l&&f(a)}}function i(a){a.settings.disableAutohide||(s=(new Date).getTime(),h(a))}function j(a){o.on("scroll."+m,function(){(new Date).getTime()-s>r?i(a):(clearTimeout(p),p=setTimeout(function(){i(a)},r))}),n.on("resize."+m,function(){clearTimeout(q),q=setTimeout(function(){u=n.height()},r)})}function k(){o.off("."+m),n.off("."+m)}var l,m="autoHidingNavbar",n=a(b),o=a(c),p=null,q=null,r=70,s=0,t=null,u=n.height(),v=!0,w={disableAutohide:!1,showOnUpscroll:!0,showOnBottom:!0,hideOffset:"auto",animationDuration:200};e.prototype={init:function(){return this.elements={navbar:this.element},this.setDisableAutohide(this.settings.disableAutohide),this.setShowOnUpscroll(this.settings.showOnUpscroll),this.setShowOnBottom(this.settings.showOnBottom),this.setHideOffset(this.settings.hideOffset),this.setAnimationDuration(this.settings.animationDuration),l="auto"===this.settings.hideOffset?this.element.height():this.settings.hideOffset,j(this),this.element},setDisableAutohide:function(a){return this.settings.disableAutohide=a,this.element},setShowOnUpscroll:function(a){return this.settings.showOnUpscroll=a,this.element},setShowOnBottom:function(a){return this.settings.showOnBottom=a,this.element},setHideOffset:function(a){return this.settings.hideOffset=a,this.element},setAnimationDuration:function(a){return this.settings.animationDuration=a,this.element},show:function(){return g(this),this.element},hide:function(){return f(this),this.element},destroy:function(){return k(this),g(this),a.data(this,"plugin_"+m,null),this.element}},a.fn[m]=function(b){var c=arguments;if(b===d||"object"==typeof b)return this.each(function(){a.data(this,"plugin_"+m)||a.data(this,"plugin_"+m,new e(this,b))});if("string"==typeof b&&"_"!==b[0]&&"init"!==b){var f;return this.each(function(){var d=a.data(this,"plugin_"+m);d instanceof e&&"function"==typeof d[b]&&(f=d[b].apply(d,Array.prototype.slice.call(c,1)))}),f!==d?f:this}}}(jQuery,window,document);
|
||||
161
public/js/jquery.elastic.source.js
Normal file
@@ -0,0 +1,161 @@
|
||||
/**
|
||||
* @name Elastic
|
||||
* @descripton Elastic is jQuery plugin that grow and shrink your textareas automatically
|
||||
* @version 1.6.10
|
||||
* @requires jQuery 1.2.6+
|
||||
*
|
||||
* @author Jan Jarfalk
|
||||
* @author-email jan.jarfalk@unwrongest.com
|
||||
* @author-website http://www.unwrongest.com
|
||||
*
|
||||
* @licence MIT License - http://www.opensource.org/licenses/mit-license.php
|
||||
*/
|
||||
|
||||
(function(jQuery){
|
||||
jQuery.fn.extend({
|
||||
elastic: function() {
|
||||
|
||||
// We will create a div clone of the textarea
|
||||
// by copying these attributes from the textarea to the div.
|
||||
var mimics = [
|
||||
'paddingTop',
|
||||
'paddingRight',
|
||||
'paddingBottom',
|
||||
'paddingLeft',
|
||||
'fontSize',
|
||||
'lineHeight',
|
||||
'fontFamily',
|
||||
'width',
|
||||
'fontWeight',
|
||||
'border-top-width',
|
||||
'border-right-width',
|
||||
'border-bottom-width',
|
||||
'border-left-width',
|
||||
'borderTopStyle',
|
||||
'borderTopColor',
|
||||
'borderRightStyle',
|
||||
'borderRightColor',
|
||||
'borderBottomStyle',
|
||||
'borderBottomColor',
|
||||
'borderLeftStyle',
|
||||
'borderLeftColor'
|
||||
];
|
||||
|
||||
return this.each( function() {
|
||||
|
||||
// Elastic only works on textareas
|
||||
if ( this.type !== 'textarea' ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
var $textarea = jQuery(this),
|
||||
$twin = jQuery('<div />').css({'position': 'absolute','display':'none','word-wrap':'break-word'}),
|
||||
lineHeight = parseInt($textarea.css('line-height'),10) || parseInt($textarea.css('font-size'),'10'),
|
||||
minheight = parseInt($textarea.css('height'),10) || lineHeight*3,
|
||||
maxheight = parseInt($textarea.css('max-height'),10) || Number.MAX_VALUE,
|
||||
goalheight = 0;
|
||||
|
||||
// Opera returns max-height of -1 if not set
|
||||
if (maxheight < 0) { maxheight = Number.MAX_VALUE; }
|
||||
|
||||
// Append the twin to the DOM
|
||||
// We are going to meassure the height of this, not the textarea.
|
||||
$twin.appendTo($textarea.parent());
|
||||
|
||||
// Copy the essential styles (mimics) from the textarea to the twin
|
||||
var i = mimics.length;
|
||||
while(i--){
|
||||
$twin.css(mimics[i].toString(),$textarea.css(mimics[i].toString()));
|
||||
}
|
||||
|
||||
// Updates the width of the twin. (solution for textareas with widths in percent)
|
||||
function setTwinWidth(){
|
||||
curatedWidth = Math.floor(parseInt($textarea.width(),10));
|
||||
if($twin.width() !== curatedWidth){
|
||||
$twin.css({'width': curatedWidth + 'px'});
|
||||
|
||||
// Update height of textarea
|
||||
update(true);
|
||||
}
|
||||
}
|
||||
|
||||
// Sets a given height and overflow state on the textarea
|
||||
function setHeightAndOverflow(height, overflow){
|
||||
|
||||
var curratedHeight = Math.floor(parseInt(height,10));
|
||||
if($textarea.height() !== curratedHeight){
|
||||
$textarea.css({'height': curratedHeight + 'px','overflow':overflow});
|
||||
|
||||
// Fire the custom event resize
|
||||
$textarea.trigger('resize');
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
// This function will update the height of the textarea if necessary
|
||||
function update(forced) {
|
||||
|
||||
// Get curated content from the textarea.
|
||||
var textareaContent = $textarea.val().replace(/&/g,'&').replace(/ {2}/g, ' ').replace(/<|>/g, '>').replace(/\n/g, '<br />');
|
||||
|
||||
// Compare curated content with curated twin.
|
||||
var twinContent = $twin.html().replace(/<br>/ig,'<br />');
|
||||
|
||||
if(forced || textareaContent+' ' !== twinContent){
|
||||
|
||||
// Add an extra white space so new rows are added when you are at the end of a row.
|
||||
$twin.html(textareaContent+' ');
|
||||
|
||||
// Change textarea height if twin plus the height of one line differs more than 3 pixel from textarea height
|
||||
if(Math.abs($twin.height() + lineHeight - $textarea.height()) > 3){
|
||||
|
||||
var goalheight = $twin.height()+lineHeight;
|
||||
if(goalheight >= maxheight) {
|
||||
setHeightAndOverflow(maxheight,'auto');
|
||||
} else if(goalheight <= minheight) {
|
||||
setHeightAndOverflow(minheight,'hidden');
|
||||
} else {
|
||||
setHeightAndOverflow(goalheight,'hidden');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Hide scrollbars
|
||||
$textarea.css({'overflow':'hidden'});
|
||||
|
||||
// Update textarea size on keyup, change, cut and paste
|
||||
$textarea.bind('keyup change cut paste', function(){
|
||||
update();
|
||||
});
|
||||
|
||||
// Update width of twin if browser or textarea is resized (solution for textareas with widths in percent)
|
||||
$(window).bind('resize', setTwinWidth);
|
||||
$textarea.bind('resize', setTwinWidth);
|
||||
$textarea.bind('update', update);
|
||||
|
||||
// Compact textarea on blur
|
||||
$textarea.bind('blur',function(){
|
||||
if($twin.height() < maxheight){
|
||||
if($twin.height() > minheight) {
|
||||
$textarea.height($twin.height());
|
||||
} else {
|
||||
$textarea.height(minheight);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// And this line is to catch the browser paste event
|
||||
$textarea.bind('input paste',function(e){ setTimeout( update, 250); });
|
||||
|
||||
// Run update once when elastic is initialized
|
||||
update();
|
||||
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
})(jQuery);
|
||||
13
public/js/jquery.isotope.min.js
vendored
Normal file
99
public/js/jquery.newsticker.js
Normal file
@@ -0,0 +1,99 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2006/2007 Sam Collett (http://www.texotela.co.uk)
|
||||
* Licensed under the MIT License:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
* Version 2.0
|
||||
* Demo: http://www.texotela.co.uk/code/jquery/newsticker/
|
||||
*
|
||||
* $LastChangedDate$
|
||||
* $Rev$
|
||||
*
|
||||
*/
|
||||
|
||||
(function($) {
|
||||
/*
|
||||
* A basic news ticker.
|
||||
*
|
||||
* @name newsticker (or newsTicker)
|
||||
* @param delay Delay (in milliseconds) between iterations. Default 4 seconds (4000ms)
|
||||
* @author Sam Collett (http://www.texotela.co.uk)
|
||||
* @example $("#news").newsticker(); // or $("#news").newsTicker(5000);
|
||||
*
|
||||
*/
|
||||
$.fn.newsTicker = $.fn.newsticker = function(delay)
|
||||
{
|
||||
delay = delay || 4000;
|
||||
initTicker = function(el)
|
||||
{
|
||||
stopTicker(el);
|
||||
el.items = $("li", el);
|
||||
// hide all items (except first one)
|
||||
el.items.not(":eq(0)").hide().end();
|
||||
// current item
|
||||
el.currentitem = 0;
|
||||
startTicker(el);
|
||||
};
|
||||
startTicker = function(el)
|
||||
{
|
||||
el.tickfn = setInterval(function() { doTick(el) }, delay)
|
||||
};
|
||||
stopTicker = function(el)
|
||||
{
|
||||
clearInterval(el.tickfn);
|
||||
};
|
||||
pauseTicker = function(el)
|
||||
{
|
||||
el.pause = true;
|
||||
};
|
||||
resumeTicker = function(el)
|
||||
{
|
||||
el.pause = false;
|
||||
};
|
||||
doTick = function(el)
|
||||
{
|
||||
// don't run if paused
|
||||
if(el.pause) return;
|
||||
// pause until animation has finished
|
||||
el.pause = true;
|
||||
// hide current item
|
||||
$(el.items[el.currentitem]).fadeOut("slow",
|
||||
function()
|
||||
{
|
||||
$(this).hide();
|
||||
// move to next item and show
|
||||
el.currentitem = ++el.currentitem % (el.items.size());
|
||||
$(el.items[el.currentitem]).fadeIn("slow",
|
||||
function()
|
||||
{
|
||||
el.pause = false;
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
};
|
||||
this.each(
|
||||
function()
|
||||
{
|
||||
if(this.nodeName.toLowerCase()!= "ul") return;
|
||||
initTicker(this);
|
||||
}
|
||||
)
|
||||
.addClass("newsticker")
|
||||
.hover(
|
||||
function()
|
||||
{
|
||||
// pause if hovered over
|
||||
pauseTicker(this);
|
||||
},
|
||||
function()
|
||||
{
|
||||
// resume when not hovered over
|
||||
resumeTicker(this);
|
||||
}
|
||||
);
|
||||
return this;
|
||||
};
|
||||
|
||||
})(jQuery);
|
||||
83
public/js/jquery.prettyPhoto.js
Normal file
@@ -0,0 +1,83 @@
|
||||
/* ------------------------------------------------------------------------
|
||||
Class: prettyPhoto
|
||||
Use: Lightbox clone for jQuery
|
||||
Author: Stephane Caron (http://www.no-margin-for-errors.com)
|
||||
Version: 3.1.4
|
||||
------------------------------------------------------------------------- */
|
||||
|
||||
(function($){$.prettyPhoto={version:'3.1.4'};$.fn.prettyPhoto=function(pp_settings){pp_settings=jQuery.extend({hook:'rel',animation_speed:'fast',ajaxcallback:function(){},slideshow:5000,autoplay_slideshow:false,opacity:0.80,show_title:true,allow_resize:true,allow_expand:true,default_width:500,default_height:344,counter_separator_label:'/',theme:'pp_default',horizontal_padding:20,hideflash:false,wmode:'opaque',autoplay:true,modal:false,deeplinking:true,overlay_gallery:true,overlay_gallery_max:30,keyboard_shortcuts:true,changepicturecallback:function(){},callback:function(){},ie6_fallback:true,markup:'<div class="pp_pic_holder"> \
|
||||
<div class="ppt"> </div> \
|
||||
<div class="pp_top"> \
|
||||
<div class="pp_left"></div> \
|
||||
<div class="pp_middle"></div> \
|
||||
<div class="pp_right"></div> \
|
||||
</div> \
|
||||
<div class="pp_content_container"> \
|
||||
<div class="pp_left"> \
|
||||
<div class="pp_right"> \
|
||||
<div class="pp_content"> \
|
||||
<div class="pp_loaderIcon"></div> \
|
||||
<div class="pp_fade"> \
|
||||
<a href="#" class="pp_expand" title="Expand the image">Expand</a> \
|
||||
<div class="pp_hoverContainer"> \
|
||||
<a class="pp_next" href="#">next</a> \
|
||||
<a class="pp_previous" href="#">previous</a> \
|
||||
</div> \
|
||||
<div id="pp_full_res"></div> \
|
||||
<div class="pp_details"> \
|
||||
<div class="pp_nav"> \
|
||||
<a href="#" class="pp_arrow_previous">Previous</a> \
|
||||
<p class="currentTextHolder">0/0</p> \
|
||||
<a href="#" class="pp_arrow_next">Next</a> \
|
||||
</div> \
|
||||
<p class="pp_description"></p> \
|
||||
<div class="pp_social">{pp_social}</div> \
|
||||
<a class="pp_close" href="#">Close</a> \
|
||||
</div> \
|
||||
</div> \
|
||||
</div> \
|
||||
</div> \
|
||||
</div> \
|
||||
</div> \
|
||||
<div class="pp_bottom"> \
|
||||
<div class="pp_left"></div> \
|
||||
<div class="pp_middle"></div> \
|
||||
<div class="pp_right"></div> \
|
||||
</div> \
|
||||
</div> \
|
||||
<div class="pp_overlay"></div>',gallery_markup:'<div class="pp_gallery"> \
|
||||
<a href="#" class="pp_arrow_previous">Previous</a> \
|
||||
<div> \
|
||||
<ul> \
|
||||
{gallery} \
|
||||
</ul> \
|
||||
</div> \
|
||||
<a href="#" class="pp_arrow_next">Next</a> \
|
||||
</div>',image_markup:'<img id="fullResImage" src="{path}" />',flash_markup:'<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="{width}" height="{height}"><param name="wmode" value="{wmode}" /><param name="allowfullscreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="movie" value="{path}" /><embed src="{path}" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="{width}" height="{height}" wmode="{wmode}"></embed></object>',quicktime_markup:'<object classid="clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B" codebase="http://www.apple.com/qtactivex/qtplugin.cab" height="{height}" width="{width}"><param name="src" value="{path}"><param name="autoplay" value="{autoplay}"><param name="type" value="video/quicktime"><embed src="{path}" height="{height}" width="{width}" autoplay="{autoplay}" type="video/quicktime" pluginspage="http://www.apple.com/quicktime/download/"></embed></object>',iframe_markup:'<iframe src ="{path}" width="{width}" height="{height}" frameborder="no"></iframe>',inline_markup:'<div class="pp_inline">{content}</div>',custom_markup:'',social_tools:'<div class="twitter"><a href="http://twitter.com/share" class="twitter-share-button" data-count="none">Tweet</a><script type="text/javascript" src="http://platform.twitter.com/widgets.js"></script></div><div class="facebook"><iframe src="//www.facebook.com/plugins/like.php?locale=en_US&href={location_href}&layout=button_count&show_faces=true&width=500&action=like&font&colorscheme=light&height=23" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:500px; height:23px;" allowTransparency="true"></iframe></div>'},pp_settings);var matchedObjects=this,percentBased=false,pp_dimensions,pp_open,pp_contentHeight,pp_contentWidth,pp_containerHeight,pp_containerWidth,windowHeight=$(window).height(),windowWidth=$(window).width(),pp_slideshow;doresize=true,scroll_pos=_get_scroll();$(window).unbind('resize.prettyphoto').bind('resize.prettyphoto',function(){_center_overlay();_resize_overlay();});if(pp_settings.keyboard_shortcuts){$(document).unbind('keydown.prettyphoto').bind('keydown.prettyphoto',function(e){if(typeof $pp_pic_holder!='undefined'){if($pp_pic_holder.is(':visible')){switch(e.keyCode){case 37:$.prettyPhoto.changePage('previous');e.preventDefault();break;case 39:$.prettyPhoto.changePage('next');e.preventDefault();break;case 27:if(!settings.modal)
|
||||
$.prettyPhoto.close();e.preventDefault();break;};};};});};$.prettyPhoto.initialize=function(){settings=pp_settings;if(settings.theme=='pp_default')settings.horizontal_padding=16;if(settings.ie6_fallback&&$.browser.msie&&parseInt($.browser.version)==6)settings.theme="light_square";theRel=$(this).attr(settings.hook);galleryRegExp=/\[(?:.*)\]/;isSet=(galleryRegExp.exec(theRel))?true:false;pp_images=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr(settings.hook).indexOf(theRel)!=-1)return $(n).attr('href');}):$.makeArray($(this).attr('href'));pp_titles=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr(settings.hook).indexOf(theRel)!=-1)return($(n).find('img').attr('alt'))?$(n).find('img').attr('alt'):"";}):$.makeArray($(this).find('img').attr('alt'));pp_descriptions=(isSet)?jQuery.map(matchedObjects,function(n,i){if($(n).attr(settings.hook).indexOf(theRel)!=-1)return($(n).attr('title'))?$(n).attr('title'):"";}):$.makeArray($(this).attr('title'));if(pp_images.length>settings.overlay_gallery_max)settings.overlay_gallery=false;set_position=jQuery.inArray($(this).attr('href'),pp_images);rel_index=(isSet)?set_position:$("a["+settings.hook+"^='"+theRel+"']").index($(this));_build_overlay(this);if(settings.allow_resize)
|
||||
$(window).bind('scroll.prettyphoto',function(){_center_overlay();});$.prettyPhoto.open();return false;}
|
||||
$.prettyPhoto.open=function(event){if(typeof settings=="undefined"){settings=pp_settings;if($.browser.msie&&$.browser.version==6)settings.theme="light_square";pp_images=$.makeArray(arguments[0]);pp_titles=(arguments[1])?$.makeArray(arguments[1]):$.makeArray("");pp_descriptions=(arguments[2])?$.makeArray(arguments[2]):$.makeArray("");isSet=(pp_images.length>1)?true:false;set_position=(arguments[3])?arguments[3]:0;_build_overlay(event.target);}
|
||||
if($.browser.msie&&$.browser.version==6)$('select').css('visibility','hidden');if(settings.hideflash)$('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','hidden');_checkPosition($(pp_images).size());$('.pp_loaderIcon').show();if(settings.deeplinking)
|
||||
setHashtag();if(settings.social_tools){facebook_like_link=settings.social_tools.replace('{location_href}',encodeURIComponent(location.href));$pp_pic_holder.find('.pp_social').html(facebook_like_link);}
|
||||
if($ppt.is(':hidden'))$ppt.css('opacity',0).show();$pp_overlay.show().fadeTo(settings.animation_speed,settings.opacity);$pp_pic_holder.find('.currentTextHolder').text((set_position+1)+settings.counter_separator_label+$(pp_images).size());if(typeof pp_descriptions[set_position]!='undefined'&&pp_descriptions[set_position]!=""){$pp_pic_holder.find('.pp_description').show().html(unescape(pp_descriptions[set_position]));}else{$pp_pic_holder.find('.pp_description').hide();}
|
||||
movie_width=(parseFloat(getParam('width',pp_images[set_position])))?getParam('width',pp_images[set_position]):settings.default_width.toString();movie_height=(parseFloat(getParam('height',pp_images[set_position])))?getParam('height',pp_images[set_position]):settings.default_height.toString();percentBased=false;if(movie_height.indexOf('%')!=-1){movie_height=parseFloat(($(window).height()*parseFloat(movie_height)/100)-150);percentBased=true;}
|
||||
if(movie_width.indexOf('%')!=-1){movie_width=parseFloat(($(window).width()*parseFloat(movie_width)/100)-150);percentBased=true;}
|
||||
$pp_pic_holder.fadeIn(function(){(settings.show_title&&pp_titles[set_position]!=""&&typeof pp_titles[set_position]!="undefined")?$ppt.html(unescape(pp_titles[set_position])):$ppt.html(' ');imgPreloader="";skipInjection=false;switch(_getFileType(pp_images[set_position])){case'image':imgPreloader=new Image();nextImage=new Image();if(isSet&&set_position<$(pp_images).size()-1)nextImage.src=pp_images[set_position+1];prevImage=new Image();if(isSet&&pp_images[set_position-1])prevImage.src=pp_images[set_position-1];$pp_pic_holder.find('#pp_full_res')[0].innerHTML=settings.image_markup.replace(/{path}/g,pp_images[set_position]);imgPreloader.onload=function(){pp_dimensions=_fitToViewport(imgPreloader.width,imgPreloader.height);_showContent();};imgPreloader.onerror=function(){alert('Image cannot be loaded. Make sure the path is correct and image exist.');$.prettyPhoto.close();};imgPreloader.src=pp_images[set_position];break;case'youtube':pp_dimensions=_fitToViewport(movie_width,movie_height);movie_id=getParam('v',pp_images[set_position]);if(movie_id==""){movie_id=pp_images[set_position].split('youtu.be/');movie_id=movie_id[1];if(movie_id.indexOf('?')>0)
|
||||
movie_id=movie_id.substr(0,movie_id.indexOf('?'));if(movie_id.indexOf('&')>0)
|
||||
movie_id=movie_id.substr(0,movie_id.indexOf('&'));}
|
||||
movie='http://www.youtube.com/embed/'+movie_id;(getParam('rel',pp_images[set_position]))?movie+="?rel="+getParam('rel',pp_images[set_position]):movie+="?rel=1";if(settings.autoplay)movie+="&autoplay=1";toInject=settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,movie);break;case'vimeo':pp_dimensions=_fitToViewport(movie_width,movie_height);movie_id=pp_images[set_position];var regExp=/http:\/\/(www\.)?vimeo.com\/(\d+)/;var match=movie_id.match(regExp);movie='http://player.vimeo.com/video/'+match[2]+'?title=0&byline=0&portrait=0';if(settings.autoplay)movie+="&autoplay=1;";vimeo_width=pp_dimensions['width']+'/embed/?moog_width='+pp_dimensions['width'];toInject=settings.iframe_markup.replace(/{width}/g,vimeo_width).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,movie);break;case'quicktime':pp_dimensions=_fitToViewport(movie_width,movie_height);pp_dimensions['height']+=15;pp_dimensions['contentHeight']+=15;pp_dimensions['containerHeight']+=15;toInject=settings.quicktime_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,pp_images[set_position]).replace(/{autoplay}/g,settings.autoplay);break;case'flash':pp_dimensions=_fitToViewport(movie_width,movie_height);flash_vars=pp_images[set_position];flash_vars=flash_vars.substring(pp_images[set_position].indexOf('flashvars')+10,pp_images[set_position].length);filename=pp_images[set_position];filename=filename.substring(0,filename.indexOf('?'));toInject=settings.flash_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{wmode}/g,settings.wmode).replace(/{path}/g,filename+'?'+flash_vars);break;case'iframe':pp_dimensions=_fitToViewport(movie_width,movie_height);frame_url=pp_images[set_position];frame_url=frame_url.substr(0,frame_url.indexOf('iframe')-1);toInject=settings.iframe_markup.replace(/{width}/g,pp_dimensions['width']).replace(/{height}/g,pp_dimensions['height']).replace(/{path}/g,frame_url);break;case'ajax':doresize=false;pp_dimensions=_fitToViewport(movie_width,movie_height);doresize=true;skipInjection=true;$.get(pp_images[set_position],function(responseHTML){toInject=settings.inline_markup.replace(/{content}/g,responseHTML);$pp_pic_holder.find('#pp_full_res')[0].innerHTML=toInject;_showContent();});break;case'custom':pp_dimensions=_fitToViewport(movie_width,movie_height);toInject=settings.custom_markup;break;case'inline':myClone=$(pp_images[set_position]).clone().append('<br clear="all" />').css({'width':settings.default_width}).wrapInner('<div id="pp_full_res"><div class="pp_inline"></div></div>').appendTo($('body')).show();doresize=false;pp_dimensions=_fitToViewport($(myClone).width(),$(myClone).height());doresize=true;$(myClone).remove();toInject=settings.inline_markup.replace(/{content}/g,$(pp_images[set_position]).html());break;};if(!imgPreloader&&!skipInjection){$pp_pic_holder.find('#pp_full_res')[0].innerHTML=toInject;_showContent();};});return false;};$.prettyPhoto.changePage=function(direction){currentGalleryPage=0;if(direction=='previous'){set_position--;if(set_position<0)set_position=$(pp_images).size()-1;}else if(direction=='next'){set_position++;if(set_position>$(pp_images).size()-1)set_position=0;}else{set_position=direction;};rel_index=set_position;if(!doresize)doresize=true;if(settings.allow_expand){$('.pp_contract').removeClass('pp_contract').addClass('pp_expand');}
|
||||
_hideContent(function(){$.prettyPhoto.open();});};$.prettyPhoto.changeGalleryPage=function(direction){if(direction=='next'){currentGalleryPage++;if(currentGalleryPage>totalPage)currentGalleryPage=0;}else if(direction=='previous'){currentGalleryPage--;if(currentGalleryPage<0)currentGalleryPage=totalPage;}else{currentGalleryPage=direction;};slide_speed=(direction=='next'||direction=='previous')?settings.animation_speed:0;slide_to=currentGalleryPage*(itemsPerPage*itemWidth);$pp_gallery.find('ul').animate({left:-slide_to},slide_speed);};$.prettyPhoto.startSlideshow=function(){if(typeof pp_slideshow=='undefined'){$pp_pic_holder.find('.pp_play').unbind('click').removeClass('pp_play').addClass('pp_pause').click(function(){$.prettyPhoto.stopSlideshow();return false;});pp_slideshow=setInterval($.prettyPhoto.startSlideshow,settings.slideshow);}else{$.prettyPhoto.changePage('next');};}
|
||||
$.prettyPhoto.stopSlideshow=function(){$pp_pic_holder.find('.pp_pause').unbind('click').removeClass('pp_pause').addClass('pp_play').click(function(){$.prettyPhoto.startSlideshow();return false;});clearInterval(pp_slideshow);pp_slideshow=undefined;}
|
||||
$.prettyPhoto.close=function(){if($pp_overlay.is(":animated"))return;$.prettyPhoto.stopSlideshow();$pp_pic_holder.stop().find('object,embed').css('visibility','hidden');$('div.pp_pic_holder,div.ppt,.pp_fade').fadeOut(settings.animation_speed,function(){$(this).remove();});$pp_overlay.fadeOut(settings.animation_speed,function(){if($.browser.msie&&$.browser.version==6)$('select').css('visibility','visible');if(settings.hideflash)$('object,embed,iframe[src*=youtube],iframe[src*=vimeo]').css('visibility','visible');$(this).remove();$(window).unbind('scroll.prettyphoto');clearHashtag();settings.callback();doresize=true;pp_open=false;delete settings;});};function _showContent(){$('.pp_loaderIcon').hide();projectedTop=scroll_pos['scrollTop']+((windowHeight/2)-(pp_dimensions['containerHeight']/2));if(projectedTop<0)projectedTop=0;$ppt.fadeTo(settings.animation_speed,1);$pp_pic_holder.find('.pp_content').animate({height:pp_dimensions['contentHeight'],width:pp_dimensions['contentWidth']},settings.animation_speed);$pp_pic_holder.animate({'top':projectedTop,'left':((windowWidth/2)-(pp_dimensions['containerWidth']/2)<0)?0:(windowWidth/2)-(pp_dimensions['containerWidth']/2),width:pp_dimensions['containerWidth']},settings.animation_speed,function(){$pp_pic_holder.find('.pp_hoverContainer,#fullResImage').height(pp_dimensions['height']).width(pp_dimensions['width']);$pp_pic_holder.find('.pp_fade').fadeIn(settings.animation_speed);if(isSet&&_getFileType(pp_images[set_position])=="image"){$pp_pic_holder.find('.pp_hoverContainer').show();}else{$pp_pic_holder.find('.pp_hoverContainer').hide();}
|
||||
if(settings.allow_expand){if(pp_dimensions['resized']){$('a.pp_expand,a.pp_contract').show();}else{$('a.pp_expand').hide();}}
|
||||
if(settings.autoplay_slideshow&&!pp_slideshow&&!pp_open)$.prettyPhoto.startSlideshow();settings.changepicturecallback();pp_open=true;});_insert_gallery();pp_settings.ajaxcallback();};function _hideContent(callback){$pp_pic_holder.find('#pp_full_res object,#pp_full_res embed').css('visibility','hidden');$pp_pic_holder.find('.pp_fade').fadeOut(settings.animation_speed,function(){$('.pp_loaderIcon').show();callback();});};function _checkPosition(setCount){(setCount>1)?$('.pp_nav').show():$('.pp_nav').hide();};function _fitToViewport(width,height){resized=false;_getDimensions(width,height);imageWidth=width,imageHeight=height;if(((pp_containerWidth>windowWidth)||(pp_containerHeight>windowHeight))&&doresize&&settings.allow_resize&&!percentBased){resized=true,fitting=false;while(!fitting){if((pp_containerWidth>windowWidth)){imageWidth=(windowWidth-200);imageHeight=(height/width)*imageWidth;}else if((pp_containerHeight>windowHeight)){imageHeight=(windowHeight-200);imageWidth=(width/height)*imageHeight;}else{fitting=true;};pp_containerHeight=imageHeight,pp_containerWidth=imageWidth;};_getDimensions(imageWidth,imageHeight);if((pp_containerWidth>windowWidth)||(pp_containerHeight>windowHeight)){_fitToViewport(pp_containerWidth,pp_containerHeight)};};return{width:Math.floor(imageWidth),height:Math.floor(imageHeight),containerHeight:Math.floor(pp_containerHeight),containerWidth:Math.floor(pp_containerWidth)+(settings.horizontal_padding*2),contentHeight:Math.floor(pp_contentHeight),contentWidth:Math.floor(pp_contentWidth),resized:resized};};function _getDimensions(width,height){width=parseFloat(width);height=parseFloat(height);$pp_details=$pp_pic_holder.find('.pp_details');$pp_details.width(width);detailsHeight=parseFloat($pp_details.css('marginTop'))+parseFloat($pp_details.css('marginBottom'));$pp_details=$pp_details.clone().addClass(settings.theme).width(width).appendTo($('body')).css({'position':'absolute','top':-10000});detailsHeight+=$pp_details.height();detailsHeight=(detailsHeight<=34)?36:detailsHeight;if($.browser.msie&&$.browser.version==7)detailsHeight+=8;$pp_details.remove();$pp_title=$pp_pic_holder.find('.ppt');$pp_title.width(width);titleHeight=parseFloat($pp_title.css('marginTop'))+parseFloat($pp_title.css('marginBottom'));$pp_title=$pp_title.clone().appendTo($('body')).css({'position':'absolute','top':-10000});titleHeight+=$pp_title.height();$pp_title.remove();pp_contentHeight=height+detailsHeight;pp_contentWidth=width;pp_containerHeight=pp_contentHeight+titleHeight+$pp_pic_holder.find('.pp_top').height()+$pp_pic_holder.find('.pp_bottom').height();pp_containerWidth=width;}
|
||||
function _getFileType(itemSrc){if(itemSrc.match(/youtube\.com\/watch/i)||itemSrc.match(/youtu\.be/i)){return'youtube';}else if(itemSrc.match(/vimeo\.com/i)){return'vimeo';}else if(itemSrc.match(/\b.mov\b/i)){return'quicktime';}else if(itemSrc.match(/\b.swf\b/i)){return'flash';}else if(itemSrc.match(/\biframe=true\b/i)){return'iframe';}else if(itemSrc.match(/\bajax=true\b/i)){return'ajax';}else if(itemSrc.match(/\bcustom=true\b/i)){return'custom';}else if(itemSrc.substr(0,1)=='#'){return'inline';}else{return'image';};};function _center_overlay(){if(doresize&&typeof $pp_pic_holder!='undefined'){scroll_pos=_get_scroll();contentHeight=$pp_pic_holder.height(),contentwidth=$pp_pic_holder.width();projectedTop=(windowHeight/2)+scroll_pos['scrollTop']-(contentHeight/2);if(projectedTop<0)projectedTop=0;if(contentHeight>windowHeight)
|
||||
return;$pp_pic_holder.css({'top':projectedTop,'left':(windowWidth/2)+scroll_pos['scrollLeft']-(contentwidth/2)});};};function _get_scroll(){if(self.pageYOffset){return{scrollTop:self.pageYOffset,scrollLeft:self.pageXOffset};}else if(document.documentElement&&document.documentElement.scrollTop){return{scrollTop:document.documentElement.scrollTop,scrollLeft:document.documentElement.scrollLeft};}else if(document.body){return{scrollTop:document.body.scrollTop,scrollLeft:document.body.scrollLeft};};};function _resize_overlay(){windowHeight=$(window).height(),windowWidth=$(window).width();if(typeof $pp_overlay!="undefined")$pp_overlay.height($(document).height()).width(windowWidth);};function _insert_gallery(){if(isSet&&settings.overlay_gallery&&_getFileType(pp_images[set_position])=="image"&&(settings.ie6_fallback&&!($.browser.msie&&parseInt($.browser.version)==6))){itemWidth=52+5;navWidth=(settings.theme=="facebook"||settings.theme=="pp_default")?50:30;itemsPerPage=Math.floor((pp_dimensions['containerWidth']-100-navWidth)/itemWidth);itemsPerPage=(itemsPerPage<pp_images.length)?itemsPerPage:pp_images.length;totalPage=Math.ceil(pp_images.length/itemsPerPage)-1;if(totalPage==0){navWidth=0;$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').hide();}else{$pp_gallery.find('.pp_arrow_next,.pp_arrow_previous').show();};galleryWidth=itemsPerPage*itemWidth;fullGalleryWidth=pp_images.length*itemWidth;$pp_gallery.css('margin-left',-((galleryWidth/2)+(navWidth/2))).find('div:first').width(galleryWidth+5).find('ul').width(fullGalleryWidth).find('li.selected').removeClass('selected');goToPage=(Math.floor(set_position/itemsPerPage)<totalPage)?Math.floor(set_position/itemsPerPage):totalPage;$.prettyPhoto.changeGalleryPage(goToPage);$pp_gallery_li.filter(':eq('+set_position+')').addClass('selected');}else{$pp_pic_holder.find('.pp_content').unbind('mouseenter mouseleave');}}
|
||||
function _build_overlay(caller){if(settings.social_tools)
|
||||
facebook_like_link=settings.social_tools.replace('{location_href}',encodeURIComponent(location.href));settings.markup=settings.markup.replace('{pp_social}','');$('body').append(settings.markup);$pp_pic_holder=$('.pp_pic_holder'),$ppt=$('.ppt'),$pp_overlay=$('div.pp_overlay');if(isSet&&settings.overlay_gallery){currentGalleryPage=0;toInject="";for(var i=0;i<pp_images.length;i++){if(!pp_images[i].match(/\b(jpg|jpeg|png|gif)\b/gi)){classname='default';img_src='';}else{classname='';img_src=pp_images[i];}
|
||||
toInject+="<li class='"+classname+"'><a href='#'><img src='"+img_src+"' width='50' alt='' /></a></li>";};toInject=settings.gallery_markup.replace(/{gallery}/g,toInject);$pp_pic_holder.find('#pp_full_res').after(toInject);$pp_gallery=$('.pp_pic_holder .pp_gallery'),$pp_gallery_li=$pp_gallery.find('li');$pp_gallery.find('.pp_arrow_next').click(function(){$.prettyPhoto.changeGalleryPage('next');$.prettyPhoto.stopSlideshow();return false;});$pp_gallery.find('.pp_arrow_previous').click(function(){$.prettyPhoto.changeGalleryPage('previous');$.prettyPhoto.stopSlideshow();return false;});$pp_pic_holder.find('.pp_content').hover(function(){$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeIn();},function(){$pp_pic_holder.find('.pp_gallery:not(.disabled)').fadeOut();});itemWidth=52+5;$pp_gallery_li.each(function(i){$(this).find('a').click(function(){$.prettyPhoto.changePage(i);$.prettyPhoto.stopSlideshow();return false;});});};if(settings.slideshow){$pp_pic_holder.find('.pp_nav').prepend('<a href="#" class="pp_play">Play</a>')
|
||||
$pp_pic_holder.find('.pp_nav .pp_play').click(function(){$.prettyPhoto.startSlideshow();return false;});}
|
||||
$pp_pic_holder.attr('class','pp_pic_holder '+settings.theme);$pp_overlay.css({'opacity':0,'height':$(document).height(),'width':$(window).width()}).bind('click',function(){if(!settings.modal)$.prettyPhoto.close();});$('a.pp_close').bind('click',function(){$.prettyPhoto.close();return false;});if(settings.allow_expand){$('a.pp_expand').bind('click',function(e){if($(this).hasClass('pp_expand')){$(this).removeClass('pp_expand').addClass('pp_contract');doresize=false;}else{$(this).removeClass('pp_contract').addClass('pp_expand');doresize=true;};_hideContent(function(){$.prettyPhoto.open();});return false;});}
|
||||
$pp_pic_holder.find('.pp_previous, .pp_nav .pp_arrow_previous').bind('click',function(){$.prettyPhoto.changePage('previous');$.prettyPhoto.stopSlideshow();return false;});$pp_pic_holder.find('.pp_next, .pp_nav .pp_arrow_next').bind('click',function(){$.prettyPhoto.changePage('next');$.prettyPhoto.stopSlideshow();return false;});_center_overlay();};if(!pp_alreadyInitialized&&getHashtag()){pp_alreadyInitialized=true;hashIndex=getHashtag();hashRel=hashIndex;hashIndex=hashIndex.substring(hashIndex.indexOf('/')+1,hashIndex.length-1);hashRel=hashRel.substring(0,hashRel.indexOf('/'));setTimeout(function(){$("a["+pp_settings.hook+"^='"+hashRel+"']:eq("+hashIndex+")").trigger('click');},50);}
|
||||
return this.unbind('click.prettyphoto').bind('click.prettyphoto',$.prettyPhoto.initialize);};function getHashtag(){url=location.href;hashtag=(url.indexOf('#prettyPhoto')!==-1)?decodeURI(url.substring(url.indexOf('#prettyPhoto')+1,url.length)):false;return hashtag;};function setHashtag(){if(typeof theRel=='undefined')return;location.hash=theRel+'/'+rel_index+'/';};function clearHashtag(){if(location.href.indexOf('#prettyPhoto')!==-1)location.hash="prettyPhoto";}
|
||||
function getParam(name,url){name=name.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");var regexS="[\\?&]"+name+"=([^&#]*)";var regex=new RegExp(regexS);var results=regex.exec(url);return(results==null)?"":results[1];}})(jQuery);var pp_alreadyInitialized=false;
|
||||
134
public/js/jquery.thumbs.js
Normal file
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
*
|
||||
* Copyright (c) 2006-2010 Joan Piedra (http://joanpiedra.com)
|
||||
* Licensed under the MIT License:
|
||||
* http://www.opensource.org/licenses/mit-license.php
|
||||
*
|
||||
*/
|
||||
(function($) {
|
||||
|
||||
/*
|
||||
* Converts image and link elements to thumbnails
|
||||
*
|
||||
* @name $.fn.thumbs
|
||||
* @author Joan Piedra (http://joanpiedra.com)
|
||||
* @example $('.thumb').thumbs();
|
||||
*
|
||||
*/
|
||||
$.fn.thumbs = function(options) {
|
||||
var $thumbs = this;
|
||||
|
||||
if (options == 'destroy') {
|
||||
return Thumbs.destroy($thumbs);
|
||||
}
|
||||
|
||||
if( $thumbs.data('thumbs') ) {
|
||||
return $thumbs;
|
||||
}
|
||||
|
||||
var center = {},
|
||||
defaults = {
|
||||
center: true,
|
||||
classNames: {
|
||||
center: 'thumb-center',
|
||||
container: 'thumb-container',
|
||||
icon: 'thumb-icon',
|
||||
img: 'thumb-img',
|
||||
inner: 'thumb-inner',
|
||||
strip: 'thumb-strip'
|
||||
},
|
||||
html: '<span class="%container%"><span class="%inner%"><span class="%img%"></span><span class="%strip%">%strip_content%</span><span class="%icon%"></span></span></span>',
|
||||
strip: true
|
||||
};
|
||||
|
||||
options = $.extend(true, {}, defaults, options);
|
||||
|
||||
return $thumbs.each(function(){
|
||||
var $thumb = $(this),
|
||||
c = options.classNames,
|
||||
clone = $thumb.clone(true),
|
||||
html = new String(options.html),
|
||||
centered = false,
|
||||
strip = '';
|
||||
|
||||
for (className in c) {
|
||||
var newClassName = c[className];
|
||||
|
||||
if ( options.center && !centered && className == 'container' ) {
|
||||
newClassName = c.container + ' ' + c.center;
|
||||
centered = true;
|
||||
}
|
||||
|
||||
html = html.replace('%' + className + '%', newClassName);
|
||||
}
|
||||
|
||||
if (options.strip) {
|
||||
strip = $thumb.is('img') ? $thumb.attr('alt') : $thumb.find('img').attr('alt');
|
||||
strip = strip != undefined ? strip : $thumb.attr('title');
|
||||
strip = strip != undefined ? strip : '';
|
||||
}
|
||||
|
||||
html = html.replace('%strip_content%', strip);
|
||||
|
||||
$thumb.wrap( html );
|
||||
|
||||
if (options.center) {
|
||||
Thumbs.centerImg( $thumb );
|
||||
}
|
||||
|
||||
var data = {
|
||||
'container': $thumb.parents('.' + c.container),
|
||||
'raw': clone
|
||||
};
|
||||
|
||||
$thumb.data('thumbs', data);
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
var Thumbs = {
|
||||
|
||||
/*
|
||||
* Private: Absolute positions the image in the center of the thumbnail frame
|
||||
*
|
||||
* @name thumbs.centerImg
|
||||
* @author Joan Piedra (http://joanpiedra.com)
|
||||
* @example Thumbs.centerImg($thumb);
|
||||
*
|
||||
*/
|
||||
centerImg: function($thumb) {
|
||||
var $img = $thumb.is('img') ? $thumb : $thumb.find('img'),
|
||||
css = {
|
||||
left: '-' + ( parseInt( $img.css('width') ) / 2 ) + 'px',
|
||||
top: '-' + ( parseInt( $img.css('height') ) / 2 ) + 'px'
|
||||
};
|
||||
|
||||
$img.css( css );
|
||||
|
||||
return $thumb;
|
||||
},
|
||||
|
||||
/*
|
||||
* Private: Removes all the added thumbnail html
|
||||
*
|
||||
* @name thumbs.destroy
|
||||
* @author Joan Piedra (http://joanpiedra.com)
|
||||
* @example Thumbs.destroy($thumbs);
|
||||
*
|
||||
*/
|
||||
destroy: function($thumbs) {
|
||||
$thumbs.each(function(index) {
|
||||
var $thumb = $(this),
|
||||
data = $thumb.data('thumbs');
|
||||
|
||||
if (!data) {
|
||||
return;
|
||||
}
|
||||
|
||||
data.container.after(data.raw).remove();
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
})(jQuery);
|
||||
427
public/js/jquery.ticker.js
Normal file
@@ -0,0 +1,427 @@
|
||||
/*
|
||||
jQuery News Ticker is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, version 2 of the License.
|
||||
|
||||
jQuery News Ticker is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with jQuery News Ticker. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
(function($){
|
||||
$.fn.ticker = function(options) {
|
||||
// Extend our default options with those provided.
|
||||
// Note that the first arg to extend is an empty object -
|
||||
// this is to keep from overriding our "defaults" object.
|
||||
var opts = $.extend({}, $.fn.ticker.defaults, options);
|
||||
|
||||
// check that the passed element is actually in the DOM
|
||||
if ($(this).length == 0) {
|
||||
if (window.console && window.console.log) {
|
||||
window.console.log('Element does not exist in DOM!');
|
||||
}
|
||||
else {
|
||||
alert('Element does not exist in DOM!');
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Get the id of the UL to get our news content from */
|
||||
var newsID = '#' + $(this).attr('id');
|
||||
|
||||
/* Get the tag type - we will check this later to makde sure it is a UL tag */
|
||||
var tagType = $(this).get(0).tagName;
|
||||
|
||||
return this.each(function() {
|
||||
// get a unique id for this ticker
|
||||
var uniqID = getUniqID();
|
||||
|
||||
/* Internal vars */
|
||||
var settings = {
|
||||
position: 0,
|
||||
time: 0,
|
||||
distance: 0,
|
||||
newsArr: {},
|
||||
play: true,
|
||||
paused: false,
|
||||
contentLoaded: false,
|
||||
dom: {
|
||||
contentID: '#ticker-content-' + uniqID,
|
||||
titleID: '#ticker-title-' + uniqID,
|
||||
titleElem: '#ticker-title-' + uniqID + ' SPAN',
|
||||
tickerID : '#ticker-' + uniqID,
|
||||
wrapperID: '#ticker-wrapper-' + uniqID,
|
||||
revealID: '#ticker-swipe-' + uniqID,
|
||||
revealElem: '#ticker-swipe-' + uniqID + ' SPAN',
|
||||
controlsID: '#ticker-controls-' + uniqID,
|
||||
prevID: '#prev-' + uniqID,
|
||||
nextID: '#next-' + uniqID,
|
||||
playPauseID: '#play-pause-' + uniqID
|
||||
}
|
||||
};
|
||||
|
||||
// if we are not using a UL, display an error message and stop any further execution
|
||||
if (tagType != 'UL' && tagType != 'OL' && opts.htmlFeed === true) {
|
||||
debugError('Cannot use <' + tagType.toLowerCase() + '> type of element for this plugin - must of type <ul> or <ol>');
|
||||
return false;
|
||||
}
|
||||
|
||||
// set the ticker direction
|
||||
opts.direction == 'rtl' ? opts.direction = 'right' : opts.direction = 'left';
|
||||
|
||||
// lets go...
|
||||
initialisePage();
|
||||
/* Function to get the size of an Object*/
|
||||
function countSize(obj) {
|
||||
var size = 0, key;
|
||||
for (key in obj) {
|
||||
if (obj.hasOwnProperty(key)) size++;
|
||||
}
|
||||
return size;
|
||||
};
|
||||
|
||||
function getUniqID() {
|
||||
var newDate = new Date;
|
||||
return newDate.getTime();
|
||||
}
|
||||
|
||||
/* Function for handling debug and error messages */
|
||||
function debugError(obj) {
|
||||
if (opts.debugMode) {
|
||||
if (window.console && window.console.log) {
|
||||
window.console.log(obj);
|
||||
}
|
||||
else {
|
||||
alert(obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Function to setup the page */
|
||||
function initialisePage() {
|
||||
// process the content for this ticker
|
||||
processContent();
|
||||
|
||||
// add our HTML structure for the ticker to the DOM
|
||||
$(newsID).wrap('<div id="' + settings.dom.wrapperID.replace('#', '') + '"></div>');
|
||||
|
||||
// remove any current content inside this ticker
|
||||
$(settings.dom.wrapperID).children().remove();
|
||||
|
||||
$(settings.dom.wrapperID).append('<div id="' + settings.dom.tickerID.replace('#', '') + '" class="ticker"><div id="' + settings.dom.titleID.replace('#', '') + '" class="ticker-title"><span><!-- --></span></div><p id="' + settings.dom.contentID.replace('#', '') + '" class="ticker-content"></p><div id="' + settings.dom.revealID.replace('#', '') + '" class="ticker-swipe"><span><!-- --></span></div></div>');
|
||||
$(settings.dom.wrapperID).removeClass('no-js').addClass('ticker-wrapper has-js ' + opts.direction);
|
||||
// hide the ticker
|
||||
$(settings.dom.tickerElem + ',' + settings.dom.contentID).hide();
|
||||
// add the controls to the DOM if required
|
||||
if (opts.controls) {
|
||||
// add related events - set functions to run on given event
|
||||
$(settings.dom.controlsID).live('click mouseover mousedown mouseout mouseup', function (e) {
|
||||
var button = e.target.id;
|
||||
if (e.type == 'click') {
|
||||
switch (button) {
|
||||
case settings.dom.prevID.replace('#', ''):
|
||||
// show previous item
|
||||
settings.paused = true;
|
||||
$(settings.dom.playPauseID).addClass('paused');
|
||||
manualChangeContent('prev');
|
||||
break;
|
||||
case settings.dom.nextID.replace('#', ''):
|
||||
// show next item
|
||||
settings.paused = true;
|
||||
$(settings.dom.playPauseID).addClass('paused');
|
||||
manualChangeContent('next');
|
||||
break;
|
||||
case settings.dom.playPauseID.replace('#', ''):
|
||||
// play or pause the ticker
|
||||
if (settings.play == true) {
|
||||
settings.paused = true;
|
||||
$(settings.dom.playPauseID).addClass('paused');
|
||||
pauseTicker();
|
||||
}
|
||||
else {
|
||||
settings.paused = false;
|
||||
$(settings.dom.playPauseID).removeClass('paused');
|
||||
restartTicker();
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (e.type == 'mouseover' && $('#' + button).hasClass('controls')) {
|
||||
$('#' + button).addClass('over');
|
||||
}
|
||||
else if (e.type == 'mousedown' && $('#' + button).hasClass('controls')) {
|
||||
$('#' + button).addClass('down');
|
||||
}
|
||||
else if (e.type == 'mouseup' && $('#' + button).hasClass('controls')) {
|
||||
$('#' + button).removeClass('down');
|
||||
}
|
||||
else if (e.type == 'mouseout' && $('#' + button).hasClass('controls')) {
|
||||
$('#' + button).removeClass('over');
|
||||
}
|
||||
});
|
||||
// add controls HTML to DOM
|
||||
$(settings.dom.wrapperID).append('<ul id="' + settings.dom.controlsID.replace('#', '') + '" class="ticker-controls"><li id="' + settings.dom.playPauseID.replace('#', '') + '" class="jnt-play-pause controls"><a href=""><!-- --></a></li><li id="' + settings.dom.prevID.replace('#', '') + '" class="jnt-prev controls"><a href=""><!-- --></a></li><li id="' + settings.dom.nextID.replace('#', '') + '" class="jnt-next controls"><a href=""><!-- --></a></li></ul>');
|
||||
}
|
||||
if (opts.displayType != 'fade') {
|
||||
// add mouse over on the content
|
||||
$(settings.dom.contentID).mouseover(function () {
|
||||
if (settings.paused == false) {
|
||||
pauseTicker();
|
||||
}
|
||||
}).mouseout(function () {
|
||||
if (settings.paused == false) {
|
||||
restartTicker();
|
||||
}
|
||||
});
|
||||
}
|
||||
// we may have to wait for the ajax call to finish here
|
||||
if (!opts.ajaxFeed) {
|
||||
setupContentAndTriggerDisplay();
|
||||
}
|
||||
}
|
||||
|
||||
/* Start to process the content for this ticker */
|
||||
function processContent() {
|
||||
// check to see if we need to load content
|
||||
if (settings.contentLoaded == false) {
|
||||
// construct content
|
||||
if (opts.ajaxFeed) {
|
||||
if (opts.feedType == 'xml') {
|
||||
$.ajax({
|
||||
url: opts.feedUrl,
|
||||
cache: false,
|
||||
dataType: opts.feedType,
|
||||
async: true,
|
||||
success: function(data){
|
||||
count = 0;
|
||||
// get the 'root' node
|
||||
for (var a = 0; a < data.childNodes.length; a++) {
|
||||
if (data.childNodes[a].nodeName == 'rss') {
|
||||
xmlContent = data.childNodes[a];
|
||||
}
|
||||
}
|
||||
// find the channel node
|
||||
for (var i = 0; i < xmlContent.childNodes.length; i++) {
|
||||
if (xmlContent.childNodes[i].nodeName == 'channel') {
|
||||
xmlChannel = xmlContent.childNodes[i];
|
||||
}
|
||||
}
|
||||
// for each item create a link and add the article title as the link text
|
||||
for (var x = 0; x < xmlChannel.childNodes.length; x++) {
|
||||
if (xmlChannel.childNodes[x].nodeName == 'item') {
|
||||
xmlItems = xmlChannel.childNodes[x];
|
||||
var title, link = false;
|
||||
for (var y = 0; y < xmlItems.childNodes.length; y++) {
|
||||
if (xmlItems.childNodes[y].nodeName == 'title') {
|
||||
title = xmlItems.childNodes[y].lastChild.nodeValue;
|
||||
}
|
||||
else if (xmlItems.childNodes[y].nodeName == 'link') {
|
||||
link = xmlItems.childNodes[y].lastChild.nodeValue;
|
||||
}
|
||||
if ((title !== false && title != '') && link !== false) {
|
||||
settings.newsArr['item-' + count] = { type: opts.titleText, content: '<a href="' + link + '">' + title + '</a>' }; count++; title = false; link = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// quick check here to see if we actually have any content - log error if not
|
||||
if (countSize(settings.newsArr < 1)) {
|
||||
debugError('Couldn\'t find any content from the XML feed for the ticker to use!');
|
||||
return false;
|
||||
}
|
||||
settings.contentLoaded = true;
|
||||
setupContentAndTriggerDisplay();
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
debugError('Code Me!');
|
||||
}
|
||||
}
|
||||
else if (opts.htmlFeed) {
|
||||
if($(newsID + ' LI').length > 0) {
|
||||
$(newsID + ' LI').each(function (i) {
|
||||
// maybe this could be one whole object and not an array of objects?
|
||||
settings.newsArr['item-' + i] = { type: opts.titleText, content: $(this).html()};
|
||||
});
|
||||
}
|
||||
else {
|
||||
debugError('Couldn\'t find HTML any content for the ticker to use!');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
else {
|
||||
debugError('The ticker is set to not use any types of content! Check the settings for the ticker.');
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function setupContentAndTriggerDisplay() {
|
||||
|
||||
settings.contentLoaded = true;
|
||||
|
||||
// update the ticker content with the correct item
|
||||
// insert news content into DOM
|
||||
$(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
|
||||
$(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
|
||||
|
||||
// set the next content item to be used - loop round if we are at the end of the content
|
||||
if (settings.position == (countSize(settings.newsArr) -1)) {
|
||||
settings.position = 0;
|
||||
}
|
||||
else {
|
||||
settings.position++;
|
||||
}
|
||||
|
||||
// get the values of content and set the time of the reveal (so all reveals have the same speed regardless of content size)
|
||||
distance = $(settings.dom.contentID).width();
|
||||
time = distance / opts.speed;
|
||||
|
||||
// start the ticker animation
|
||||
revealContent();
|
||||
}
|
||||
|
||||
// slide back cover or fade in content
|
||||
function revealContent() {
|
||||
$(settings.dom.contentID).css('opacity', '1');
|
||||
if(settings.play) {
|
||||
// get the width of the title element to offset the content and reveal
|
||||
var offset = $(settings.dom.titleID).width() + 20;
|
||||
|
||||
$(settings.dom.revealID).css(opts.direction, offset + 'px');
|
||||
// show the reveal element and start the animation
|
||||
if (opts.displayType == 'fade') {
|
||||
// fade in effect ticker
|
||||
$(settings.dom.revealID).hide(0, function () {
|
||||
$(settings.dom.contentID).css(opts.direction, offset + 'px').fadeIn(opts.fadeInSpeed, postReveal);
|
||||
});
|
||||
}
|
||||
else if (opts.displayType == 'scroll') {
|
||||
// to code
|
||||
}
|
||||
else {
|
||||
// default bbc scroll effect
|
||||
$(settings.dom.revealElem).show(0, function () {
|
||||
$(settings.dom.contentID).css(opts.direction, offset + 'px').show();
|
||||
// set our animation direction
|
||||
animationAction = opts.direction == 'right' ? { marginRight: distance + 'px'} : { marginLeft: distance + 'px' };
|
||||
$(settings.dom.revealID).css('margin-' + opts.direction, '0px').delay(20).animate(animationAction, time, 'linear', postReveal);
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
// here we hide the current content and reset the ticker elements to a default state ready for the next ticker item
|
||||
function postReveal() {
|
||||
if(settings.play) {
|
||||
// we have to separately fade the content out here to get around an IE bug - needs further investigation
|
||||
$(settings.dom.contentID).delay(opts.pauseOnItems).fadeOut(opts.fadeOutSpeed);
|
||||
// deal with the rest of the content, prepare the DOM and trigger the next ticker
|
||||
if (opts.displayType == 'fade') {
|
||||
$(settings.dom.contentID).fadeOut(opts.fadeOutSpeed, function () {
|
||||
$(settings.dom.wrapperID)
|
||||
.find(settings.dom.revealElem + ',' + settings.dom.contentID)
|
||||
.hide()
|
||||
.end().find(settings.dom.tickerID + ',' + settings.dom.revealID)
|
||||
.show()
|
||||
.end().find(settings.dom.tickerID + ',' + settings.dom.revealID)
|
||||
.removeAttr('style');
|
||||
setupContentAndTriggerDisplay();
|
||||
});
|
||||
}
|
||||
else {
|
||||
$(settings.dom.revealID).hide(0, function () {
|
||||
$(settings.dom.contentID).fadeOut(opts.fadeOutSpeed, function () {
|
||||
$(settings.dom.wrapperID)
|
||||
.find(settings.dom.revealElem + ',' + settings.dom.contentID)
|
||||
.hide()
|
||||
.end().find(settings.dom.tickerID + ',' + settings.dom.revealID)
|
||||
.show()
|
||||
.end().find(settings.dom.tickerID + ',' + settings.dom.revealID)
|
||||
.removeAttr('style');
|
||||
setupContentAndTriggerDisplay();
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
else {
|
||||
$(settings.dom.revealElem).hide();
|
||||
}
|
||||
}
|
||||
|
||||
// pause ticker
|
||||
function pauseTicker() {
|
||||
settings.play = false;
|
||||
// stop animation and show content - must pass "true, true" to the stop function, or we can get some funky behaviour
|
||||
$(settings.dom.tickerID + ',' + settings.dom.revealID + ',' + settings.dom.titleID + ',' + settings.dom.titleElem + ',' + settings.dom.revealElem + ',' + settings.dom.contentID).stop(true, true);
|
||||
$(settings.dom.revealID + ',' + settings.dom.revealElem).hide();
|
||||
$(settings.dom.wrapperID)
|
||||
.find(settings.dom.titleID + ',' + settings.dom.titleElem).show()
|
||||
.end().find(settings.dom.contentID).show();
|
||||
}
|
||||
|
||||
// play ticker
|
||||
function restartTicker() {
|
||||
settings.play = true;
|
||||
settings.paused = false;
|
||||
// start the ticker again
|
||||
postReveal();
|
||||
}
|
||||
|
||||
// change the content on user input
|
||||
function manualChangeContent(direction) {
|
||||
pauseTicker();
|
||||
switch (direction) {
|
||||
case 'prev':
|
||||
if (settings.position == 0) {
|
||||
settings.position = countSize(settings.newsArr) -2;
|
||||
}
|
||||
else if (settings.position == 1) {
|
||||
settings.position = countSize(settings.newsArr) -1;
|
||||
}
|
||||
else {
|
||||
settings.position = settings.position - 2;
|
||||
}
|
||||
$(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
|
||||
$(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
|
||||
break;
|
||||
case 'next':
|
||||
$(settings.dom.titleElem).html(settings.newsArr['item-' + settings.position].type);
|
||||
$(settings.dom.contentID).html(settings.newsArr['item-' + settings.position].content);
|
||||
break;
|
||||
}
|
||||
// set the next content item to be used - loop round if we are at the end of the content
|
||||
if (settings.position == (countSize(settings.newsArr) -1)) {
|
||||
settings.position = 0;
|
||||
}
|
||||
else {
|
||||
settings.position++;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// plugin defaults - added as a property on our plugin function
|
||||
$.fn.ticker.defaults = {
|
||||
speed: 0.10,
|
||||
ajaxFeed: false,
|
||||
feedUrl: '',
|
||||
feedType: 'xml',
|
||||
displayType: 'reveal',
|
||||
htmlFeed: true,
|
||||
debugMode: true,
|
||||
controls: true,
|
||||
titleText: 'Latest',
|
||||
direction: 'ltr',
|
||||
pauseOnItems: 3000,
|
||||
fadeInSpeed: 600,
|
||||
fadeOutSpeed: 300
|
||||
};
|
||||
})(jQuery);
|
||||
251
public/js/jquery.uploadify (Source).js
Normal file
@@ -0,0 +1,251 @@
|
||||
/*
|
||||
Copyright (c) 2009 Ronnie Garcia, Travis Nickels
|
||||
|
||||
This file is part of Uploadify v1.6.2
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of Uploadify and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
UPLOADIFY IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
|
||||
var flashVer = -1;
|
||||
if (navigator.plugins != null && navigator.plugins.length > 0) {
|
||||
if (navigator.plugins["Shockwave Flash 2.0"] || navigator.plugins["Shockwave Flash"]) {
|
||||
var swVer2 = navigator.plugins["Shockwave Flash 2.0"] ? " 2.0" : "";
|
||||
var flashDescription = navigator.plugins["Shockwave Flash" + swVer2].description;
|
||||
var descArray = flashDescription.split(" ");
|
||||
var tempArrayMajor = descArray[2].split(".");
|
||||
var versionMajor = tempArrayMajor[0];
|
||||
var versionMinor = tempArrayMajor[1];
|
||||
var versionRevision = descArray[3];
|
||||
if (versionRevision == "") {
|
||||
versionRevision = descArray[4];
|
||||
}
|
||||
if (versionRevision[0] == "d") {
|
||||
versionRevision = versionRevision.substring(1);
|
||||
} else if (versionRevision[0] == "r") {
|
||||
ersionRevision = versionRevision.substring(1);
|
||||
if (versionRevision.indexOf("d") > 0) {
|
||||
versionRevision = versionRevision.substring(0, versionRevision.indexOf("d"));
|
||||
}
|
||||
}
|
||||
var flashVer = versionMajor + "." + versionMinor + "." + versionRevision;
|
||||
}
|
||||
} else if ( $.browser.msie ) {
|
||||
var version;
|
||||
var axo;
|
||||
var e;
|
||||
try {
|
||||
axo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");
|
||||
version = axo.GetVariable("$version");
|
||||
} catch (e) {
|
||||
}
|
||||
flashVer = version.replace("WIN ","").replace(",",".");
|
||||
}
|
||||
flashVer = flashVer.split(".")[0];
|
||||
|
||||
if(jQuery)(
|
||||
function($){
|
||||
$.extend($.fn,{
|
||||
fileUpload:function(options) {
|
||||
if (flashVer >= 9) {
|
||||
$(this).each(function(){
|
||||
settings = $.extend({
|
||||
uploader: 'uploader.swf',
|
||||
script: 'uploader.php',
|
||||
folder: '',
|
||||
height: 30,
|
||||
width: 110,
|
||||
cancelImg: 'cancel.png',
|
||||
wmode: 'opaque',
|
||||
scriptAccess: 'sameDomain',
|
||||
fileDataName: 'Filedata',
|
||||
displayData: 'percentage',
|
||||
onInit: function() {},
|
||||
onSelect: function() {},
|
||||
onCheck: function() {},
|
||||
onCancel: function() {},
|
||||
onError: function() {},
|
||||
onProgress: function() {},
|
||||
onComplete: function() {}
|
||||
}, options);
|
||||
var pagePath = location.pathname;
|
||||
pagePath = pagePath.split('/');
|
||||
pagePath.pop();
|
||||
pagePath = pagePath.join('/') + '/';
|
||||
var data = '&pagepath=' + pagePath;
|
||||
if (settings.buttonImg) data += '&buttonImg=' + escape(settings.buttonImg);
|
||||
if (settings.buttonText) data += '&buttonText=' + escape(settings.buttonText);
|
||||
if (settings.rollover) data += '&rollover=true';
|
||||
data += '&script=' + settings.script;
|
||||
data += '&folder=' + escape(settings.folder);
|
||||
if (settings.scriptData) {
|
||||
var scriptDataString = '';
|
||||
for (var name in settings.scriptData) {
|
||||
scriptDataString += '&' + name + '=' + settings.scriptData[name];
|
||||
}
|
||||
data += '&scriptData=' + escape(scriptDataString);
|
||||
}
|
||||
data += '&btnWidth=' + settings.width;
|
||||
data += '&btnHeight=' + settings.height;
|
||||
data += '&wmode=' + settings.wmode;
|
||||
if (settings.hideButton) data += '&hideButton=true';
|
||||
if (settings.fileDesc) data += '&fileDesc=' + settings.fileDesc + '&fileExt=' + settings.fileExt;
|
||||
if (settings.multi) data += '&multi=true';
|
||||
if (settings.auto) data += '&auto=true';
|
||||
if (settings.sizeLimit) data += '&sizeLimit=' + settings.sizeLimit;
|
||||
if (settings.simUploadLimit) data += '&simUploadLimit=' + settings.simUploadLimit;
|
||||
if (settings.checkScript) data += '&checkScript=' + settings.checkScript;
|
||||
if (settings.fileDataName) data += '&fileDataName=' + settings.fileDataName;
|
||||
if ($.browser.msie) {
|
||||
flashElement = '<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" width="' + settings.width + '" height="' + settings.height + '" id="' + $(this).attr("id") + 'Uploader" class="fileUploaderBtn">\
|
||||
<param name="movie" value="' + settings.uploader + '?fileUploadID=' + $(this).attr("id") + data + '" />\
|
||||
<param name="quality" value="high" />\
|
||||
<param name="wmode" value="' + settings.wmode + '" />\
|
||||
<param name="allowScriptAccess" value="' + settings.scriptAccess + '">\
|
||||
<param name="swfversion" value="9.0.0.0" />\
|
||||
</object>';
|
||||
} else {
|
||||
flashElement = '<embed src="' + settings.uploader + '?fileUploadID=' + $(this).attr("id") + data + '" quality="high" width="' + settings.width + '" height="' + settings.height + '" id="' + $(this).attr("id") + 'Uploader" class="fileUploaderBtn" name="' + $(this).attr("id") + 'Uploader" allowScriptAccess="' + settings.scriptAccess + '" wmode="' + settings.wmode + '" type="application/x-shockwave-flash" />';
|
||||
}
|
||||
if (settings.onInit() !== false) {
|
||||
$(this).css('display','none');
|
||||
if ($.browser.msie) {
|
||||
$(this).after('<div id="' + $(this).attr("id") + 'Uploader"></div>');
|
||||
document.getElementById($(this).attr("id") + 'Uploader').outerHTML = flashElement;
|
||||
} else {
|
||||
$(this).after(flashElement);
|
||||
}
|
||||
$("#" + $(this).attr('id') + "Uploader").after('<div id="' + $(this).attr('id') + 'Queue" class="fileUploadQueue"></div>');
|
||||
}
|
||||
$(this).bind("rfuSelect", {'action': settings.onSelect}, function(event, queueID, fileObj) {
|
||||
if (event.data.action(event, queueID, fileObj) !== false) {
|
||||
var byteSize = Math.round(fileObj.size / 1024 * 100) * .01;
|
||||
var suffix = 'KB';
|
||||
if (byteSize > 1000) {
|
||||
byteSize = Math.round(byteSize *.001 * 100) * .01;
|
||||
suffix = 'MB';
|
||||
}
|
||||
var sizeParts = byteSize.toString().split('.');
|
||||
if (sizeParts.length > 1) {
|
||||
byteSize = sizeParts[0] + '.' + sizeParts[1].substr(0,2);
|
||||
} else {
|
||||
byteSize = sizeParts[0];
|
||||
}
|
||||
if (fileObj.name.length > 20) {
|
||||
fileName = fileObj.name.substr(0,20) + '...';
|
||||
} else {
|
||||
fileName = fileObj.name;
|
||||
}
|
||||
$('#' + $(this).attr('id') + 'Queue').append('<div id="' + $(this).attr('id') + queueID + '" class="fileUploadQueueItem">\
|
||||
<div class="cancel">\
|
||||
<a href="javascript:$(\'#' + $(this).attr('id') + '\').fileUploadCancel(\'' + queueID + '\')"><img src="' + settings.cancelImg + '" border="0" /></a>\
|
||||
</div>\
|
||||
<span class="fileName">' + fileName + ' (' + byteSize + suffix + ')</span><span class="percentage"> </span>\
|
||||
<div class="fileUploadProgress" style="width: 100%;">\
|
||||
<div id="' + $(this).attr('id') + queueID + 'ProgressBar" class="fileUploadProgressBar" style="width: 1px; height: 3px;"></div>\
|
||||
</div>\
|
||||
</div>');
|
||||
}
|
||||
});
|
||||
if (typeof(settings.onSelectOnce) == 'function') {
|
||||
$(this).bind("rfuSelectOnce", settings.onSelectOnce);
|
||||
}
|
||||
$(this).bind("rfuCheckExist", {'action': settings.onCheck}, function(event, checkScript, fileQueue, folder, single) {
|
||||
var postData = new Object();
|
||||
postData.folder = pagePath + folder;
|
||||
for (var queueID in fileQueue) {
|
||||
postData[queueID] = fileQueue[queueID];
|
||||
if (single) {
|
||||
var singleFileID = queueID;
|
||||
}
|
||||
}
|
||||
$.post(checkScript, postData, function(data) {
|
||||
for(var key in data) {
|
||||
if (event.data.action(event, checkScript, fileQueue, folder, single) !== false) {
|
||||
var replaceFile = confirm('Do you want to replace the file \'' + data[key] + '\'?');
|
||||
if (!replaceFile) {
|
||||
document.getElementById($(event.target).attr('id') + 'Uploader').cancelFileUpload(key);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (single) {
|
||||
document.getElementById($(event.target).attr('id') + 'Uploader').startFileUpload(singleFileID, true);
|
||||
} else {
|
||||
document.getElementById($(event.target).attr('id') + 'Uploader').startFileUpload(null, true);
|
||||
}
|
||||
}, "json");
|
||||
});
|
||||
$(this).bind("rfuCancel", {'action': settings.onCancel}, function(event, queueID, fileObj, data) {
|
||||
if (event.data.action(event, queueID, fileObj, data) !== false) {
|
||||
$("#" + $(this).attr('id') + queueID).fadeOut(250, function() { $("#" + $(this).attr('id') + queueID).remove()});
|
||||
}
|
||||
});
|
||||
$(this).bind("rfuClearQueue", {'action': settings.onClearQueue}, function() {
|
||||
if (event.data.action() !== false) {
|
||||
$('#' + $(this).attr('id') + 'Queue').contents().fadeOut(250, function() {$('#' + $(this).attr('id') + 'Queue').empty()});
|
||||
}
|
||||
});
|
||||
$(this).bind("rfuError", {'action': settings.onError}, function(event, queueID, fileObj, errorObj) {
|
||||
if (event.data.action(event, queueID, fileObj, errorObj) !== false) {
|
||||
$("#" + $(this).attr('id') + queueID + " .fileName").text(errorObj.type + " Error - " + fileObj.name);
|
||||
$("#" + $(this).attr('id') + queueID).css({'border': '3px solid #FBCBBC', 'background-color': '#FDE5DD'});
|
||||
}
|
||||
});
|
||||
$(this).bind("rfuProgress", {'action': settings.onProgress, 'toDisplay': settings.displayData}, function(event, queueID, fileObj, data) {
|
||||
if (event.data.action(event, queueID, fileObj, data) !== false) {
|
||||
$("#" + $(this).attr('id') + queueID + "ProgressBar").css('width', data.percentage + '%');
|
||||
if (event.data.toDisplay == 'percentage') displayData = ' - ' + data.percentage + '%';
|
||||
if (event.data.toDisplay == 'speed') displayData = ' - ' + data.speed + 'KB/s';
|
||||
if (event.data.toDisplay == null) displayData = ' ';
|
||||
$("#" + $(this).attr('id') + queueID + " .percentage").text(displayData);
|
||||
}
|
||||
});
|
||||
$(this).bind("rfuComplete", {'action': settings.onComplete}, function(event, queueID, fileObj, response, data) {
|
||||
if (event.data.action(event, queueID, fileObj, unescape(response), data) !== false) {
|
||||
$("#" + $(this).attr('id') + queueID).fadeOut(250, function() { $("#" + $(this).attr('id') + queueID).remove()});
|
||||
$("#" + $(this).attr('id') + queueID + " .percentage").text(' - Completed');
|
||||
}
|
||||
});
|
||||
if (typeof(settings.onAllComplete) == 'function') {
|
||||
$(this).bind("rfuAllComplete", settings.onAllComplete);
|
||||
}
|
||||
});
|
||||
}
|
||||
},
|
||||
fileUploadSettings:function(settingName, settingValue) {
|
||||
$(this).each(function() {
|
||||
document.getElementById($(this).attr('id') + 'Uploader').updateSettings(settingName,settingValue);
|
||||
});
|
||||
},
|
||||
fileUploadStart:function(queueID) {
|
||||
$(this).each(function() {
|
||||
document.getElementById($(this).attr('id') + 'Uploader').startFileUpload(queueID, false);
|
||||
});
|
||||
},
|
||||
fileUploadCancel:function(queueID) {
|
||||
$(this).each(function() {
|
||||
document.getElementById($(this).attr('id') + 'Uploader').cancelFileUpload(queueID);
|
||||
});
|
||||
},
|
||||
fileUploadClearQueue:function() {
|
||||
$(this).each(function() {
|
||||
document.getElementById($(this).attr('id') + 'Uploader').clearFileUploadQueue();
|
||||
});
|
||||
}
|
||||
})
|
||||
})(jQuery);
|
||||
25
public/js/jquery.uploadify.js
Normal file
60
public/js/legacy-gallery-init.js
Normal file
@@ -0,0 +1,60 @@
|
||||
// Modern gallery init: wait for images to decode, then init Isotope/Masonry
|
||||
(function(){
|
||||
'use strict';
|
||||
|
||||
function waitForImages(container) {
|
||||
var imgs = Array.prototype.slice.call(container.querySelectorAll('img'));
|
||||
var promises = imgs.map(function(img){
|
||||
try {
|
||||
if (!img.complete) {
|
||||
return img.decode().catch(function(){ /* ignore */ });
|
||||
}
|
||||
// already complete: still attempt decode if supported
|
||||
return img.decode ? img.decode().catch(function(){}) : Promise.resolve();
|
||||
} catch (e) {
|
||||
return Promise.resolve();
|
||||
}
|
||||
});
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
async function initGallery() {
|
||||
var grid = document.querySelector('.gallery-grid');
|
||||
if (!grid) return;
|
||||
|
||||
try {
|
||||
await waitForImages(grid);
|
||||
} catch (e) {
|
||||
// continue even on failures
|
||||
}
|
||||
|
||||
// Prefer Isotope (legacy code included it). Fall back to Masonry.
|
||||
if (window.Isotope) {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
var iso = new Isotope(grid, {
|
||||
itemSelector: '.photo_frame',
|
||||
layoutMode: 'masonry',
|
||||
masonry: { columnWidth: '.photo_frame', gutter: 12 },
|
||||
percentPosition: true,
|
||||
fitWidth: true
|
||||
});
|
||||
} else if (window.Masonry) {
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
var m = new Masonry(grid, {
|
||||
itemSelector: '.photo_frame',
|
||||
columnWidth: '.photo_frame',
|
||||
percentPosition: true,
|
||||
gutter: 12,
|
||||
fitWidth: true
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Auto-run when DOM ready
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initGallery);
|
||||
} else {
|
||||
initGallery();
|
||||
}
|
||||
|
||||
})();
|
||||
53
public/js/lib/.svn/all-wcprops
Normal file
@@ -0,0 +1,53 @@
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 25
|
||||
/svn/!svn/ver/2/trunk/lib
|
||||
END
|
||||
prototype.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 38
|
||||
/svn/!svn/ver/2/trunk/lib/prototype.js
|
||||
END
|
||||
builder.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 36
|
||||
/svn/!svn/ver/2/trunk/lib/builder.js
|
||||
END
|
||||
effects.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 36
|
||||
/svn/!svn/ver/2/trunk/lib/effects.js
|
||||
END
|
||||
unittest.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 37
|
||||
/svn/!svn/ver/2/trunk/lib/unittest.js
|
||||
END
|
||||
scriptaculous.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 42
|
||||
/svn/!svn/ver/2/trunk/lib/scriptaculous.js
|
||||
END
|
||||
dragdrop.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 37
|
||||
/svn/!svn/ver/2/trunk/lib/dragdrop.js
|
||||
END
|
||||
slider.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 35
|
||||
/svn/!svn/ver/2/trunk/lib/slider.js
|
||||
END
|
||||
controls.js
|
||||
K 25
|
||||
svn:wc:ra_dav:version-url
|
||||
V 37
|
||||
/svn/!svn/ver/2/trunk/lib/controls.js
|
||||
END
|
||||
132
public/js/lib/.svn/entries
Normal file
@@ -0,0 +1,132 @@
|
||||
8
|
||||
|
||||
dir
|
||||
23
|
||||
https://modalbox.googlecode.com/svn/trunk/lib
|
||||
https://modalbox.googlecode.com/svn
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
|
||||
|
||||
svn:special svn:externals svn:needs-lock
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
27ecc59e-4629-0410-aa62-799b7395345f
|
||||
|
||||
prototype.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
76a7817d74e1ade50d87167b13a443db
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
builder.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
5cf5f6ccca0fa4c4c8a0428e9240b81a
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
effects.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
be6dba6cd4a57fc1dade9b547fc614d9
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
unittest.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
9ffcc3a22dbfeb9e5665247f376deb76
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
scriptaculous.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
211d955609da0b228a65487384b95722
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
dragdrop.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
f41cfdb65270e6f50eb1cce7cee52902
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
slider.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
a35f869479bb76b2d0de3aaa808ead5e
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
controls.js
|
||||
file
|
||||
|
||||
|
||||
|
||||
|
||||
2007-02-15T15:21:21.000000Z
|
||||
3caf5091b68f3a6afaf881744509d4c6
|
||||
2007-02-15T15:07:37.813389Z
|
||||
2
|
||||
andrej.okonetschnikow
|
||||
has-props
|
||||
|
||||
1
public/js/lib/.svn/format
Normal file
@@ -0,0 +1 @@
|
||||
8
|
||||
5
public/js/lib/.svn/prop-base/builder.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/controls.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/dragdrop.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/effects.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/prototype.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/scriptaculous.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/slider.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
5
public/js/lib/.svn/prop-base/unittest.js.svn-base
Normal file
@@ -0,0 +1,5 @@
|
||||
K 13
|
||||
svn:mime-type
|
||||
V 15
|
||||
text/javascript
|
||||
END
|
||||
131
public/js/lib/.svn/text-base/builder.js.svn-base
Normal file
@@ -0,0 +1,131 @@
|
||||
// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
//
|
||||
// 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/
|
||||
|
||||
var Builder = {
|
||||
NODEMAP: {
|
||||
AREA: 'map',
|
||||
CAPTION: 'table',
|
||||
COL: 'table',
|
||||
COLGROUP: 'table',
|
||||
LEGEND: 'fieldset',
|
||||
OPTGROUP: 'select',
|
||||
OPTION: 'select',
|
||||
PARAM: 'object',
|
||||
TBODY: 'table',
|
||||
TD: 'table',
|
||||
TFOOT: 'table',
|
||||
TH: 'table',
|
||||
THEAD: 'table',
|
||||
TR: 'table'
|
||||
},
|
||||
// note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
|
||||
// due to a Firefox bug
|
||||
node: function(elementName) {
|
||||
elementName = elementName.toUpperCase();
|
||||
|
||||
// try innerHTML approach
|
||||
var parentTag = this.NODEMAP[elementName] || 'div';
|
||||
var parentElement = document.createElement(parentTag);
|
||||
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
||||
parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
|
||||
} catch(e) {}
|
||||
var element = parentElement.firstChild || null;
|
||||
|
||||
// see if browser added wrapping tags
|
||||
if(element && (element.tagName.toUpperCase() != elementName))
|
||||
element = element.getElementsByTagName(elementName)[0];
|
||||
|
||||
// fallback to createElement approach
|
||||
if(!element) element = document.createElement(elementName);
|
||||
|
||||
// abort if nothing could be created
|
||||
if(!element) return;
|
||||
|
||||
// attributes (or text)
|
||||
if(arguments[1])
|
||||
if(this._isStringOrNumber(arguments[1]) ||
|
||||
(arguments[1] instanceof Array)) {
|
||||
this._children(element, arguments[1]);
|
||||
} else {
|
||||
var attrs = this._attributes(arguments[1]);
|
||||
if(attrs.length) {
|
||||
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
||||
parentElement.innerHTML = "<" +elementName + " " +
|
||||
attrs + "></" + elementName + ">";
|
||||
} catch(e) {}
|
||||
element = parentElement.firstChild || null;
|
||||
// workaround firefox 1.0.X bug
|
||||
if(!element) {
|
||||
element = document.createElement(elementName);
|
||||
for(attr in arguments[1])
|
||||
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
|
||||
}
|
||||
if(element.tagName.toUpperCase() != elementName)
|
||||
element = parentElement.getElementsByTagName(elementName)[0];
|
||||
}
|
||||
}
|
||||
|
||||
// text, or array of children
|
||||
if(arguments[2])
|
||||
this._children(element, arguments[2]);
|
||||
|
||||
return element;
|
||||
},
|
||||
_text: function(text) {
|
||||
return document.createTextNode(text);
|
||||
},
|
||||
|
||||
ATTR_MAP: {
|
||||
'className': 'class',
|
||||
'htmlFor': 'for'
|
||||
},
|
||||
|
||||
_attributes: function(attributes) {
|
||||
var attrs = [];
|
||||
for(attribute in attributes)
|
||||
attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
|
||||
'="' + attributes[attribute].toString().escapeHTML() + '"');
|
||||
return attrs.join(" ");
|
||||
},
|
||||
_children: function(element, children) {
|
||||
if(typeof children=='object') { // array can hold nodes and text
|
||||
children.flatten().each( function(e) {
|
||||
if(typeof e=='object')
|
||||
element.appendChild(e)
|
||||
else
|
||||
if(Builder._isStringOrNumber(e))
|
||||
element.appendChild(Builder._text(e));
|
||||
});
|
||||
} else
|
||||
if(Builder._isStringOrNumber(children))
|
||||
element.appendChild(Builder._text(children));
|
||||
},
|
||||
_isStringOrNumber: function(param) {
|
||||
return(typeof param=='string' || typeof param=='number');
|
||||
},
|
||||
build: function(html) {
|
||||
var element = this.node('div');
|
||||
$(element).update(html.strip());
|
||||
return element.down();
|
||||
},
|
||||
dump: function(scope) {
|
||||
if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
|
||||
|
||||
var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
|
||||
"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
|
||||
"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
|
||||
"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
|
||||
"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
|
||||
"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
|
||||
|
||||
tags.each( function(tag){
|
||||
scope[tag] = function() {
|
||||
return Builder.node.apply(Builder, [tag].concat($A(arguments)));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
835
public/js/lib/.svn/text-base/controls.js.svn-base
Normal file
@@ -0,0 +1,835 @@
|
||||
// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
|
||||
// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
|
||||
// Contributors:
|
||||
// Richard Livsey
|
||||
// Rahul Bhargava
|
||||
// Rob Wills
|
||||
//
|
||||
// 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/
|
||||
|
||||
// Autocompleter.Base handles all the autocompletion functionality
|
||||
// that's independent of the data source for autocompletion. This
|
||||
// includes drawing the autocompletion menu, observing keyboard
|
||||
// and mouse events, and similar.
|
||||
//
|
||||
// Specific autocompleters need to provide, at the very least,
|
||||
// a getUpdatedChoices function that will be invoked every time
|
||||
// the text inside the monitored textbox changes. This method
|
||||
// should get the text for which to provide autocompletion by
|
||||
// invoking this.getToken(), NOT by directly accessing
|
||||
// this.element.value. This is to allow incremental tokenized
|
||||
// autocompletion. Specific auto-completion logic (AJAX, etc)
|
||||
// belongs in getUpdatedChoices.
|
||||
//
|
||||
// Tokenized incremental autocompletion is enabled automatically
|
||||
// when an autocompleter is instantiated with the 'tokens' option
|
||||
// in the options parameter, e.g.:
|
||||
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
|
||||
// will incrementally autocomplete with a comma as the token.
|
||||
// Additionally, ',' in the above example can be replaced with
|
||||
// a token array, e.g. { tokens: [',', '\n'] } which
|
||||
// enables autocompletion on multiple tokens. This is most
|
||||
// useful when one of the tokens is \n (a newline), as it
|
||||
// allows smart autocompletion after linebreaks.
|
||||
|
||||
if(typeof Effect == 'undefined')
|
||||
throw("controls.js requires including script.aculo.us' effects.js library");
|
||||
|
||||
var Autocompleter = {}
|
||||
Autocompleter.Base = function() {};
|
||||
Autocompleter.Base.prototype = {
|
||||
baseInitialize: function(element, update, options) {
|
||||
this.element = $(element);
|
||||
this.update = $(update);
|
||||
this.hasFocus = false;
|
||||
this.changed = false;
|
||||
this.active = false;
|
||||
this.index = 0;
|
||||
this.entryCount = 0;
|
||||
|
||||
if(this.setOptions)
|
||||
this.setOptions(options);
|
||||
else
|
||||
this.options = options || {};
|
||||
|
||||
this.options.paramName = this.options.paramName || this.element.name;
|
||||
this.options.tokens = this.options.tokens || [];
|
||||
this.options.frequency = this.options.frequency || 0.4;
|
||||
this.options.minChars = this.options.minChars || 1;
|
||||
this.options.onShow = this.options.onShow ||
|
||||
function(element, update){
|
||||
if(!update.style.position || update.style.position=='absolute') {
|
||||
update.style.position = 'absolute';
|
||||
Position.clone(element, update, {
|
||||
setHeight: false,
|
||||
offsetTop: element.offsetHeight
|
||||
});
|
||||
}
|
||||
Effect.Appear(update,{duration:0.15});
|
||||
};
|
||||
this.options.onHide = this.options.onHide ||
|
||||
function(element, update){ new Effect.Fade(update,{duration:0.15}) };
|
||||
|
||||
if(typeof(this.options.tokens) == 'string')
|
||||
this.options.tokens = new Array(this.options.tokens);
|
||||
|
||||
this.observer = null;
|
||||
|
||||
this.element.setAttribute('autocomplete','off');
|
||||
|
||||
Element.hide(this.update);
|
||||
|
||||
Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
|
||||
Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
|
||||
if(!this.iefix &&
|
||||
(navigator.appVersion.indexOf('MSIE')>0) &&
|
||||
(navigator.userAgent.indexOf('Opera')<0) &&
|
||||
(Element.getStyle(this.update, 'position')=='absolute')) {
|
||||
new Insertion.After(this.update,
|
||||
'<iframe id="' + this.update.id + '_iefix" '+
|
||||
'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
|
||||
'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
|
||||
this.iefix = $(this.update.id+'_iefix');
|
||||
}
|
||||
if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
|
||||
},
|
||||
|
||||
fixIEOverlapping: function() {
|
||||
Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
|
||||
this.iefix.style.zIndex = 1;
|
||||
this.update.style.zIndex = 2;
|
||||
Element.show(this.iefix);
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
this.stopIndicator();
|
||||
if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
|
||||
if(this.iefix) Element.hide(this.iefix);
|
||||
},
|
||||
|
||||
startIndicator: function() {
|
||||
if(this.options.indicator) Element.show(this.options.indicator);
|
||||
},
|
||||
|
||||
stopIndicator: function() {
|
||||
if(this.options.indicator) Element.hide(this.options.indicator);
|
||||
},
|
||||
|
||||
onKeyPress: function(event) {
|
||||
if(this.active)
|
||||
switch(event.keyCode) {
|
||||
case Event.KEY_TAB:
|
||||
case Event.KEY_RETURN:
|
||||
this.selectEntry();
|
||||
Event.stop(event);
|
||||
case Event.KEY_ESC:
|
||||
this.hide();
|
||||
this.active = false;
|
||||
Event.stop(event);
|
||||
return;
|
||||
case Event.KEY_LEFT:
|
||||
case Event.KEY_RIGHT:
|
||||
return;
|
||||
case Event.KEY_UP:
|
||||
this.markPrevious();
|
||||
this.render();
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
|
||||
return;
|
||||
case Event.KEY_DOWN:
|
||||
this.markNext();
|
||||
this.render();
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
|
||||
(navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
|
||||
|
||||
this.changed = true;
|
||||
this.hasFocus = true;
|
||||
|
||||
if(this.observer) clearTimeout(this.observer);
|
||||
this.observer =
|
||||
setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
|
||||
},
|
||||
|
||||
activate: function() {
|
||||
this.changed = false;
|
||||
this.hasFocus = true;
|
||||
this.getUpdatedChoices();
|
||||
},
|
||||
|
||||
onHover: function(event) {
|
||||
var element = Event.findElement(event, 'LI');
|
||||
if(this.index != element.autocompleteIndex)
|
||||
{
|
||||
this.index = element.autocompleteIndex;
|
||||
this.render();
|
||||
}
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
onClick: function(event) {
|
||||
var element = Event.findElement(event, 'LI');
|
||||
this.index = element.autocompleteIndex;
|
||||
this.selectEntry();
|
||||
this.hide();
|
||||
},
|
||||
|
||||
onBlur: function(event) {
|
||||
// needed to make click events working
|
||||
setTimeout(this.hide.bind(this), 250);
|
||||
this.hasFocus = false;
|
||||
this.active = false;
|
||||
},
|
||||
|
||||
render: function() {
|
||||
if(this.entryCount > 0) {
|
||||
for (var i = 0; i < this.entryCount; i++)
|
||||
this.index==i ?
|
||||
Element.addClassName(this.getEntry(i),"selected") :
|
||||
Element.removeClassName(this.getEntry(i),"selected");
|
||||
|
||||
if(this.hasFocus) {
|
||||
this.show();
|
||||
this.active = true;
|
||||
}
|
||||
} else {
|
||||
this.active = false;
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
|
||||
markPrevious: function() {
|
||||
if(this.index > 0) this.index--
|
||||
else this.index = this.entryCount-1;
|
||||
this.getEntry(this.index).scrollIntoView(true);
|
||||
},
|
||||
|
||||
markNext: function() {
|
||||
if(this.index < this.entryCount-1) this.index++
|
||||
else this.index = 0;
|
||||
this.getEntry(this.index).scrollIntoView(false);
|
||||
},
|
||||
|
||||
getEntry: function(index) {
|
||||
return this.update.firstChild.childNodes[index];
|
||||
},
|
||||
|
||||
getCurrentEntry: function() {
|
||||
return this.getEntry(this.index);
|
||||
},
|
||||
|
||||
selectEntry: function() {
|
||||
this.active = false;
|
||||
this.updateElement(this.getCurrentEntry());
|
||||
},
|
||||
|
||||
updateElement: function(selectedElement) {
|
||||
if (this.options.updateElement) {
|
||||
this.options.updateElement(selectedElement);
|
||||
return;
|
||||
}
|
||||
var value = '';
|
||||
if (this.options.select) {
|
||||
var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
|
||||
if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
|
||||
} else
|
||||
value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
|
||||
|
||||
var lastTokenPos = this.findLastToken();
|
||||
if (lastTokenPos != -1) {
|
||||
var newValue = this.element.value.substr(0, lastTokenPos + 1);
|
||||
var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
|
||||
if (whitespace)
|
||||
newValue += whitespace[0];
|
||||
this.element.value = newValue + value;
|
||||
} else {
|
||||
this.element.value = value;
|
||||
}
|
||||
this.element.focus();
|
||||
|
||||
if (this.options.afterUpdateElement)
|
||||
this.options.afterUpdateElement(this.element, selectedElement);
|
||||
},
|
||||
|
||||
updateChoices: function(choices) {
|
||||
if(!this.changed && this.hasFocus) {
|
||||
this.update.innerHTML = choices;
|
||||
Element.cleanWhitespace(this.update);
|
||||
Element.cleanWhitespace(this.update.down());
|
||||
|
||||
if(this.update.firstChild && this.update.down().childNodes) {
|
||||
this.entryCount =
|
||||
this.update.down().childNodes.length;
|
||||
for (var i = 0; i < this.entryCount; i++) {
|
||||
var entry = this.getEntry(i);
|
||||
entry.autocompleteIndex = i;
|
||||
this.addObservers(entry);
|
||||
}
|
||||
} else {
|
||||
this.entryCount = 0;
|
||||
}
|
||||
|
||||
this.stopIndicator();
|
||||
this.index = 0;
|
||||
|
||||
if(this.entryCount==1 && this.options.autoSelect) {
|
||||
this.selectEntry();
|
||||
this.hide();
|
||||
} else {
|
||||
this.render();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
addObservers: function(element) {
|
||||
Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
|
||||
Event.observe(element, "click", this.onClick.bindAsEventListener(this));
|
||||
},
|
||||
|
||||
onObserverEvent: function() {
|
||||
this.changed = false;
|
||||
if(this.getToken().length>=this.options.minChars) {
|
||||
this.startIndicator();
|
||||
this.getUpdatedChoices();
|
||||
} else {
|
||||
this.active = false;
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
|
||||
getToken: function() {
|
||||
var tokenPos = this.findLastToken();
|
||||
if (tokenPos != -1)
|
||||
var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
|
||||
else
|
||||
var ret = this.element.value;
|
||||
|
||||
return /\n/.test(ret) ? '' : ret;
|
||||
},
|
||||
|
||||
findLastToken: function() {
|
||||
var lastTokenPos = -1;
|
||||
|
||||
for (var i=0; i<this.options.tokens.length; i++) {
|
||||
var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
|
||||
if (thisTokenPos > lastTokenPos)
|
||||
lastTokenPos = thisTokenPos;
|
||||
}
|
||||
return lastTokenPos;
|
||||
}
|
||||
}
|
||||
|
||||
Ajax.Autocompleter = Class.create();
|
||||
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
|
||||
initialize: function(element, update, url, options) {
|
||||
this.baseInitialize(element, update, options);
|
||||
this.options.asynchronous = true;
|
||||
this.options.onComplete = this.onComplete.bind(this);
|
||||
this.options.defaultParams = this.options.parameters || null;
|
||||
this.url = url;
|
||||
},
|
||||
|
||||
getUpdatedChoices: function() {
|
||||
entry = encodeURIComponent(this.options.paramName) + '=' +
|
||||
encodeURIComponent(this.getToken());
|
||||
|
||||
this.options.parameters = this.options.callback ?
|
||||
this.options.callback(this.element, entry) : entry;
|
||||
|
||||
if(this.options.defaultParams)
|
||||
this.options.parameters += '&' + this.options.defaultParams;
|
||||
|
||||
new Ajax.Request(this.url, this.options);
|
||||
},
|
||||
|
||||
onComplete: function(request) {
|
||||
this.updateChoices(request.responseText);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// The local array autocompleter. Used when you'd prefer to
|
||||
// inject an array of autocompletion options into the page, rather
|
||||
// than sending out Ajax queries, which can be quite slow sometimes.
|
||||
//
|
||||
// The constructor takes four parameters. The first two are, as usual,
|
||||
// the id of the monitored textbox, and id of the autocompletion menu.
|
||||
// The third is the array you want to autocomplete from, and the fourth
|
||||
// is the options block.
|
||||
//
|
||||
// Extra local autocompletion options:
|
||||
// - choices - How many autocompletion choices to offer
|
||||
//
|
||||
// - partialSearch - If false, the autocompleter will match entered
|
||||
// text only at the beginning of strings in the
|
||||
// autocomplete array. Defaults to true, which will
|
||||
// match text at the beginning of any *word* in the
|
||||
// strings in the autocomplete array. If you want to
|
||||
// search anywhere in the string, additionally set
|
||||
// the option fullSearch to true (default: off).
|
||||
//
|
||||
// - fullSsearch - Search anywhere in autocomplete array strings.
|
||||
//
|
||||
// - partialChars - How many characters to enter before triggering
|
||||
// a partial match (unlike minChars, which defines
|
||||
// how many characters are required to do any match
|
||||
// at all). Defaults to 2.
|
||||
//
|
||||
// - ignoreCase - Whether to ignore case when autocompleting.
|
||||
// Defaults to true.
|
||||
//
|
||||
// It's possible to pass in a custom function as the 'selector'
|
||||
// option, if you prefer to write your own autocompletion logic.
|
||||
// In that case, the other options above will not apply unless
|
||||
// you support them.
|
||||
|
||||
Autocompleter.Local = Class.create();
|
||||
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
|
||||
initialize: function(element, update, array, options) {
|
||||
this.baseInitialize(element, update, options);
|
||||
this.options.array = array;
|
||||
},
|
||||
|
||||
getUpdatedChoices: function() {
|
||||
this.updateChoices(this.options.selector(this));
|
||||
},
|
||||
|
||||
setOptions: function(options) {
|
||||
this.options = Object.extend({
|
||||
choices: 10,
|
||||
partialSearch: true,
|
||||
partialChars: 2,
|
||||
ignoreCase: true,
|
||||
fullSearch: false,
|
||||
selector: function(instance) {
|
||||
var ret = []; // Beginning matches
|
||||
var partial = []; // Inside matches
|
||||
var entry = instance.getToken();
|
||||
var count = 0;
|
||||
|
||||
for (var i = 0; i < instance.options.array.length &&
|
||||
ret.length < instance.options.choices ; i++) {
|
||||
|
||||
var elem = instance.options.array[i];
|
||||
var foundPos = instance.options.ignoreCase ?
|
||||
elem.toLowerCase().indexOf(entry.toLowerCase()) :
|
||||
elem.indexOf(entry);
|
||||
|
||||
while (foundPos != -1) {
|
||||
if (foundPos == 0 && elem.length != entry.length) {
|
||||
ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
|
||||
elem.substr(entry.length) + "</li>");
|
||||
break;
|
||||
} else if (entry.length >= instance.options.partialChars &&
|
||||
instance.options.partialSearch && foundPos != -1) {
|
||||
if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
|
||||
partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
|
||||
elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
|
||||
foundPos + entry.length) + "</li>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foundPos = instance.options.ignoreCase ?
|
||||
elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
|
||||
elem.indexOf(entry, foundPos + 1);
|
||||
|
||||
}
|
||||
}
|
||||
if (partial.length)
|
||||
ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
|
||||
return "<ul>" + ret.join('') + "</ul>";
|
||||
}
|
||||
}, options || {});
|
||||
}
|
||||
});
|
||||
|
||||
// AJAX in-place editor
|
||||
//
|
||||
// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
|
||||
|
||||
// Use this if you notice weird scrolling problems on some browsers,
|
||||
// the DOM might be a bit confused when this gets called so do this
|
||||
// waits 1 ms (with setTimeout) until it does the activation
|
||||
Field.scrollFreeActivate = function(field) {
|
||||
setTimeout(function() {
|
||||
Field.activate(field);
|
||||
}, 1);
|
||||
}
|
||||
|
||||
Ajax.InPlaceEditor = Class.create();
|
||||
Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
|
||||
Ajax.InPlaceEditor.prototype = {
|
||||
initialize: function(element, url, options) {
|
||||
this.url = url;
|
||||
this.element = $(element);
|
||||
|
||||
this.options = Object.extend({
|
||||
paramName: "value",
|
||||
okButton: true,
|
||||
okText: "ok",
|
||||
cancelLink: true,
|
||||
cancelText: "cancel",
|
||||
savingText: "Saving...",
|
||||
clickToEditText: "Click to edit",
|
||||
okText: "ok",
|
||||
rows: 1,
|
||||
onComplete: function(transport, element) {
|
||||
new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
|
||||
},
|
||||
onFailure: function(transport) {
|
||||
alert("Error communicating with the server: " + transport.responseText.stripTags());
|
||||
},
|
||||
callback: function(form) {
|
||||
return Form.serialize(form);
|
||||
},
|
||||
handleLineBreaks: true,
|
||||
loadingText: 'Loading...',
|
||||
savingClassName: 'inplaceeditor-saving',
|
||||
loadingClassName: 'inplaceeditor-loading',
|
||||
formClassName: 'inplaceeditor-form',
|
||||
highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
|
||||
highlightendcolor: "#FFFFFF",
|
||||
externalControl: null,
|
||||
submitOnBlur: false,
|
||||
ajaxOptions: {},
|
||||
evalScripts: false
|
||||
}, options || {});
|
||||
|
||||
if(!this.options.formId && this.element.id) {
|
||||
this.options.formId = this.element.id + "-inplaceeditor";
|
||||
if ($(this.options.formId)) {
|
||||
// there's already a form with that name, don't specify an id
|
||||
this.options.formId = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.options.externalControl) {
|
||||
this.options.externalControl = $(this.options.externalControl);
|
||||
}
|
||||
|
||||
this.originalBackground = Element.getStyle(this.element, 'background-color');
|
||||
if (!this.originalBackground) {
|
||||
this.originalBackground = "transparent";
|
||||
}
|
||||
|
||||
this.element.title = this.options.clickToEditText;
|
||||
|
||||
this.onclickListener = this.enterEditMode.bindAsEventListener(this);
|
||||
this.mouseoverListener = this.enterHover.bindAsEventListener(this);
|
||||
this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
|
||||
Event.observe(this.element, 'click', this.onclickListener);
|
||||
Event.observe(this.element, 'mouseover', this.mouseoverListener);
|
||||
Event.observe(this.element, 'mouseout', this.mouseoutListener);
|
||||
if (this.options.externalControl) {
|
||||
Event.observe(this.options.externalControl, 'click', this.onclickListener);
|
||||
Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
|
||||
Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
|
||||
}
|
||||
},
|
||||
enterEditMode: function(evt) {
|
||||
if (this.saving) return;
|
||||
if (this.editing) return;
|
||||
this.editing = true;
|
||||
this.onEnterEditMode();
|
||||
if (this.options.externalControl) {
|
||||
Element.hide(this.options.externalControl);
|
||||
}
|
||||
Element.hide(this.element);
|
||||
this.createForm();
|
||||
this.element.parentNode.insertBefore(this.form, this.element);
|
||||
if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
|
||||
// stop the event to avoid a page refresh in Safari
|
||||
if (evt) {
|
||||
Event.stop(evt);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
createForm: function() {
|
||||
this.form = document.createElement("form");
|
||||
this.form.id = this.options.formId;
|
||||
Element.addClassName(this.form, this.options.formClassName)
|
||||
this.form.onsubmit = this.onSubmit.bind(this);
|
||||
|
||||
this.createEditField();
|
||||
|
||||
if (this.options.textarea) {
|
||||
var br = document.createElement("br");
|
||||
this.form.appendChild(br);
|
||||
}
|
||||
|
||||
if (this.options.okButton) {
|
||||
okButton = document.createElement("input");
|
||||
okButton.type = "submit";
|
||||
okButton.value = this.options.okText;
|
||||
okButton.className = 'editor_ok_button';
|
||||
this.form.appendChild(okButton);
|
||||
}
|
||||
|
||||
if (this.options.cancelLink) {
|
||||
cancelLink = document.createElement("a");
|
||||
cancelLink.href = "#";
|
||||
cancelLink.appendChild(document.createTextNode(this.options.cancelText));
|
||||
cancelLink.onclick = this.onclickCancel.bind(this);
|
||||
cancelLink.className = 'editor_cancel';
|
||||
this.form.appendChild(cancelLink);
|
||||
}
|
||||
},
|
||||
hasHTMLLineBreaks: function(string) {
|
||||
if (!this.options.handleLineBreaks) return false;
|
||||
return string.match(/<br/i) || string.match(/<p>/i);
|
||||
},
|
||||
convertHTMLLineBreaks: function(string) {
|
||||
return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
|
||||
},
|
||||
createEditField: function() {
|
||||
var text;
|
||||
if(this.options.loadTextURL) {
|
||||
text = this.options.loadingText;
|
||||
} else {
|
||||
text = this.getText();
|
||||
}
|
||||
|
||||
var obj = this;
|
||||
|
||||
if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
|
||||
this.options.textarea = false;
|
||||
var textField = document.createElement("input");
|
||||
textField.obj = this;
|
||||
textField.type = "text";
|
||||
textField.name = this.options.paramName;
|
||||
textField.value = text;
|
||||
textField.style.backgroundColor = this.options.highlightcolor;
|
||||
textField.className = 'editor_field';
|
||||
var size = this.options.size || this.options.cols || 0;
|
||||
if (size != 0) textField.size = size;
|
||||
if (this.options.submitOnBlur)
|
||||
textField.onblur = this.onSubmit.bind(this);
|
||||
this.editField = textField;
|
||||
} else {
|
||||
this.options.textarea = true;
|
||||
var textArea = document.createElement("textarea");
|
||||
textArea.obj = this;
|
||||
textArea.name = this.options.paramName;
|
||||
textArea.value = this.convertHTMLLineBreaks(text);
|
||||
textArea.rows = this.options.rows;
|
||||
textArea.cols = this.options.cols || 40;
|
||||
textArea.className = 'editor_field';
|
||||
if (this.options.submitOnBlur)
|
||||
textArea.onblur = this.onSubmit.bind(this);
|
||||
this.editField = textArea;
|
||||
}
|
||||
|
||||
if(this.options.loadTextURL) {
|
||||
this.loadExternalText();
|
||||
}
|
||||
this.form.appendChild(this.editField);
|
||||
},
|
||||
getText: function() {
|
||||
return this.element.innerHTML;
|
||||
},
|
||||
loadExternalText: function() {
|
||||
Element.addClassName(this.form, this.options.loadingClassName);
|
||||
this.editField.disabled = true;
|
||||
new Ajax.Request(
|
||||
this.options.loadTextURL,
|
||||
Object.extend({
|
||||
asynchronous: true,
|
||||
onComplete: this.onLoadedExternalText.bind(this)
|
||||
}, this.options.ajaxOptions)
|
||||
);
|
||||
},
|
||||
onLoadedExternalText: function(transport) {
|
||||
Element.removeClassName(this.form, this.options.loadingClassName);
|
||||
this.editField.disabled = false;
|
||||
this.editField.value = transport.responseText.stripTags();
|
||||
Field.scrollFreeActivate(this.editField);
|
||||
},
|
||||
onclickCancel: function() {
|
||||
this.onComplete();
|
||||
this.leaveEditMode();
|
||||
return false;
|
||||
},
|
||||
onFailure: function(transport) {
|
||||
this.options.onFailure(transport);
|
||||
if (this.oldInnerHTML) {
|
||||
this.element.innerHTML = this.oldInnerHTML;
|
||||
this.oldInnerHTML = null;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onSubmit: function() {
|
||||
// onLoading resets these so we need to save them away for the Ajax call
|
||||
var form = this.form;
|
||||
var value = this.editField.value;
|
||||
|
||||
// do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
|
||||
// which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
|
||||
// to be displayed indefinitely
|
||||
this.onLoading();
|
||||
|
||||
if (this.options.evalScripts) {
|
||||
new Ajax.Request(
|
||||
this.url, Object.extend({
|
||||
parameters: this.options.callback(form, value),
|
||||
onComplete: this.onComplete.bind(this),
|
||||
onFailure: this.onFailure.bind(this),
|
||||
asynchronous:true,
|
||||
evalScripts:true
|
||||
}, this.options.ajaxOptions));
|
||||
} else {
|
||||
new Ajax.Updater(
|
||||
{ success: this.element,
|
||||
// don't update on failure (this could be an option)
|
||||
failure: null },
|
||||
this.url, Object.extend({
|
||||
parameters: this.options.callback(form, value),
|
||||
onComplete: this.onComplete.bind(this),
|
||||
onFailure: this.onFailure.bind(this)
|
||||
}, this.options.ajaxOptions));
|
||||
}
|
||||
// stop the event to avoid a page refresh in Safari
|
||||
if (arguments.length > 1) {
|
||||
Event.stop(arguments[0]);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onLoading: function() {
|
||||
this.saving = true;
|
||||
this.removeForm();
|
||||
this.leaveHover();
|
||||
this.showSaving();
|
||||
},
|
||||
showSaving: function() {
|
||||
this.oldInnerHTML = this.element.innerHTML;
|
||||
this.element.innerHTML = this.options.savingText;
|
||||
Element.addClassName(this.element, this.options.savingClassName);
|
||||
this.element.style.backgroundColor = this.originalBackground;
|
||||
Element.show(this.element);
|
||||
},
|
||||
removeForm: function() {
|
||||
if(this.form) {
|
||||
if (this.form.parentNode) Element.remove(this.form);
|
||||
this.form = null;
|
||||
}
|
||||
},
|
||||
enterHover: function() {
|
||||
if (this.saving) return;
|
||||
this.element.style.backgroundColor = this.options.highlightcolor;
|
||||
if (this.effect) {
|
||||
this.effect.cancel();
|
||||
}
|
||||
Element.addClassName(this.element, this.options.hoverClassName)
|
||||
},
|
||||
leaveHover: function() {
|
||||
if (this.options.backgroundColor) {
|
||||
this.element.style.backgroundColor = this.oldBackground;
|
||||
}
|
||||
Element.removeClassName(this.element, this.options.hoverClassName)
|
||||
if (this.saving) return;
|
||||
this.effect = new Effect.Highlight(this.element, {
|
||||
startcolor: this.options.highlightcolor,
|
||||
endcolor: this.options.highlightendcolor,
|
||||
restorecolor: this.originalBackground
|
||||
});
|
||||
},
|
||||
leaveEditMode: function() {
|
||||
Element.removeClassName(this.element, this.options.savingClassName);
|
||||
this.removeForm();
|
||||
this.leaveHover();
|
||||
this.element.style.backgroundColor = this.originalBackground;
|
||||
Element.show(this.element);
|
||||
if (this.options.externalControl) {
|
||||
Element.show(this.options.externalControl);
|
||||
}
|
||||
this.editing = false;
|
||||
this.saving = false;
|
||||
this.oldInnerHTML = null;
|
||||
this.onLeaveEditMode();
|
||||
},
|
||||
onComplete: function(transport) {
|
||||
this.leaveEditMode();
|
||||
this.options.onComplete.bind(this)(transport, this.element);
|
||||
},
|
||||
onEnterEditMode: function() {},
|
||||
onLeaveEditMode: function() {},
|
||||
dispose: function() {
|
||||
if (this.oldInnerHTML) {
|
||||
this.element.innerHTML = this.oldInnerHTML;
|
||||
}
|
||||
this.leaveEditMode();
|
||||
Event.stopObserving(this.element, 'click', this.onclickListener);
|
||||
Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
|
||||
Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
|
||||
if (this.options.externalControl) {
|
||||
Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
|
||||
Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
|
||||
Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ajax.InPlaceCollectionEditor = Class.create();
|
||||
Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
|
||||
Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
|
||||
createEditField: function() {
|
||||
if (!this.cached_selectTag) {
|
||||
var selectTag = document.createElement("select");
|
||||
var collection = this.options.collection || [];
|
||||
var optionTag;
|
||||
collection.each(function(e,i) {
|
||||
optionTag = document.createElement("option");
|
||||
optionTag.value = (e instanceof Array) ? e[0] : e;
|
||||
if((typeof this.options.value == 'undefined') &&
|
||||
((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
|
||||
if(this.options.value==optionTag.value) optionTag.selected = true;
|
||||
optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
|
||||
selectTag.appendChild(optionTag);
|
||||
}.bind(this));
|
||||
this.cached_selectTag = selectTag;
|
||||
}
|
||||
|
||||
this.editField = this.cached_selectTag;
|
||||
if(this.options.loadTextURL) this.loadExternalText();
|
||||
this.form.appendChild(this.editField);
|
||||
this.options.callback = function(form, value) {
|
||||
return "value=" + encodeURIComponent(value);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Delayed observer, like Form.Element.Observer,
|
||||
// but waits for delay after last key input
|
||||
// Ideal for live-search fields
|
||||
|
||||
Form.Element.DelayedObserver = Class.create();
|
||||
Form.Element.DelayedObserver.prototype = {
|
||||
initialize: function(element, delay, callback) {
|
||||
this.delay = delay || 0.5;
|
||||
this.element = $(element);
|
||||
this.callback = callback;
|
||||
this.timer = null;
|
||||
this.lastValue = $F(this.element);
|
||||
Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
|
||||
},
|
||||
delayedListener: function(event) {
|
||||
if(this.lastValue == $F(this.element)) return;
|
||||
if(this.timer) clearTimeout(this.timer);
|
||||
this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
|
||||
this.lastValue = $F(this.element);
|
||||
},
|
||||
onTimerEvent: function() {
|
||||
this.timer = null;
|
||||
this.callback(this.element, $F(this.element));
|
||||
}
|
||||
};
|
||||
944
public/js/lib/.svn/text-base/dragdrop.js.svn-base
Normal file
@@ -0,0 +1,944 @@
|
||||
// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
|
||||
//
|
||||
// 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/
|
||||
|
||||
if(typeof Effect == 'undefined')
|
||||
throw("dragdrop.js requires including script.aculo.us' effects.js library");
|
||||
|
||||
var Droppables = {
|
||||
drops: [],
|
||||
|
||||
remove: function(element) {
|
||||
this.drops = this.drops.reject(function(d) { return d.element==$(element) });
|
||||
},
|
||||
|
||||
add: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend({
|
||||
greedy: true,
|
||||
hoverclass: null,
|
||||
tree: false
|
||||
}, arguments[1] || {});
|
||||
|
||||
// cache containers
|
||||
if(options.containment) {
|
||||
options._containers = [];
|
||||
var containment = options.containment;
|
||||
if((typeof containment == 'object') &&
|
||||
(containment.constructor == Array)) {
|
||||
containment.each( function(c) { options._containers.push($(c)) });
|
||||
} else {
|
||||
options._containers.push($(containment));
|
||||
}
|
||||
}
|
||||
|
||||
if(options.accept) options.accept = [options.accept].flatten();
|
||||
|
||||
Element.makePositioned(element); // fix IE
|
||||
options.element = element;
|
||||
|
||||
this.drops.push(options);
|
||||
},
|
||||
|
||||
findDeepestChild: function(drops) {
|
||||
deepest = drops[0];
|
||||
|
||||
for (i = 1; i < drops.length; ++i)
|
||||
if (Element.isParent(drops[i].element, deepest.element))
|
||||
deepest = drops[i];
|
||||
|
||||
return deepest;
|
||||
},
|
||||
|
||||
isContained: function(element, drop) {
|
||||
var containmentNode;
|
||||
if(drop.tree) {
|
||||
containmentNode = element.treeNode;
|
||||
} else {
|
||||
containmentNode = element.parentNode;
|
||||
}
|
||||
return drop._containers.detect(function(c) { return containmentNode == c });
|
||||
},
|
||||
|
||||
isAffected: function(point, element, drop) {
|
||||
return (
|
||||
(drop.element!=element) &&
|
||||
((!drop._containers) ||
|
||||
this.isContained(element, drop)) &&
|
||||
((!drop.accept) ||
|
||||
(Element.classNames(element).detect(
|
||||
function(v) { return drop.accept.include(v) } ) )) &&
|
||||
Position.within(drop.element, point[0], point[1]) );
|
||||
},
|
||||
|
||||
deactivate: function(drop) {
|
||||
if(drop.hoverclass)
|
||||
Element.removeClassName(drop.element, drop.hoverclass);
|
||||
this.last_active = null;
|
||||
},
|
||||
|
||||
activate: function(drop) {
|
||||
if(drop.hoverclass)
|
||||
Element.addClassName(drop.element, drop.hoverclass);
|
||||
this.last_active = drop;
|
||||
},
|
||||
|
||||
show: function(point, element) {
|
||||
if(!this.drops.length) return;
|
||||
var affected = [];
|
||||
|
||||
if(this.last_active) this.deactivate(this.last_active);
|
||||
this.drops.each( function(drop) {
|
||||
if(Droppables.isAffected(point, element, drop))
|
||||
affected.push(drop);
|
||||
});
|
||||
|
||||
if(affected.length>0) {
|
||||
drop = Droppables.findDeepestChild(affected);
|
||||
Position.within(drop.element, point[0], point[1]);
|
||||
if(drop.onHover)
|
||||
drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
|
||||
|
||||
Droppables.activate(drop);
|
||||
}
|
||||
},
|
||||
|
||||
fire: function(event, element) {
|
||||
if(!this.last_active) return;
|
||||
Position.prepare();
|
||||
|
||||
if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
|
||||
if (this.last_active.onDrop)
|
||||
this.last_active.onDrop(element, this.last_active.element, event);
|
||||
},
|
||||
|
||||
reset: function() {
|
||||
if(this.last_active)
|
||||
this.deactivate(this.last_active);
|
||||
}
|
||||
}
|
||||
|
||||
var Draggables = {
|
||||
drags: [],
|
||||
observers: [],
|
||||
|
||||
register: function(draggable) {
|
||||
if(this.drags.length == 0) {
|
||||
this.eventMouseUp = this.endDrag.bindAsEventListener(this);
|
||||
this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
|
||||
this.eventKeypress = this.keyPress.bindAsEventListener(this);
|
||||
|
||||
Event.observe(document, "mouseup", this.eventMouseUp);
|
||||
Event.observe(document, "mousemove", this.eventMouseMove);
|
||||
Event.observe(document, "keypress", this.eventKeypress);
|
||||
}
|
||||
this.drags.push(draggable);
|
||||
},
|
||||
|
||||
unregister: function(draggable) {
|
||||
this.drags = this.drags.reject(function(d) { return d==draggable });
|
||||
if(this.drags.length == 0) {
|
||||
Event.stopObserving(document, "mouseup", this.eventMouseUp);
|
||||
Event.stopObserving(document, "mousemove", this.eventMouseMove);
|
||||
Event.stopObserving(document, "keypress", this.eventKeypress);
|
||||
}
|
||||
},
|
||||
|
||||
activate: function(draggable) {
|
||||
if(draggable.options.delay) {
|
||||
this._timeout = setTimeout(function() {
|
||||
Draggables._timeout = null;
|
||||
window.focus();
|
||||
Draggables.activeDraggable = draggable;
|
||||
}.bind(this), draggable.options.delay);
|
||||
} else {
|
||||
window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
|
||||
this.activeDraggable = draggable;
|
||||
}
|
||||
},
|
||||
|
||||
deactivate: function() {
|
||||
this.activeDraggable = null;
|
||||
},
|
||||
|
||||
updateDrag: function(event) {
|
||||
if(!this.activeDraggable) return;
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
// Mozilla-based browsers fire successive mousemove events with
|
||||
// the same coordinates, prevent needless redrawing (moz bug?)
|
||||
if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
|
||||
this._lastPointer = pointer;
|
||||
|
||||
this.activeDraggable.updateDrag(event, pointer);
|
||||
},
|
||||
|
||||
endDrag: function(event) {
|
||||
if(this._timeout) {
|
||||
clearTimeout(this._timeout);
|
||||
this._timeout = null;
|
||||
}
|
||||
if(!this.activeDraggable) return;
|
||||
this._lastPointer = null;
|
||||
this.activeDraggable.endDrag(event);
|
||||
this.activeDraggable = null;
|
||||
},
|
||||
|
||||
keyPress: function(event) {
|
||||
if(this.activeDraggable)
|
||||
this.activeDraggable.keyPress(event);
|
||||
},
|
||||
|
||||
addObserver: function(observer) {
|
||||
this.observers.push(observer);
|
||||
this._cacheObserverCallbacks();
|
||||
},
|
||||
|
||||
removeObserver: function(element) { // element instead of observer fixes mem leaks
|
||||
this.observers = this.observers.reject( function(o) { return o.element==element });
|
||||
this._cacheObserverCallbacks();
|
||||
},
|
||||
|
||||
notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
|
||||
if(this[eventName+'Count'] > 0)
|
||||
this.observers.each( function(o) {
|
||||
if(o[eventName]) o[eventName](eventName, draggable, event);
|
||||
});
|
||||
if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
|
||||
},
|
||||
|
||||
_cacheObserverCallbacks: function() {
|
||||
['onStart','onEnd','onDrag'].each( function(eventName) {
|
||||
Draggables[eventName+'Count'] = Draggables.observers.select(
|
||||
function(o) { return o[eventName]; }
|
||||
).length;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var Draggable = Class.create();
|
||||
Draggable._dragging = {};
|
||||
|
||||
Draggable.prototype = {
|
||||
initialize: function(element) {
|
||||
var defaults = {
|
||||
handle: false,
|
||||
reverteffect: function(element, top_offset, left_offset) {
|
||||
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
|
||||
new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
|
||||
queue: {scope:'_draggable', position:'end'}
|
||||
});
|
||||
},
|
||||
endeffect: function(element) {
|
||||
var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
|
||||
new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
|
||||
queue: {scope:'_draggable', position:'end'},
|
||||
afterFinish: function(){
|
||||
Draggable._dragging[element] = false
|
||||
}
|
||||
});
|
||||
},
|
||||
zindex: 1000,
|
||||
revert: false,
|
||||
scroll: false,
|
||||
scrollSensitivity: 20,
|
||||
scrollSpeed: 15,
|
||||
snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
|
||||
delay: 0
|
||||
};
|
||||
|
||||
if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
|
||||
Object.extend(defaults, {
|
||||
starteffect: function(element) {
|
||||
element._opacity = Element.getOpacity(element);
|
||||
Draggable._dragging[element] = true;
|
||||
new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
|
||||
}
|
||||
});
|
||||
|
||||
var options = Object.extend(defaults, arguments[1] || {});
|
||||
|
||||
this.element = $(element);
|
||||
|
||||
if(options.handle && (typeof options.handle == 'string'))
|
||||
this.handle = this.element.down('.'+options.handle, 0);
|
||||
|
||||
if(!this.handle) this.handle = $(options.handle);
|
||||
if(!this.handle) this.handle = this.element;
|
||||
|
||||
if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
|
||||
options.scroll = $(options.scroll);
|
||||
this._isScrollChild = Element.childOf(this.element, options.scroll);
|
||||
}
|
||||
|
||||
Element.makePositioned(this.element); // fix IE
|
||||
|
||||
this.delta = this.currentDelta();
|
||||
this.options = options;
|
||||
this.dragging = false;
|
||||
|
||||
this.eventMouseDown = this.initDrag.bindAsEventListener(this);
|
||||
Event.observe(this.handle, "mousedown", this.eventMouseDown);
|
||||
|
||||
Draggables.register(this);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
|
||||
Draggables.unregister(this);
|
||||
},
|
||||
|
||||
currentDelta: function() {
|
||||
return([
|
||||
parseInt(Element.getStyle(this.element,'left') || '0'),
|
||||
parseInt(Element.getStyle(this.element,'top') || '0')]);
|
||||
},
|
||||
|
||||
initDrag: function(event) {
|
||||
if(typeof Draggable._dragging[this.element] != 'undefined' &&
|
||||
Draggable._dragging[this.element]) return;
|
||||
if(Event.isLeftClick(event)) {
|
||||
// abort on form elements, fixes a Firefox issue
|
||||
var src = Event.element(event);
|
||||
if((tag_name = src.tagName.toUpperCase()) && (
|
||||
tag_name=='INPUT' ||
|
||||
tag_name=='SELECT' ||
|
||||
tag_name=='OPTION' ||
|
||||
tag_name=='BUTTON' ||
|
||||
tag_name=='TEXTAREA')) return;
|
||||
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
var pos = Position.cumulativeOffset(this.element);
|
||||
this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
|
||||
|
||||
Draggables.activate(this);
|
||||
Event.stop(event);
|
||||
}
|
||||
},
|
||||
|
||||
startDrag: function(event) {
|
||||
this.dragging = true;
|
||||
|
||||
if(this.options.zindex) {
|
||||
this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
|
||||
this.element.style.zIndex = this.options.zindex;
|
||||
}
|
||||
|
||||
if(this.options.ghosting) {
|
||||
this._clone = this.element.cloneNode(true);
|
||||
Position.absolutize(this.element);
|
||||
this.element.parentNode.insertBefore(this._clone, this.element);
|
||||
}
|
||||
|
||||
if(this.options.scroll) {
|
||||
if (this.options.scroll == window) {
|
||||
var where = this._getWindowScroll(this.options.scroll);
|
||||
this.originalScrollLeft = where.left;
|
||||
this.originalScrollTop = where.top;
|
||||
} else {
|
||||
this.originalScrollLeft = this.options.scroll.scrollLeft;
|
||||
this.originalScrollTop = this.options.scroll.scrollTop;
|
||||
}
|
||||
}
|
||||
|
||||
Draggables.notify('onStart', this, event);
|
||||
|
||||
if(this.options.starteffect) this.options.starteffect(this.element);
|
||||
},
|
||||
|
||||
updateDrag: function(event, pointer) {
|
||||
if(!this.dragging) this.startDrag(event);
|
||||
Position.prepare();
|
||||
Droppables.show(pointer, this.element);
|
||||
Draggables.notify('onDrag', this, event);
|
||||
|
||||
this.draw(pointer);
|
||||
if(this.options.change) this.options.change(this);
|
||||
|
||||
if(this.options.scroll) {
|
||||
this.stopScrolling();
|
||||
|
||||
var p;
|
||||
if (this.options.scroll == window) {
|
||||
with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
|
||||
} else {
|
||||
p = Position.page(this.options.scroll);
|
||||
p[0] += this.options.scroll.scrollLeft + Position.deltaX;
|
||||
p[1] += this.options.scroll.scrollTop + Position.deltaY;
|
||||
p.push(p[0]+this.options.scroll.offsetWidth);
|
||||
p.push(p[1]+this.options.scroll.offsetHeight);
|
||||
}
|
||||
var speed = [0,0];
|
||||
if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
|
||||
if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
|
||||
if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
|
||||
if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
|
||||
this.startScrolling(speed);
|
||||
}
|
||||
|
||||
// fix AppleWebKit rendering
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
||||
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
finishDrag: function(event, success) {
|
||||
this.dragging = false;
|
||||
|
||||
if(this.options.ghosting) {
|
||||
Position.relativize(this.element);
|
||||
Element.remove(this._clone);
|
||||
this._clone = null;
|
||||
}
|
||||
|
||||
if(success) Droppables.fire(event, this.element);
|
||||
Draggables.notify('onEnd', this, event);
|
||||
|
||||
var revert = this.options.revert;
|
||||
if(revert && typeof revert == 'function') revert = revert(this.element);
|
||||
|
||||
var d = this.currentDelta();
|
||||
if(revert && this.options.reverteffect) {
|
||||
this.options.reverteffect(this.element,
|
||||
d[1]-this.delta[1], d[0]-this.delta[0]);
|
||||
} else {
|
||||
this.delta = d;
|
||||
}
|
||||
|
||||
if(this.options.zindex)
|
||||
this.element.style.zIndex = this.originalZ;
|
||||
|
||||
if(this.options.endeffect)
|
||||
this.options.endeffect(this.element);
|
||||
|
||||
Draggables.deactivate(this);
|
||||
Droppables.reset();
|
||||
},
|
||||
|
||||
keyPress: function(event) {
|
||||
if(event.keyCode!=Event.KEY_ESC) return;
|
||||
this.finishDrag(event, false);
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
endDrag: function(event) {
|
||||
if(!this.dragging) return;
|
||||
this.stopScrolling();
|
||||
this.finishDrag(event, true);
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
draw: function(point) {
|
||||
var pos = Position.cumulativeOffset(this.element);
|
||||
if(this.options.ghosting) {
|
||||
var r = Position.realOffset(this.element);
|
||||
pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
|
||||
}
|
||||
|
||||
var d = this.currentDelta();
|
||||
pos[0] -= d[0]; pos[1] -= d[1];
|
||||
|
||||
if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
|
||||
pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
|
||||
pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
|
||||
}
|
||||
|
||||
var p = [0,1].map(function(i){
|
||||
return (point[i]-pos[i]-this.offset[i])
|
||||
}.bind(this));
|
||||
|
||||
if(this.options.snap) {
|
||||
if(typeof this.options.snap == 'function') {
|
||||
p = this.options.snap(p[0],p[1],this);
|
||||
} else {
|
||||
if(this.options.snap instanceof Array) {
|
||||
p = p.map( function(v, i) {
|
||||
return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
|
||||
} else {
|
||||
p = p.map( function(v) {
|
||||
return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
|
||||
}
|
||||
}}
|
||||
|
||||
var style = this.element.style;
|
||||
if((!this.options.constraint) || (this.options.constraint=='horizontal'))
|
||||
style.left = p[0] + "px";
|
||||
if((!this.options.constraint) || (this.options.constraint=='vertical'))
|
||||
style.top = p[1] + "px";
|
||||
|
||||
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
|
||||
},
|
||||
|
||||
stopScrolling: function() {
|
||||
if(this.scrollInterval) {
|
||||
clearInterval(this.scrollInterval);
|
||||
this.scrollInterval = null;
|
||||
Draggables._lastScrollPointer = null;
|
||||
}
|
||||
},
|
||||
|
||||
startScrolling: function(speed) {
|
||||
if(!(speed[0] || speed[1])) return;
|
||||
this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
|
||||
this.lastScrolled = new Date();
|
||||
this.scrollInterval = setInterval(this.scroll.bind(this), 10);
|
||||
},
|
||||
|
||||
scroll: function() {
|
||||
var current = new Date();
|
||||
var delta = current - this.lastScrolled;
|
||||
this.lastScrolled = current;
|
||||
if(this.options.scroll == window) {
|
||||
with (this._getWindowScroll(this.options.scroll)) {
|
||||
if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
|
||||
var d = delta / 1000;
|
||||
this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
|
||||
this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
|
||||
}
|
||||
|
||||
Position.prepare();
|
||||
Droppables.show(Draggables._lastPointer, this.element);
|
||||
Draggables.notify('onDrag', this);
|
||||
if (this._isScrollChild) {
|
||||
Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
|
||||
Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
|
||||
Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
|
||||
if (Draggables._lastScrollPointer[0] < 0)
|
||||
Draggables._lastScrollPointer[0] = 0;
|
||||
if (Draggables._lastScrollPointer[1] < 0)
|
||||
Draggables._lastScrollPointer[1] = 0;
|
||||
this.draw(Draggables._lastScrollPointer);
|
||||
}
|
||||
|
||||
if(this.options.change) this.options.change(this);
|
||||
},
|
||||
|
||||
_getWindowScroll: function(w) {
|
||||
var T, L, W, H;
|
||||
with (w.document) {
|
||||
if (w.document.documentElement && documentElement.scrollTop) {
|
||||
T = documentElement.scrollTop;
|
||||
L = documentElement.scrollLeft;
|
||||
} else if (w.document.body) {
|
||||
T = body.scrollTop;
|
||||
L = body.scrollLeft;
|
||||
}
|
||||
if (w.innerWidth) {
|
||||
W = w.innerWidth;
|
||||
H = w.innerHeight;
|
||||
} else if (w.document.documentElement && documentElement.clientWidth) {
|
||||
W = documentElement.clientWidth;
|
||||
H = documentElement.clientHeight;
|
||||
} else {
|
||||
W = body.offsetWidth;
|
||||
H = body.offsetHeight
|
||||
}
|
||||
}
|
||||
return { top: T, left: L, width: W, height: H };
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var SortableObserver = Class.create();
|
||||
SortableObserver.prototype = {
|
||||
initialize: function(element, observer) {
|
||||
this.element = $(element);
|
||||
this.observer = observer;
|
||||
this.lastValue = Sortable.serialize(this.element);
|
||||
},
|
||||
|
||||
onStart: function() {
|
||||
this.lastValue = Sortable.serialize(this.element);
|
||||
},
|
||||
|
||||
onEnd: function() {
|
||||
Sortable.unmark();
|
||||
if(this.lastValue != Sortable.serialize(this.element))
|
||||
this.observer(this.element)
|
||||
}
|
||||
}
|
||||
|
||||
var Sortable = {
|
||||
SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
|
||||
|
||||
sortables: {},
|
||||
|
||||
_findRootElement: function(element) {
|
||||
while (element.tagName.toUpperCase() != "BODY") {
|
||||
if(element.id && Sortable.sortables[element.id]) return element;
|
||||
element = element.parentNode;
|
||||
}
|
||||
},
|
||||
|
||||
options: function(element) {
|
||||
element = Sortable._findRootElement($(element));
|
||||
if(!element) return;
|
||||
return Sortable.sortables[element.id];
|
||||
},
|
||||
|
||||
destroy: function(element){
|
||||
var s = Sortable.options(element);
|
||||
|
||||
if(s) {
|
||||
Draggables.removeObserver(s.element);
|
||||
s.droppables.each(function(d){ Droppables.remove(d) });
|
||||
s.draggables.invoke('destroy');
|
||||
|
||||
delete Sortable.sortables[s.element.id];
|
||||
}
|
||||
},
|
||||
|
||||
create: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend({
|
||||
element: element,
|
||||
tag: 'li', // assumes li children, override with tag: 'tagname'
|
||||
dropOnEmpty: false,
|
||||
tree: false,
|
||||
treeTag: 'ul',
|
||||
overlap: 'vertical', // one of 'vertical', 'horizontal'
|
||||
constraint: 'vertical', // one of 'vertical', 'horizontal', false
|
||||
containment: element, // also takes array of elements (or id's); or false
|
||||
handle: false, // or a CSS class
|
||||
only: false,
|
||||
delay: 0,
|
||||
hoverclass: null,
|
||||
ghosting: false,
|
||||
scroll: false,
|
||||
scrollSensitivity: 20,
|
||||
scrollSpeed: 15,
|
||||
format: this.SERIALIZE_RULE,
|
||||
onChange: Prototype.emptyFunction,
|
||||
onUpdate: Prototype.emptyFunction
|
||||
}, arguments[1] || {});
|
||||
|
||||
// clear any old sortable with same element
|
||||
this.destroy(element);
|
||||
|
||||
// build options for the draggables
|
||||
var options_for_draggable = {
|
||||
revert: true,
|
||||
scroll: options.scroll,
|
||||
scrollSpeed: options.scrollSpeed,
|
||||
scrollSensitivity: options.scrollSensitivity,
|
||||
delay: options.delay,
|
||||
ghosting: options.ghosting,
|
||||
constraint: options.constraint,
|
||||
handle: options.handle };
|
||||
|
||||
if(options.starteffect)
|
||||
options_for_draggable.starteffect = options.starteffect;
|
||||
|
||||
if(options.reverteffect)
|
||||
options_for_draggable.reverteffect = options.reverteffect;
|
||||
else
|
||||
if(options.ghosting) options_for_draggable.reverteffect = function(element) {
|
||||
element.style.top = 0;
|
||||
element.style.left = 0;
|
||||
};
|
||||
|
||||
if(options.endeffect)
|
||||
options_for_draggable.endeffect = options.endeffect;
|
||||
|
||||
if(options.zindex)
|
||||
options_for_draggable.zindex = options.zindex;
|
||||
|
||||
// build options for the droppables
|
||||
var options_for_droppable = {
|
||||
overlap: options.overlap,
|
||||
containment: options.containment,
|
||||
tree: options.tree,
|
||||
hoverclass: options.hoverclass,
|
||||
onHover: Sortable.onHover
|
||||
}
|
||||
|
||||
var options_for_tree = {
|
||||
onHover: Sortable.onEmptyHover,
|
||||
overlap: options.overlap,
|
||||
containment: options.containment,
|
||||
hoverclass: options.hoverclass
|
||||
}
|
||||
|
||||
// fix for gecko engine
|
||||
Element.cleanWhitespace(element);
|
||||
|
||||
options.draggables = [];
|
||||
options.droppables = [];
|
||||
|
||||
// drop on empty handling
|
||||
if(options.dropOnEmpty || options.tree) {
|
||||
Droppables.add(element, options_for_tree);
|
||||
options.droppables.push(element);
|
||||
}
|
||||
|
||||
(this.findElements(element, options) || []).each( function(e) {
|
||||
// handles are per-draggable
|
||||
var handle = options.handle ?
|
||||
$(e).down('.'+options.handle,0) : e;
|
||||
options.draggables.push(
|
||||
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
|
||||
Droppables.add(e, options_for_droppable);
|
||||
if(options.tree) e.treeNode = element;
|
||||
options.droppables.push(e);
|
||||
});
|
||||
|
||||
if(options.tree) {
|
||||
(Sortable.findTreeElements(element, options) || []).each( function(e) {
|
||||
Droppables.add(e, options_for_tree);
|
||||
e.treeNode = element;
|
||||
options.droppables.push(e);
|
||||
});
|
||||
}
|
||||
|
||||
// keep reference
|
||||
this.sortables[element.id] = options;
|
||||
|
||||
// for onupdate
|
||||
Draggables.addObserver(new SortableObserver(element, options.onUpdate));
|
||||
|
||||
},
|
||||
|
||||
// return all suitable-for-sortable elements in a guaranteed order
|
||||
findElements: function(element, options) {
|
||||
return Element.findChildren(
|
||||
element, options.only, options.tree ? true : false, options.tag);
|
||||
},
|
||||
|
||||
findTreeElements: function(element, options) {
|
||||
return Element.findChildren(
|
||||
element, options.only, options.tree ? true : false, options.treeTag);
|
||||
},
|
||||
|
||||
onHover: function(element, dropon, overlap) {
|
||||
if(Element.isParent(dropon, element)) return;
|
||||
|
||||
if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
|
||||
return;
|
||||
} else if(overlap>0.5) {
|
||||
Sortable.mark(dropon, 'before');
|
||||
if(dropon.previousSibling != element) {
|
||||
var oldParentNode = element.parentNode;
|
||||
element.style.visibility = "hidden"; // fix gecko rendering
|
||||
dropon.parentNode.insertBefore(element, dropon);
|
||||
if(dropon.parentNode!=oldParentNode)
|
||||
Sortable.options(oldParentNode).onChange(element);
|
||||
Sortable.options(dropon.parentNode).onChange(element);
|
||||
}
|
||||
} else {
|
||||
Sortable.mark(dropon, 'after');
|
||||
var nextElement = dropon.nextSibling || null;
|
||||
if(nextElement != element) {
|
||||
var oldParentNode = element.parentNode;
|
||||
element.style.visibility = "hidden"; // fix gecko rendering
|
||||
dropon.parentNode.insertBefore(element, nextElement);
|
||||
if(dropon.parentNode!=oldParentNode)
|
||||
Sortable.options(oldParentNode).onChange(element);
|
||||
Sortable.options(dropon.parentNode).onChange(element);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onEmptyHover: function(element, dropon, overlap) {
|
||||
var oldParentNode = element.parentNode;
|
||||
var droponOptions = Sortable.options(dropon);
|
||||
|
||||
if(!Element.isParent(dropon, element)) {
|
||||
var index;
|
||||
|
||||
var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
|
||||
var child = null;
|
||||
|
||||
if(children) {
|
||||
var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
|
||||
|
||||
for (index = 0; index < children.length; index += 1) {
|
||||
if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
|
||||
offset -= Element.offsetSize (children[index], droponOptions.overlap);
|
||||
} else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
|
||||
child = index + 1 < children.length ? children[index + 1] : null;
|
||||
break;
|
||||
} else {
|
||||
child = children[index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dropon.insertBefore(element, child);
|
||||
|
||||
Sortable.options(oldParentNode).onChange(element);
|
||||
droponOptions.onChange(element);
|
||||
}
|
||||
},
|
||||
|
||||
unmark: function() {
|
||||
if(Sortable._marker) Sortable._marker.hide();
|
||||
},
|
||||
|
||||
mark: function(dropon, position) {
|
||||
// mark on ghosting only
|
||||
var sortable = Sortable.options(dropon.parentNode);
|
||||
if(sortable && !sortable.ghosting) return;
|
||||
|
||||
if(!Sortable._marker) {
|
||||
Sortable._marker =
|
||||
($('dropmarker') || Element.extend(document.createElement('DIV'))).
|
||||
hide().addClassName('dropmarker').setStyle({position:'absolute'});
|
||||
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
|
||||
}
|
||||
var offsets = Position.cumulativeOffset(dropon);
|
||||
Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
|
||||
|
||||
if(position=='after')
|
||||
if(sortable.overlap == 'horizontal')
|
||||
Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
|
||||
else
|
||||
Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
|
||||
|
||||
Sortable._marker.show();
|
||||
},
|
||||
|
||||
_tree: function(element, options, parent) {
|
||||
var children = Sortable.findElements(element, options) || [];
|
||||
|
||||
for (var i = 0; i < children.length; ++i) {
|
||||
var match = children[i].id.match(options.format);
|
||||
|
||||
if (!match) continue;
|
||||
|
||||
var child = {
|
||||
id: encodeURIComponent(match ? match[1] : null),
|
||||
element: element,
|
||||
parent: parent,
|
||||
children: [],
|
||||
position: parent.children.length,
|
||||
container: $(children[i]).down(options.treeTag)
|
||||
}
|
||||
|
||||
/* Get the element containing the children and recurse over it */
|
||||
if (child.container)
|
||||
this._tree(child.container, options, child)
|
||||
|
||||
parent.children.push (child);
|
||||
}
|
||||
|
||||
return parent;
|
||||
},
|
||||
|
||||
tree: function(element) {
|
||||
element = $(element);
|
||||
var sortableOptions = this.options(element);
|
||||
var options = Object.extend({
|
||||
tag: sortableOptions.tag,
|
||||
treeTag: sortableOptions.treeTag,
|
||||
only: sortableOptions.only,
|
||||
name: element.id,
|
||||
format: sortableOptions.format
|
||||
}, arguments[1] || {});
|
||||
|
||||
var root = {
|
||||
id: null,
|
||||
parent: null,
|
||||
children: [],
|
||||
container: element,
|
||||
position: 0
|
||||
}
|
||||
|
||||
return Sortable._tree(element, options, root);
|
||||
},
|
||||
|
||||
/* Construct a [i] index for a particular node */
|
||||
_constructIndex: function(node) {
|
||||
var index = '';
|
||||
do {
|
||||
if (node.id) index = '[' + node.position + ']' + index;
|
||||
} while ((node = node.parent) != null);
|
||||
return index;
|
||||
},
|
||||
|
||||
sequence: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend(this.options(element), arguments[1] || {});
|
||||
|
||||
return $(this.findElements(element, options) || []).map( function(item) {
|
||||
return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
|
||||
});
|
||||
},
|
||||
|
||||
setSequence: function(element, new_sequence) {
|
||||
element = $(element);
|
||||
var options = Object.extend(this.options(element), arguments[2] || {});
|
||||
|
||||
var nodeMap = {};
|
||||
this.findElements(element, options).each( function(n) {
|
||||
if (n.id.match(options.format))
|
||||
nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
|
||||
n.parentNode.removeChild(n);
|
||||
});
|
||||
|
||||
new_sequence.each(function(ident) {
|
||||
var n = nodeMap[ident];
|
||||
if (n) {
|
||||
n[1].appendChild(n[0]);
|
||||
delete nodeMap[ident];
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
serialize: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend(Sortable.options(element), arguments[1] || {});
|
||||
var name = encodeURIComponent(
|
||||
(arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
|
||||
|
||||
if (options.tree) {
|
||||
return Sortable.tree(element, arguments[1]).children.map( function (item) {
|
||||
return [name + Sortable._constructIndex(item) + "[id]=" +
|
||||
encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
|
||||
}).flatten().join('&');
|
||||
} else {
|
||||
return Sortable.sequence(element, arguments[1]).map( function(item) {
|
||||
return name + "[]=" + encodeURIComponent(item);
|
||||
}).join('&');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns true if child is contained within element
|
||||
Element.isParent = function(child, element) {
|
||||
if (!child.parentNode || child == element) return false;
|
||||
if (child.parentNode == element) return true;
|
||||
return Element.isParent(child.parentNode, element);
|
||||
}
|
||||
|
||||
Element.findChildren = function(element, only, recursive, tagName) {
|
||||
if(!element.hasChildNodes()) return null;
|
||||
tagName = tagName.toUpperCase();
|
||||
if(only) only = [only].flatten();
|
||||
var elements = [];
|
||||
$A(element.childNodes).each( function(e) {
|
||||
if(e.tagName && e.tagName.toUpperCase()==tagName &&
|
||||
(!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
|
||||
elements.push(e);
|
||||
if(recursive) {
|
||||
var grandchildren = Element.findChildren(e, only, recursive, tagName);
|
||||
if(grandchildren) elements.push(grandchildren);
|
||||
}
|
||||
});
|
||||
|
||||
return (elements.length>0 ? elements.flatten() : []);
|
||||
}
|
||||
|
||||
Element.offsetSize = function (element, type) {
|
||||
return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
|
||||
}
|
||||
1090
public/js/lib/.svn/text-base/effects.js.svn-base
Normal file
2515
public/js/lib/.svn/text-base/prototype.js.svn-base
Normal file
51
public/js/lib/.svn/text-base/scriptaculous.js.svn-base
Normal file
@@ -0,0 +1,51 @@
|
||||
// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||
|
||||
var Scriptaculous = {
|
||||
Version: '1.7.0',
|
||||
require: function(libraryName) {
|
||||
// inserting via DOM fails in Safari 2.0, so brute force approach
|
||||
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
|
||||
},
|
||||
load: function() {
|
||||
if((typeof Prototype=='undefined') ||
|
||||
(typeof Element == 'undefined') ||
|
||||
(typeof Element.Methods=='undefined') ||
|
||||
parseFloat(Prototype.Version.split(".")[0] + "." +
|
||||
Prototype.Version.split(".")[1]) < 1.5)
|
||||
throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
|
||||
|
||||
$A(document.getElementsByTagName("script")).findAll( function(s) {
|
||||
return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
|
||||
}).each( function(s) {
|
||||
var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
|
||||
var includes = s.src.match(/\?.*load=([a-z,]*)/);
|
||||
(includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
|
||||
function(include) { Scriptaculous.require(path+include+'.js') });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Scriptaculous.load();
|
||||
278
public/js/lib/.svn/text-base/slider.js.svn-base
Normal file
@@ -0,0 +1,278 @@
|
||||
// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs
|
||||
//
|
||||
// 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/
|
||||
|
||||
if(!Control) var Control = {};
|
||||
Control.Slider = Class.create();
|
||||
|
||||
// options:
|
||||
// axis: 'vertical', or 'horizontal' (default)
|
||||
//
|
||||
// callbacks:
|
||||
// onChange(value)
|
||||
// onSlide(value)
|
||||
Control.Slider.prototype = {
|
||||
initialize: function(handle, track, options) {
|
||||
var slider = this;
|
||||
|
||||
if(handle instanceof Array) {
|
||||
this.handles = handle.collect( function(e) { return $(e) });
|
||||
} else {
|
||||
this.handles = [$(handle)];
|
||||
}
|
||||
|
||||
this.track = $(track);
|
||||
this.options = options || {};
|
||||
|
||||
this.axis = this.options.axis || 'horizontal';
|
||||
this.increment = this.options.increment || 1;
|
||||
this.step = parseInt(this.options.step || '1');
|
||||
this.range = this.options.range || $R(0,1);
|
||||
|
||||
this.value = 0; // assure backwards compat
|
||||
this.values = this.handles.map( function() { return 0 });
|
||||
this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
|
||||
this.options.startSpan = $(this.options.startSpan || null);
|
||||
this.options.endSpan = $(this.options.endSpan || null);
|
||||
|
||||
this.restricted = this.options.restricted || false;
|
||||
|
||||
this.maximum = this.options.maximum || this.range.end;
|
||||
this.minimum = this.options.minimum || this.range.start;
|
||||
|
||||
// Will be used to align the handle onto the track, if necessary
|
||||
this.alignX = parseInt(this.options.alignX || '0');
|
||||
this.alignY = parseInt(this.options.alignY || '0');
|
||||
|
||||
this.trackLength = this.maximumOffset() - this.minimumOffset();
|
||||
|
||||
this.handleLength = this.isVertical() ?
|
||||
(this.handles[0].offsetHeight != 0 ?
|
||||
this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
|
||||
(this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
|
||||
this.handles[0].style.width.replace(/px$/,""));
|
||||
|
||||
this.active = false;
|
||||
this.dragging = false;
|
||||
this.disabled = false;
|
||||
|
||||
if(this.options.disabled) this.setDisabled();
|
||||
|
||||
// Allowed values array
|
||||
this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
|
||||
if(this.allowedValues) {
|
||||
this.minimum = this.allowedValues.min();
|
||||
this.maximum = this.allowedValues.max();
|
||||
}
|
||||
|
||||
this.eventMouseDown = this.startDrag.bindAsEventListener(this);
|
||||
this.eventMouseUp = this.endDrag.bindAsEventListener(this);
|
||||
this.eventMouseMove = this.update.bindAsEventListener(this);
|
||||
|
||||
// Initialize handles in reverse (make sure first handle is active)
|
||||
this.handles.each( function(h,i) {
|
||||
i = slider.handles.length-1-i;
|
||||
slider.setValue(parseFloat(
|
||||
(slider.options.sliderValue instanceof Array ?
|
||||
slider.options.sliderValue[i] : slider.options.sliderValue) ||
|
||||
slider.range.start), i);
|
||||
Element.makePositioned(h); // fix IE
|
||||
Event.observe(h, "mousedown", slider.eventMouseDown);
|
||||
});
|
||||
|
||||
Event.observe(this.track, "mousedown", this.eventMouseDown);
|
||||
Event.observe(document, "mouseup", this.eventMouseUp);
|
||||
Event.observe(document, "mousemove", this.eventMouseMove);
|
||||
|
||||
this.initialized = true;
|
||||
},
|
||||
dispose: function() {
|
||||
var slider = this;
|
||||
Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
|
||||
Event.stopObserving(document, "mouseup", this.eventMouseUp);
|
||||
Event.stopObserving(document, "mousemove", this.eventMouseMove);
|
||||
this.handles.each( function(h) {
|
||||
Event.stopObserving(h, "mousedown", slider.eventMouseDown);
|
||||
});
|
||||
},
|
||||
setDisabled: function(){
|
||||
this.disabled = true;
|
||||
},
|
||||
setEnabled: function(){
|
||||
this.disabled = false;
|
||||
},
|
||||
getNearestValue: function(value){
|
||||
if(this.allowedValues){
|
||||
if(value >= this.allowedValues.max()) return(this.allowedValues.max());
|
||||
if(value <= this.allowedValues.min()) return(this.allowedValues.min());
|
||||
|
||||
var offset = Math.abs(this.allowedValues[0] - value);
|
||||
var newValue = this.allowedValues[0];
|
||||
this.allowedValues.each( function(v) {
|
||||
var currentOffset = Math.abs(v - value);
|
||||
if(currentOffset <= offset){
|
||||
newValue = v;
|
||||
offset = currentOffset;
|
||||
}
|
||||
});
|
||||
return newValue;
|
||||
}
|
||||
if(value > this.range.end) return this.range.end;
|
||||
if(value < this.range.start) return this.range.start;
|
||||
return value;
|
||||
},
|
||||
setValue: function(sliderValue, handleIdx){
|
||||
if(!this.active) {
|
||||
this.activeHandleIdx = handleIdx || 0;
|
||||
this.activeHandle = this.handles[this.activeHandleIdx];
|
||||
this.updateStyles();
|
||||
}
|
||||
handleIdx = handleIdx || this.activeHandleIdx || 0;
|
||||
if(this.initialized && this.restricted) {
|
||||
if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
|
||||
sliderValue = this.values[handleIdx-1];
|
||||
if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
|
||||
sliderValue = this.values[handleIdx+1];
|
||||
}
|
||||
sliderValue = this.getNearestValue(sliderValue);
|
||||
this.values[handleIdx] = sliderValue;
|
||||
this.value = this.values[0]; // assure backwards compat
|
||||
|
||||
this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
|
||||
this.translateToPx(sliderValue);
|
||||
|
||||
this.drawSpans();
|
||||
if(!this.dragging || !this.event) this.updateFinished();
|
||||
},
|
||||
setValueBy: function(delta, handleIdx) {
|
||||
this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
|
||||
handleIdx || this.activeHandleIdx || 0);
|
||||
},
|
||||
translateToPx: function(value) {
|
||||
return Math.round(
|
||||
((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
|
||||
(value - this.range.start)) + "px";
|
||||
},
|
||||
translateToValue: function(offset) {
|
||||
return ((offset/(this.trackLength-this.handleLength) *
|
||||
(this.range.end-this.range.start)) + this.range.start);
|
||||
},
|
||||
getRange: function(range) {
|
||||
var v = this.values.sortBy(Prototype.K);
|
||||
range = range || 0;
|
||||
return $R(v[range],v[range+1]);
|
||||
},
|
||||
minimumOffset: function(){
|
||||
return(this.isVertical() ? this.alignY : this.alignX);
|
||||
},
|
||||
maximumOffset: function(){
|
||||
return(this.isVertical() ?
|
||||
(this.track.offsetHeight != 0 ? this.track.offsetHeight :
|
||||
this.track.style.height.replace(/px$/,"")) - this.alignY :
|
||||
(this.track.offsetWidth != 0 ? this.track.offsetWidth :
|
||||
this.track.style.width.replace(/px$/,"")) - this.alignY);
|
||||
},
|
||||
isVertical: function(){
|
||||
return (this.axis == 'vertical');
|
||||
},
|
||||
drawSpans: function() {
|
||||
var slider = this;
|
||||
if(this.spans)
|
||||
$R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
|
||||
if(this.options.startSpan)
|
||||
this.setSpan(this.options.startSpan,
|
||||
$R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
|
||||
if(this.options.endSpan)
|
||||
this.setSpan(this.options.endSpan,
|
||||
$R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
|
||||
},
|
||||
setSpan: function(span, range) {
|
||||
if(this.isVertical()) {
|
||||
span.style.top = this.translateToPx(range.start);
|
||||
span.style.height = this.translateToPx(range.end - range.start + this.range.start);
|
||||
} else {
|
||||
span.style.left = this.translateToPx(range.start);
|
||||
span.style.width = this.translateToPx(range.end - range.start + this.range.start);
|
||||
}
|
||||
},
|
||||
updateStyles: function() {
|
||||
this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
|
||||
Element.addClassName(this.activeHandle, 'selected');
|
||||
},
|
||||
startDrag: function(event) {
|
||||
if(Event.isLeftClick(event)) {
|
||||
if(!this.disabled){
|
||||
this.active = true;
|
||||
|
||||
var handle = Event.element(event);
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
var track = handle;
|
||||
if(track==this.track) {
|
||||
var offsets = Position.cumulativeOffset(this.track);
|
||||
this.event = event;
|
||||
this.setValue(this.translateToValue(
|
||||
(this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
|
||||
));
|
||||
var offsets = Position.cumulativeOffset(this.activeHandle);
|
||||
this.offsetX = (pointer[0] - offsets[0]);
|
||||
this.offsetY = (pointer[1] - offsets[1]);
|
||||
} else {
|
||||
// find the handle (prevents issues with Safari)
|
||||
while((this.handles.indexOf(handle) == -1) && handle.parentNode)
|
||||
handle = handle.parentNode;
|
||||
|
||||
if(this.handles.indexOf(handle)!=-1) {
|
||||
this.activeHandle = handle;
|
||||
this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
|
||||
this.updateStyles();
|
||||
|
||||
var offsets = Position.cumulativeOffset(this.activeHandle);
|
||||
this.offsetX = (pointer[0] - offsets[0]);
|
||||
this.offsetY = (pointer[1] - offsets[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Event.stop(event);
|
||||
}
|
||||
},
|
||||
update: function(event) {
|
||||
if(this.active) {
|
||||
if(!this.dragging) this.dragging = true;
|
||||
this.draw(event);
|
||||
// fix AppleWebKit rendering
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
||||
Event.stop(event);
|
||||
}
|
||||
},
|
||||
draw: function(event) {
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
var offsets = Position.cumulativeOffset(this.track);
|
||||
pointer[0] -= this.offsetX + offsets[0];
|
||||
pointer[1] -= this.offsetY + offsets[1];
|
||||
this.event = event;
|
||||
this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
|
||||
if(this.initialized && this.options.onSlide)
|
||||
this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
|
||||
},
|
||||
endDrag: function(event) {
|
||||
if(this.active && this.dragging) {
|
||||
this.finishDrag(event, true);
|
||||
Event.stop(event);
|
||||
}
|
||||
this.active = false;
|
||||
this.dragging = false;
|
||||
},
|
||||
finishDrag: function(event, success) {
|
||||
this.active = false;
|
||||
this.dragging = false;
|
||||
this.updateFinished();
|
||||
},
|
||||
updateFinished: function() {
|
||||
if(this.initialized && this.options.onChange)
|
||||
this.options.onChange(this.values.length>1 ? this.values : this.value, this);
|
||||
this.event = null;
|
||||
}
|
||||
}
|
||||
564
public/js/lib/.svn/text-base/unittest.js.svn-base
Normal file
@@ -0,0 +1,564 @@
|
||||
// script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
|
||||
// (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/)
|
||||
//
|
||||
// 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/
|
||||
|
||||
// experimental, Firefox-only
|
||||
Event.simulateMouse = function(element, eventName) {
|
||||
var options = Object.extend({
|
||||
pointerX: 0,
|
||||
pointerY: 0,
|
||||
buttons: 0,
|
||||
ctrlKey: false,
|
||||
altKey: false,
|
||||
shiftKey: false,
|
||||
metaKey: false
|
||||
}, arguments[2] || {});
|
||||
var oEvent = document.createEvent("MouseEvents");
|
||||
oEvent.initMouseEvent(eventName, true, true, document.defaultView,
|
||||
options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
|
||||
options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
|
||||
|
||||
if(this.mark) Element.remove(this.mark);
|
||||
this.mark = document.createElement('div');
|
||||
this.mark.appendChild(document.createTextNode(" "));
|
||||
document.body.appendChild(this.mark);
|
||||
this.mark.style.position = 'absolute';
|
||||
this.mark.style.top = options.pointerY + "px";
|
||||
this.mark.style.left = options.pointerX + "px";
|
||||
this.mark.style.width = "5px";
|
||||
this.mark.style.height = "5px;";
|
||||
this.mark.style.borderTop = "1px solid red;"
|
||||
this.mark.style.borderLeft = "1px solid red;"
|
||||
|
||||
if(this.step)
|
||||
alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
|
||||
|
||||
$(element).dispatchEvent(oEvent);
|
||||
};
|
||||
|
||||
// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
|
||||
// You need to downgrade to 1.0.4 for now to get this working
|
||||
// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
|
||||
Event.simulateKey = function(element, eventName) {
|
||||
var options = Object.extend({
|
||||
ctrlKey: false,
|
||||
altKey: false,
|
||||
shiftKey: false,
|
||||
metaKey: false,
|
||||
keyCode: 0,
|
||||
charCode: 0
|
||||
}, arguments[2] || {});
|
||||
|
||||
var oEvent = document.createEvent("KeyEvents");
|
||||
oEvent.initKeyEvent(eventName, true, true, window,
|
||||
options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
|
||||
options.keyCode, options.charCode );
|
||||
$(element).dispatchEvent(oEvent);
|
||||
};
|
||||
|
||||
Event.simulateKeys = function(element, command) {
|
||||
for(var i=0; i<command.length; i++) {
|
||||
Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
|
||||
}
|
||||
};
|
||||
|
||||
var Test = {}
|
||||
Test.Unit = {};
|
||||
|
||||
// security exception workaround
|
||||
Test.Unit.inspect = Object.inspect;
|
||||
|
||||
Test.Unit.Logger = Class.create();
|
||||
Test.Unit.Logger.prototype = {
|
||||
initialize: function(log) {
|
||||
this.log = $(log);
|
||||
if (this.log) {
|
||||
this._createLogTable();
|
||||
}
|
||||
},
|
||||
start: function(testName) {
|
||||
if (!this.log) return;
|
||||
this.testName = testName;
|
||||
this.lastLogLine = document.createElement('tr');
|
||||
this.statusCell = document.createElement('td');
|
||||
this.nameCell = document.createElement('td');
|
||||
this.nameCell.className = "nameCell";
|
||||
this.nameCell.appendChild(document.createTextNode(testName));
|
||||
this.messageCell = document.createElement('td');
|
||||
this.lastLogLine.appendChild(this.statusCell);
|
||||
this.lastLogLine.appendChild(this.nameCell);
|
||||
this.lastLogLine.appendChild(this.messageCell);
|
||||
this.loglines.appendChild(this.lastLogLine);
|
||||
},
|
||||
finish: function(status, summary) {
|
||||
if (!this.log) return;
|
||||
this.lastLogLine.className = status;
|
||||
this.statusCell.innerHTML = status;
|
||||
this.messageCell.innerHTML = this._toHTML(summary);
|
||||
this.addLinksToResults();
|
||||
},
|
||||
message: function(message) {
|
||||
if (!this.log) return;
|
||||
this.messageCell.innerHTML = this._toHTML(message);
|
||||
},
|
||||
summary: function(summary) {
|
||||
if (!this.log) return;
|
||||
this.logsummary.innerHTML = this._toHTML(summary);
|
||||
},
|
||||
_createLogTable: function() {
|
||||
this.log.innerHTML =
|
||||
'<div id="logsummary"></div>' +
|
||||
'<table id="logtable">' +
|
||||
'<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
|
||||
'<tbody id="loglines"></tbody>' +
|
||||
'</table>';
|
||||
this.logsummary = $('logsummary')
|
||||
this.loglines = $('loglines');
|
||||
},
|
||||
_toHTML: function(txt) {
|
||||
return txt.escapeHTML().replace(/\n/g,"<br/>");
|
||||
},
|
||||
addLinksToResults: function(){
|
||||
$$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
|
||||
td.title = "Run only this test"
|
||||
Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
|
||||
});
|
||||
$$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
|
||||
td.title = "Run all tests"
|
||||
Event.observe(td, 'click', function(){ window.location.search = "";});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Test.Unit.Runner = Class.create();
|
||||
Test.Unit.Runner.prototype = {
|
||||
initialize: function(testcases) {
|
||||
this.options = Object.extend({
|
||||
testLog: 'testlog'
|
||||
}, arguments[1] || {});
|
||||
this.options.resultsURL = this.parseResultsURLQueryParameter();
|
||||
this.options.tests = this.parseTestsQueryParameter();
|
||||
if (this.options.testLog) {
|
||||
this.options.testLog = $(this.options.testLog) || null;
|
||||
}
|
||||
if(this.options.tests) {
|
||||
this.tests = [];
|
||||
for(var i = 0; i < this.options.tests.length; i++) {
|
||||
if(/^test/.test(this.options.tests[i])) {
|
||||
this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.options.test) {
|
||||
this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
|
||||
} else {
|
||||
this.tests = [];
|
||||
for(var testcase in testcases) {
|
||||
if(/^test/.test(testcase)) {
|
||||
this.tests.push(
|
||||
new Test.Unit.Testcase(
|
||||
this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
|
||||
testcases[testcase], testcases["setup"], testcases["teardown"]
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.currentTest = 0;
|
||||
this.logger = new Test.Unit.Logger(this.options.testLog);
|
||||
setTimeout(this.runTests.bind(this), 1000);
|
||||
},
|
||||
parseResultsURLQueryParameter: function() {
|
||||
return window.location.search.parseQuery()["resultsURL"];
|
||||
},
|
||||
parseTestsQueryParameter: function(){
|
||||
if (window.location.search.parseQuery()["tests"]){
|
||||
return window.location.search.parseQuery()["tests"].split(',');
|
||||
};
|
||||
},
|
||||
// Returns:
|
||||
// "ERROR" if there was an error,
|
||||
// "FAILURE" if there was a failure, or
|
||||
// "SUCCESS" if there was neither
|
||||
getResult: function() {
|
||||
var hasFailure = false;
|
||||
for(var i=0;i<this.tests.length;i++) {
|
||||
if (this.tests[i].errors > 0) {
|
||||
return "ERROR";
|
||||
}
|
||||
if (this.tests[i].failures > 0) {
|
||||
hasFailure = true;
|
||||
}
|
||||
}
|
||||
if (hasFailure) {
|
||||
return "FAILURE";
|
||||
} else {
|
||||
return "SUCCESS";
|
||||
}
|
||||
},
|
||||
postResults: function() {
|
||||
if (this.options.resultsURL) {
|
||||
new Ajax.Request(this.options.resultsURL,
|
||||
{ method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
|
||||
}
|
||||
},
|
||||
runTests: function() {
|
||||
var test = this.tests[this.currentTest];
|
||||
if (!test) {
|
||||
// finished!
|
||||
this.postResults();
|
||||
this.logger.summary(this.summary());
|
||||
return;
|
||||
}
|
||||
if(!test.isWaiting) {
|
||||
this.logger.start(test.name);
|
||||
}
|
||||
test.run();
|
||||
if(test.isWaiting) {
|
||||
this.logger.message("Waiting for " + test.timeToWait + "ms");
|
||||
setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
|
||||
} else {
|
||||
this.logger.finish(test.status(), test.summary());
|
||||
this.currentTest++;
|
||||
// tail recursive, hopefully the browser will skip the stackframe
|
||||
this.runTests();
|
||||
}
|
||||
},
|
||||
summary: function() {
|
||||
var assertions = 0;
|
||||
var failures = 0;
|
||||
var errors = 0;
|
||||
var messages = [];
|
||||
for(var i=0;i<this.tests.length;i++) {
|
||||
assertions += this.tests[i].assertions;
|
||||
failures += this.tests[i].failures;
|
||||
errors += this.tests[i].errors;
|
||||
}
|
||||
return (
|
||||
(this.options.context ? this.options.context + ': ': '') +
|
||||
this.tests.length + " tests, " +
|
||||
assertions + " assertions, " +
|
||||
failures + " failures, " +
|
||||
errors + " errors");
|
||||
}
|
||||
}
|
||||
|
||||
Test.Unit.Assertions = Class.create();
|
||||
Test.Unit.Assertions.prototype = {
|
||||
initialize: function() {
|
||||
this.assertions = 0;
|
||||
this.failures = 0;
|
||||
this.errors = 0;
|
||||
this.messages = [];
|
||||
},
|
||||
summary: function() {
|
||||
return (
|
||||
this.assertions + " assertions, " +
|
||||
this.failures + " failures, " +
|
||||
this.errors + " errors" + "\n" +
|
||||
this.messages.join("\n"));
|
||||
},
|
||||
pass: function() {
|
||||
this.assertions++;
|
||||
},
|
||||
fail: function(message) {
|
||||
this.failures++;
|
||||
this.messages.push("Failure: " + message);
|
||||
},
|
||||
info: function(message) {
|
||||
this.messages.push("Info: " + message);
|
||||
},
|
||||
error: function(error) {
|
||||
this.errors++;
|
||||
this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
|
||||
},
|
||||
status: function() {
|
||||
if (this.failures > 0) return 'failed';
|
||||
if (this.errors > 0) return 'error';
|
||||
return 'passed';
|
||||
},
|
||||
assert: function(expression) {
|
||||
var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
|
||||
try { expression ? this.pass() :
|
||||
this.fail(message); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertEqual: function(expected, actual) {
|
||||
var message = arguments[2] || "assertEqual";
|
||||
try { (expected == actual) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertInspect: function(expected, actual) {
|
||||
var message = arguments[2] || "assertInspect";
|
||||
try { (expected == actual.inspect()) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertEnumEqual: function(expected, actual) {
|
||||
var message = arguments[2] || "assertEnumEqual";
|
||||
try { $A(expected).length == $A(actual).length &&
|
||||
expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
|
||||
this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
|
||||
', actual ' + Test.Unit.inspect(actual)); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotEqual: function(expected, actual) {
|
||||
var message = arguments[2] || "assertNotEqual";
|
||||
try { (expected != actual) ? this.pass() :
|
||||
this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertIdentical: function(expected, actual) {
|
||||
var message = arguments[2] || "assertIdentical";
|
||||
try { (expected === actual) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotIdentical: function(expected, actual) {
|
||||
var message = arguments[2] || "assertNotIdentical";
|
||||
try { !(expected === actual) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNull: function(obj) {
|
||||
var message = arguments[1] || 'assertNull'
|
||||
try { (obj==null) ? this.pass() :
|
||||
this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertMatch: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertMatch';
|
||||
var regex = new RegExp(expected);
|
||||
try { (regex.exec(actual)) ? this.pass() :
|
||||
this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertHidden: function(element) {
|
||||
var message = arguments[1] || 'assertHidden';
|
||||
this.assertEqual("none", element.style.display, message);
|
||||
},
|
||||
assertNotNull: function(object) {
|
||||
var message = arguments[1] || 'assertNotNull';
|
||||
this.assert(object != null, message);
|
||||
},
|
||||
assertType: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertType';
|
||||
try {
|
||||
(actual.constructor == expected) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + (actual.constructor) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotOfType: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertNotOfType';
|
||||
try {
|
||||
(actual.constructor != expected) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + (actual.constructor) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertInstanceOf: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertInstanceOf';
|
||||
try {
|
||||
(actual instanceof expected) ? this.pass() :
|
||||
this.fail(message + ": object was not an instance of the expected type"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotInstanceOf: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertNotInstanceOf';
|
||||
try {
|
||||
!(actual instanceof expected) ? this.pass() :
|
||||
this.fail(message + ": object was an instance of the not expected type"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertRespondsTo: function(method, obj) {
|
||||
var message = arguments[2] || 'assertRespondsTo';
|
||||
try {
|
||||
(obj[method] && typeof obj[method] == 'function') ? this.pass() :
|
||||
this.fail(message + ": object doesn't respond to [" + method + "]"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertReturnsTrue: function(method, obj) {
|
||||
var message = arguments[2] || 'assertReturnsTrue';
|
||||
try {
|
||||
var m = obj[method];
|
||||
if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
|
||||
m() ? this.pass() :
|
||||
this.fail(message + ": method returned false"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertReturnsFalse: function(method, obj) {
|
||||
var message = arguments[2] || 'assertReturnsFalse';
|
||||
try {
|
||||
var m = obj[method];
|
||||
if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
|
||||
!m() ? this.pass() :
|
||||
this.fail(message + ": method returned true"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertRaise: function(exceptionName, method) {
|
||||
var message = arguments[2] || 'assertRaise';
|
||||
try {
|
||||
method();
|
||||
this.fail(message + ": exception expected but none was raised"); }
|
||||
catch(e) {
|
||||
((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e);
|
||||
}
|
||||
},
|
||||
assertElementsMatch: function() {
|
||||
var expressions = $A(arguments), elements = $A(expressions.shift());
|
||||
if (elements.length != expressions.length) {
|
||||
this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
|
||||
return false;
|
||||
}
|
||||
elements.zip(expressions).all(function(pair, index) {
|
||||
var element = $(pair.first()), expression = pair.last();
|
||||
if (element.match(expression)) return true;
|
||||
this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
|
||||
}.bind(this)) && this.pass();
|
||||
},
|
||||
assertElementMatches: function(element, expression) {
|
||||
this.assertElementsMatch([element], expression);
|
||||
},
|
||||
benchmark: function(operation, iterations) {
|
||||
var startAt = new Date();
|
||||
(iterations || 1).times(operation);
|
||||
var timeTaken = ((new Date())-startAt);
|
||||
this.info((arguments[2] || 'Operation') + ' finished ' +
|
||||
iterations + ' iterations in ' + (timeTaken/1000)+'s' );
|
||||
return timeTaken;
|
||||
},
|
||||
_isVisible: function(element) {
|
||||
element = $(element);
|
||||
if(!element.parentNode) return true;
|
||||
this.assertNotNull(element);
|
||||
if(element.style && Element.getStyle(element, 'display') == 'none')
|
||||
return false;
|
||||
|
||||
return this._isVisible(element.parentNode);
|
||||
},
|
||||
assertNotVisible: function(element) {
|
||||
this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
|
||||
},
|
||||
assertVisible: function(element) {
|
||||
this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
|
||||
},
|
||||
benchmark: function(operation, iterations) {
|
||||
var startAt = new Date();
|
||||
(iterations || 1).times(operation);
|
||||
var timeTaken = ((new Date())-startAt);
|
||||
this.info((arguments[2] || 'Operation') + ' finished ' +
|
||||
iterations + ' iterations in ' + (timeTaken/1000)+'s' );
|
||||
return timeTaken;
|
||||
}
|
||||
}
|
||||
|
||||
Test.Unit.Testcase = Class.create();
|
||||
Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
|
||||
initialize: function(name, test, setup, teardown) {
|
||||
Test.Unit.Assertions.prototype.initialize.bind(this)();
|
||||
this.name = name;
|
||||
|
||||
if(typeof test == 'string') {
|
||||
test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
|
||||
test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
|
||||
this.test = function() {
|
||||
eval('with(this){'+test+'}');
|
||||
}
|
||||
} else {
|
||||
this.test = test || function() {};
|
||||
}
|
||||
|
||||
this.setup = setup || function() {};
|
||||
this.teardown = teardown || function() {};
|
||||
this.isWaiting = false;
|
||||
this.timeToWait = 1000;
|
||||
},
|
||||
wait: function(time, nextPart) {
|
||||
this.isWaiting = true;
|
||||
this.test = nextPart;
|
||||
this.timeToWait = time;
|
||||
},
|
||||
run: function() {
|
||||
try {
|
||||
try {
|
||||
if (!this.isWaiting) this.setup.bind(this)();
|
||||
this.isWaiting = false;
|
||||
this.test.bind(this)();
|
||||
} finally {
|
||||
if(!this.isWaiting) {
|
||||
this.teardown.bind(this)();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(e) { this.error(e); }
|
||||
}
|
||||
});
|
||||
|
||||
// *EXPERIMENTAL* BDD-style testing to please non-technical folk
|
||||
// This draws many ideas from RSpec http://rspec.rubyforge.org/
|
||||
|
||||
Test.setupBDDExtensionMethods = function(){
|
||||
var METHODMAP = {
|
||||
shouldEqual: 'assertEqual',
|
||||
shouldNotEqual: 'assertNotEqual',
|
||||
shouldEqualEnum: 'assertEnumEqual',
|
||||
shouldBeA: 'assertType',
|
||||
shouldNotBeA: 'assertNotOfType',
|
||||
shouldBeAn: 'assertType',
|
||||
shouldNotBeAn: 'assertNotOfType',
|
||||
shouldBeNull: 'assertNull',
|
||||
shouldNotBeNull: 'assertNotNull',
|
||||
|
||||
shouldBe: 'assertReturnsTrue',
|
||||
shouldNotBe: 'assertReturnsFalse',
|
||||
shouldRespondTo: 'assertRespondsTo'
|
||||
};
|
||||
Test.BDDMethods = {};
|
||||
for(m in METHODMAP) {
|
||||
Test.BDDMethods[m] = eval(
|
||||
'function(){'+
|
||||
'var args = $A(arguments);'+
|
||||
'var scope = args.shift();'+
|
||||
'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
|
||||
}
|
||||
[Array.prototype, String.prototype, Number.prototype].each(
|
||||
function(p){ Object.extend(p, Test.BDDMethods) }
|
||||
);
|
||||
}
|
||||
|
||||
Test.context = function(name, spec, log){
|
||||
Test.setupBDDExtensionMethods();
|
||||
|
||||
var compiledSpec = {};
|
||||
var titles = {};
|
||||
for(specName in spec) {
|
||||
switch(specName){
|
||||
case "setup":
|
||||
case "teardown":
|
||||
compiledSpec[specName] = spec[specName];
|
||||
break;
|
||||
default:
|
||||
var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
|
||||
var body = spec[specName].toString().split('\n').slice(1);
|
||||
if(/^\{/.test(body[0])) body = body.slice(1);
|
||||
body.pop();
|
||||
body = body.map(function(statement){
|
||||
return statement.strip()
|
||||
});
|
||||
compiledSpec[testName] = body.join('\n');
|
||||
titles[testName] = specName;
|
||||
}
|
||||
}
|
||||
new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
|
||||
};
|
||||
131
public/js/lib/builder.js
Normal file
@@ -0,0 +1,131 @@
|
||||
// script.aculo.us builder.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
//
|
||||
// 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/
|
||||
|
||||
var Builder = {
|
||||
NODEMAP: {
|
||||
AREA: 'map',
|
||||
CAPTION: 'table',
|
||||
COL: 'table',
|
||||
COLGROUP: 'table',
|
||||
LEGEND: 'fieldset',
|
||||
OPTGROUP: 'select',
|
||||
OPTION: 'select',
|
||||
PARAM: 'object',
|
||||
TBODY: 'table',
|
||||
TD: 'table',
|
||||
TFOOT: 'table',
|
||||
TH: 'table',
|
||||
THEAD: 'table',
|
||||
TR: 'table'
|
||||
},
|
||||
// note: For Firefox < 1.5, OPTION and OPTGROUP tags are currently broken,
|
||||
// due to a Firefox bug
|
||||
node: function(elementName) {
|
||||
elementName = elementName.toUpperCase();
|
||||
|
||||
// try innerHTML approach
|
||||
var parentTag = this.NODEMAP[elementName] || 'div';
|
||||
var parentElement = document.createElement(parentTag);
|
||||
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
||||
parentElement.innerHTML = "<" + elementName + "></" + elementName + ">";
|
||||
} catch(e) {}
|
||||
var element = parentElement.firstChild || null;
|
||||
|
||||
// see if browser added wrapping tags
|
||||
if(element && (element.tagName.toUpperCase() != elementName))
|
||||
element = element.getElementsByTagName(elementName)[0];
|
||||
|
||||
// fallback to createElement approach
|
||||
if(!element) element = document.createElement(elementName);
|
||||
|
||||
// abort if nothing could be created
|
||||
if(!element) return;
|
||||
|
||||
// attributes (or text)
|
||||
if(arguments[1])
|
||||
if(this._isStringOrNumber(arguments[1]) ||
|
||||
(arguments[1] instanceof Array)) {
|
||||
this._children(element, arguments[1]);
|
||||
} else {
|
||||
var attrs = this._attributes(arguments[1]);
|
||||
if(attrs.length) {
|
||||
try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707
|
||||
parentElement.innerHTML = "<" +elementName + " " +
|
||||
attrs + "></" + elementName + ">";
|
||||
} catch(e) {}
|
||||
element = parentElement.firstChild || null;
|
||||
// workaround firefox 1.0.X bug
|
||||
if(!element) {
|
||||
element = document.createElement(elementName);
|
||||
for(attr in arguments[1])
|
||||
element[attr == 'class' ? 'className' : attr] = arguments[1][attr];
|
||||
}
|
||||
if(element.tagName.toUpperCase() != elementName)
|
||||
element = parentElement.getElementsByTagName(elementName)[0];
|
||||
}
|
||||
}
|
||||
|
||||
// text, or array of children
|
||||
if(arguments[2])
|
||||
this._children(element, arguments[2]);
|
||||
|
||||
return element;
|
||||
},
|
||||
_text: function(text) {
|
||||
return document.createTextNode(text);
|
||||
},
|
||||
|
||||
ATTR_MAP: {
|
||||
'className': 'class',
|
||||
'htmlFor': 'for'
|
||||
},
|
||||
|
||||
_attributes: function(attributes) {
|
||||
var attrs = [];
|
||||
for(attribute in attributes)
|
||||
attrs.push((attribute in this.ATTR_MAP ? this.ATTR_MAP[attribute] : attribute) +
|
||||
'="' + attributes[attribute].toString().escapeHTML() + '"');
|
||||
return attrs.join(" ");
|
||||
},
|
||||
_children: function(element, children) {
|
||||
if(typeof children=='object') { // array can hold nodes and text
|
||||
children.flatten().each( function(e) {
|
||||
if(typeof e=='object')
|
||||
element.appendChild(e)
|
||||
else
|
||||
if(Builder._isStringOrNumber(e))
|
||||
element.appendChild(Builder._text(e));
|
||||
});
|
||||
} else
|
||||
if(Builder._isStringOrNumber(children))
|
||||
element.appendChild(Builder._text(children));
|
||||
},
|
||||
_isStringOrNumber: function(param) {
|
||||
return(typeof param=='string' || typeof param=='number');
|
||||
},
|
||||
build: function(html) {
|
||||
var element = this.node('div');
|
||||
$(element).update(html.strip());
|
||||
return element.down();
|
||||
},
|
||||
dump: function(scope) {
|
||||
if(typeof scope != 'object' && typeof scope != 'function') scope = window; //global scope
|
||||
|
||||
var tags = ("A ABBR ACRONYM ADDRESS APPLET AREA B BASE BASEFONT BDO BIG BLOCKQUOTE BODY " +
|
||||
"BR BUTTON CAPTION CENTER CITE CODE COL COLGROUP DD DEL DFN DIR DIV DL DT EM FIELDSET " +
|
||||
"FONT FORM FRAME FRAMESET H1 H2 H3 H4 H5 H6 HEAD HR HTML I IFRAME IMG INPUT INS ISINDEX "+
|
||||
"KBD LABEL LEGEND LI LINK MAP MENU META NOFRAMES NOSCRIPT OBJECT OL OPTGROUP OPTION P "+
|
||||
"PARAM PRE Q S SAMP SCRIPT SELECT SMALL SPAN STRIKE STRONG STYLE SUB SUP TABLE TBODY TD "+
|
||||
"TEXTAREA TFOOT TH THEAD TITLE TR TT U UL VAR").split(/\s+/);
|
||||
|
||||
tags.each( function(tag){
|
||||
scope[tag] = function() {
|
||||
return Builder.node.apply(Builder, [tag].concat($A(arguments)));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
835
public/js/lib/controls.js
vendored
Normal file
@@ -0,0 +1,835 @@
|
||||
// script.aculo.us controls.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// (c) 2005, 2006 Ivan Krstic (http://blogs.law.harvard.edu/ivan)
|
||||
// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
|
||||
// Contributors:
|
||||
// Richard Livsey
|
||||
// Rahul Bhargava
|
||||
// Rob Wills
|
||||
//
|
||||
// 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/
|
||||
|
||||
// Autocompleter.Base handles all the autocompletion functionality
|
||||
// that's independent of the data source for autocompletion. This
|
||||
// includes drawing the autocompletion menu, observing keyboard
|
||||
// and mouse events, and similar.
|
||||
//
|
||||
// Specific autocompleters need to provide, at the very least,
|
||||
// a getUpdatedChoices function that will be invoked every time
|
||||
// the text inside the monitored textbox changes. This method
|
||||
// should get the text for which to provide autocompletion by
|
||||
// invoking this.getToken(), NOT by directly accessing
|
||||
// this.element.value. This is to allow incremental tokenized
|
||||
// autocompletion. Specific auto-completion logic (AJAX, etc)
|
||||
// belongs in getUpdatedChoices.
|
||||
//
|
||||
// Tokenized incremental autocompletion is enabled automatically
|
||||
// when an autocompleter is instantiated with the 'tokens' option
|
||||
// in the options parameter, e.g.:
|
||||
// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' });
|
||||
// will incrementally autocomplete with a comma as the token.
|
||||
// Additionally, ',' in the above example can be replaced with
|
||||
// a token array, e.g. { tokens: [',', '\n'] } which
|
||||
// enables autocompletion on multiple tokens. This is most
|
||||
// useful when one of the tokens is \n (a newline), as it
|
||||
// allows smart autocompletion after linebreaks.
|
||||
|
||||
if(typeof Effect == 'undefined')
|
||||
throw("controls.js requires including script.aculo.us' effects.js library");
|
||||
|
||||
var Autocompleter = {}
|
||||
Autocompleter.Base = function() {};
|
||||
Autocompleter.Base.prototype = {
|
||||
baseInitialize: function(element, update, options) {
|
||||
this.element = $(element);
|
||||
this.update = $(update);
|
||||
this.hasFocus = false;
|
||||
this.changed = false;
|
||||
this.active = false;
|
||||
this.index = 0;
|
||||
this.entryCount = 0;
|
||||
|
||||
if(this.setOptions)
|
||||
this.setOptions(options);
|
||||
else
|
||||
this.options = options || {};
|
||||
|
||||
this.options.paramName = this.options.paramName || this.element.name;
|
||||
this.options.tokens = this.options.tokens || [];
|
||||
this.options.frequency = this.options.frequency || 0.4;
|
||||
this.options.minChars = this.options.minChars || 1;
|
||||
this.options.onShow = this.options.onShow ||
|
||||
function(element, update){
|
||||
if(!update.style.position || update.style.position=='absolute') {
|
||||
update.style.position = 'absolute';
|
||||
Position.clone(element, update, {
|
||||
setHeight: false,
|
||||
offsetTop: element.offsetHeight
|
||||
});
|
||||
}
|
||||
Effect.Appear(update,{duration:0.15});
|
||||
};
|
||||
this.options.onHide = this.options.onHide ||
|
||||
function(element, update){ new Effect.Fade(update,{duration:0.15}) };
|
||||
|
||||
if(typeof(this.options.tokens) == 'string')
|
||||
this.options.tokens = new Array(this.options.tokens);
|
||||
|
||||
this.observer = null;
|
||||
|
||||
this.element.setAttribute('autocomplete','off');
|
||||
|
||||
Element.hide(this.update);
|
||||
|
||||
Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this));
|
||||
Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this));
|
||||
},
|
||||
|
||||
show: function() {
|
||||
if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update);
|
||||
if(!this.iefix &&
|
||||
(navigator.appVersion.indexOf('MSIE')>0) &&
|
||||
(navigator.userAgent.indexOf('Opera')<0) &&
|
||||
(Element.getStyle(this.update, 'position')=='absolute')) {
|
||||
new Insertion.After(this.update,
|
||||
'<iframe id="' + this.update.id + '_iefix" '+
|
||||
'style="display:none;position:absolute;filter:progid:DXImageTransform.Microsoft.Alpha(opacity=0);" ' +
|
||||
'src="javascript:false;" frameborder="0" scrolling="no"></iframe>');
|
||||
this.iefix = $(this.update.id+'_iefix');
|
||||
}
|
||||
if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50);
|
||||
},
|
||||
|
||||
fixIEOverlapping: function() {
|
||||
Position.clone(this.update, this.iefix, {setTop:(!this.update.style.height)});
|
||||
this.iefix.style.zIndex = 1;
|
||||
this.update.style.zIndex = 2;
|
||||
Element.show(this.iefix);
|
||||
},
|
||||
|
||||
hide: function() {
|
||||
this.stopIndicator();
|
||||
if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update);
|
||||
if(this.iefix) Element.hide(this.iefix);
|
||||
},
|
||||
|
||||
startIndicator: function() {
|
||||
if(this.options.indicator) Element.show(this.options.indicator);
|
||||
},
|
||||
|
||||
stopIndicator: function() {
|
||||
if(this.options.indicator) Element.hide(this.options.indicator);
|
||||
},
|
||||
|
||||
onKeyPress: function(event) {
|
||||
if(this.active)
|
||||
switch(event.keyCode) {
|
||||
case Event.KEY_TAB:
|
||||
case Event.KEY_RETURN:
|
||||
this.selectEntry();
|
||||
Event.stop(event);
|
||||
case Event.KEY_ESC:
|
||||
this.hide();
|
||||
this.active = false;
|
||||
Event.stop(event);
|
||||
return;
|
||||
case Event.KEY_LEFT:
|
||||
case Event.KEY_RIGHT:
|
||||
return;
|
||||
case Event.KEY_UP:
|
||||
this.markPrevious();
|
||||
this.render();
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
|
||||
return;
|
||||
case Event.KEY_DOWN:
|
||||
this.markNext();
|
||||
this.render();
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event);
|
||||
return;
|
||||
}
|
||||
else
|
||||
if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN ||
|
||||
(navigator.appVersion.indexOf('AppleWebKit') > 0 && event.keyCode == 0)) return;
|
||||
|
||||
this.changed = true;
|
||||
this.hasFocus = true;
|
||||
|
||||
if(this.observer) clearTimeout(this.observer);
|
||||
this.observer =
|
||||
setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000);
|
||||
},
|
||||
|
||||
activate: function() {
|
||||
this.changed = false;
|
||||
this.hasFocus = true;
|
||||
this.getUpdatedChoices();
|
||||
},
|
||||
|
||||
onHover: function(event) {
|
||||
var element = Event.findElement(event, 'LI');
|
||||
if(this.index != element.autocompleteIndex)
|
||||
{
|
||||
this.index = element.autocompleteIndex;
|
||||
this.render();
|
||||
}
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
onClick: function(event) {
|
||||
var element = Event.findElement(event, 'LI');
|
||||
this.index = element.autocompleteIndex;
|
||||
this.selectEntry();
|
||||
this.hide();
|
||||
},
|
||||
|
||||
onBlur: function(event) {
|
||||
// needed to make click events working
|
||||
setTimeout(this.hide.bind(this), 250);
|
||||
this.hasFocus = false;
|
||||
this.active = false;
|
||||
},
|
||||
|
||||
render: function() {
|
||||
if(this.entryCount > 0) {
|
||||
for (var i = 0; i < this.entryCount; i++)
|
||||
this.index==i ?
|
||||
Element.addClassName(this.getEntry(i),"selected") :
|
||||
Element.removeClassName(this.getEntry(i),"selected");
|
||||
|
||||
if(this.hasFocus) {
|
||||
this.show();
|
||||
this.active = true;
|
||||
}
|
||||
} else {
|
||||
this.active = false;
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
|
||||
markPrevious: function() {
|
||||
if(this.index > 0) this.index--
|
||||
else this.index = this.entryCount-1;
|
||||
this.getEntry(this.index).scrollIntoView(true);
|
||||
},
|
||||
|
||||
markNext: function() {
|
||||
if(this.index < this.entryCount-1) this.index++
|
||||
else this.index = 0;
|
||||
this.getEntry(this.index).scrollIntoView(false);
|
||||
},
|
||||
|
||||
getEntry: function(index) {
|
||||
return this.update.firstChild.childNodes[index];
|
||||
},
|
||||
|
||||
getCurrentEntry: function() {
|
||||
return this.getEntry(this.index);
|
||||
},
|
||||
|
||||
selectEntry: function() {
|
||||
this.active = false;
|
||||
this.updateElement(this.getCurrentEntry());
|
||||
},
|
||||
|
||||
updateElement: function(selectedElement) {
|
||||
if (this.options.updateElement) {
|
||||
this.options.updateElement(selectedElement);
|
||||
return;
|
||||
}
|
||||
var value = '';
|
||||
if (this.options.select) {
|
||||
var nodes = document.getElementsByClassName(this.options.select, selectedElement) || [];
|
||||
if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select);
|
||||
} else
|
||||
value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal');
|
||||
|
||||
var lastTokenPos = this.findLastToken();
|
||||
if (lastTokenPos != -1) {
|
||||
var newValue = this.element.value.substr(0, lastTokenPos + 1);
|
||||
var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/);
|
||||
if (whitespace)
|
||||
newValue += whitespace[0];
|
||||
this.element.value = newValue + value;
|
||||
} else {
|
||||
this.element.value = value;
|
||||
}
|
||||
this.element.focus();
|
||||
|
||||
if (this.options.afterUpdateElement)
|
||||
this.options.afterUpdateElement(this.element, selectedElement);
|
||||
},
|
||||
|
||||
updateChoices: function(choices) {
|
||||
if(!this.changed && this.hasFocus) {
|
||||
this.update.innerHTML = choices;
|
||||
Element.cleanWhitespace(this.update);
|
||||
Element.cleanWhitespace(this.update.down());
|
||||
|
||||
if(this.update.firstChild && this.update.down().childNodes) {
|
||||
this.entryCount =
|
||||
this.update.down().childNodes.length;
|
||||
for (var i = 0; i < this.entryCount; i++) {
|
||||
var entry = this.getEntry(i);
|
||||
entry.autocompleteIndex = i;
|
||||
this.addObservers(entry);
|
||||
}
|
||||
} else {
|
||||
this.entryCount = 0;
|
||||
}
|
||||
|
||||
this.stopIndicator();
|
||||
this.index = 0;
|
||||
|
||||
if(this.entryCount==1 && this.options.autoSelect) {
|
||||
this.selectEntry();
|
||||
this.hide();
|
||||
} else {
|
||||
this.render();
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
addObservers: function(element) {
|
||||
Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this));
|
||||
Event.observe(element, "click", this.onClick.bindAsEventListener(this));
|
||||
},
|
||||
|
||||
onObserverEvent: function() {
|
||||
this.changed = false;
|
||||
if(this.getToken().length>=this.options.minChars) {
|
||||
this.startIndicator();
|
||||
this.getUpdatedChoices();
|
||||
} else {
|
||||
this.active = false;
|
||||
this.hide();
|
||||
}
|
||||
},
|
||||
|
||||
getToken: function() {
|
||||
var tokenPos = this.findLastToken();
|
||||
if (tokenPos != -1)
|
||||
var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,'');
|
||||
else
|
||||
var ret = this.element.value;
|
||||
|
||||
return /\n/.test(ret) ? '' : ret;
|
||||
},
|
||||
|
||||
findLastToken: function() {
|
||||
var lastTokenPos = -1;
|
||||
|
||||
for (var i=0; i<this.options.tokens.length; i++) {
|
||||
var thisTokenPos = this.element.value.lastIndexOf(this.options.tokens[i]);
|
||||
if (thisTokenPos > lastTokenPos)
|
||||
lastTokenPos = thisTokenPos;
|
||||
}
|
||||
return lastTokenPos;
|
||||
}
|
||||
}
|
||||
|
||||
Ajax.Autocompleter = Class.create();
|
||||
Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), {
|
||||
initialize: function(element, update, url, options) {
|
||||
this.baseInitialize(element, update, options);
|
||||
this.options.asynchronous = true;
|
||||
this.options.onComplete = this.onComplete.bind(this);
|
||||
this.options.defaultParams = this.options.parameters || null;
|
||||
this.url = url;
|
||||
},
|
||||
|
||||
getUpdatedChoices: function() {
|
||||
entry = encodeURIComponent(this.options.paramName) + '=' +
|
||||
encodeURIComponent(this.getToken());
|
||||
|
||||
this.options.parameters = this.options.callback ?
|
||||
this.options.callback(this.element, entry) : entry;
|
||||
|
||||
if(this.options.defaultParams)
|
||||
this.options.parameters += '&' + this.options.defaultParams;
|
||||
|
||||
new Ajax.Request(this.url, this.options);
|
||||
},
|
||||
|
||||
onComplete: function(request) {
|
||||
this.updateChoices(request.responseText);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
// The local array autocompleter. Used when you'd prefer to
|
||||
// inject an array of autocompletion options into the page, rather
|
||||
// than sending out Ajax queries, which can be quite slow sometimes.
|
||||
//
|
||||
// The constructor takes four parameters. The first two are, as usual,
|
||||
// the id of the monitored textbox, and id of the autocompletion menu.
|
||||
// The third is the array you want to autocomplete from, and the fourth
|
||||
// is the options block.
|
||||
//
|
||||
// Extra local autocompletion options:
|
||||
// - choices - How many autocompletion choices to offer
|
||||
//
|
||||
// - partialSearch - If false, the autocompleter will match entered
|
||||
// text only at the beginning of strings in the
|
||||
// autocomplete array. Defaults to true, which will
|
||||
// match text at the beginning of any *word* in the
|
||||
// strings in the autocomplete array. If you want to
|
||||
// search anywhere in the string, additionally set
|
||||
// the option fullSearch to true (default: off).
|
||||
//
|
||||
// - fullSsearch - Search anywhere in autocomplete array strings.
|
||||
//
|
||||
// - partialChars - How many characters to enter before triggering
|
||||
// a partial match (unlike minChars, which defines
|
||||
// how many characters are required to do any match
|
||||
// at all). Defaults to 2.
|
||||
//
|
||||
// - ignoreCase - Whether to ignore case when autocompleting.
|
||||
// Defaults to true.
|
||||
//
|
||||
// It's possible to pass in a custom function as the 'selector'
|
||||
// option, if you prefer to write your own autocompletion logic.
|
||||
// In that case, the other options above will not apply unless
|
||||
// you support them.
|
||||
|
||||
Autocompleter.Local = Class.create();
|
||||
Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), {
|
||||
initialize: function(element, update, array, options) {
|
||||
this.baseInitialize(element, update, options);
|
||||
this.options.array = array;
|
||||
},
|
||||
|
||||
getUpdatedChoices: function() {
|
||||
this.updateChoices(this.options.selector(this));
|
||||
},
|
||||
|
||||
setOptions: function(options) {
|
||||
this.options = Object.extend({
|
||||
choices: 10,
|
||||
partialSearch: true,
|
||||
partialChars: 2,
|
||||
ignoreCase: true,
|
||||
fullSearch: false,
|
||||
selector: function(instance) {
|
||||
var ret = []; // Beginning matches
|
||||
var partial = []; // Inside matches
|
||||
var entry = instance.getToken();
|
||||
var count = 0;
|
||||
|
||||
for (var i = 0; i < instance.options.array.length &&
|
||||
ret.length < instance.options.choices ; i++) {
|
||||
|
||||
var elem = instance.options.array[i];
|
||||
var foundPos = instance.options.ignoreCase ?
|
||||
elem.toLowerCase().indexOf(entry.toLowerCase()) :
|
||||
elem.indexOf(entry);
|
||||
|
||||
while (foundPos != -1) {
|
||||
if (foundPos == 0 && elem.length != entry.length) {
|
||||
ret.push("<li><strong>" + elem.substr(0, entry.length) + "</strong>" +
|
||||
elem.substr(entry.length) + "</li>");
|
||||
break;
|
||||
} else if (entry.length >= instance.options.partialChars &&
|
||||
instance.options.partialSearch && foundPos != -1) {
|
||||
if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) {
|
||||
partial.push("<li>" + elem.substr(0, foundPos) + "<strong>" +
|
||||
elem.substr(foundPos, entry.length) + "</strong>" + elem.substr(
|
||||
foundPos + entry.length) + "</li>");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
foundPos = instance.options.ignoreCase ?
|
||||
elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) :
|
||||
elem.indexOf(entry, foundPos + 1);
|
||||
|
||||
}
|
||||
}
|
||||
if (partial.length)
|
||||
ret = ret.concat(partial.slice(0, instance.options.choices - ret.length))
|
||||
return "<ul>" + ret.join('') + "</ul>";
|
||||
}
|
||||
}, options || {});
|
||||
}
|
||||
});
|
||||
|
||||
// AJAX in-place editor
|
||||
//
|
||||
// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor
|
||||
|
||||
// Use this if you notice weird scrolling problems on some browsers,
|
||||
// the DOM might be a bit confused when this gets called so do this
|
||||
// waits 1 ms (with setTimeout) until it does the activation
|
||||
Field.scrollFreeActivate = function(field) {
|
||||
setTimeout(function() {
|
||||
Field.activate(field);
|
||||
}, 1);
|
||||
}
|
||||
|
||||
Ajax.InPlaceEditor = Class.create();
|
||||
Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99";
|
||||
Ajax.InPlaceEditor.prototype = {
|
||||
initialize: function(element, url, options) {
|
||||
this.url = url;
|
||||
this.element = $(element);
|
||||
|
||||
this.options = Object.extend({
|
||||
paramName: "value",
|
||||
okButton: true,
|
||||
okText: "ok",
|
||||
cancelLink: true,
|
||||
cancelText: "cancel",
|
||||
savingText: "Saving...",
|
||||
clickToEditText: "Click to edit",
|
||||
okText: "ok",
|
||||
rows: 1,
|
||||
onComplete: function(transport, element) {
|
||||
new Effect.Highlight(element, {startcolor: this.options.highlightcolor});
|
||||
},
|
||||
onFailure: function(transport) {
|
||||
alert("Error communicating with the server: " + transport.responseText.stripTags());
|
||||
},
|
||||
callback: function(form) {
|
||||
return Form.serialize(form);
|
||||
},
|
||||
handleLineBreaks: true,
|
||||
loadingText: 'Loading...',
|
||||
savingClassName: 'inplaceeditor-saving',
|
||||
loadingClassName: 'inplaceeditor-loading',
|
||||
formClassName: 'inplaceeditor-form',
|
||||
highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor,
|
||||
highlightendcolor: "#FFFFFF",
|
||||
externalControl: null,
|
||||
submitOnBlur: false,
|
||||
ajaxOptions: {},
|
||||
evalScripts: false
|
||||
}, options || {});
|
||||
|
||||
if(!this.options.formId && this.element.id) {
|
||||
this.options.formId = this.element.id + "-inplaceeditor";
|
||||
if ($(this.options.formId)) {
|
||||
// there's already a form with that name, don't specify an id
|
||||
this.options.formId = null;
|
||||
}
|
||||
}
|
||||
|
||||
if (this.options.externalControl) {
|
||||
this.options.externalControl = $(this.options.externalControl);
|
||||
}
|
||||
|
||||
this.originalBackground = Element.getStyle(this.element, 'background-color');
|
||||
if (!this.originalBackground) {
|
||||
this.originalBackground = "transparent";
|
||||
}
|
||||
|
||||
this.element.title = this.options.clickToEditText;
|
||||
|
||||
this.onclickListener = this.enterEditMode.bindAsEventListener(this);
|
||||
this.mouseoverListener = this.enterHover.bindAsEventListener(this);
|
||||
this.mouseoutListener = this.leaveHover.bindAsEventListener(this);
|
||||
Event.observe(this.element, 'click', this.onclickListener);
|
||||
Event.observe(this.element, 'mouseover', this.mouseoverListener);
|
||||
Event.observe(this.element, 'mouseout', this.mouseoutListener);
|
||||
if (this.options.externalControl) {
|
||||
Event.observe(this.options.externalControl, 'click', this.onclickListener);
|
||||
Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener);
|
||||
Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener);
|
||||
}
|
||||
},
|
||||
enterEditMode: function(evt) {
|
||||
if (this.saving) return;
|
||||
if (this.editing) return;
|
||||
this.editing = true;
|
||||
this.onEnterEditMode();
|
||||
if (this.options.externalControl) {
|
||||
Element.hide(this.options.externalControl);
|
||||
}
|
||||
Element.hide(this.element);
|
||||
this.createForm();
|
||||
this.element.parentNode.insertBefore(this.form, this.element);
|
||||
if (!this.options.loadTextURL) Field.scrollFreeActivate(this.editField);
|
||||
// stop the event to avoid a page refresh in Safari
|
||||
if (evt) {
|
||||
Event.stop(evt);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
createForm: function() {
|
||||
this.form = document.createElement("form");
|
||||
this.form.id = this.options.formId;
|
||||
Element.addClassName(this.form, this.options.formClassName)
|
||||
this.form.onsubmit = this.onSubmit.bind(this);
|
||||
|
||||
this.createEditField();
|
||||
|
||||
if (this.options.textarea) {
|
||||
var br = document.createElement("br");
|
||||
this.form.appendChild(br);
|
||||
}
|
||||
|
||||
if (this.options.okButton) {
|
||||
okButton = document.createElement("input");
|
||||
okButton.type = "submit";
|
||||
okButton.value = this.options.okText;
|
||||
okButton.className = 'editor_ok_button';
|
||||
this.form.appendChild(okButton);
|
||||
}
|
||||
|
||||
if (this.options.cancelLink) {
|
||||
cancelLink = document.createElement("a");
|
||||
cancelLink.href = "#";
|
||||
cancelLink.appendChild(document.createTextNode(this.options.cancelText));
|
||||
cancelLink.onclick = this.onclickCancel.bind(this);
|
||||
cancelLink.className = 'editor_cancel';
|
||||
this.form.appendChild(cancelLink);
|
||||
}
|
||||
},
|
||||
hasHTMLLineBreaks: function(string) {
|
||||
if (!this.options.handleLineBreaks) return false;
|
||||
return string.match(/<br/i) || string.match(/<p>/i);
|
||||
},
|
||||
convertHTMLLineBreaks: function(string) {
|
||||
return string.replace(/<br>/gi, "\n").replace(/<br\/>/gi, "\n").replace(/<\/p>/gi, "\n").replace(/<p>/gi, "");
|
||||
},
|
||||
createEditField: function() {
|
||||
var text;
|
||||
if(this.options.loadTextURL) {
|
||||
text = this.options.loadingText;
|
||||
} else {
|
||||
text = this.getText();
|
||||
}
|
||||
|
||||
var obj = this;
|
||||
|
||||
if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) {
|
||||
this.options.textarea = false;
|
||||
var textField = document.createElement("input");
|
||||
textField.obj = this;
|
||||
textField.type = "text";
|
||||
textField.name = this.options.paramName;
|
||||
textField.value = text;
|
||||
textField.style.backgroundColor = this.options.highlightcolor;
|
||||
textField.className = 'editor_field';
|
||||
var size = this.options.size || this.options.cols || 0;
|
||||
if (size != 0) textField.size = size;
|
||||
if (this.options.submitOnBlur)
|
||||
textField.onblur = this.onSubmit.bind(this);
|
||||
this.editField = textField;
|
||||
} else {
|
||||
this.options.textarea = true;
|
||||
var textArea = document.createElement("textarea");
|
||||
textArea.obj = this;
|
||||
textArea.name = this.options.paramName;
|
||||
textArea.value = this.convertHTMLLineBreaks(text);
|
||||
textArea.rows = this.options.rows;
|
||||
textArea.cols = this.options.cols || 40;
|
||||
textArea.className = 'editor_field';
|
||||
if (this.options.submitOnBlur)
|
||||
textArea.onblur = this.onSubmit.bind(this);
|
||||
this.editField = textArea;
|
||||
}
|
||||
|
||||
if(this.options.loadTextURL) {
|
||||
this.loadExternalText();
|
||||
}
|
||||
this.form.appendChild(this.editField);
|
||||
},
|
||||
getText: function() {
|
||||
return this.element.innerHTML;
|
||||
},
|
||||
loadExternalText: function() {
|
||||
Element.addClassName(this.form, this.options.loadingClassName);
|
||||
this.editField.disabled = true;
|
||||
new Ajax.Request(
|
||||
this.options.loadTextURL,
|
||||
Object.extend({
|
||||
asynchronous: true,
|
||||
onComplete: this.onLoadedExternalText.bind(this)
|
||||
}, this.options.ajaxOptions)
|
||||
);
|
||||
},
|
||||
onLoadedExternalText: function(transport) {
|
||||
Element.removeClassName(this.form, this.options.loadingClassName);
|
||||
this.editField.disabled = false;
|
||||
this.editField.value = transport.responseText.stripTags();
|
||||
Field.scrollFreeActivate(this.editField);
|
||||
},
|
||||
onclickCancel: function() {
|
||||
this.onComplete();
|
||||
this.leaveEditMode();
|
||||
return false;
|
||||
},
|
||||
onFailure: function(transport) {
|
||||
this.options.onFailure(transport);
|
||||
if (this.oldInnerHTML) {
|
||||
this.element.innerHTML = this.oldInnerHTML;
|
||||
this.oldInnerHTML = null;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onSubmit: function() {
|
||||
// onLoading resets these so we need to save them away for the Ajax call
|
||||
var form = this.form;
|
||||
var value = this.editField.value;
|
||||
|
||||
// do this first, sometimes the ajax call returns before we get a chance to switch on Saving...
|
||||
// which means this will actually switch on Saving... *after* we've left edit mode causing Saving...
|
||||
// to be displayed indefinitely
|
||||
this.onLoading();
|
||||
|
||||
if (this.options.evalScripts) {
|
||||
new Ajax.Request(
|
||||
this.url, Object.extend({
|
||||
parameters: this.options.callback(form, value),
|
||||
onComplete: this.onComplete.bind(this),
|
||||
onFailure: this.onFailure.bind(this),
|
||||
asynchronous:true,
|
||||
evalScripts:true
|
||||
}, this.options.ajaxOptions));
|
||||
} else {
|
||||
new Ajax.Updater(
|
||||
{ success: this.element,
|
||||
// don't update on failure (this could be an option)
|
||||
failure: null },
|
||||
this.url, Object.extend({
|
||||
parameters: this.options.callback(form, value),
|
||||
onComplete: this.onComplete.bind(this),
|
||||
onFailure: this.onFailure.bind(this)
|
||||
}, this.options.ajaxOptions));
|
||||
}
|
||||
// stop the event to avoid a page refresh in Safari
|
||||
if (arguments.length > 1) {
|
||||
Event.stop(arguments[0]);
|
||||
}
|
||||
return false;
|
||||
},
|
||||
onLoading: function() {
|
||||
this.saving = true;
|
||||
this.removeForm();
|
||||
this.leaveHover();
|
||||
this.showSaving();
|
||||
},
|
||||
showSaving: function() {
|
||||
this.oldInnerHTML = this.element.innerHTML;
|
||||
this.element.innerHTML = this.options.savingText;
|
||||
Element.addClassName(this.element, this.options.savingClassName);
|
||||
this.element.style.backgroundColor = this.originalBackground;
|
||||
Element.show(this.element);
|
||||
},
|
||||
removeForm: function() {
|
||||
if(this.form) {
|
||||
if (this.form.parentNode) Element.remove(this.form);
|
||||
this.form = null;
|
||||
}
|
||||
},
|
||||
enterHover: function() {
|
||||
if (this.saving) return;
|
||||
this.element.style.backgroundColor = this.options.highlightcolor;
|
||||
if (this.effect) {
|
||||
this.effect.cancel();
|
||||
}
|
||||
Element.addClassName(this.element, this.options.hoverClassName)
|
||||
},
|
||||
leaveHover: function() {
|
||||
if (this.options.backgroundColor) {
|
||||
this.element.style.backgroundColor = this.oldBackground;
|
||||
}
|
||||
Element.removeClassName(this.element, this.options.hoverClassName)
|
||||
if (this.saving) return;
|
||||
this.effect = new Effect.Highlight(this.element, {
|
||||
startcolor: this.options.highlightcolor,
|
||||
endcolor: this.options.highlightendcolor,
|
||||
restorecolor: this.originalBackground
|
||||
});
|
||||
},
|
||||
leaveEditMode: function() {
|
||||
Element.removeClassName(this.element, this.options.savingClassName);
|
||||
this.removeForm();
|
||||
this.leaveHover();
|
||||
this.element.style.backgroundColor = this.originalBackground;
|
||||
Element.show(this.element);
|
||||
if (this.options.externalControl) {
|
||||
Element.show(this.options.externalControl);
|
||||
}
|
||||
this.editing = false;
|
||||
this.saving = false;
|
||||
this.oldInnerHTML = null;
|
||||
this.onLeaveEditMode();
|
||||
},
|
||||
onComplete: function(transport) {
|
||||
this.leaveEditMode();
|
||||
this.options.onComplete.bind(this)(transport, this.element);
|
||||
},
|
||||
onEnterEditMode: function() {},
|
||||
onLeaveEditMode: function() {},
|
||||
dispose: function() {
|
||||
if (this.oldInnerHTML) {
|
||||
this.element.innerHTML = this.oldInnerHTML;
|
||||
}
|
||||
this.leaveEditMode();
|
||||
Event.stopObserving(this.element, 'click', this.onclickListener);
|
||||
Event.stopObserving(this.element, 'mouseover', this.mouseoverListener);
|
||||
Event.stopObserving(this.element, 'mouseout', this.mouseoutListener);
|
||||
if (this.options.externalControl) {
|
||||
Event.stopObserving(this.options.externalControl, 'click', this.onclickListener);
|
||||
Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener);
|
||||
Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener);
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Ajax.InPlaceCollectionEditor = Class.create();
|
||||
Object.extend(Ajax.InPlaceCollectionEditor.prototype, Ajax.InPlaceEditor.prototype);
|
||||
Object.extend(Ajax.InPlaceCollectionEditor.prototype, {
|
||||
createEditField: function() {
|
||||
if (!this.cached_selectTag) {
|
||||
var selectTag = document.createElement("select");
|
||||
var collection = this.options.collection || [];
|
||||
var optionTag;
|
||||
collection.each(function(e,i) {
|
||||
optionTag = document.createElement("option");
|
||||
optionTag.value = (e instanceof Array) ? e[0] : e;
|
||||
if((typeof this.options.value == 'undefined') &&
|
||||
((e instanceof Array) ? this.element.innerHTML == e[1] : e == optionTag.value)) optionTag.selected = true;
|
||||
if(this.options.value==optionTag.value) optionTag.selected = true;
|
||||
optionTag.appendChild(document.createTextNode((e instanceof Array) ? e[1] : e));
|
||||
selectTag.appendChild(optionTag);
|
||||
}.bind(this));
|
||||
this.cached_selectTag = selectTag;
|
||||
}
|
||||
|
||||
this.editField = this.cached_selectTag;
|
||||
if(this.options.loadTextURL) this.loadExternalText();
|
||||
this.form.appendChild(this.editField);
|
||||
this.options.callback = function(form, value) {
|
||||
return "value=" + encodeURIComponent(value);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
// Delayed observer, like Form.Element.Observer,
|
||||
// but waits for delay after last key input
|
||||
// Ideal for live-search fields
|
||||
|
||||
Form.Element.DelayedObserver = Class.create();
|
||||
Form.Element.DelayedObserver.prototype = {
|
||||
initialize: function(element, delay, callback) {
|
||||
this.delay = delay || 0.5;
|
||||
this.element = $(element);
|
||||
this.callback = callback;
|
||||
this.timer = null;
|
||||
this.lastValue = $F(this.element);
|
||||
Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this));
|
||||
},
|
||||
delayedListener: function(event) {
|
||||
if(this.lastValue == $F(this.element)) return;
|
||||
if(this.timer) clearTimeout(this.timer);
|
||||
this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000);
|
||||
this.lastValue = $F(this.element);
|
||||
},
|
||||
onTimerEvent: function() {
|
||||
this.timer = null;
|
||||
this.callback(this.element, $F(this.element));
|
||||
}
|
||||
};
|
||||
944
public/js/lib/dragdrop.js
vendored
Normal file
@@ -0,0 +1,944 @@
|
||||
// script.aculo.us dragdrop.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// (c) 2005, 2006 Sammi Williams (http://www.oriontransfer.co.nz, sammi@oriontransfer.co.nz)
|
||||
//
|
||||
// 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/
|
||||
|
||||
if(typeof Effect == 'undefined')
|
||||
throw("dragdrop.js requires including script.aculo.us' effects.js library");
|
||||
|
||||
var Droppables = {
|
||||
drops: [],
|
||||
|
||||
remove: function(element) {
|
||||
this.drops = this.drops.reject(function(d) { return d.element==$(element) });
|
||||
},
|
||||
|
||||
add: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend({
|
||||
greedy: true,
|
||||
hoverclass: null,
|
||||
tree: false
|
||||
}, arguments[1] || {});
|
||||
|
||||
// cache containers
|
||||
if(options.containment) {
|
||||
options._containers = [];
|
||||
var containment = options.containment;
|
||||
if((typeof containment == 'object') &&
|
||||
(containment.constructor == Array)) {
|
||||
containment.each( function(c) { options._containers.push($(c)) });
|
||||
} else {
|
||||
options._containers.push($(containment));
|
||||
}
|
||||
}
|
||||
|
||||
if(options.accept) options.accept = [options.accept].flatten();
|
||||
|
||||
Element.makePositioned(element); // fix IE
|
||||
options.element = element;
|
||||
|
||||
this.drops.push(options);
|
||||
},
|
||||
|
||||
findDeepestChild: function(drops) {
|
||||
deepest = drops[0];
|
||||
|
||||
for (i = 1; i < drops.length; ++i)
|
||||
if (Element.isParent(drops[i].element, deepest.element))
|
||||
deepest = drops[i];
|
||||
|
||||
return deepest;
|
||||
},
|
||||
|
||||
isContained: function(element, drop) {
|
||||
var containmentNode;
|
||||
if(drop.tree) {
|
||||
containmentNode = element.treeNode;
|
||||
} else {
|
||||
containmentNode = element.parentNode;
|
||||
}
|
||||
return drop._containers.detect(function(c) { return containmentNode == c });
|
||||
},
|
||||
|
||||
isAffected: function(point, element, drop) {
|
||||
return (
|
||||
(drop.element!=element) &&
|
||||
((!drop._containers) ||
|
||||
this.isContained(element, drop)) &&
|
||||
((!drop.accept) ||
|
||||
(Element.classNames(element).detect(
|
||||
function(v) { return drop.accept.include(v) } ) )) &&
|
||||
Position.within(drop.element, point[0], point[1]) );
|
||||
},
|
||||
|
||||
deactivate: function(drop) {
|
||||
if(drop.hoverclass)
|
||||
Element.removeClassName(drop.element, drop.hoverclass);
|
||||
this.last_active = null;
|
||||
},
|
||||
|
||||
activate: function(drop) {
|
||||
if(drop.hoverclass)
|
||||
Element.addClassName(drop.element, drop.hoverclass);
|
||||
this.last_active = drop;
|
||||
},
|
||||
|
||||
show: function(point, element) {
|
||||
if(!this.drops.length) return;
|
||||
var affected = [];
|
||||
|
||||
if(this.last_active) this.deactivate(this.last_active);
|
||||
this.drops.each( function(drop) {
|
||||
if(Droppables.isAffected(point, element, drop))
|
||||
affected.push(drop);
|
||||
});
|
||||
|
||||
if(affected.length>0) {
|
||||
drop = Droppables.findDeepestChild(affected);
|
||||
Position.within(drop.element, point[0], point[1]);
|
||||
if(drop.onHover)
|
||||
drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element));
|
||||
|
||||
Droppables.activate(drop);
|
||||
}
|
||||
},
|
||||
|
||||
fire: function(event, element) {
|
||||
if(!this.last_active) return;
|
||||
Position.prepare();
|
||||
|
||||
if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active))
|
||||
if (this.last_active.onDrop)
|
||||
this.last_active.onDrop(element, this.last_active.element, event);
|
||||
},
|
||||
|
||||
reset: function() {
|
||||
if(this.last_active)
|
||||
this.deactivate(this.last_active);
|
||||
}
|
||||
}
|
||||
|
||||
var Draggables = {
|
||||
drags: [],
|
||||
observers: [],
|
||||
|
||||
register: function(draggable) {
|
||||
if(this.drags.length == 0) {
|
||||
this.eventMouseUp = this.endDrag.bindAsEventListener(this);
|
||||
this.eventMouseMove = this.updateDrag.bindAsEventListener(this);
|
||||
this.eventKeypress = this.keyPress.bindAsEventListener(this);
|
||||
|
||||
Event.observe(document, "mouseup", this.eventMouseUp);
|
||||
Event.observe(document, "mousemove", this.eventMouseMove);
|
||||
Event.observe(document, "keypress", this.eventKeypress);
|
||||
}
|
||||
this.drags.push(draggable);
|
||||
},
|
||||
|
||||
unregister: function(draggable) {
|
||||
this.drags = this.drags.reject(function(d) { return d==draggable });
|
||||
if(this.drags.length == 0) {
|
||||
Event.stopObserving(document, "mouseup", this.eventMouseUp);
|
||||
Event.stopObserving(document, "mousemove", this.eventMouseMove);
|
||||
Event.stopObserving(document, "keypress", this.eventKeypress);
|
||||
}
|
||||
},
|
||||
|
||||
activate: function(draggable) {
|
||||
if(draggable.options.delay) {
|
||||
this._timeout = setTimeout(function() {
|
||||
Draggables._timeout = null;
|
||||
window.focus();
|
||||
Draggables.activeDraggable = draggable;
|
||||
}.bind(this), draggable.options.delay);
|
||||
} else {
|
||||
window.focus(); // allows keypress events if window isn't currently focused, fails for Safari
|
||||
this.activeDraggable = draggable;
|
||||
}
|
||||
},
|
||||
|
||||
deactivate: function() {
|
||||
this.activeDraggable = null;
|
||||
},
|
||||
|
||||
updateDrag: function(event) {
|
||||
if(!this.activeDraggable) return;
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
// Mozilla-based browsers fire successive mousemove events with
|
||||
// the same coordinates, prevent needless redrawing (moz bug?)
|
||||
if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return;
|
||||
this._lastPointer = pointer;
|
||||
|
||||
this.activeDraggable.updateDrag(event, pointer);
|
||||
},
|
||||
|
||||
endDrag: function(event) {
|
||||
if(this._timeout) {
|
||||
clearTimeout(this._timeout);
|
||||
this._timeout = null;
|
||||
}
|
||||
if(!this.activeDraggable) return;
|
||||
this._lastPointer = null;
|
||||
this.activeDraggable.endDrag(event);
|
||||
this.activeDraggable = null;
|
||||
},
|
||||
|
||||
keyPress: function(event) {
|
||||
if(this.activeDraggable)
|
||||
this.activeDraggable.keyPress(event);
|
||||
},
|
||||
|
||||
addObserver: function(observer) {
|
||||
this.observers.push(observer);
|
||||
this._cacheObserverCallbacks();
|
||||
},
|
||||
|
||||
removeObserver: function(element) { // element instead of observer fixes mem leaks
|
||||
this.observers = this.observers.reject( function(o) { return o.element==element });
|
||||
this._cacheObserverCallbacks();
|
||||
},
|
||||
|
||||
notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag'
|
||||
if(this[eventName+'Count'] > 0)
|
||||
this.observers.each( function(o) {
|
||||
if(o[eventName]) o[eventName](eventName, draggable, event);
|
||||
});
|
||||
if(draggable.options[eventName]) draggable.options[eventName](draggable, event);
|
||||
},
|
||||
|
||||
_cacheObserverCallbacks: function() {
|
||||
['onStart','onEnd','onDrag'].each( function(eventName) {
|
||||
Draggables[eventName+'Count'] = Draggables.observers.select(
|
||||
function(o) { return o[eventName]; }
|
||||
).length;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var Draggable = Class.create();
|
||||
Draggable._dragging = {};
|
||||
|
||||
Draggable.prototype = {
|
||||
initialize: function(element) {
|
||||
var defaults = {
|
||||
handle: false,
|
||||
reverteffect: function(element, top_offset, left_offset) {
|
||||
var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02;
|
||||
new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur,
|
||||
queue: {scope:'_draggable', position:'end'}
|
||||
});
|
||||
},
|
||||
endeffect: function(element) {
|
||||
var toOpacity = typeof element._opacity == 'number' ? element._opacity : 1.0;
|
||||
new Effect.Opacity(element, {duration:0.2, from:0.7, to:toOpacity,
|
||||
queue: {scope:'_draggable', position:'end'},
|
||||
afterFinish: function(){
|
||||
Draggable._dragging[element] = false
|
||||
}
|
||||
});
|
||||
},
|
||||
zindex: 1000,
|
||||
revert: false,
|
||||
scroll: false,
|
||||
scrollSensitivity: 20,
|
||||
scrollSpeed: 15,
|
||||
snap: false, // false, or xy or [x,y] or function(x,y){ return [x,y] }
|
||||
delay: 0
|
||||
};
|
||||
|
||||
if(!arguments[1] || typeof arguments[1].endeffect == 'undefined')
|
||||
Object.extend(defaults, {
|
||||
starteffect: function(element) {
|
||||
element._opacity = Element.getOpacity(element);
|
||||
Draggable._dragging[element] = true;
|
||||
new Effect.Opacity(element, {duration:0.2, from:element._opacity, to:0.7});
|
||||
}
|
||||
});
|
||||
|
||||
var options = Object.extend(defaults, arguments[1] || {});
|
||||
|
||||
this.element = $(element);
|
||||
|
||||
if(options.handle && (typeof options.handle == 'string'))
|
||||
this.handle = this.element.down('.'+options.handle, 0);
|
||||
|
||||
if(!this.handle) this.handle = $(options.handle);
|
||||
if(!this.handle) this.handle = this.element;
|
||||
|
||||
if(options.scroll && !options.scroll.scrollTo && !options.scroll.outerHTML) {
|
||||
options.scroll = $(options.scroll);
|
||||
this._isScrollChild = Element.childOf(this.element, options.scroll);
|
||||
}
|
||||
|
||||
Element.makePositioned(this.element); // fix IE
|
||||
|
||||
this.delta = this.currentDelta();
|
||||
this.options = options;
|
||||
this.dragging = false;
|
||||
|
||||
this.eventMouseDown = this.initDrag.bindAsEventListener(this);
|
||||
Event.observe(this.handle, "mousedown", this.eventMouseDown);
|
||||
|
||||
Draggables.register(this);
|
||||
},
|
||||
|
||||
destroy: function() {
|
||||
Event.stopObserving(this.handle, "mousedown", this.eventMouseDown);
|
||||
Draggables.unregister(this);
|
||||
},
|
||||
|
||||
currentDelta: function() {
|
||||
return([
|
||||
parseInt(Element.getStyle(this.element,'left') || '0'),
|
||||
parseInt(Element.getStyle(this.element,'top') || '0')]);
|
||||
},
|
||||
|
||||
initDrag: function(event) {
|
||||
if(typeof Draggable._dragging[this.element] != 'undefined' &&
|
||||
Draggable._dragging[this.element]) return;
|
||||
if(Event.isLeftClick(event)) {
|
||||
// abort on form elements, fixes a Firefox issue
|
||||
var src = Event.element(event);
|
||||
if((tag_name = src.tagName.toUpperCase()) && (
|
||||
tag_name=='INPUT' ||
|
||||
tag_name=='SELECT' ||
|
||||
tag_name=='OPTION' ||
|
||||
tag_name=='BUTTON' ||
|
||||
tag_name=='TEXTAREA')) return;
|
||||
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
var pos = Position.cumulativeOffset(this.element);
|
||||
this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) });
|
||||
|
||||
Draggables.activate(this);
|
||||
Event.stop(event);
|
||||
}
|
||||
},
|
||||
|
||||
startDrag: function(event) {
|
||||
this.dragging = true;
|
||||
|
||||
if(this.options.zindex) {
|
||||
this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0);
|
||||
this.element.style.zIndex = this.options.zindex;
|
||||
}
|
||||
|
||||
if(this.options.ghosting) {
|
||||
this._clone = this.element.cloneNode(true);
|
||||
Position.absolutize(this.element);
|
||||
this.element.parentNode.insertBefore(this._clone, this.element);
|
||||
}
|
||||
|
||||
if(this.options.scroll) {
|
||||
if (this.options.scroll == window) {
|
||||
var where = this._getWindowScroll(this.options.scroll);
|
||||
this.originalScrollLeft = where.left;
|
||||
this.originalScrollTop = where.top;
|
||||
} else {
|
||||
this.originalScrollLeft = this.options.scroll.scrollLeft;
|
||||
this.originalScrollTop = this.options.scroll.scrollTop;
|
||||
}
|
||||
}
|
||||
|
||||
Draggables.notify('onStart', this, event);
|
||||
|
||||
if(this.options.starteffect) this.options.starteffect(this.element);
|
||||
},
|
||||
|
||||
updateDrag: function(event, pointer) {
|
||||
if(!this.dragging) this.startDrag(event);
|
||||
Position.prepare();
|
||||
Droppables.show(pointer, this.element);
|
||||
Draggables.notify('onDrag', this, event);
|
||||
|
||||
this.draw(pointer);
|
||||
if(this.options.change) this.options.change(this);
|
||||
|
||||
if(this.options.scroll) {
|
||||
this.stopScrolling();
|
||||
|
||||
var p;
|
||||
if (this.options.scroll == window) {
|
||||
with(this._getWindowScroll(this.options.scroll)) { p = [ left, top, left+width, top+height ]; }
|
||||
} else {
|
||||
p = Position.page(this.options.scroll);
|
||||
p[0] += this.options.scroll.scrollLeft + Position.deltaX;
|
||||
p[1] += this.options.scroll.scrollTop + Position.deltaY;
|
||||
p.push(p[0]+this.options.scroll.offsetWidth);
|
||||
p.push(p[1]+this.options.scroll.offsetHeight);
|
||||
}
|
||||
var speed = [0,0];
|
||||
if(pointer[0] < (p[0]+this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[0]+this.options.scrollSensitivity);
|
||||
if(pointer[1] < (p[1]+this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[1]+this.options.scrollSensitivity);
|
||||
if(pointer[0] > (p[2]-this.options.scrollSensitivity)) speed[0] = pointer[0]-(p[2]-this.options.scrollSensitivity);
|
||||
if(pointer[1] > (p[3]-this.options.scrollSensitivity)) speed[1] = pointer[1]-(p[3]-this.options.scrollSensitivity);
|
||||
this.startScrolling(speed);
|
||||
}
|
||||
|
||||
// fix AppleWebKit rendering
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
||||
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
finishDrag: function(event, success) {
|
||||
this.dragging = false;
|
||||
|
||||
if(this.options.ghosting) {
|
||||
Position.relativize(this.element);
|
||||
Element.remove(this._clone);
|
||||
this._clone = null;
|
||||
}
|
||||
|
||||
if(success) Droppables.fire(event, this.element);
|
||||
Draggables.notify('onEnd', this, event);
|
||||
|
||||
var revert = this.options.revert;
|
||||
if(revert && typeof revert == 'function') revert = revert(this.element);
|
||||
|
||||
var d = this.currentDelta();
|
||||
if(revert && this.options.reverteffect) {
|
||||
this.options.reverteffect(this.element,
|
||||
d[1]-this.delta[1], d[0]-this.delta[0]);
|
||||
} else {
|
||||
this.delta = d;
|
||||
}
|
||||
|
||||
if(this.options.zindex)
|
||||
this.element.style.zIndex = this.originalZ;
|
||||
|
||||
if(this.options.endeffect)
|
||||
this.options.endeffect(this.element);
|
||||
|
||||
Draggables.deactivate(this);
|
||||
Droppables.reset();
|
||||
},
|
||||
|
||||
keyPress: function(event) {
|
||||
if(event.keyCode!=Event.KEY_ESC) return;
|
||||
this.finishDrag(event, false);
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
endDrag: function(event) {
|
||||
if(!this.dragging) return;
|
||||
this.stopScrolling();
|
||||
this.finishDrag(event, true);
|
||||
Event.stop(event);
|
||||
},
|
||||
|
||||
draw: function(point) {
|
||||
var pos = Position.cumulativeOffset(this.element);
|
||||
if(this.options.ghosting) {
|
||||
var r = Position.realOffset(this.element);
|
||||
pos[0] += r[0] - Position.deltaX; pos[1] += r[1] - Position.deltaY;
|
||||
}
|
||||
|
||||
var d = this.currentDelta();
|
||||
pos[0] -= d[0]; pos[1] -= d[1];
|
||||
|
||||
if(this.options.scroll && (this.options.scroll != window && this._isScrollChild)) {
|
||||
pos[0] -= this.options.scroll.scrollLeft-this.originalScrollLeft;
|
||||
pos[1] -= this.options.scroll.scrollTop-this.originalScrollTop;
|
||||
}
|
||||
|
||||
var p = [0,1].map(function(i){
|
||||
return (point[i]-pos[i]-this.offset[i])
|
||||
}.bind(this));
|
||||
|
||||
if(this.options.snap) {
|
||||
if(typeof this.options.snap == 'function') {
|
||||
p = this.options.snap(p[0],p[1],this);
|
||||
} else {
|
||||
if(this.options.snap instanceof Array) {
|
||||
p = p.map( function(v, i) {
|
||||
return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this))
|
||||
} else {
|
||||
p = p.map( function(v) {
|
||||
return Math.round(v/this.options.snap)*this.options.snap }.bind(this))
|
||||
}
|
||||
}}
|
||||
|
||||
var style = this.element.style;
|
||||
if((!this.options.constraint) || (this.options.constraint=='horizontal'))
|
||||
style.left = p[0] + "px";
|
||||
if((!this.options.constraint) || (this.options.constraint=='vertical'))
|
||||
style.top = p[1] + "px";
|
||||
|
||||
if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering
|
||||
},
|
||||
|
||||
stopScrolling: function() {
|
||||
if(this.scrollInterval) {
|
||||
clearInterval(this.scrollInterval);
|
||||
this.scrollInterval = null;
|
||||
Draggables._lastScrollPointer = null;
|
||||
}
|
||||
},
|
||||
|
||||
startScrolling: function(speed) {
|
||||
if(!(speed[0] || speed[1])) return;
|
||||
this.scrollSpeed = [speed[0]*this.options.scrollSpeed,speed[1]*this.options.scrollSpeed];
|
||||
this.lastScrolled = new Date();
|
||||
this.scrollInterval = setInterval(this.scroll.bind(this), 10);
|
||||
},
|
||||
|
||||
scroll: function() {
|
||||
var current = new Date();
|
||||
var delta = current - this.lastScrolled;
|
||||
this.lastScrolled = current;
|
||||
if(this.options.scroll == window) {
|
||||
with (this._getWindowScroll(this.options.scroll)) {
|
||||
if (this.scrollSpeed[0] || this.scrollSpeed[1]) {
|
||||
var d = delta / 1000;
|
||||
this.options.scroll.scrollTo( left + d*this.scrollSpeed[0], top + d*this.scrollSpeed[1] );
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.options.scroll.scrollLeft += this.scrollSpeed[0] * delta / 1000;
|
||||
this.options.scroll.scrollTop += this.scrollSpeed[1] * delta / 1000;
|
||||
}
|
||||
|
||||
Position.prepare();
|
||||
Droppables.show(Draggables._lastPointer, this.element);
|
||||
Draggables.notify('onDrag', this);
|
||||
if (this._isScrollChild) {
|
||||
Draggables._lastScrollPointer = Draggables._lastScrollPointer || $A(Draggables._lastPointer);
|
||||
Draggables._lastScrollPointer[0] += this.scrollSpeed[0] * delta / 1000;
|
||||
Draggables._lastScrollPointer[1] += this.scrollSpeed[1] * delta / 1000;
|
||||
if (Draggables._lastScrollPointer[0] < 0)
|
||||
Draggables._lastScrollPointer[0] = 0;
|
||||
if (Draggables._lastScrollPointer[1] < 0)
|
||||
Draggables._lastScrollPointer[1] = 0;
|
||||
this.draw(Draggables._lastScrollPointer);
|
||||
}
|
||||
|
||||
if(this.options.change) this.options.change(this);
|
||||
},
|
||||
|
||||
_getWindowScroll: function(w) {
|
||||
var T, L, W, H;
|
||||
with (w.document) {
|
||||
if (w.document.documentElement && documentElement.scrollTop) {
|
||||
T = documentElement.scrollTop;
|
||||
L = documentElement.scrollLeft;
|
||||
} else if (w.document.body) {
|
||||
T = body.scrollTop;
|
||||
L = body.scrollLeft;
|
||||
}
|
||||
if (w.innerWidth) {
|
||||
W = w.innerWidth;
|
||||
H = w.innerHeight;
|
||||
} else if (w.document.documentElement && documentElement.clientWidth) {
|
||||
W = documentElement.clientWidth;
|
||||
H = documentElement.clientHeight;
|
||||
} else {
|
||||
W = body.offsetWidth;
|
||||
H = body.offsetHeight
|
||||
}
|
||||
}
|
||||
return { top: T, left: L, width: W, height: H };
|
||||
}
|
||||
}
|
||||
|
||||
/*--------------------------------------------------------------------------*/
|
||||
|
||||
var SortableObserver = Class.create();
|
||||
SortableObserver.prototype = {
|
||||
initialize: function(element, observer) {
|
||||
this.element = $(element);
|
||||
this.observer = observer;
|
||||
this.lastValue = Sortable.serialize(this.element);
|
||||
},
|
||||
|
||||
onStart: function() {
|
||||
this.lastValue = Sortable.serialize(this.element);
|
||||
},
|
||||
|
||||
onEnd: function() {
|
||||
Sortable.unmark();
|
||||
if(this.lastValue != Sortable.serialize(this.element))
|
||||
this.observer(this.element)
|
||||
}
|
||||
}
|
||||
|
||||
var Sortable = {
|
||||
SERIALIZE_RULE: /^[^_\-](?:[A-Za-z0-9\-\_]*)[_](.*)$/,
|
||||
|
||||
sortables: {},
|
||||
|
||||
_findRootElement: function(element) {
|
||||
while (element.tagName.toUpperCase() != "BODY") {
|
||||
if(element.id && Sortable.sortables[element.id]) return element;
|
||||
element = element.parentNode;
|
||||
}
|
||||
},
|
||||
|
||||
options: function(element) {
|
||||
element = Sortable._findRootElement($(element));
|
||||
if(!element) return;
|
||||
return Sortable.sortables[element.id];
|
||||
},
|
||||
|
||||
destroy: function(element){
|
||||
var s = Sortable.options(element);
|
||||
|
||||
if(s) {
|
||||
Draggables.removeObserver(s.element);
|
||||
s.droppables.each(function(d){ Droppables.remove(d) });
|
||||
s.draggables.invoke('destroy');
|
||||
|
||||
delete Sortable.sortables[s.element.id];
|
||||
}
|
||||
},
|
||||
|
||||
create: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend({
|
||||
element: element,
|
||||
tag: 'li', // assumes li children, override with tag: 'tagname'
|
||||
dropOnEmpty: false,
|
||||
tree: false,
|
||||
treeTag: 'ul',
|
||||
overlap: 'vertical', // one of 'vertical', 'horizontal'
|
||||
constraint: 'vertical', // one of 'vertical', 'horizontal', false
|
||||
containment: element, // also takes array of elements (or id's); or false
|
||||
handle: false, // or a CSS class
|
||||
only: false,
|
||||
delay: 0,
|
||||
hoverclass: null,
|
||||
ghosting: false,
|
||||
scroll: false,
|
||||
scrollSensitivity: 20,
|
||||
scrollSpeed: 15,
|
||||
format: this.SERIALIZE_RULE,
|
||||
onChange: Prototype.emptyFunction,
|
||||
onUpdate: Prototype.emptyFunction
|
||||
}, arguments[1] || {});
|
||||
|
||||
// clear any old sortable with same element
|
||||
this.destroy(element);
|
||||
|
||||
// build options for the draggables
|
||||
var options_for_draggable = {
|
||||
revert: true,
|
||||
scroll: options.scroll,
|
||||
scrollSpeed: options.scrollSpeed,
|
||||
scrollSensitivity: options.scrollSensitivity,
|
||||
delay: options.delay,
|
||||
ghosting: options.ghosting,
|
||||
constraint: options.constraint,
|
||||
handle: options.handle };
|
||||
|
||||
if(options.starteffect)
|
||||
options_for_draggable.starteffect = options.starteffect;
|
||||
|
||||
if(options.reverteffect)
|
||||
options_for_draggable.reverteffect = options.reverteffect;
|
||||
else
|
||||
if(options.ghosting) options_for_draggable.reverteffect = function(element) {
|
||||
element.style.top = 0;
|
||||
element.style.left = 0;
|
||||
};
|
||||
|
||||
if(options.endeffect)
|
||||
options_for_draggable.endeffect = options.endeffect;
|
||||
|
||||
if(options.zindex)
|
||||
options_for_draggable.zindex = options.zindex;
|
||||
|
||||
// build options for the droppables
|
||||
var options_for_droppable = {
|
||||
overlap: options.overlap,
|
||||
containment: options.containment,
|
||||
tree: options.tree,
|
||||
hoverclass: options.hoverclass,
|
||||
onHover: Sortable.onHover
|
||||
}
|
||||
|
||||
var options_for_tree = {
|
||||
onHover: Sortable.onEmptyHover,
|
||||
overlap: options.overlap,
|
||||
containment: options.containment,
|
||||
hoverclass: options.hoverclass
|
||||
}
|
||||
|
||||
// fix for gecko engine
|
||||
Element.cleanWhitespace(element);
|
||||
|
||||
options.draggables = [];
|
||||
options.droppables = [];
|
||||
|
||||
// drop on empty handling
|
||||
if(options.dropOnEmpty || options.tree) {
|
||||
Droppables.add(element, options_for_tree);
|
||||
options.droppables.push(element);
|
||||
}
|
||||
|
||||
(this.findElements(element, options) || []).each( function(e) {
|
||||
// handles are per-draggable
|
||||
var handle = options.handle ?
|
||||
$(e).down('.'+options.handle,0) : e;
|
||||
options.draggables.push(
|
||||
new Draggable(e, Object.extend(options_for_draggable, { handle: handle })));
|
||||
Droppables.add(e, options_for_droppable);
|
||||
if(options.tree) e.treeNode = element;
|
||||
options.droppables.push(e);
|
||||
});
|
||||
|
||||
if(options.tree) {
|
||||
(Sortable.findTreeElements(element, options) || []).each( function(e) {
|
||||
Droppables.add(e, options_for_tree);
|
||||
e.treeNode = element;
|
||||
options.droppables.push(e);
|
||||
});
|
||||
}
|
||||
|
||||
// keep reference
|
||||
this.sortables[element.id] = options;
|
||||
|
||||
// for onupdate
|
||||
Draggables.addObserver(new SortableObserver(element, options.onUpdate));
|
||||
|
||||
},
|
||||
|
||||
// return all suitable-for-sortable elements in a guaranteed order
|
||||
findElements: function(element, options) {
|
||||
return Element.findChildren(
|
||||
element, options.only, options.tree ? true : false, options.tag);
|
||||
},
|
||||
|
||||
findTreeElements: function(element, options) {
|
||||
return Element.findChildren(
|
||||
element, options.only, options.tree ? true : false, options.treeTag);
|
||||
},
|
||||
|
||||
onHover: function(element, dropon, overlap) {
|
||||
if(Element.isParent(dropon, element)) return;
|
||||
|
||||
if(overlap > .33 && overlap < .66 && Sortable.options(dropon).tree) {
|
||||
return;
|
||||
} else if(overlap>0.5) {
|
||||
Sortable.mark(dropon, 'before');
|
||||
if(dropon.previousSibling != element) {
|
||||
var oldParentNode = element.parentNode;
|
||||
element.style.visibility = "hidden"; // fix gecko rendering
|
||||
dropon.parentNode.insertBefore(element, dropon);
|
||||
if(dropon.parentNode!=oldParentNode)
|
||||
Sortable.options(oldParentNode).onChange(element);
|
||||
Sortable.options(dropon.parentNode).onChange(element);
|
||||
}
|
||||
} else {
|
||||
Sortable.mark(dropon, 'after');
|
||||
var nextElement = dropon.nextSibling || null;
|
||||
if(nextElement != element) {
|
||||
var oldParentNode = element.parentNode;
|
||||
element.style.visibility = "hidden"; // fix gecko rendering
|
||||
dropon.parentNode.insertBefore(element, nextElement);
|
||||
if(dropon.parentNode!=oldParentNode)
|
||||
Sortable.options(oldParentNode).onChange(element);
|
||||
Sortable.options(dropon.parentNode).onChange(element);
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
onEmptyHover: function(element, dropon, overlap) {
|
||||
var oldParentNode = element.parentNode;
|
||||
var droponOptions = Sortable.options(dropon);
|
||||
|
||||
if(!Element.isParent(dropon, element)) {
|
||||
var index;
|
||||
|
||||
var children = Sortable.findElements(dropon, {tag: droponOptions.tag, only: droponOptions.only});
|
||||
var child = null;
|
||||
|
||||
if(children) {
|
||||
var offset = Element.offsetSize(dropon, droponOptions.overlap) * (1.0 - overlap);
|
||||
|
||||
for (index = 0; index < children.length; index += 1) {
|
||||
if (offset - Element.offsetSize (children[index], droponOptions.overlap) >= 0) {
|
||||
offset -= Element.offsetSize (children[index], droponOptions.overlap);
|
||||
} else if (offset - (Element.offsetSize (children[index], droponOptions.overlap) / 2) >= 0) {
|
||||
child = index + 1 < children.length ? children[index + 1] : null;
|
||||
break;
|
||||
} else {
|
||||
child = children[index];
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
dropon.insertBefore(element, child);
|
||||
|
||||
Sortable.options(oldParentNode).onChange(element);
|
||||
droponOptions.onChange(element);
|
||||
}
|
||||
},
|
||||
|
||||
unmark: function() {
|
||||
if(Sortable._marker) Sortable._marker.hide();
|
||||
},
|
||||
|
||||
mark: function(dropon, position) {
|
||||
// mark on ghosting only
|
||||
var sortable = Sortable.options(dropon.parentNode);
|
||||
if(sortable && !sortable.ghosting) return;
|
||||
|
||||
if(!Sortable._marker) {
|
||||
Sortable._marker =
|
||||
($('dropmarker') || Element.extend(document.createElement('DIV'))).
|
||||
hide().addClassName('dropmarker').setStyle({position:'absolute'});
|
||||
document.getElementsByTagName("body").item(0).appendChild(Sortable._marker);
|
||||
}
|
||||
var offsets = Position.cumulativeOffset(dropon);
|
||||
Sortable._marker.setStyle({left: offsets[0]+'px', top: offsets[1] + 'px'});
|
||||
|
||||
if(position=='after')
|
||||
if(sortable.overlap == 'horizontal')
|
||||
Sortable._marker.setStyle({left: (offsets[0]+dropon.clientWidth) + 'px'});
|
||||
else
|
||||
Sortable._marker.setStyle({top: (offsets[1]+dropon.clientHeight) + 'px'});
|
||||
|
||||
Sortable._marker.show();
|
||||
},
|
||||
|
||||
_tree: function(element, options, parent) {
|
||||
var children = Sortable.findElements(element, options) || [];
|
||||
|
||||
for (var i = 0; i < children.length; ++i) {
|
||||
var match = children[i].id.match(options.format);
|
||||
|
||||
if (!match) continue;
|
||||
|
||||
var child = {
|
||||
id: encodeURIComponent(match ? match[1] : null),
|
||||
element: element,
|
||||
parent: parent,
|
||||
children: [],
|
||||
position: parent.children.length,
|
||||
container: $(children[i]).down(options.treeTag)
|
||||
}
|
||||
|
||||
/* Get the element containing the children and recurse over it */
|
||||
if (child.container)
|
||||
this._tree(child.container, options, child)
|
||||
|
||||
parent.children.push (child);
|
||||
}
|
||||
|
||||
return parent;
|
||||
},
|
||||
|
||||
tree: function(element) {
|
||||
element = $(element);
|
||||
var sortableOptions = this.options(element);
|
||||
var options = Object.extend({
|
||||
tag: sortableOptions.tag,
|
||||
treeTag: sortableOptions.treeTag,
|
||||
only: sortableOptions.only,
|
||||
name: element.id,
|
||||
format: sortableOptions.format
|
||||
}, arguments[1] || {});
|
||||
|
||||
var root = {
|
||||
id: null,
|
||||
parent: null,
|
||||
children: [],
|
||||
container: element,
|
||||
position: 0
|
||||
}
|
||||
|
||||
return Sortable._tree(element, options, root);
|
||||
},
|
||||
|
||||
/* Construct a [i] index for a particular node */
|
||||
_constructIndex: function(node) {
|
||||
var index = '';
|
||||
do {
|
||||
if (node.id) index = '[' + node.position + ']' + index;
|
||||
} while ((node = node.parent) != null);
|
||||
return index;
|
||||
},
|
||||
|
||||
sequence: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend(this.options(element), arguments[1] || {});
|
||||
|
||||
return $(this.findElements(element, options) || []).map( function(item) {
|
||||
return item.id.match(options.format) ? item.id.match(options.format)[1] : '';
|
||||
});
|
||||
},
|
||||
|
||||
setSequence: function(element, new_sequence) {
|
||||
element = $(element);
|
||||
var options = Object.extend(this.options(element), arguments[2] || {});
|
||||
|
||||
var nodeMap = {};
|
||||
this.findElements(element, options).each( function(n) {
|
||||
if (n.id.match(options.format))
|
||||
nodeMap[n.id.match(options.format)[1]] = [n, n.parentNode];
|
||||
n.parentNode.removeChild(n);
|
||||
});
|
||||
|
||||
new_sequence.each(function(ident) {
|
||||
var n = nodeMap[ident];
|
||||
if (n) {
|
||||
n[1].appendChild(n[0]);
|
||||
delete nodeMap[ident];
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
serialize: function(element) {
|
||||
element = $(element);
|
||||
var options = Object.extend(Sortable.options(element), arguments[1] || {});
|
||||
var name = encodeURIComponent(
|
||||
(arguments[1] && arguments[1].name) ? arguments[1].name : element.id);
|
||||
|
||||
if (options.tree) {
|
||||
return Sortable.tree(element, arguments[1]).children.map( function (item) {
|
||||
return [name + Sortable._constructIndex(item) + "[id]=" +
|
||||
encodeURIComponent(item.id)].concat(item.children.map(arguments.callee));
|
||||
}).flatten().join('&');
|
||||
} else {
|
||||
return Sortable.sequence(element, arguments[1]).map( function(item) {
|
||||
return name + "[]=" + encodeURIComponent(item);
|
||||
}).join('&');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Returns true if child is contained within element
|
||||
Element.isParent = function(child, element) {
|
||||
if (!child.parentNode || child == element) return false;
|
||||
if (child.parentNode == element) return true;
|
||||
return Element.isParent(child.parentNode, element);
|
||||
}
|
||||
|
||||
Element.findChildren = function(element, only, recursive, tagName) {
|
||||
if(!element.hasChildNodes()) return null;
|
||||
tagName = tagName.toUpperCase();
|
||||
if(only) only = [only].flatten();
|
||||
var elements = [];
|
||||
$A(element.childNodes).each( function(e) {
|
||||
if(e.tagName && e.tagName.toUpperCase()==tagName &&
|
||||
(!only || (Element.classNames(e).detect(function(v) { return only.include(v) }))))
|
||||
elements.push(e);
|
||||
if(recursive) {
|
||||
var grandchildren = Element.findChildren(e, only, recursive, tagName);
|
||||
if(grandchildren) elements.push(grandchildren);
|
||||
}
|
||||
});
|
||||
|
||||
return (elements.length>0 ? elements.flatten() : []);
|
||||
}
|
||||
|
||||
Element.offsetSize = function (element, type) {
|
||||
return element['offset' + ((type=='vertical' || type=='height') ? 'Height' : 'Width')];
|
||||
}
|
||||
1090
public/js/lib/effects.js
vendored
Normal file
2515
public/js/lib/prototype.js
vendored
Normal file
51
public/js/lib/scriptaculous.js
Normal file
@@ -0,0 +1,51 @@
|
||||
// script.aculo.us scriptaculous.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining
|
||||
// a copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to
|
||||
// permit persons to whom the Software is furnished to do so, subject to
|
||||
// the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be
|
||||
// included in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
||||
// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
//
|
||||
// For details, see the script.aculo.us web site: http://script.aculo.us/
|
||||
|
||||
var Scriptaculous = {
|
||||
Version: '1.7.0',
|
||||
require: function(libraryName) {
|
||||
// inserting via DOM fails in Safari 2.0, so brute force approach
|
||||
document.write('<script type="text/javascript" src="'+libraryName+'"></script>');
|
||||
},
|
||||
load: function() {
|
||||
if((typeof Prototype=='undefined') ||
|
||||
(typeof Element == 'undefined') ||
|
||||
(typeof Element.Methods=='undefined') ||
|
||||
parseFloat(Prototype.Version.split(".")[0] + "." +
|
||||
Prototype.Version.split(".")[1]) < 1.5)
|
||||
throw("script.aculo.us requires the Prototype JavaScript framework >= 1.5.0");
|
||||
|
||||
$A(document.getElementsByTagName("script")).findAll( function(s) {
|
||||
return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
|
||||
}).each( function(s) {
|
||||
var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
|
||||
var includes = s.src.match(/\?.*load=([a-z,]*)/);
|
||||
(includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each(
|
||||
function(include) { Scriptaculous.require(path+include+'.js') });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Scriptaculous.load();
|
||||
278
public/js/lib/slider.js
Normal file
@@ -0,0 +1,278 @@
|
||||
// script.aculo.us slider.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Marty Haught, Thomas Fuchs
|
||||
//
|
||||
// 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/
|
||||
|
||||
if(!Control) var Control = {};
|
||||
Control.Slider = Class.create();
|
||||
|
||||
// options:
|
||||
// axis: 'vertical', or 'horizontal' (default)
|
||||
//
|
||||
// callbacks:
|
||||
// onChange(value)
|
||||
// onSlide(value)
|
||||
Control.Slider.prototype = {
|
||||
initialize: function(handle, track, options) {
|
||||
var slider = this;
|
||||
|
||||
if(handle instanceof Array) {
|
||||
this.handles = handle.collect( function(e) { return $(e) });
|
||||
} else {
|
||||
this.handles = [$(handle)];
|
||||
}
|
||||
|
||||
this.track = $(track);
|
||||
this.options = options || {};
|
||||
|
||||
this.axis = this.options.axis || 'horizontal';
|
||||
this.increment = this.options.increment || 1;
|
||||
this.step = parseInt(this.options.step || '1');
|
||||
this.range = this.options.range || $R(0,1);
|
||||
|
||||
this.value = 0; // assure backwards compat
|
||||
this.values = this.handles.map( function() { return 0 });
|
||||
this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false;
|
||||
this.options.startSpan = $(this.options.startSpan || null);
|
||||
this.options.endSpan = $(this.options.endSpan || null);
|
||||
|
||||
this.restricted = this.options.restricted || false;
|
||||
|
||||
this.maximum = this.options.maximum || this.range.end;
|
||||
this.minimum = this.options.minimum || this.range.start;
|
||||
|
||||
// Will be used to align the handle onto the track, if necessary
|
||||
this.alignX = parseInt(this.options.alignX || '0');
|
||||
this.alignY = parseInt(this.options.alignY || '0');
|
||||
|
||||
this.trackLength = this.maximumOffset() - this.minimumOffset();
|
||||
|
||||
this.handleLength = this.isVertical() ?
|
||||
(this.handles[0].offsetHeight != 0 ?
|
||||
this.handles[0].offsetHeight : this.handles[0].style.height.replace(/px$/,"")) :
|
||||
(this.handles[0].offsetWidth != 0 ? this.handles[0].offsetWidth :
|
||||
this.handles[0].style.width.replace(/px$/,""));
|
||||
|
||||
this.active = false;
|
||||
this.dragging = false;
|
||||
this.disabled = false;
|
||||
|
||||
if(this.options.disabled) this.setDisabled();
|
||||
|
||||
// Allowed values array
|
||||
this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false;
|
||||
if(this.allowedValues) {
|
||||
this.minimum = this.allowedValues.min();
|
||||
this.maximum = this.allowedValues.max();
|
||||
}
|
||||
|
||||
this.eventMouseDown = this.startDrag.bindAsEventListener(this);
|
||||
this.eventMouseUp = this.endDrag.bindAsEventListener(this);
|
||||
this.eventMouseMove = this.update.bindAsEventListener(this);
|
||||
|
||||
// Initialize handles in reverse (make sure first handle is active)
|
||||
this.handles.each( function(h,i) {
|
||||
i = slider.handles.length-1-i;
|
||||
slider.setValue(parseFloat(
|
||||
(slider.options.sliderValue instanceof Array ?
|
||||
slider.options.sliderValue[i] : slider.options.sliderValue) ||
|
||||
slider.range.start), i);
|
||||
Element.makePositioned(h); // fix IE
|
||||
Event.observe(h, "mousedown", slider.eventMouseDown);
|
||||
});
|
||||
|
||||
Event.observe(this.track, "mousedown", this.eventMouseDown);
|
||||
Event.observe(document, "mouseup", this.eventMouseUp);
|
||||
Event.observe(document, "mousemove", this.eventMouseMove);
|
||||
|
||||
this.initialized = true;
|
||||
},
|
||||
dispose: function() {
|
||||
var slider = this;
|
||||
Event.stopObserving(this.track, "mousedown", this.eventMouseDown);
|
||||
Event.stopObserving(document, "mouseup", this.eventMouseUp);
|
||||
Event.stopObserving(document, "mousemove", this.eventMouseMove);
|
||||
this.handles.each( function(h) {
|
||||
Event.stopObserving(h, "mousedown", slider.eventMouseDown);
|
||||
});
|
||||
},
|
||||
setDisabled: function(){
|
||||
this.disabled = true;
|
||||
},
|
||||
setEnabled: function(){
|
||||
this.disabled = false;
|
||||
},
|
||||
getNearestValue: function(value){
|
||||
if(this.allowedValues){
|
||||
if(value >= this.allowedValues.max()) return(this.allowedValues.max());
|
||||
if(value <= this.allowedValues.min()) return(this.allowedValues.min());
|
||||
|
||||
var offset = Math.abs(this.allowedValues[0] - value);
|
||||
var newValue = this.allowedValues[0];
|
||||
this.allowedValues.each( function(v) {
|
||||
var currentOffset = Math.abs(v - value);
|
||||
if(currentOffset <= offset){
|
||||
newValue = v;
|
||||
offset = currentOffset;
|
||||
}
|
||||
});
|
||||
return newValue;
|
||||
}
|
||||
if(value > this.range.end) return this.range.end;
|
||||
if(value < this.range.start) return this.range.start;
|
||||
return value;
|
||||
},
|
||||
setValue: function(sliderValue, handleIdx){
|
||||
if(!this.active) {
|
||||
this.activeHandleIdx = handleIdx || 0;
|
||||
this.activeHandle = this.handles[this.activeHandleIdx];
|
||||
this.updateStyles();
|
||||
}
|
||||
handleIdx = handleIdx || this.activeHandleIdx || 0;
|
||||
if(this.initialized && this.restricted) {
|
||||
if((handleIdx>0) && (sliderValue<this.values[handleIdx-1]))
|
||||
sliderValue = this.values[handleIdx-1];
|
||||
if((handleIdx < (this.handles.length-1)) && (sliderValue>this.values[handleIdx+1]))
|
||||
sliderValue = this.values[handleIdx+1];
|
||||
}
|
||||
sliderValue = this.getNearestValue(sliderValue);
|
||||
this.values[handleIdx] = sliderValue;
|
||||
this.value = this.values[0]; // assure backwards compat
|
||||
|
||||
this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] =
|
||||
this.translateToPx(sliderValue);
|
||||
|
||||
this.drawSpans();
|
||||
if(!this.dragging || !this.event) this.updateFinished();
|
||||
},
|
||||
setValueBy: function(delta, handleIdx) {
|
||||
this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta,
|
||||
handleIdx || this.activeHandleIdx || 0);
|
||||
},
|
||||
translateToPx: function(value) {
|
||||
return Math.round(
|
||||
((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) *
|
||||
(value - this.range.start)) + "px";
|
||||
},
|
||||
translateToValue: function(offset) {
|
||||
return ((offset/(this.trackLength-this.handleLength) *
|
||||
(this.range.end-this.range.start)) + this.range.start);
|
||||
},
|
||||
getRange: function(range) {
|
||||
var v = this.values.sortBy(Prototype.K);
|
||||
range = range || 0;
|
||||
return $R(v[range],v[range+1]);
|
||||
},
|
||||
minimumOffset: function(){
|
||||
return(this.isVertical() ? this.alignY : this.alignX);
|
||||
},
|
||||
maximumOffset: function(){
|
||||
return(this.isVertical() ?
|
||||
(this.track.offsetHeight != 0 ? this.track.offsetHeight :
|
||||
this.track.style.height.replace(/px$/,"")) - this.alignY :
|
||||
(this.track.offsetWidth != 0 ? this.track.offsetWidth :
|
||||
this.track.style.width.replace(/px$/,"")) - this.alignY);
|
||||
},
|
||||
isVertical: function(){
|
||||
return (this.axis == 'vertical');
|
||||
},
|
||||
drawSpans: function() {
|
||||
var slider = this;
|
||||
if(this.spans)
|
||||
$R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) });
|
||||
if(this.options.startSpan)
|
||||
this.setSpan(this.options.startSpan,
|
||||
$R(0, this.values.length>1 ? this.getRange(0).min() : this.value ));
|
||||
if(this.options.endSpan)
|
||||
this.setSpan(this.options.endSpan,
|
||||
$R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum));
|
||||
},
|
||||
setSpan: function(span, range) {
|
||||
if(this.isVertical()) {
|
||||
span.style.top = this.translateToPx(range.start);
|
||||
span.style.height = this.translateToPx(range.end - range.start + this.range.start);
|
||||
} else {
|
||||
span.style.left = this.translateToPx(range.start);
|
||||
span.style.width = this.translateToPx(range.end - range.start + this.range.start);
|
||||
}
|
||||
},
|
||||
updateStyles: function() {
|
||||
this.handles.each( function(h){ Element.removeClassName(h, 'selected') });
|
||||
Element.addClassName(this.activeHandle, 'selected');
|
||||
},
|
||||
startDrag: function(event) {
|
||||
if(Event.isLeftClick(event)) {
|
||||
if(!this.disabled){
|
||||
this.active = true;
|
||||
|
||||
var handle = Event.element(event);
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
var track = handle;
|
||||
if(track==this.track) {
|
||||
var offsets = Position.cumulativeOffset(this.track);
|
||||
this.event = event;
|
||||
this.setValue(this.translateToValue(
|
||||
(this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2)
|
||||
));
|
||||
var offsets = Position.cumulativeOffset(this.activeHandle);
|
||||
this.offsetX = (pointer[0] - offsets[0]);
|
||||
this.offsetY = (pointer[1] - offsets[1]);
|
||||
} else {
|
||||
// find the handle (prevents issues with Safari)
|
||||
while((this.handles.indexOf(handle) == -1) && handle.parentNode)
|
||||
handle = handle.parentNode;
|
||||
|
||||
if(this.handles.indexOf(handle)!=-1) {
|
||||
this.activeHandle = handle;
|
||||
this.activeHandleIdx = this.handles.indexOf(this.activeHandle);
|
||||
this.updateStyles();
|
||||
|
||||
var offsets = Position.cumulativeOffset(this.activeHandle);
|
||||
this.offsetX = (pointer[0] - offsets[0]);
|
||||
this.offsetY = (pointer[1] - offsets[1]);
|
||||
}
|
||||
}
|
||||
}
|
||||
Event.stop(event);
|
||||
}
|
||||
},
|
||||
update: function(event) {
|
||||
if(this.active) {
|
||||
if(!this.dragging) this.dragging = true;
|
||||
this.draw(event);
|
||||
// fix AppleWebKit rendering
|
||||
if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0);
|
||||
Event.stop(event);
|
||||
}
|
||||
},
|
||||
draw: function(event) {
|
||||
var pointer = [Event.pointerX(event), Event.pointerY(event)];
|
||||
var offsets = Position.cumulativeOffset(this.track);
|
||||
pointer[0] -= this.offsetX + offsets[0];
|
||||
pointer[1] -= this.offsetY + offsets[1];
|
||||
this.event = event;
|
||||
this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] ));
|
||||
if(this.initialized && this.options.onSlide)
|
||||
this.options.onSlide(this.values.length>1 ? this.values : this.value, this);
|
||||
},
|
||||
endDrag: function(event) {
|
||||
if(this.active && this.dragging) {
|
||||
this.finishDrag(event, true);
|
||||
Event.stop(event);
|
||||
}
|
||||
this.active = false;
|
||||
this.dragging = false;
|
||||
},
|
||||
finishDrag: function(event, success) {
|
||||
this.active = false;
|
||||
this.dragging = false;
|
||||
this.updateFinished();
|
||||
},
|
||||
updateFinished: function() {
|
||||
if(this.initialized && this.options.onChange)
|
||||
this.options.onChange(this.values.length>1 ? this.values : this.value, this);
|
||||
this.event = null;
|
||||
}
|
||||
}
|
||||
564
public/js/lib/unittest.js
Normal file
@@ -0,0 +1,564 @@
|
||||
// script.aculo.us unittest.js v1.7.0, Fri Jan 19 19:16:36 CET 2007
|
||||
|
||||
// Copyright (c) 2005, 2006 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
|
||||
// (c) 2005, 2006 Jon Tirsen (http://www.tirsen.com)
|
||||
// (c) 2005, 2006 Michael Schuerig (http://www.schuerig.de/michael/)
|
||||
//
|
||||
// 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/
|
||||
|
||||
// experimental, Firefox-only
|
||||
Event.simulateMouse = function(element, eventName) {
|
||||
var options = Object.extend({
|
||||
pointerX: 0,
|
||||
pointerY: 0,
|
||||
buttons: 0,
|
||||
ctrlKey: false,
|
||||
altKey: false,
|
||||
shiftKey: false,
|
||||
metaKey: false
|
||||
}, arguments[2] || {});
|
||||
var oEvent = document.createEvent("MouseEvents");
|
||||
oEvent.initMouseEvent(eventName, true, true, document.defaultView,
|
||||
options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY,
|
||||
options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, 0, $(element));
|
||||
|
||||
if(this.mark) Element.remove(this.mark);
|
||||
this.mark = document.createElement('div');
|
||||
this.mark.appendChild(document.createTextNode(" "));
|
||||
document.body.appendChild(this.mark);
|
||||
this.mark.style.position = 'absolute';
|
||||
this.mark.style.top = options.pointerY + "px";
|
||||
this.mark.style.left = options.pointerX + "px";
|
||||
this.mark.style.width = "5px";
|
||||
this.mark.style.height = "5px;";
|
||||
this.mark.style.borderTop = "1px solid red;"
|
||||
this.mark.style.borderLeft = "1px solid red;"
|
||||
|
||||
if(this.step)
|
||||
alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options));
|
||||
|
||||
$(element).dispatchEvent(oEvent);
|
||||
};
|
||||
|
||||
// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2.
|
||||
// You need to downgrade to 1.0.4 for now to get this working
|
||||
// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much
|
||||
Event.simulateKey = function(element, eventName) {
|
||||
var options = Object.extend({
|
||||
ctrlKey: false,
|
||||
altKey: false,
|
||||
shiftKey: false,
|
||||
metaKey: false,
|
||||
keyCode: 0,
|
||||
charCode: 0
|
||||
}, arguments[2] || {});
|
||||
|
||||
var oEvent = document.createEvent("KeyEvents");
|
||||
oEvent.initKeyEvent(eventName, true, true, window,
|
||||
options.ctrlKey, options.altKey, options.shiftKey, options.metaKey,
|
||||
options.keyCode, options.charCode );
|
||||
$(element).dispatchEvent(oEvent);
|
||||
};
|
||||
|
||||
Event.simulateKeys = function(element, command) {
|
||||
for(var i=0; i<command.length; i++) {
|
||||
Event.simulateKey(element,'keypress',{charCode:command.charCodeAt(i)});
|
||||
}
|
||||
};
|
||||
|
||||
var Test = {}
|
||||
Test.Unit = {};
|
||||
|
||||
// security exception workaround
|
||||
Test.Unit.inspect = Object.inspect;
|
||||
|
||||
Test.Unit.Logger = Class.create();
|
||||
Test.Unit.Logger.prototype = {
|
||||
initialize: function(log) {
|
||||
this.log = $(log);
|
||||
if (this.log) {
|
||||
this._createLogTable();
|
||||
}
|
||||
},
|
||||
start: function(testName) {
|
||||
if (!this.log) return;
|
||||
this.testName = testName;
|
||||
this.lastLogLine = document.createElement('tr');
|
||||
this.statusCell = document.createElement('td');
|
||||
this.nameCell = document.createElement('td');
|
||||
this.nameCell.className = "nameCell";
|
||||
this.nameCell.appendChild(document.createTextNode(testName));
|
||||
this.messageCell = document.createElement('td');
|
||||
this.lastLogLine.appendChild(this.statusCell);
|
||||
this.lastLogLine.appendChild(this.nameCell);
|
||||
this.lastLogLine.appendChild(this.messageCell);
|
||||
this.loglines.appendChild(this.lastLogLine);
|
||||
},
|
||||
finish: function(status, summary) {
|
||||
if (!this.log) return;
|
||||
this.lastLogLine.className = status;
|
||||
this.statusCell.innerHTML = status;
|
||||
this.messageCell.innerHTML = this._toHTML(summary);
|
||||
this.addLinksToResults();
|
||||
},
|
||||
message: function(message) {
|
||||
if (!this.log) return;
|
||||
this.messageCell.innerHTML = this._toHTML(message);
|
||||
},
|
||||
summary: function(summary) {
|
||||
if (!this.log) return;
|
||||
this.logsummary.innerHTML = this._toHTML(summary);
|
||||
},
|
||||
_createLogTable: function() {
|
||||
this.log.innerHTML =
|
||||
'<div id="logsummary"></div>' +
|
||||
'<table id="logtable">' +
|
||||
'<thead><tr><th>Status</th><th>Test</th><th>Message</th></tr></thead>' +
|
||||
'<tbody id="loglines"></tbody>' +
|
||||
'</table>';
|
||||
this.logsummary = $('logsummary')
|
||||
this.loglines = $('loglines');
|
||||
},
|
||||
_toHTML: function(txt) {
|
||||
return txt.escapeHTML().replace(/\n/g,"<br/>");
|
||||
},
|
||||
addLinksToResults: function(){
|
||||
$$("tr.failed .nameCell").each( function(td){ // todo: limit to children of this.log
|
||||
td.title = "Run only this test"
|
||||
Event.observe(td, 'click', function(){ window.location.search = "?tests=" + td.innerHTML;});
|
||||
});
|
||||
$$("tr.passed .nameCell").each( function(td){ // todo: limit to children of this.log
|
||||
td.title = "Run all tests"
|
||||
Event.observe(td, 'click', function(){ window.location.search = "";});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
Test.Unit.Runner = Class.create();
|
||||
Test.Unit.Runner.prototype = {
|
||||
initialize: function(testcases) {
|
||||
this.options = Object.extend({
|
||||
testLog: 'testlog'
|
||||
}, arguments[1] || {});
|
||||
this.options.resultsURL = this.parseResultsURLQueryParameter();
|
||||
this.options.tests = this.parseTestsQueryParameter();
|
||||
if (this.options.testLog) {
|
||||
this.options.testLog = $(this.options.testLog) || null;
|
||||
}
|
||||
if(this.options.tests) {
|
||||
this.tests = [];
|
||||
for(var i = 0; i < this.options.tests.length; i++) {
|
||||
if(/^test/.test(this.options.tests[i])) {
|
||||
this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"]));
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.options.test) {
|
||||
this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])];
|
||||
} else {
|
||||
this.tests = [];
|
||||
for(var testcase in testcases) {
|
||||
if(/^test/.test(testcase)) {
|
||||
this.tests.push(
|
||||
new Test.Unit.Testcase(
|
||||
this.options.context ? ' -> ' + this.options.titles[testcase] : testcase,
|
||||
testcases[testcase], testcases["setup"], testcases["teardown"]
|
||||
));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
this.currentTest = 0;
|
||||
this.logger = new Test.Unit.Logger(this.options.testLog);
|
||||
setTimeout(this.runTests.bind(this), 1000);
|
||||
},
|
||||
parseResultsURLQueryParameter: function() {
|
||||
return window.location.search.parseQuery()["resultsURL"];
|
||||
},
|
||||
parseTestsQueryParameter: function(){
|
||||
if (window.location.search.parseQuery()["tests"]){
|
||||
return window.location.search.parseQuery()["tests"].split(',');
|
||||
};
|
||||
},
|
||||
// Returns:
|
||||
// "ERROR" if there was an error,
|
||||
// "FAILURE" if there was a failure, or
|
||||
// "SUCCESS" if there was neither
|
||||
getResult: function() {
|
||||
var hasFailure = false;
|
||||
for(var i=0;i<this.tests.length;i++) {
|
||||
if (this.tests[i].errors > 0) {
|
||||
return "ERROR";
|
||||
}
|
||||
if (this.tests[i].failures > 0) {
|
||||
hasFailure = true;
|
||||
}
|
||||
}
|
||||
if (hasFailure) {
|
||||
return "FAILURE";
|
||||
} else {
|
||||
return "SUCCESS";
|
||||
}
|
||||
},
|
||||
postResults: function() {
|
||||
if (this.options.resultsURL) {
|
||||
new Ajax.Request(this.options.resultsURL,
|
||||
{ method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false });
|
||||
}
|
||||
},
|
||||
runTests: function() {
|
||||
var test = this.tests[this.currentTest];
|
||||
if (!test) {
|
||||
// finished!
|
||||
this.postResults();
|
||||
this.logger.summary(this.summary());
|
||||
return;
|
||||
}
|
||||
if(!test.isWaiting) {
|
||||
this.logger.start(test.name);
|
||||
}
|
||||
test.run();
|
||||
if(test.isWaiting) {
|
||||
this.logger.message("Waiting for " + test.timeToWait + "ms");
|
||||
setTimeout(this.runTests.bind(this), test.timeToWait || 1000);
|
||||
} else {
|
||||
this.logger.finish(test.status(), test.summary());
|
||||
this.currentTest++;
|
||||
// tail recursive, hopefully the browser will skip the stackframe
|
||||
this.runTests();
|
||||
}
|
||||
},
|
||||
summary: function() {
|
||||
var assertions = 0;
|
||||
var failures = 0;
|
||||
var errors = 0;
|
||||
var messages = [];
|
||||
for(var i=0;i<this.tests.length;i++) {
|
||||
assertions += this.tests[i].assertions;
|
||||
failures += this.tests[i].failures;
|
||||
errors += this.tests[i].errors;
|
||||
}
|
||||
return (
|
||||
(this.options.context ? this.options.context + ': ': '') +
|
||||
this.tests.length + " tests, " +
|
||||
assertions + " assertions, " +
|
||||
failures + " failures, " +
|
||||
errors + " errors");
|
||||
}
|
||||
}
|
||||
|
||||
Test.Unit.Assertions = Class.create();
|
||||
Test.Unit.Assertions.prototype = {
|
||||
initialize: function() {
|
||||
this.assertions = 0;
|
||||
this.failures = 0;
|
||||
this.errors = 0;
|
||||
this.messages = [];
|
||||
},
|
||||
summary: function() {
|
||||
return (
|
||||
this.assertions + " assertions, " +
|
||||
this.failures + " failures, " +
|
||||
this.errors + " errors" + "\n" +
|
||||
this.messages.join("\n"));
|
||||
},
|
||||
pass: function() {
|
||||
this.assertions++;
|
||||
},
|
||||
fail: function(message) {
|
||||
this.failures++;
|
||||
this.messages.push("Failure: " + message);
|
||||
},
|
||||
info: function(message) {
|
||||
this.messages.push("Info: " + message);
|
||||
},
|
||||
error: function(error) {
|
||||
this.errors++;
|
||||
this.messages.push(error.name + ": "+ error.message + "(" + Test.Unit.inspect(error) +")");
|
||||
},
|
||||
status: function() {
|
||||
if (this.failures > 0) return 'failed';
|
||||
if (this.errors > 0) return 'error';
|
||||
return 'passed';
|
||||
},
|
||||
assert: function(expression) {
|
||||
var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"';
|
||||
try { expression ? this.pass() :
|
||||
this.fail(message); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertEqual: function(expected, actual) {
|
||||
var message = arguments[2] || "assertEqual";
|
||||
try { (expected == actual) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertInspect: function(expected, actual) {
|
||||
var message = arguments[2] || "assertInspect";
|
||||
try { (expected == actual.inspect()) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertEnumEqual: function(expected, actual) {
|
||||
var message = arguments[2] || "assertEnumEqual";
|
||||
try { $A(expected).length == $A(actual).length &&
|
||||
expected.zip(actual).all(function(pair) { return pair[0] == pair[1] }) ?
|
||||
this.pass() : this.fail(message + ': expected ' + Test.Unit.inspect(expected) +
|
||||
', actual ' + Test.Unit.inspect(actual)); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotEqual: function(expected, actual) {
|
||||
var message = arguments[2] || "assertNotEqual";
|
||||
try { (expected != actual) ? this.pass() :
|
||||
this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertIdentical: function(expected, actual) {
|
||||
var message = arguments[2] || "assertIdentical";
|
||||
try { (expected === actual) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotIdentical: function(expected, actual) {
|
||||
var message = arguments[2] || "assertNotIdentical";
|
||||
try { !(expected === actual) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNull: function(obj) {
|
||||
var message = arguments[1] || 'assertNull'
|
||||
try { (obj==null) ? this.pass() :
|
||||
this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertMatch: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertMatch';
|
||||
var regex = new RegExp(expected);
|
||||
try { (regex.exec(actual)) ? this.pass() :
|
||||
this.fail(message + ' : regex: "' + Test.Unit.inspect(expected) + ' did not match: ' + Test.Unit.inspect(actual) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertHidden: function(element) {
|
||||
var message = arguments[1] || 'assertHidden';
|
||||
this.assertEqual("none", element.style.display, message);
|
||||
},
|
||||
assertNotNull: function(object) {
|
||||
var message = arguments[1] || 'assertNotNull';
|
||||
this.assert(object != null, message);
|
||||
},
|
||||
assertType: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertType';
|
||||
try {
|
||||
(actual.constructor == expected) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + (actual.constructor) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotOfType: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertNotOfType';
|
||||
try {
|
||||
(actual.constructor != expected) ? this.pass() :
|
||||
this.fail(message + ': expected "' + Test.Unit.inspect(expected) +
|
||||
'", actual "' + (actual.constructor) + '"'); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertInstanceOf: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertInstanceOf';
|
||||
try {
|
||||
(actual instanceof expected) ? this.pass() :
|
||||
this.fail(message + ": object was not an instance of the expected type"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertNotInstanceOf: function(expected, actual) {
|
||||
var message = arguments[2] || 'assertNotInstanceOf';
|
||||
try {
|
||||
!(actual instanceof expected) ? this.pass() :
|
||||
this.fail(message + ": object was an instance of the not expected type"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertRespondsTo: function(method, obj) {
|
||||
var message = arguments[2] || 'assertRespondsTo';
|
||||
try {
|
||||
(obj[method] && typeof obj[method] == 'function') ? this.pass() :
|
||||
this.fail(message + ": object doesn't respond to [" + method + "]"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertReturnsTrue: function(method, obj) {
|
||||
var message = arguments[2] || 'assertReturnsTrue';
|
||||
try {
|
||||
var m = obj[method];
|
||||
if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
|
||||
m() ? this.pass() :
|
||||
this.fail(message + ": method returned false"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertReturnsFalse: function(method, obj) {
|
||||
var message = arguments[2] || 'assertReturnsFalse';
|
||||
try {
|
||||
var m = obj[method];
|
||||
if(!m) m = obj['is'+method.charAt(0).toUpperCase()+method.slice(1)];
|
||||
!m() ? this.pass() :
|
||||
this.fail(message + ": method returned true"); }
|
||||
catch(e) { this.error(e); }
|
||||
},
|
||||
assertRaise: function(exceptionName, method) {
|
||||
var message = arguments[2] || 'assertRaise';
|
||||
try {
|
||||
method();
|
||||
this.fail(message + ": exception expected but none was raised"); }
|
||||
catch(e) {
|
||||
((exceptionName == null) || (e.name==exceptionName)) ? this.pass() : this.error(e);
|
||||
}
|
||||
},
|
||||
assertElementsMatch: function() {
|
||||
var expressions = $A(arguments), elements = $A(expressions.shift());
|
||||
if (elements.length != expressions.length) {
|
||||
this.fail('assertElementsMatch: size mismatch: ' + elements.length + ' elements, ' + expressions.length + ' expressions');
|
||||
return false;
|
||||
}
|
||||
elements.zip(expressions).all(function(pair, index) {
|
||||
var element = $(pair.first()), expression = pair.last();
|
||||
if (element.match(expression)) return true;
|
||||
this.fail('assertElementsMatch: (in index ' + index + ') expected ' + expression.inspect() + ' but got ' + element.inspect());
|
||||
}.bind(this)) && this.pass();
|
||||
},
|
||||
assertElementMatches: function(element, expression) {
|
||||
this.assertElementsMatch([element], expression);
|
||||
},
|
||||
benchmark: function(operation, iterations) {
|
||||
var startAt = new Date();
|
||||
(iterations || 1).times(operation);
|
||||
var timeTaken = ((new Date())-startAt);
|
||||
this.info((arguments[2] || 'Operation') + ' finished ' +
|
||||
iterations + ' iterations in ' + (timeTaken/1000)+'s' );
|
||||
return timeTaken;
|
||||
},
|
||||
_isVisible: function(element) {
|
||||
element = $(element);
|
||||
if(!element.parentNode) return true;
|
||||
this.assertNotNull(element);
|
||||
if(element.style && Element.getStyle(element, 'display') == 'none')
|
||||
return false;
|
||||
|
||||
return this._isVisible(element.parentNode);
|
||||
},
|
||||
assertNotVisible: function(element) {
|
||||
this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1]));
|
||||
},
|
||||
assertVisible: function(element) {
|
||||
this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1]));
|
||||
},
|
||||
benchmark: function(operation, iterations) {
|
||||
var startAt = new Date();
|
||||
(iterations || 1).times(operation);
|
||||
var timeTaken = ((new Date())-startAt);
|
||||
this.info((arguments[2] || 'Operation') + ' finished ' +
|
||||
iterations + ' iterations in ' + (timeTaken/1000)+'s' );
|
||||
return timeTaken;
|
||||
}
|
||||
}
|
||||
|
||||
Test.Unit.Testcase = Class.create();
|
||||
Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), {
|
||||
initialize: function(name, test, setup, teardown) {
|
||||
Test.Unit.Assertions.prototype.initialize.bind(this)();
|
||||
this.name = name;
|
||||
|
||||
if(typeof test == 'string') {
|
||||
test = test.gsub(/(\.should[^\(]+\()/,'#{0}this,');
|
||||
test = test.gsub(/(\.should[^\(]+)\(this,\)/,'#{1}(this)');
|
||||
this.test = function() {
|
||||
eval('with(this){'+test+'}');
|
||||
}
|
||||
} else {
|
||||
this.test = test || function() {};
|
||||
}
|
||||
|
||||
this.setup = setup || function() {};
|
||||
this.teardown = teardown || function() {};
|
||||
this.isWaiting = false;
|
||||
this.timeToWait = 1000;
|
||||
},
|
||||
wait: function(time, nextPart) {
|
||||
this.isWaiting = true;
|
||||
this.test = nextPart;
|
||||
this.timeToWait = time;
|
||||
},
|
||||
run: function() {
|
||||
try {
|
||||
try {
|
||||
if (!this.isWaiting) this.setup.bind(this)();
|
||||
this.isWaiting = false;
|
||||
this.test.bind(this)();
|
||||
} finally {
|
||||
if(!this.isWaiting) {
|
||||
this.teardown.bind(this)();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(e) { this.error(e); }
|
||||
}
|
||||
});
|
||||
|
||||
// *EXPERIMENTAL* BDD-style testing to please non-technical folk
|
||||
// This draws many ideas from RSpec http://rspec.rubyforge.org/
|
||||
|
||||
Test.setupBDDExtensionMethods = function(){
|
||||
var METHODMAP = {
|
||||
shouldEqual: 'assertEqual',
|
||||
shouldNotEqual: 'assertNotEqual',
|
||||
shouldEqualEnum: 'assertEnumEqual',
|
||||
shouldBeA: 'assertType',
|
||||
shouldNotBeA: 'assertNotOfType',
|
||||
shouldBeAn: 'assertType',
|
||||
shouldNotBeAn: 'assertNotOfType',
|
||||
shouldBeNull: 'assertNull',
|
||||
shouldNotBeNull: 'assertNotNull',
|
||||
|
||||
shouldBe: 'assertReturnsTrue',
|
||||
shouldNotBe: 'assertReturnsFalse',
|
||||
shouldRespondTo: 'assertRespondsTo'
|
||||
};
|
||||
Test.BDDMethods = {};
|
||||
for(m in METHODMAP) {
|
||||
Test.BDDMethods[m] = eval(
|
||||
'function(){'+
|
||||
'var args = $A(arguments);'+
|
||||
'var scope = args.shift();'+
|
||||
'scope.'+METHODMAP[m]+'.apply(scope,(args || []).concat([this])); }');
|
||||
}
|
||||
[Array.prototype, String.prototype, Number.prototype].each(
|
||||
function(p){ Object.extend(p, Test.BDDMethods) }
|
||||
);
|
||||
}
|
||||
|
||||
Test.context = function(name, spec, log){
|
||||
Test.setupBDDExtensionMethods();
|
||||
|
||||
var compiledSpec = {};
|
||||
var titles = {};
|
||||
for(specName in spec) {
|
||||
switch(specName){
|
||||
case "setup":
|
||||
case "teardown":
|
||||
compiledSpec[specName] = spec[specName];
|
||||
break;
|
||||
default:
|
||||
var testName = 'test'+specName.gsub(/\s+/,'-').camelize();
|
||||
var body = spec[specName].toString().split('\n').slice(1);
|
||||
if(/^\{/.test(body[0])) body = body.slice(1);
|
||||
body.pop();
|
||||
body = body.map(function(statement){
|
||||
return statement.strip()
|
||||
});
|
||||
compiledSpec[testName] = body.join('\n');
|
||||
titles[testName] = specName;
|
||||
}
|
||||
}
|
||||
new Test.Unit.Runner(compiledSpec, { titles: titles, testLog: log || 'testlog', context: name });
|
||||
};
|
||||
689
public/js/lightbox.js
Normal file
@@ -0,0 +1,689 @@
|
||||
// -----------------------------------------------------------------------------------
|
||||
//
|
||||
// Lightbox v2.02
|
||||
// by Lokesh Dhakar - http://www.huddletogether.com
|
||||
// 3/31/06
|
||||
//
|
||||
// For more information on this script, visit:
|
||||
// http://huddletogether.com/projects/lightbox2/
|
||||
//
|
||||
// Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
|
||||
//
|
||||
// Credit also due to those who have helped, inspired, and made their code available to the public.
|
||||
// Including: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.org), Thomas Fuchs(mir.aculo.us), and others.
|
||||
//
|
||||
//
|
||||
// -----------------------------------------------------------------------------------
|
||||
/*
|
||||
|
||||
Table of Contents
|
||||
-----------------
|
||||
Configuration
|
||||
Global Variables
|
||||
|
||||
Extending Built-in Objects
|
||||
- Object.extend(Element)
|
||||
- Array.prototype.removeDuplicates()
|
||||
- Array.prototype.empty()
|
||||
|
||||
Lightbox Class Declaration
|
||||
- initialize()
|
||||
- start()
|
||||
- changeImage()
|
||||
- resizeImageContainer()
|
||||
- showImage()
|
||||
- updateDetails()
|
||||
- updateNav()
|
||||
- enableKeyboardNav()
|
||||
- disableKeyboardNav()
|
||||
- keyboardAction()
|
||||
- preloadNeighborImages()
|
||||
- end()
|
||||
|
||||
Miscellaneous Functions
|
||||
- getPageScroll()
|
||||
- getPageSize()
|
||||
- getKey()
|
||||
- listenKey()
|
||||
- showSelectBoxes()
|
||||
- hideSelectBoxes()
|
||||
- pause()
|
||||
- initLightbox()
|
||||
|
||||
Function Calls
|
||||
- addLoadEvent(initLightbox)
|
||||
|
||||
*/
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Configuration
|
||||
//
|
||||
var fileLoadingImage = "gfx/images/loading.gif";
|
||||
var fileBottomNavCloseImage = "gfx/images/closelabel.gif";
|
||||
|
||||
var resizeSpeed = 7; // controls the speed of the image resizing (1=slowest and 10=fastest)
|
||||
|
||||
var borderSize = 10; //if you adjust the padding in the CSS, you will need to update this variable
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
var imageArray = new Array;
|
||||
var activeImage;
|
||||
|
||||
if(resizeSpeed > 10){ resizeSpeed = 10;}
|
||||
if(resizeSpeed < 1){ resizeSpeed = 1;}
|
||||
resizeDuration = (11 - resizeSpeed) * 0.15;
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Additional methods for Element added by SU, Couloir
|
||||
// - further additions by Lokesh Dhakar (huddletogether.com)
|
||||
//
|
||||
Object.extend(Element, {
|
||||
getWidth: function(element) {
|
||||
element = $(element);
|
||||
return element.offsetWidth;
|
||||
},
|
||||
setWidth: function(element,w) {
|
||||
element = $(element);
|
||||
element.style.width = w +"px";
|
||||
},
|
||||
setHeight: function(element,h) {
|
||||
element = $(element);
|
||||
element.style.height = h +"px";
|
||||
},
|
||||
setTop: function(element,t) {
|
||||
element = $(element);
|
||||
element.style.top = t +"px";
|
||||
},
|
||||
setSrc: function(element,src) {
|
||||
element = $(element);
|
||||
element.src = src;
|
||||
},
|
||||
setHref: function(element,href) {
|
||||
element = $(element);
|
||||
element.href = href;
|
||||
},
|
||||
setInnerHTML: function(element,content) {
|
||||
element = $(element);
|
||||
element.innerHTML = content;
|
||||
}
|
||||
});
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Extending built-in Array object
|
||||
// - array.removeDuplicates()
|
||||
// - array.empty()
|
||||
//
|
||||
Array.prototype.removeDuplicates = function () {
|
||||
for(i = 1; i < this.length; i++){
|
||||
if(this[i][0] == this[i-1][0]){
|
||||
this.splice(i,1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
Array.prototype.empty = function () {
|
||||
for(i = 0; i <= this.length; i++){
|
||||
this.shift();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// Lightbox Class Declaration
|
||||
// - initialize()
|
||||
// - start()
|
||||
// - changeImage()
|
||||
// - resizeImageContainer()
|
||||
// - showImage()
|
||||
// - updateDetails()
|
||||
// - updateNav()
|
||||
// - enableKeyboardNav()
|
||||
// - disableKeyboardNav()
|
||||
// - keyboardNavAction()
|
||||
// - preloadNeighborImages()
|
||||
// - end()
|
||||
//
|
||||
// Structuring of code inspired by Scott Upton (http://www.uptonic.com/)
|
||||
//
|
||||
var Lightbox = Class.create();
|
||||
|
||||
Lightbox.prototype = {
|
||||
|
||||
// initialize()
|
||||
// Constructor runs on completion of the DOM loading. Loops through anchor tags looking for
|
||||
// 'lightbox' references and applies onclick events to appropriate links. The 2nd section of
|
||||
// the function inserts html at the bottom of the page which is used to display the shadow
|
||||
// overlay and the image container.
|
||||
//
|
||||
initialize: function() {
|
||||
if (!document.getElementsByTagName){ return; }
|
||||
var anchors = document.getElementsByTagName('a');
|
||||
|
||||
// loop through all anchor tags
|
||||
for (var i=0; i<anchors.length; i++){
|
||||
var anchor = anchors[i];
|
||||
|
||||
var relAttribute = String(anchor.getAttribute('rel'));
|
||||
|
||||
// use the string.match() method to catch 'lightbox' references in the rel attribute
|
||||
if (anchor.getAttribute('href') && (relAttribute.toLowerCase().match('lightbox'))){
|
||||
anchor.onclick = function () {myLightbox.start(this); return false;}
|
||||
}
|
||||
}
|
||||
|
||||
// The rest of this code inserts html at the bottom of the page that looks similar to this:
|
||||
//
|
||||
// <div id="overlay"></div>
|
||||
// <div id="lightbox">
|
||||
// <div id="outerImageContainer">
|
||||
// <div id="imageContainer">
|
||||
// <img id="lightboxImage">
|
||||
// <div style="" id="hoverNav">
|
||||
// <a href="#" id="prevLink"></a>
|
||||
// <a href="#" id="nextLink"></a>
|
||||
// </div>
|
||||
// <div id="loading">
|
||||
// <a href="#" id="loadingLink">
|
||||
// <img src="images/loading.gif">
|
||||
// </a>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// <div id="imageDataContainer">
|
||||
// <div id="imageData">
|
||||
// <div id="imageDetails">
|
||||
// <span id="caption"></span>
|
||||
// <span id="numberDisplay"></span>
|
||||
// </div>
|
||||
// <div id="bottomNav">
|
||||
// <a href="#" id="bottomNavClose">
|
||||
// <img src="images/close.gif">
|
||||
// </a>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
// </div>
|
||||
|
||||
|
||||
var objBody = document.getElementsByTagName("body").item(0);
|
||||
|
||||
var objOverlay = document.createElement("div");
|
||||
objOverlay.setAttribute('id','overlay');
|
||||
objOverlay.style.display = 'none';
|
||||
objOverlay.onclick = function() { myLightbox.end(); return false; }
|
||||
objBody.appendChild(objOverlay);
|
||||
|
||||
var objLightbox = document.createElement("div");
|
||||
objLightbox.setAttribute('id','lightbox');
|
||||
objLightbox.style.display = 'none';
|
||||
objBody.appendChild(objLightbox);
|
||||
|
||||
var objOuterImageContainer = document.createElement("div");
|
||||
objOuterImageContainer.setAttribute('id','outerImageContainer');
|
||||
objLightbox.appendChild(objOuterImageContainer);
|
||||
|
||||
var objImageContainer = document.createElement("div");
|
||||
objImageContainer.setAttribute('id','imageContainer');
|
||||
objOuterImageContainer.appendChild(objImageContainer);
|
||||
|
||||
var objLightboxImage = document.createElement("img");
|
||||
objLightboxImage.setAttribute('id','lightboxImage');
|
||||
objImageContainer.appendChild(objLightboxImage);
|
||||
|
||||
var objHoverNav = document.createElement("div");
|
||||
objHoverNav.setAttribute('id','hoverNav');
|
||||
objImageContainer.appendChild(objHoverNav);
|
||||
|
||||
var objPrevLink = document.createElement("a");
|
||||
objPrevLink.setAttribute('id','prevLink');
|
||||
objPrevLink.setAttribute('href','#');
|
||||
objHoverNav.appendChild(objPrevLink);
|
||||
|
||||
var objNextLink = document.createElement("a");
|
||||
objNextLink.setAttribute('id','nextLink');
|
||||
objNextLink.setAttribute('href','#');
|
||||
objHoverNav.appendChild(objNextLink);
|
||||
|
||||
var objLoading = document.createElement("div");
|
||||
objLoading.setAttribute('id','loading');
|
||||
objImageContainer.appendChild(objLoading);
|
||||
|
||||
var objLoadingLink = document.createElement("a");
|
||||
objLoadingLink.setAttribute('id','loadingLink');
|
||||
objLoadingLink.setAttribute('href','#');
|
||||
objLoadingLink.onclick = function() { myLightbox.end(); return false; }
|
||||
objLoading.appendChild(objLoadingLink);
|
||||
|
||||
var objLoadingImage = document.createElement("img");
|
||||
objLoadingImage.setAttribute('src', fileLoadingImage);
|
||||
objLoadingLink.appendChild(objLoadingImage);
|
||||
|
||||
var objImageDataContainer = document.createElement("div");
|
||||
objImageDataContainer.setAttribute('id','imageDataContainer');
|
||||
objImageDataContainer.className = 'clearfix';
|
||||
objLightbox.appendChild(objImageDataContainer);
|
||||
|
||||
var objImageData = document.createElement("div");
|
||||
objImageData.setAttribute('id','imageData');
|
||||
objImageDataContainer.appendChild(objImageData);
|
||||
|
||||
var objImageDetails = document.createElement("div");
|
||||
objImageDetails.setAttribute('id','imageDetails');
|
||||
objImageData.appendChild(objImageDetails);
|
||||
|
||||
var objCaption = document.createElement("span");
|
||||
objCaption.setAttribute('id','caption');
|
||||
objImageDetails.appendChild(objCaption);
|
||||
|
||||
var objNumberDisplay = document.createElement("span");
|
||||
objNumberDisplay.setAttribute('id','numberDisplay');
|
||||
objImageDetails.appendChild(objNumberDisplay);
|
||||
|
||||
var objBottomNav = document.createElement("div");
|
||||
objBottomNav.setAttribute('id','bottomNav');
|
||||
objImageData.appendChild(objBottomNav);
|
||||
|
||||
var objBottomNavCloseLink = document.createElement("a");
|
||||
objBottomNavCloseLink.setAttribute('id','bottomNavClose');
|
||||
objBottomNavCloseLink.setAttribute('href','#');
|
||||
objBottomNavCloseLink.onclick = function() { myLightbox.end(); return false; }
|
||||
objBottomNav.appendChild(objBottomNavCloseLink);
|
||||
|
||||
var objBottomNavCloseImage = document.createElement("img");
|
||||
objBottomNavCloseImage.setAttribute('src', fileBottomNavCloseImage);
|
||||
objBottomNavCloseLink.appendChild(objBottomNavCloseImage);
|
||||
},
|
||||
|
||||
//
|
||||
// start()
|
||||
// Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
|
||||
//
|
||||
start: function(imageLink) {
|
||||
|
||||
hideSelectBoxes();
|
||||
|
||||
// stretch overlay to fill page and fade in
|
||||
var arrayPageSize = getPageSize();
|
||||
Element.setHeight('overlay', arrayPageSize[1]);
|
||||
new Effect.Appear('overlay', { duration: 0.2, from: 0.0, to: 0.8 });
|
||||
|
||||
imageArray = [];
|
||||
imageNum = 0;
|
||||
|
||||
if (!document.getElementsByTagName){ return; }
|
||||
var anchors = document.getElementsByTagName('a');
|
||||
|
||||
// if image is NOT part of a set..
|
||||
if((imageLink.getAttribute('rel') == 'lightbox')){
|
||||
// add single image to imageArray
|
||||
imageArray.push(new Array(imageLink.getAttribute('href'), imageLink.getAttribute('title')));
|
||||
} else {
|
||||
// if image is part of a set..
|
||||
|
||||
// loop through anchors, find other images in set, and add them to imageArray
|
||||
for (var i=0; i<anchors.length; i++){
|
||||
var anchor = anchors[i];
|
||||
if (anchor.getAttribute('href') && (anchor.getAttribute('rel') == imageLink.getAttribute('rel'))){
|
||||
imageArray.push(new Array(anchor.getAttribute('href'), anchor.getAttribute('title')));
|
||||
}
|
||||
}
|
||||
imageArray.removeDuplicates();
|
||||
while(imageArray[imageNum][0] != imageLink.getAttribute('href')) { imageNum++;}
|
||||
}
|
||||
|
||||
// calculate top offset for the lightbox and display
|
||||
var arrayPageSize = getPageSize();
|
||||
var arrayPageScroll = getPageScroll();
|
||||
var lightboxTop = arrayPageScroll[1] + (arrayPageSize[3] / 15);
|
||||
|
||||
Element.setTop('lightbox', lightboxTop);
|
||||
Element.show('lightbox');
|
||||
|
||||
this.changeImage(imageNum);
|
||||
},
|
||||
|
||||
//
|
||||
// changeImage()
|
||||
// Hide most elements and preload image in preparation for resizing image container.
|
||||
//
|
||||
changeImage: function(imageNum) {
|
||||
|
||||
activeImage = imageNum; // update global var
|
||||
|
||||
// hide elements during transition
|
||||
Element.show('loading');
|
||||
Element.hide('lightboxImage');
|
||||
Element.hide('hoverNav');
|
||||
Element.hide('prevLink');
|
||||
Element.hide('nextLink');
|
||||
Element.hide('imageDataContainer');
|
||||
Element.hide('numberDisplay');
|
||||
|
||||
imgPreloader = new Image();
|
||||
|
||||
// once image is preloaded, resize image container
|
||||
imgPreloader.onload=function(){
|
||||
Element.setSrc('lightboxImage', imageArray[activeImage][0]);
|
||||
myLightbox.resizeImageContainer(imgPreloader.width, imgPreloader.height);
|
||||
}
|
||||
imgPreloader.src = imageArray[activeImage][0];
|
||||
},
|
||||
|
||||
//
|
||||
// resizeImageContainer()
|
||||
//
|
||||
resizeImageContainer: function( imgWidth, imgHeight) {
|
||||
|
||||
// get current height and width
|
||||
this.wCur = Element.getWidth('outerImageContainer');
|
||||
this.hCur = Element.getHeight('outerImageContainer');
|
||||
|
||||
// scalars based on change from old to new
|
||||
this.xScale = ((imgWidth + (borderSize * 2)) / this.wCur) * 100;
|
||||
this.yScale = ((imgHeight + (borderSize * 2)) / this.hCur) * 100;
|
||||
|
||||
// calculate size difference between new and old image, and resize if necessary
|
||||
wDiff = (this.wCur - borderSize * 2) - imgWidth;
|
||||
hDiff = (this.hCur - borderSize * 2) - imgHeight;
|
||||
|
||||
if(!( hDiff == 0)){ new Effect.Scale('outerImageContainer', this.yScale, {scaleX: false, duration: resizeDuration, queue: 'front'}); }
|
||||
if(!( wDiff == 0)){ new Effect.Scale('outerImageContainer', this.xScale, {scaleY: false, delay: resizeDuration, duration: resizeDuration}); }
|
||||
|
||||
// if new and old image are same size and no scaling transition is necessary,
|
||||
// do a quick pause to prevent image flicker.
|
||||
if((hDiff == 0) && (wDiff == 0)){
|
||||
if (navigator.appVersion.indexOf("MSIE")!=-1){ pause(250); } else { pause(100);}
|
||||
}
|
||||
|
||||
Element.setHeight('prevLink', imgHeight);
|
||||
Element.setHeight('nextLink', imgHeight);
|
||||
Element.setWidth( 'imageDataContainer', imgWidth + (borderSize * 2));
|
||||
|
||||
this.showImage();
|
||||
},
|
||||
|
||||
//
|
||||
// showImage()
|
||||
// Display image and begin preloading neighbors.
|
||||
//
|
||||
showImage: function(){
|
||||
Element.hide('loading');
|
||||
new Effect.Appear('lightboxImage', { duration: 0.5, queue: 'end', afterFinish: function(){ myLightbox.updateDetails(); } });
|
||||
this.preloadNeighborImages();
|
||||
},
|
||||
|
||||
//
|
||||
// updateDetails()
|
||||
// Display caption, image number, and bottom nav.
|
||||
//
|
||||
updateDetails: function() {
|
||||
|
||||
Element.show('caption');
|
||||
Element.setInnerHTML( 'caption', imageArray[activeImage][1]);
|
||||
|
||||
// if image is part of set display 'Image x of x'
|
||||
if(imageArray.length > 1){
|
||||
Element.show('numberDisplay');
|
||||
Element.setInnerHTML( 'numberDisplay', "Image " + eval(activeImage + 1) + " of " + imageArray.length);
|
||||
}
|
||||
|
||||
new Effect.Parallel(
|
||||
[ new Effect.SlideDown( 'imageDataContainer', { sync: true, duration: resizeDuration + 0.25, from: 0.0, to: 1.0 }),
|
||||
new Effect.Appear('imageDataContainer', { sync: true, duration: 1.0 }) ],
|
||||
{ duration: 0.65, afterFinish: function() { myLightbox.updateNav();} }
|
||||
);
|
||||
},
|
||||
|
||||
//
|
||||
// updateNav()
|
||||
// Display appropriate previous and next hover navigation.
|
||||
//
|
||||
updateNav: function() {
|
||||
|
||||
Element.show('hoverNav');
|
||||
|
||||
// if not first image in set, display prev image button
|
||||
if(activeImage != 0){
|
||||
Element.show('prevLink');
|
||||
document.getElementById('prevLink').onclick = function() {
|
||||
myLightbox.changeImage(activeImage - 1); return false;
|
||||
}
|
||||
}
|
||||
|
||||
// if not last image in set, display next image button
|
||||
if(activeImage != (imageArray.length - 1)){
|
||||
Element.show('nextLink');
|
||||
document.getElementById('nextLink').onclick = function() {
|
||||
myLightbox.changeImage(activeImage + 1); return false;
|
||||
}
|
||||
}
|
||||
|
||||
this.enableKeyboardNav();
|
||||
},
|
||||
|
||||
//
|
||||
// enableKeyboardNav()
|
||||
//
|
||||
enableKeyboardNav: function() {
|
||||
document.onkeydown = this.keyboardAction;
|
||||
},
|
||||
|
||||
//
|
||||
// disableKeyboardNav()
|
||||
//
|
||||
disableKeyboardNav: function() {
|
||||
document.onkeydown = '';
|
||||
},
|
||||
|
||||
//
|
||||
// keyboardAction()
|
||||
//
|
||||
keyboardAction: function(e) {
|
||||
if (e == null) { // ie
|
||||
keycode = event.keyCode;
|
||||
} else { // mozilla
|
||||
keycode = e.which;
|
||||
}
|
||||
|
||||
key = String.fromCharCode(keycode).toLowerCase();
|
||||
|
||||
if((key == 'x') || (key == 'o') || (key == 'c')){ // close lightbox
|
||||
myLightbox.end();
|
||||
} else if(key == 'p'){ // display previous image
|
||||
if(activeImage != 0){
|
||||
myLightbox.disableKeyboardNav();
|
||||
myLightbox.changeImage(activeImage - 1);
|
||||
}
|
||||
} else if(key == 'n'){ // display next image
|
||||
if(activeImage != (imageArray.length - 1)){
|
||||
myLightbox.disableKeyboardNav();
|
||||
myLightbox.changeImage(activeImage + 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
},
|
||||
|
||||
//
|
||||
// preloadNeighborImages()
|
||||
// Preload previous and next images.
|
||||
//
|
||||
preloadNeighborImages: function(){
|
||||
|
||||
if((imageArray.length - 1) > activeImage){
|
||||
preloadNextImage = new Image();
|
||||
preloadNextImage.src = imageArray[activeImage + 1][0];
|
||||
}
|
||||
if(activeImage > 0){
|
||||
preloadPrevImage = new Image();
|
||||
preloadPrevImage.src = imageArray[activeImage - 1][0];
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
//
|
||||
// end()
|
||||
//
|
||||
end: function() {
|
||||
this.disableKeyboardNav();
|
||||
Element.hide('lightbox');
|
||||
new Effect.Fade('overlay', { duration: 0.2});
|
||||
showSelectBoxes();
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// getPageScroll()
|
||||
// Returns array with x,y page scroll values.
|
||||
// Core code from - quirksmode.org
|
||||
//
|
||||
function getPageScroll(){
|
||||
|
||||
var yScroll;
|
||||
|
||||
if (self.pageYOffset) {
|
||||
yScroll = self.pageYOffset;
|
||||
} else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict
|
||||
yScroll = document.documentElement.scrollTop;
|
||||
} else if (document.body) {// all other Explorers
|
||||
yScroll = document.body.scrollTop;
|
||||
}
|
||||
|
||||
arrayPageScroll = new Array('',yScroll)
|
||||
return arrayPageScroll;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// getPageSize()
|
||||
// Returns array with page width, height and window width, height
|
||||
// Core code from - quirksmode.org
|
||||
// Edit for Firefox by pHaez
|
||||
//
|
||||
function getPageSize(){
|
||||
|
||||
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){ // all but Explorer Mac
|
||||
xScroll = document.body.scrollWidth;
|
||||
yScroll = document.body.scrollHeight;
|
||||
} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
|
||||
xScroll = document.body.offsetWidth;
|
||||
yScroll = document.body.offsetHeight;
|
||||
}
|
||||
|
||||
var windowWidth, windowHeight;
|
||||
if (self.innerHeight) { // all except Explorer
|
||||
windowWidth = self.innerWidth;
|
||||
windowHeight = self.innerHeight;
|
||||
} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
|
||||
windowWidth = document.documentElement.clientWidth;
|
||||
windowHeight = document.documentElement.clientHeight;
|
||||
} else if (document.body) { // other Explorers
|
||||
windowWidth = document.body.clientWidth;
|
||||
windowHeight = document.body.clientHeight;
|
||||
}
|
||||
|
||||
// for small pages with total height less then height of the viewport
|
||||
if(yScroll < windowHeight){
|
||||
pageHeight = windowHeight;
|
||||
} else {
|
||||
pageHeight = yScroll;
|
||||
}
|
||||
|
||||
// for small pages with total width less then width of the viewport
|
||||
if(xScroll < windowWidth){
|
||||
pageWidth = windowWidth;
|
||||
} else {
|
||||
pageWidth = xScroll;
|
||||
}
|
||||
|
||||
|
||||
arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight)
|
||||
return arrayPageSize;
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// getKey(key)
|
||||
// Gets keycode. If 'x' is pressed then it hides the lightbox.
|
||||
//
|
||||
function getKey(e){
|
||||
if (e == null) { // ie
|
||||
keycode = event.keyCode;
|
||||
} else { // mozilla
|
||||
keycode = e.which;
|
||||
}
|
||||
key = String.fromCharCode(keycode).toLowerCase();
|
||||
|
||||
if(key == 'x'){
|
||||
}
|
||||
}
|
||||
|
||||
// -----------------------------------------------------------------------------------
|
||||
|
||||
//
|
||||
// listenKey()
|
||||
//
|
||||
function listenKey () { document.onkeypress = getKey; }
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
function showSelectBoxes(){
|
||||
selects = document.getElementsByTagName("select");
|
||||
for (i = 0; i != selects.length; i++) {
|
||||
selects[i].style.visibility = "visible";
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
function hideSelectBoxes(){
|
||||
selects = document.getElementsByTagName("select");
|
||||
for (i = 0; i != selects.length; i++) {
|
||||
selects[i].style.visibility = "hidden";
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
//
|
||||
// pause(numberMillis)
|
||||
// Pauses code execution for specified time. Uses busy code, not good.
|
||||
// Code from http://www.faqts.com/knowledge_base/view.phtml/aid/1602
|
||||
//
|
||||
function pause(numberMillis) {
|
||||
var now = new Date();
|
||||
var exitTime = now.getTime() + numberMillis;
|
||||
while (true) {
|
||||
now = new Date();
|
||||
if (now.getTime() > exitTime)
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// ---------------------------------------------------
|
||||
|
||||
|
||||
|
||||
function initLightbox() { myLightbox = new Lightbox(); }
|
||||
Event.observe(window, 'load', initLightbox, false);
|
||||
202
public/js/lightbox_html.js
Normal file
@@ -0,0 +1,202 @@
|
||||
/*
|
||||
Created By: Chris Campbell
|
||||
Website: http://particletree.com
|
||||
Date: 2/1/2006
|
||||
|
||||
Inspired by the lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
|
||||
*/
|
||||
|
||||
/*-------------------------------GLOBAL VARIABLES------------------------------------*/
|
||||
|
||||
var detect = navigator.userAgent.toLowerCase();
|
||||
var OS,browser,version,total,thestring;
|
||||
|
||||
/*-----------------------------------------------------------------------------------------------*/
|
||||
|
||||
//Browser detect script origionally created by Peter Paul Koch at http://www.quirksmode.org/
|
||||
|
||||
function getBrowserInfo() {
|
||||
if (checkIt('konqueror')) {
|
||||
browser = "Konqueror";
|
||||
OS = "Linux";
|
||||
}
|
||||
else if (checkIt('safari')) browser = "Safari"
|
||||
else if (checkIt('omniweb')) browser = "OmniWeb"
|
||||
else if (checkIt('opera')) browser = "Opera"
|
||||
else if (checkIt('webtv')) browser = "WebTV";
|
||||
else if (checkIt('icab')) browser = "iCab"
|
||||
else if (checkIt('msie')) browser = "Internet Explorer"
|
||||
else if (!checkIt('compatible')) {
|
||||
browser = "Netscape Navigator"
|
||||
version = detect.charAt(8);
|
||||
}
|
||||
else browser = "An unknown browser";
|
||||
|
||||
if (!version) version = detect.charAt(place + thestring.length);
|
||||
|
||||
if (!OS) {
|
||||
if (checkIt('linux')) OS = "Linux";
|
||||
else if (checkIt('x11')) OS = "Unix";
|
||||
else if (checkIt('mac')) OS = "Mac"
|
||||
else if (checkIt('win')) OS = "Windows"
|
||||
else OS = "an unknown operating system";
|
||||
}
|
||||
}
|
||||
|
||||
function checkIt(string) {
|
||||
place = detect.indexOf(string) + 1;
|
||||
thestring = string;
|
||||
return place;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------------------*/
|
||||
|
||||
Event.observe(window, 'load', initialize, false);
|
||||
Event.observe(window, 'load', getBrowserInfo, false);
|
||||
Event.observe(window, 'unload', Event.unloadCache, false);
|
||||
|
||||
var lightbox = Class.create();
|
||||
|
||||
lightbox.prototype = {
|
||||
|
||||
yPos : 0,
|
||||
xPos : 0,
|
||||
|
||||
initialize: function(ctrl) {
|
||||
this.content = ctrl.href;
|
||||
Event.observe(ctrl, 'click', this.activate.bindAsEventListener(this), false);
|
||||
ctrl.onclick = function(){return false;};
|
||||
},
|
||||
|
||||
// Turn everything on - mainly the IE fixes
|
||||
activate: function(){
|
||||
if (browser == 'Internet Explorer'){
|
||||
this.getScroll();
|
||||
this.prepareIE('100%', 'hidden');
|
||||
this.setScroll(0,0);
|
||||
this.hideSelects('hidden');
|
||||
}
|
||||
this.displayLightbox("block");
|
||||
},
|
||||
|
||||
// Ie requires height to 100% and overflow hidden or else you can scroll down past the lightbox
|
||||
prepareIE: function(height, overflow){
|
||||
bod = document.getElementsByTagName('body')[0];
|
||||
bod.style.height = height;
|
||||
bod.style.overflow = overflow;
|
||||
|
||||
htm = document.getElementsByTagName('html')[0];
|
||||
htm.style.height = height;
|
||||
htm.style.overflow = overflow;
|
||||
},
|
||||
|
||||
// In IE, select elements hover on top of the lightbox
|
||||
hideSelects: function(visibility){
|
||||
selects = document.getElementsByTagName('select');
|
||||
for(i = 0; i < selects.length; i++) {
|
||||
selects[i].style.visibility = visibility;
|
||||
}
|
||||
},
|
||||
|
||||
// Taken from lightbox implementation found at http://www.huddletogether.com/projects/lightbox/
|
||||
getScroll: function(){
|
||||
if (self.pageYOffset) {
|
||||
this.yPos = self.pageYOffset;
|
||||
} else if (document.documentElement && document.documentElement.scrollTop){
|
||||
this.yPos = document.documentElement.scrollTop;
|
||||
} else if (document.body) {
|
||||
this.yPos = document.body.scrollTop;
|
||||
}
|
||||
},
|
||||
|
||||
setScroll: function(x, y){
|
||||
window.scrollTo(x, y);
|
||||
},
|
||||
|
||||
displayLightbox: function(display){
|
||||
$('overlay').style.display = display;
|
||||
$('lightbox').style.display = display;
|
||||
if(display != 'none') this.loadInfo();
|
||||
},
|
||||
|
||||
// Begin Ajax request based off of the href of the clicked linked
|
||||
loadInfo: function() {
|
||||
var myAjax = new Ajax.Request(
|
||||
this.content,
|
||||
{method: 'post', parameters: "", onComplete: this.processInfo.bindAsEventListener(this)}
|
||||
);
|
||||
|
||||
},
|
||||
|
||||
// Display Ajax response
|
||||
processInfo: function(response){
|
||||
info = "<div id='lbContent'>" + response.responseText + "</div>";
|
||||
new Insertion.Before($('lbLoadMessage'), info)
|
||||
$('lightbox').className = "done";
|
||||
this.actions();
|
||||
},
|
||||
|
||||
// Search through new links within the lightbox, and attach click event
|
||||
actions: function(){
|
||||
lbActions = document.getElementsByClassName('lbAction');
|
||||
|
||||
for(i = 0; i < lbActions.length; i++) {
|
||||
Event.observe(lbActions[i], 'click', this[lbActions[i].rel].bindAsEventListener(this), false);
|
||||
lbActions[i].onclick = function(){return false;};
|
||||
}
|
||||
|
||||
},
|
||||
|
||||
// Example of creating your own functionality once lightbox is initiated
|
||||
insert: function(e){
|
||||
link = Event.element(e).parentNode;
|
||||
Element.remove($('lbContent'));
|
||||
|
||||
var myAjax = new Ajax.Request(
|
||||
link.href,
|
||||
{method: 'post', parameters: "", onComplete: this.processInfo.bindAsEventListener(this)}
|
||||
);
|
||||
|
||||
},
|
||||
|
||||
// Example of creating your own functionality once lightbox is initiated
|
||||
deactivate: function(){
|
||||
Element.remove($('lbContent'));
|
||||
|
||||
if (browser == "Internet Explorer"){
|
||||
this.setScroll(0,this.yPos);
|
||||
this.prepareIE("auto", "auto");
|
||||
this.hideSelects("visible");
|
||||
}
|
||||
|
||||
this.displayLightbox("none");
|
||||
}
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------------------------------*/
|
||||
|
||||
// Onload, make all links that need to trigger a lightbox active
|
||||
function initialize(){
|
||||
addLightboxMarkup();
|
||||
lbox = document.getElementsByClassName('lbOn');
|
||||
for(i = 0; i < lbox.length; i++) {
|
||||
valid = new lightbox(lbox[i]);
|
||||
}
|
||||
}
|
||||
|
||||
// Add in markup necessary to make this work. Basically two divs:
|
||||
// Overlay holds the shadow
|
||||
// Lightbox is the centered square that the content is put into.
|
||||
function addLightboxMarkup() {
|
||||
bod = document.getElementsByTagName('body')[0];
|
||||
overlay = document.createElement('div');
|
||||
overlay.id = 'overlay';
|
||||
lb = document.createElement('div');
|
||||
lb.id = 'lightbox';
|
||||
lb.className = 'loading';
|
||||
lb.innerHTML = '<div id="lbLoadMessage">' +
|
||||
'<p></p>' +
|
||||
'</div>';
|
||||
bod.appendChild(overlay);
|
||||
bod.appendChild(lb);
|
||||
}
|
||||
45
public/js/magnific-popup/css/_settings.scss
Normal file
@@ -0,0 +1,45 @@
|
||||
////////////////////////
|
||||
// Settings //
|
||||
////////////////////////
|
||||
|
||||
// overlay
|
||||
$mfp-overlay-color: #0b0b0b; // Color of overlay screen
|
||||
$mfp-overlay-opacity: 0.8; // Opacity of overlay screen
|
||||
$mfp-shadow: 0 0 8px rgba(0, 0, 0, 0.6); // Shadow on image or iframe
|
||||
|
||||
// spacing
|
||||
$mfp-popup-padding-left: 8px; // Padding from left and from right side
|
||||
$mfp-popup-padding-left-mobile: 6px; // Same as above, but is applied when width of window is less than 800px
|
||||
|
||||
$mfp-z-index-base: 1040; // Base z-index of popup
|
||||
|
||||
// controls
|
||||
$mfp-include-arrows: true; // Include styles for nav arrows
|
||||
$mfp-controls-opacity: 0.65; // Opacity of controls
|
||||
$mfp-controls-color: #FFF; // Color of controls
|
||||
$mfp-controls-border-color: #3F3F3F; // Border color of controls
|
||||
$mfp-inner-close-icon-color: #333; // Color of close button when inside
|
||||
$mfp-controls-text-color: #CCC; // Color of preloader and "1 of X" indicator
|
||||
$mfp-controls-text-color-hover: #FFF; // Hover color of preloader and "1 of X" indicator
|
||||
$mfp-IE7support: true; // Very basic IE7 support
|
||||
|
||||
// Iframe-type options
|
||||
$mfp-include-iframe-type: true; // Enable Iframe-type popups
|
||||
$mfp-iframe-padding-top: 40px; // Iframe padding top
|
||||
$mfp-iframe-background: #000; // Background color of iframes
|
||||
$mfp-iframe-max-width: 900px; // Maximum width of iframes
|
||||
$mfp-iframe-ratio: 9/16; // Ratio of iframe (9/16 = widescreen, 3/4 = standard, etc.)
|
||||
|
||||
// Image-type options
|
||||
$mfp-include-image-type: true; // Enable Image-type popups
|
||||
$mfp-image-background: #444 !default;
|
||||
$mfp-image-padding-top: 40px; // Image padding top
|
||||
$mfp-image-padding-bottom: 40px; // Image padding bottom
|
||||
$mfp-include-mobile-layout-for-image: true; // Removes paddings from top and bottom
|
||||
|
||||
// Image caption options
|
||||
$mfp-caption-title-color: #F3F3F3; // Caption title color
|
||||
$mfp-caption-subtitle-color: #BDBDBD; // Caption subtitle color
|
||||
|
||||
// A11y
|
||||
$mfp-use-visuallyhidden: false;
|
||||
646
public/js/magnific-popup/css/main.scss
Normal file
@@ -0,0 +1,646 @@
|
||||
/* Magnific Popup CSS */
|
||||
|
||||
@import "settings";
|
||||
|
||||
////////////////////////
|
||||
//
|
||||
// Contents:
|
||||
//
|
||||
// 1. Default Settings
|
||||
// 2. General styles
|
||||
// - Transluscent overlay
|
||||
// - Containers, wrappers
|
||||
// - Cursors
|
||||
// - Helper classes
|
||||
// 3. Appearance
|
||||
// - Preloader & text that displays error messages
|
||||
// - CSS reset for buttons
|
||||
// - Close icon
|
||||
// - "1 of X" counter
|
||||
// - Navigation (left/right) arrows
|
||||
// - Iframe content type styles
|
||||
// - Image content type styles
|
||||
// - Media query where size of arrows is reduced
|
||||
// - IE7 support
|
||||
//
|
||||
////////////////////////
|
||||
|
||||
|
||||
|
||||
////////////////////////
|
||||
// 1. Default Settings
|
||||
////////////////////////
|
||||
|
||||
$mfp-overlay-color: #0b0b0b !default;
|
||||
$mfp-overlay-opacity: 0.8 !default;
|
||||
$mfp-shadow: 0 0 8px rgba(0, 0, 0, 0.6) !default; // shadow on image or iframe
|
||||
$mfp-popup-padding-left: 8px !default; // Padding from left and from right side
|
||||
$mfp-popup-padding-left-mobile: 6px !default; // Same as above, but is applied when width of window is less than 800px
|
||||
|
||||
$mfp-z-index-base: 1040 !default; // Base z-index of popup
|
||||
$mfp-include-arrows: true !default; // include styles for nav arrows
|
||||
$mfp-controls-opacity: 0.65 !default;
|
||||
$mfp-controls-color: #FFF !default;
|
||||
$mfp-controls-border-color: #3F3F3F !default;
|
||||
$mfp-inner-close-icon-color: #333 !default;
|
||||
$mfp-controls-text-color: #CCC !default; // Color of preloader and "1 of X" indicator
|
||||
$mfp-controls-text-color-hover: #FFF !default;
|
||||
$mfp-IE7support: true !default; // Very basic IE7 support
|
||||
|
||||
// Iframe-type options
|
||||
$mfp-include-iframe-type: true !default;
|
||||
$mfp-iframe-padding-top: 40px !default;
|
||||
$mfp-iframe-background: #000 !default;
|
||||
$mfp-iframe-max-width: 900px !default;
|
||||
$mfp-iframe-ratio: 9/16 !default;
|
||||
|
||||
// Image-type options
|
||||
$mfp-include-image-type: true !default;
|
||||
$mfp-image-background: #444 !default;
|
||||
$mfp-image-padding-top: 40px !default;
|
||||
$mfp-image-padding-bottom: 40px !default;
|
||||
$mfp-include-mobile-layout-for-image: true !default; // Removes paddings from top and bottom
|
||||
|
||||
// Image caption options
|
||||
$mfp-caption-title-color: #F3F3F3 !default;
|
||||
$mfp-caption-subtitle-color: #BDBDBD !default;
|
||||
|
||||
// A11y
|
||||
$mfp-use-visuallyhidden: false !default; // Hide content from browsers, but make it available for screen readers
|
||||
|
||||
|
||||
|
||||
////////////////////////
|
||||
// 2. General styles
|
||||
////////////////////////
|
||||
|
||||
// Transluscent overlay
|
||||
.mfp-bg {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: $mfp-z-index-base + 2;
|
||||
overflow: hidden;
|
||||
position: fixed;
|
||||
|
||||
background: $mfp-overlay-color;
|
||||
opacity: $mfp-overlay-opacity;
|
||||
@if $mfp-IE7support {
|
||||
filter: unquote("alpha(opacity=#{$mfp-overlay-opacity*100})");
|
||||
}
|
||||
}
|
||||
|
||||
// Wrapper for popup
|
||||
.mfp-wrap {
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: $mfp-z-index-base + 3;
|
||||
position: fixed;
|
||||
outline: none !important;
|
||||
-webkit-backface-visibility: hidden; // fixes webkit bug that can cause "false" scrollbar
|
||||
}
|
||||
|
||||
// Root container
|
||||
.mfp-container {
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
left: 0;
|
||||
top: 0;
|
||||
padding: 0 $mfp-popup-padding-left;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
// Vertical centerer helper
|
||||
.mfp-container {
|
||||
&:before {
|
||||
content: '';
|
||||
display: inline-block;
|
||||
height: 100%;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
// Remove vertical centering when popup has class `mfp-align-top`
|
||||
.mfp-align-top {
|
||||
.mfp-container {
|
||||
&:before {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Popup content holder
|
||||
.mfp-content {
|
||||
position: relative;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
margin: 0 auto;
|
||||
text-align: left;
|
||||
z-index: $mfp-z-index-base + 5;
|
||||
}
|
||||
.mfp-inline-holder,
|
||||
.mfp-ajax-holder {
|
||||
.mfp-content {
|
||||
width: 100%;
|
||||
cursor: auto;
|
||||
}
|
||||
}
|
||||
|
||||
// Cursors
|
||||
.mfp-ajax-cur {
|
||||
cursor: progress;
|
||||
}
|
||||
.mfp-zoom-out-cur {
|
||||
&, .mfp-image-holder .mfp-close {
|
||||
cursor: -moz-zoom-out;
|
||||
cursor: -webkit-zoom-out;
|
||||
cursor: zoom-out;
|
||||
}
|
||||
}
|
||||
.mfp-zoom {
|
||||
cursor: pointer;
|
||||
cursor: -webkit-zoom-in;
|
||||
cursor: -moz-zoom-in;
|
||||
cursor: zoom-in;
|
||||
}
|
||||
.mfp-auto-cursor {
|
||||
.mfp-content {
|
||||
cursor: auto;
|
||||
}
|
||||
}
|
||||
|
||||
.mfp-close,
|
||||
.mfp-arrow,
|
||||
.mfp-preloader,
|
||||
.mfp-counter {
|
||||
-webkit-user-select:none;
|
||||
-moz-user-select: none;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
// Hide the image during the loading
|
||||
.mfp-loading {
|
||||
&.mfp-figure {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
// Helper class that hides stuff
|
||||
@if $mfp-use-visuallyhidden {
|
||||
// From HTML5 Boilerplate https://github.com/h5bp/html5-boilerplate/blob/v4.2.0/doc/css.md#visuallyhidden
|
||||
.mfp-hide {
|
||||
border: 0 !important;
|
||||
clip: rect(0 0 0 0) !important;
|
||||
height: 1px !important;
|
||||
margin: -1px !important;
|
||||
overflow: hidden !important;
|
||||
padding: 0 !important;
|
||||
position: absolute !important;
|
||||
width: 1px !important;
|
||||
}
|
||||
} @else {
|
||||
.mfp-hide {
|
||||
display: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////
|
||||
// 3. Appearance
|
||||
////////////////////////
|
||||
|
||||
// Preloader and text that displays error messages
|
||||
.mfp-preloader {
|
||||
color: $mfp-controls-text-color;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
width: auto;
|
||||
text-align: center;
|
||||
margin-top: -0.8em;
|
||||
left: 8px;
|
||||
right: 8px;
|
||||
z-index: $mfp-z-index-base + 4;
|
||||
a {
|
||||
color: $mfp-controls-text-color;
|
||||
&:hover {
|
||||
color: $mfp-controls-text-color-hover;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Hide preloader when content successfully loaded
|
||||
.mfp-s-ready {
|
||||
.mfp-preloader {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
// Hide content when it was not loaded
|
||||
.mfp-s-error {
|
||||
.mfp-content {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
// CSS-reset for buttons
|
||||
button {
|
||||
&.mfp-close,
|
||||
&.mfp-arrow {
|
||||
overflow: visible;
|
||||
cursor: pointer;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
-webkit-appearance: none;
|
||||
display: block;
|
||||
outline: none;
|
||||
padding: 0;
|
||||
z-index: $mfp-z-index-base + 6;
|
||||
-webkit-box-shadow: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
&::-moz-focus-inner {
|
||||
padding: 0;
|
||||
border: 0
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// Close icon
|
||||
.mfp-close {
|
||||
width: 44px;
|
||||
height: 44px;
|
||||
line-height: 44px;
|
||||
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
opacity: $mfp-controls-opacity;
|
||||
@if $mfp-IE7support {
|
||||
filter: unquote("alpha(opacity=#{$mfp-controls-opacity*100})");
|
||||
}
|
||||
padding: 0 0 18px 10px;
|
||||
color: $mfp-controls-color;
|
||||
|
||||
font-style: normal;
|
||||
font-size: 28px;
|
||||
font-family: Arial, Baskerville, monospace;
|
||||
|
||||
&:hover,
|
||||
&:focus {
|
||||
opacity: 1;
|
||||
@if $mfp-IE7support {
|
||||
filter: unquote("alpha(opacity=#{1*100})");
|
||||
}
|
||||
}
|
||||
|
||||
&:active {
|
||||
top: 1px;
|
||||
}
|
||||
}
|
||||
.mfp-close-btn-in {
|
||||
.mfp-close {
|
||||
color: $mfp-inner-close-icon-color;
|
||||
}
|
||||
}
|
||||
.mfp-image-holder,
|
||||
.mfp-iframe-holder {
|
||||
.mfp-close {
|
||||
color: $mfp-controls-color;
|
||||
right: -6px;
|
||||
text-align: right;
|
||||
padding-right: 6px;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
// "1 of X" counter
|
||||
.mfp-counter {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
color: $mfp-controls-text-color;
|
||||
font-size: 12px;
|
||||
line-height: 18px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
// Navigation arrows
|
||||
@if $mfp-include-arrows {
|
||||
.mfp-arrow {
|
||||
position: absolute;
|
||||
opacity: $mfp-controls-opacity;
|
||||
@if $mfp-IE7support {
|
||||
filter: unquote("alpha(opacity=#{$mfp-controls-opacity*100})");
|
||||
}
|
||||
margin: 0;
|
||||
top: 50%;
|
||||
margin-top: -55px;
|
||||
padding: 0;
|
||||
width: 90px;
|
||||
height: 110px;
|
||||
-webkit-tap-highlight-color: rgba(0,0,0,0);
|
||||
&:active {
|
||||
margin-top: -54px;
|
||||
}
|
||||
&:hover,
|
||||
&:focus {
|
||||
opacity: 1;
|
||||
@if $mfp-IE7support {
|
||||
filter: unquote("alpha(opacity=#{1*100})");
|
||||
}
|
||||
}
|
||||
&:before,
|
||||
&:after,
|
||||
.mfp-b,
|
||||
.mfp-a {
|
||||
content: '';
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
margin-top: 35px;
|
||||
margin-left: 35px;
|
||||
border: medium inset transparent;
|
||||
}
|
||||
|
||||
&:after,
|
||||
.mfp-a {
|
||||
|
||||
border-top-width: 13px;
|
||||
border-bottom-width: 13px;
|
||||
top:8px;
|
||||
}
|
||||
|
||||
&:before,
|
||||
.mfp-b {
|
||||
border-top-width: 21px;
|
||||
border-bottom-width: 21px;
|
||||
opacity: 0.7;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.mfp-arrow-left {
|
||||
left: 0;
|
||||
|
||||
&:after,
|
||||
.mfp-a {
|
||||
border-right: 17px solid $mfp-controls-color;
|
||||
margin-left: 31px;
|
||||
}
|
||||
&:before,
|
||||
.mfp-b {
|
||||
margin-left: 25px;
|
||||
border-right: 27px solid $mfp-controls-border-color;
|
||||
}
|
||||
}
|
||||
|
||||
.mfp-arrow-right {
|
||||
right: 0;
|
||||
&:after,
|
||||
.mfp-a {
|
||||
border-left: 17px solid $mfp-controls-color;
|
||||
margin-left: 39px
|
||||
}
|
||||
&:before,
|
||||
.mfp-b {
|
||||
border-left: 27px solid $mfp-controls-border-color;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Iframe content type
|
||||
@if $mfp-include-iframe-type {
|
||||
.mfp-iframe-holder {
|
||||
padding-top: $mfp-iframe-padding-top;
|
||||
padding-bottom: $mfp-iframe-padding-top;
|
||||
.mfp-content {
|
||||
line-height: 0;
|
||||
width: 100%;
|
||||
max-width: $mfp-iframe-max-width;
|
||||
}
|
||||
.mfp-close {
|
||||
top: -40px;
|
||||
}
|
||||
}
|
||||
.mfp-iframe-scaler {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
padding-top: $mfp-iframe-ratio * 100%;
|
||||
iframe {
|
||||
position: absolute;
|
||||
display: block;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
box-shadow: $mfp-shadow;
|
||||
background: $mfp-iframe-background;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Image content type
|
||||
@if $mfp-include-image-type {
|
||||
|
||||
/* Main image in popup */
|
||||
img {
|
||||
&.mfp-img {
|
||||
width: auto;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
display: block;
|
||||
line-height: 0;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
padding: $mfp-image-padding-top 0 $mfp-image-padding-bottom;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
/* The shadow behind the image */
|
||||
.mfp-figure {
|
||||
line-height: 0;
|
||||
&:after {
|
||||
content: '';
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: $mfp-image-padding-top;
|
||||
bottom: $mfp-image-padding-bottom;
|
||||
display: block;
|
||||
right: 0;
|
||||
width: auto;
|
||||
height: auto;
|
||||
z-index: -1;
|
||||
box-shadow: $mfp-shadow;
|
||||
background: $mfp-image-background;
|
||||
}
|
||||
small {
|
||||
color: $mfp-caption-subtitle-color;
|
||||
display: block;
|
||||
font-size: 12px;
|
||||
line-height: 14px;
|
||||
}
|
||||
figure {
|
||||
margin: 0;
|
||||
}
|
||||
}
|
||||
.mfp-bottom-bar {
|
||||
margin-top: -$mfp-image-padding-bottom + 4;
|
||||
position: absolute;
|
||||
top: 100%;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
cursor: auto;
|
||||
}
|
||||
.mfp-title {
|
||||
text-align: left;
|
||||
line-height: 18px;
|
||||
color: $mfp-caption-title-color;
|
||||
word-wrap: break-word;
|
||||
padding-right: 36px; // leave some space for counter at right side
|
||||
}
|
||||
|
||||
.mfp-image-holder {
|
||||
.mfp-content {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.mfp-gallery {
|
||||
.mfp-image-holder {
|
||||
.mfp-figure {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@if $mfp-include-mobile-layout-for-image {
|
||||
@media screen and (max-width: 800px) and (orientation:landscape), screen and (max-height: 300px) {
|
||||
/**
|
||||
* Remove all paddings around the image on small screen
|
||||
*/
|
||||
.mfp-img-mobile {
|
||||
.mfp-image-holder {
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
}
|
||||
img {
|
||||
&.mfp-img {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
.mfp-figure {
|
||||
// The shadow behind the image
|
||||
&:after {
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
}
|
||||
small {
|
||||
display: inline;
|
||||
margin-left: 5px;
|
||||
}
|
||||
}
|
||||
.mfp-bottom-bar {
|
||||
background: rgba(0,0,0,0.6);
|
||||
bottom: 0;
|
||||
margin: 0;
|
||||
top: auto;
|
||||
padding: 3px 5px;
|
||||
position: fixed;
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
&:empty {
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
.mfp-counter {
|
||||
right: 5px;
|
||||
top: 3px;
|
||||
}
|
||||
.mfp-close {
|
||||
top: 0;
|
||||
right: 0;
|
||||
width: 35px;
|
||||
height: 35px;
|
||||
line-height: 35px;
|
||||
background: rgba(0, 0, 0, 0.6);
|
||||
position: fixed;
|
||||
text-align: center;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// Scale navigation arrows and reduce padding from sides
|
||||
@media all and (max-width: 900px) {
|
||||
.mfp-arrow {
|
||||
-webkit-transform: scale(0.75);
|
||||
transform: scale(0.75);
|
||||
}
|
||||
.mfp-arrow-left {
|
||||
-webkit-transform-origin: 0;
|
||||
transform-origin: 0;
|
||||
}
|
||||
.mfp-arrow-right {
|
||||
-webkit-transform-origin: 100%;
|
||||
transform-origin: 100%;
|
||||
}
|
||||
.mfp-container {
|
||||
padding-left: $mfp-popup-padding-left-mobile;
|
||||
padding-right: $mfp-popup-padding-left-mobile;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
// IE7 support
|
||||
// Styles that make popup look nicier in old IE
|
||||
@if $mfp-IE7support {
|
||||
.mfp-ie7 {
|
||||
.mfp-img {
|
||||
padding: 0;
|
||||
}
|
||||
.mfp-bottom-bar {
|
||||
width: 600px;
|
||||
left: 50%;
|
||||
margin-left: -300px;
|
||||
margin-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
.mfp-container {
|
||||
padding: 0;
|
||||
}
|
||||
.mfp-content {
|
||||
padding-top: 44px;
|
||||
}
|
||||
.mfp-close {
|
||||
top: 0;
|
||||
right: 0;
|
||||
padding-top: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
83
public/js/magnific-popup/js/ajax.js
Normal file
@@ -0,0 +1,83 @@
|
||||
var AJAX_NS = 'ajax',
|
||||
_ajaxCur,
|
||||
_removeAjaxCursor = function() {
|
||||
if(_ajaxCur) {
|
||||
$(document.body).removeClass(_ajaxCur);
|
||||
}
|
||||
},
|
||||
_destroyAjaxRequest = function() {
|
||||
_removeAjaxCursor();
|
||||
if(mfp.req) {
|
||||
mfp.req.abort();
|
||||
}
|
||||
};
|
||||
|
||||
$.magnificPopup.registerModule(AJAX_NS, {
|
||||
|
||||
options: {
|
||||
settings: null,
|
||||
cursor: 'mfp-ajax-cur',
|
||||
tError: '<a href="%url%">The content</a> could not be loaded.'
|
||||
},
|
||||
|
||||
proto: {
|
||||
initAjax: function() {
|
||||
mfp.types.push(AJAX_NS);
|
||||
_ajaxCur = mfp.st.ajax.cursor;
|
||||
|
||||
_mfpOn(CLOSE_EVENT+'.'+AJAX_NS, _destroyAjaxRequest);
|
||||
_mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest);
|
||||
},
|
||||
getAjax: function(item) {
|
||||
|
||||
if(_ajaxCur) {
|
||||
$(document.body).addClass(_ajaxCur);
|
||||
}
|
||||
|
||||
mfp.updateStatus('loading');
|
||||
|
||||
var opts = $.extend({
|
||||
url: item.src,
|
||||
success: function(data, textStatus, jqXHR) {
|
||||
var temp = {
|
||||
data:data,
|
||||
xhr:jqXHR
|
||||
};
|
||||
|
||||
_mfpTrigger('ParseAjax', temp);
|
||||
|
||||
mfp.appendContent( $(temp.data), AJAX_NS );
|
||||
|
||||
item.finished = true;
|
||||
|
||||
_removeAjaxCursor();
|
||||
|
||||
mfp._setFocus();
|
||||
|
||||
setTimeout(function() {
|
||||
mfp.wrap.addClass(READY_CLASS);
|
||||
}, 16);
|
||||
|
||||
mfp.updateStatus('ready');
|
||||
|
||||
_mfpTrigger('AjaxContentAdded');
|
||||
},
|
||||
error: function() {
|
||||
_removeAjaxCursor();
|
||||
item.finished = item.loadError = true;
|
||||
mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));
|
||||
}
|
||||
}, mfp.st.ajax.settings);
|
||||
|
||||
mfp.req = $.ajax(opts);
|
||||
|
||||
return '';
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
966
public/js/magnific-popup/js/core.js
Normal file
@@ -0,0 +1,966 @@
|
||||
/**
|
||||
*
|
||||
* Magnific Popup Core JS file
|
||||
*
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* Private static constants
|
||||
*/
|
||||
var CLOSE_EVENT = 'Close',
|
||||
BEFORE_CLOSE_EVENT = 'BeforeClose',
|
||||
AFTER_CLOSE_EVENT = 'AfterClose',
|
||||
BEFORE_APPEND_EVENT = 'BeforeAppend',
|
||||
MARKUP_PARSE_EVENT = 'MarkupParse',
|
||||
OPEN_EVENT = 'Open',
|
||||
CHANGE_EVENT = 'Change',
|
||||
NS = 'mfp',
|
||||
EVENT_NS = '.' + NS,
|
||||
READY_CLASS = 'mfp-ready',
|
||||
REMOVING_CLASS = 'mfp-removing',
|
||||
PREVENT_CLOSE_CLASS = 'mfp-prevent-close';
|
||||
|
||||
|
||||
/**
|
||||
* Private vars
|
||||
*/
|
||||
/*jshint -W079 */
|
||||
var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'
|
||||
MagnificPopup = function(){},
|
||||
_isJQ = !!(window.jQuery),
|
||||
_prevStatus,
|
||||
_window = $(window),
|
||||
_document,
|
||||
_prevContentType,
|
||||
_wrapClasses,
|
||||
_currPopupType;
|
||||
|
||||
|
||||
/**
|
||||
* Private functions
|
||||
*/
|
||||
var _mfpOn = function(name, f) {
|
||||
mfp.ev.on(NS + name + EVENT_NS, f);
|
||||
},
|
||||
_getEl = function(className, appendTo, html, raw) {
|
||||
var el = document.createElement('div');
|
||||
el.className = 'mfp-'+className;
|
||||
if(html) {
|
||||
el.innerHTML = html;
|
||||
}
|
||||
if(!raw) {
|
||||
el = $(el);
|
||||
if(appendTo) {
|
||||
el.appendTo(appendTo);
|
||||
}
|
||||
} else if(appendTo) {
|
||||
appendTo.appendChild(el);
|
||||
}
|
||||
return el;
|
||||
},
|
||||
_mfpTrigger = function(e, data) {
|
||||
mfp.ev.triggerHandler(NS + e, data);
|
||||
|
||||
if(mfp.st.callbacks) {
|
||||
// converts "mfpEventName" to "eventName" callback and triggers it if it's present
|
||||
e = e.charAt(0).toLowerCase() + e.slice(1);
|
||||
if(mfp.st.callbacks[e]) {
|
||||
mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);
|
||||
}
|
||||
}
|
||||
},
|
||||
_getCloseBtn = function(type) {
|
||||
if(type !== _currPopupType || !mfp.currTemplate.closeBtn) {
|
||||
mfp.currTemplate.closeBtn = $( mfp.st.closeMarkup.replace('%title%', mfp.st.tClose ) );
|
||||
_currPopupType = type;
|
||||
}
|
||||
return mfp.currTemplate.closeBtn;
|
||||
},
|
||||
// Initialize Magnific Popup only when called at least once
|
||||
_checkInstance = function() {
|
||||
if(!$.magnificPopup.instance) {
|
||||
/*jshint -W020 */
|
||||
mfp = new MagnificPopup();
|
||||
mfp.init();
|
||||
$.magnificPopup.instance = mfp;
|
||||
}
|
||||
},
|
||||
// CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr
|
||||
supportsTransitions = function() {
|
||||
var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist
|
||||
v = ['ms','O','Moz','Webkit']; // 'v' for vendor
|
||||
|
||||
if( s['transition'] !== undefined ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
while( v.length ) {
|
||||
if( v.pop() + 'Transition' in s ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Public functions
|
||||
*/
|
||||
MagnificPopup.prototype = {
|
||||
|
||||
constructor: MagnificPopup,
|
||||
|
||||
/**
|
||||
* Initializes Magnific Popup plugin.
|
||||
* This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed
|
||||
*/
|
||||
init: function() {
|
||||
var appVersion = navigator.appVersion;
|
||||
mfp.isIE7 = appVersion.indexOf("MSIE 7.") !== -1;
|
||||
mfp.isIE8 = appVersion.indexOf("MSIE 8.") !== -1;
|
||||
mfp.isLowIE = mfp.isIE7 || mfp.isIE8;
|
||||
mfp.isAndroid = (/android/gi).test(appVersion);
|
||||
mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);
|
||||
mfp.supportsTransition = supportsTransitions();
|
||||
|
||||
// We disable fixed positioned lightbox on devices that don't handle it nicely.
|
||||
// If you know a better way of detecting this - let me know.
|
||||
mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent) );
|
||||
_document = $(document);
|
||||
|
||||
mfp.popupsCache = {};
|
||||
},
|
||||
|
||||
/**
|
||||
* Opens popup
|
||||
* @param data [description]
|
||||
*/
|
||||
open: function(data) {
|
||||
|
||||
var i;
|
||||
|
||||
if(data.isObj === false) {
|
||||
// convert jQuery collection to array to avoid conflicts later
|
||||
mfp.items = data.items.toArray();
|
||||
|
||||
mfp.index = 0;
|
||||
var items = data.items,
|
||||
item;
|
||||
for(i = 0; i < items.length; i++) {
|
||||
item = items[i];
|
||||
if(item.parsed) {
|
||||
item = item.el[0];
|
||||
}
|
||||
if(item === data.el[0]) {
|
||||
mfp.index = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
mfp.items = $.isArray(data.items) ? data.items : [data.items];
|
||||
mfp.index = data.index || 0;
|
||||
}
|
||||
|
||||
// if popup is already opened - we just update the content
|
||||
if(mfp.isOpen) {
|
||||
mfp.updateItemHTML();
|
||||
return;
|
||||
}
|
||||
|
||||
mfp.types = [];
|
||||
_wrapClasses = '';
|
||||
if(data.mainEl && data.mainEl.length) {
|
||||
mfp.ev = data.mainEl.eq(0);
|
||||
} else {
|
||||
mfp.ev = _document;
|
||||
}
|
||||
|
||||
if(data.key) {
|
||||
if(!mfp.popupsCache[data.key]) {
|
||||
mfp.popupsCache[data.key] = {};
|
||||
}
|
||||
mfp.currTemplate = mfp.popupsCache[data.key];
|
||||
} else {
|
||||
mfp.currTemplate = {};
|
||||
}
|
||||
|
||||
|
||||
|
||||
mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data );
|
||||
mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;
|
||||
|
||||
if(mfp.st.modal) {
|
||||
mfp.st.closeOnContentClick = false;
|
||||
mfp.st.closeOnBgClick = false;
|
||||
mfp.st.showCloseBtn = false;
|
||||
mfp.st.enableEscapeKey = false;
|
||||
}
|
||||
|
||||
|
||||
// Building markup
|
||||
// main containers are created only once
|
||||
if(!mfp.bgOverlay) {
|
||||
|
||||
// Dark overlay
|
||||
mfp.bgOverlay = _getEl('bg').on('click'+EVENT_NS, function() {
|
||||
mfp.close();
|
||||
});
|
||||
|
||||
mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click'+EVENT_NS, function(e) {
|
||||
if(mfp._checkIfClose(e.target)) {
|
||||
mfp.close();
|
||||
}
|
||||
});
|
||||
|
||||
mfp.container = _getEl('container', mfp.wrap);
|
||||
}
|
||||
|
||||
mfp.contentContainer = _getEl('content');
|
||||
if(mfp.st.preloader) {
|
||||
mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);
|
||||
}
|
||||
|
||||
|
||||
// Initializing modules
|
||||
var modules = $.magnificPopup.modules;
|
||||
for(i = 0; i < modules.length; i++) {
|
||||
var n = modules[i];
|
||||
n = n.charAt(0).toUpperCase() + n.slice(1);
|
||||
mfp['init'+n].call(mfp);
|
||||
}
|
||||
_mfpTrigger('BeforeOpen');
|
||||
|
||||
|
||||
if(mfp.st.showCloseBtn) {
|
||||
// Close button
|
||||
if(!mfp.st.closeBtnInside) {
|
||||
mfp.wrap.append( _getCloseBtn() );
|
||||
} else {
|
||||
_mfpOn(MARKUP_PARSE_EVENT, function(e, template, values, item) {
|
||||
values.close_replaceWith = _getCloseBtn(item.type);
|
||||
});
|
||||
_wrapClasses += ' mfp-close-btn-in';
|
||||
}
|
||||
}
|
||||
|
||||
if(mfp.st.alignTop) {
|
||||
_wrapClasses += ' mfp-align-top';
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(mfp.fixedContentPos) {
|
||||
mfp.wrap.css({
|
||||
overflow: mfp.st.overflowY,
|
||||
overflowX: 'hidden',
|
||||
overflowY: mfp.st.overflowY
|
||||
});
|
||||
} else {
|
||||
mfp.wrap.css({
|
||||
top: _window.scrollTop(),
|
||||
position: 'absolute'
|
||||
});
|
||||
}
|
||||
if( mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos) ) {
|
||||
mfp.bgOverlay.css({
|
||||
height: _document.height(),
|
||||
position: 'absolute'
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
if(mfp.st.enableEscapeKey) {
|
||||
// Close on ESC key
|
||||
_document.on('keyup' + EVENT_NS, function(e) {
|
||||
if(e.keyCode === 27) {
|
||||
mfp.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_window.on('resize' + EVENT_NS, function() {
|
||||
mfp.updateSize();
|
||||
});
|
||||
|
||||
|
||||
if(!mfp.st.closeOnContentClick) {
|
||||
_wrapClasses += ' mfp-auto-cursor';
|
||||
}
|
||||
|
||||
if(_wrapClasses)
|
||||
mfp.wrap.addClass(_wrapClasses);
|
||||
|
||||
|
||||
// this triggers recalculation of layout, so we get it once to not to trigger twice
|
||||
var windowHeight = mfp.wH = _window.height();
|
||||
|
||||
|
||||
var windowStyles = {};
|
||||
|
||||
if( mfp.fixedContentPos ) {
|
||||
if(mfp._hasScrollBar(windowHeight)){
|
||||
var s = mfp._getScrollbarSize();
|
||||
if(s) {
|
||||
windowStyles.marginRight = s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(mfp.fixedContentPos) {
|
||||
if(!mfp.isIE7) {
|
||||
windowStyles.overflow = 'hidden';
|
||||
} else {
|
||||
// ie7 double-scroll bug
|
||||
$('body, html').css('overflow', 'hidden');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
var classesToadd = mfp.st.mainClass;
|
||||
if(mfp.isIE7) {
|
||||
classesToadd += ' mfp-ie7';
|
||||
}
|
||||
if(classesToadd) {
|
||||
mfp._addClassToMFP( classesToadd );
|
||||
}
|
||||
|
||||
// add content
|
||||
mfp.updateItemHTML();
|
||||
|
||||
_mfpTrigger('BuildControls');
|
||||
|
||||
// remove scrollbar, add margin e.t.c
|
||||
$('html').css(windowStyles);
|
||||
|
||||
// add everything to DOM
|
||||
mfp.bgOverlay.add(mfp.wrap).prependTo( mfp.st.prependTo || $(document.body) );
|
||||
|
||||
// Save last focused element
|
||||
mfp._lastFocusedEl = document.activeElement;
|
||||
|
||||
// Wait for next cycle to allow CSS transition
|
||||
setTimeout(function() {
|
||||
|
||||
if(mfp.content) {
|
||||
mfp._addClassToMFP(READY_CLASS);
|
||||
mfp._setFocus();
|
||||
} else {
|
||||
// if content is not defined (not loaded e.t.c) we add class only for BG
|
||||
mfp.bgOverlay.addClass(READY_CLASS);
|
||||
}
|
||||
|
||||
// Trap the focus in popup
|
||||
_document.on('focusin' + EVENT_NS, mfp._onFocusIn);
|
||||
|
||||
}, 16);
|
||||
|
||||
mfp.isOpen = true;
|
||||
mfp.updateSize(windowHeight);
|
||||
_mfpTrigger(OPEN_EVENT);
|
||||
|
||||
return data;
|
||||
},
|
||||
|
||||
/**
|
||||
* Closes the popup
|
||||
*/
|
||||
close: function() {
|
||||
if(!mfp.isOpen) return;
|
||||
_mfpTrigger(BEFORE_CLOSE_EVENT);
|
||||
|
||||
mfp.isOpen = false;
|
||||
// for CSS3 animation
|
||||
if(mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition ) {
|
||||
mfp._addClassToMFP(REMOVING_CLASS);
|
||||
setTimeout(function() {
|
||||
mfp._close();
|
||||
}, mfp.st.removalDelay);
|
||||
} else {
|
||||
mfp._close();
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Helper for close() function
|
||||
*/
|
||||
_close: function() {
|
||||
_mfpTrigger(CLOSE_EVENT);
|
||||
|
||||
var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';
|
||||
|
||||
mfp.bgOverlay.detach();
|
||||
mfp.wrap.detach();
|
||||
mfp.container.empty();
|
||||
|
||||
if(mfp.st.mainClass) {
|
||||
classesToRemove += mfp.st.mainClass + ' ';
|
||||
}
|
||||
|
||||
mfp._removeClassFromMFP(classesToRemove);
|
||||
|
||||
if(mfp.fixedContentPos) {
|
||||
var windowStyles = {marginRight: ''};
|
||||
if(mfp.isIE7) {
|
||||
$('body, html').css('overflow', '');
|
||||
} else {
|
||||
windowStyles.overflow = '';
|
||||
}
|
||||
$('html').css(windowStyles);
|
||||
}
|
||||
|
||||
_document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);
|
||||
mfp.ev.off(EVENT_NS);
|
||||
|
||||
// clean up DOM elements that aren't removed
|
||||
mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');
|
||||
mfp.bgOverlay.attr('class', 'mfp-bg');
|
||||
mfp.container.attr('class', 'mfp-container');
|
||||
|
||||
// remove close button from target element
|
||||
if(mfp.st.showCloseBtn &&
|
||||
(!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {
|
||||
if(mfp.currTemplate.closeBtn)
|
||||
mfp.currTemplate.closeBtn.detach();
|
||||
}
|
||||
|
||||
|
||||
if(mfp._lastFocusedEl) {
|
||||
$(mfp._lastFocusedEl).focus(); // put tab focus back
|
||||
}
|
||||
mfp.currItem = null;
|
||||
mfp.content = null;
|
||||
mfp.currTemplate = null;
|
||||
mfp.prevHeight = 0;
|
||||
|
||||
_mfpTrigger(AFTER_CLOSE_EVENT);
|
||||
},
|
||||
|
||||
updateSize: function(winHeight) {
|
||||
|
||||
if(mfp.isIOS) {
|
||||
// fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2
|
||||
var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
|
||||
var height = window.innerHeight * zoomLevel;
|
||||
mfp.wrap.css('height', height);
|
||||
mfp.wH = height;
|
||||
} else {
|
||||
mfp.wH = winHeight || _window.height();
|
||||
}
|
||||
// Fixes #84: popup incorrectly positioned with position:relative on body
|
||||
if(!mfp.fixedContentPos) {
|
||||
mfp.wrap.css('height', mfp.wH);
|
||||
}
|
||||
|
||||
_mfpTrigger('Resize');
|
||||
|
||||
},
|
||||
|
||||
/**
|
||||
* Set content of popup based on current index
|
||||
*/
|
||||
updateItemHTML: function() {
|
||||
var item = mfp.items[mfp.index];
|
||||
|
||||
// Detach and perform modifications
|
||||
mfp.contentContainer.detach();
|
||||
|
||||
if(mfp.content)
|
||||
mfp.content.detach();
|
||||
|
||||
if(!item.parsed) {
|
||||
item = mfp.parseEl( mfp.index );
|
||||
}
|
||||
|
||||
var type = item.type;
|
||||
|
||||
_mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);
|
||||
// BeforeChange event works like so:
|
||||
// _mfpOn('BeforeChange', function(e, prevType, newType) { });
|
||||
|
||||
mfp.currItem = item;
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
if(!mfp.currTemplate[type]) {
|
||||
var markup = mfp.st[type] ? mfp.st[type].markup : false;
|
||||
|
||||
// allows to modify markup
|
||||
_mfpTrigger('FirstMarkupParse', markup);
|
||||
|
||||
if(markup) {
|
||||
mfp.currTemplate[type] = $(markup);
|
||||
} else {
|
||||
// if there is no markup found we just define that template is parsed
|
||||
mfp.currTemplate[type] = true;
|
||||
}
|
||||
}
|
||||
|
||||
if(_prevContentType && _prevContentType !== item.type) {
|
||||
mfp.container.removeClass('mfp-'+_prevContentType+'-holder');
|
||||
}
|
||||
|
||||
var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);
|
||||
mfp.appendContent(newContent, type);
|
||||
|
||||
item.preloaded = true;
|
||||
|
||||
_mfpTrigger(CHANGE_EVENT, item);
|
||||
_prevContentType = item.type;
|
||||
|
||||
// Append container back after its content changed
|
||||
mfp.container.prepend(mfp.contentContainer);
|
||||
|
||||
_mfpTrigger('AfterChange');
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Set HTML content of popup
|
||||
*/
|
||||
appendContent: function(newContent, type) {
|
||||
mfp.content = newContent;
|
||||
|
||||
if(newContent) {
|
||||
if(mfp.st.showCloseBtn && mfp.st.closeBtnInside &&
|
||||
mfp.currTemplate[type] === true) {
|
||||
// if there is no markup, we just append close button element inside
|
||||
if(!mfp.content.find('.mfp-close').length) {
|
||||
mfp.content.append(_getCloseBtn());
|
||||
}
|
||||
} else {
|
||||
mfp.content = newContent;
|
||||
}
|
||||
} else {
|
||||
mfp.content = '';
|
||||
}
|
||||
|
||||
_mfpTrigger(BEFORE_APPEND_EVENT);
|
||||
mfp.container.addClass('mfp-'+type+'-holder');
|
||||
|
||||
mfp.contentContainer.append(mfp.content);
|
||||
},
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Creates Magnific Popup data object based on given data
|
||||
* @param {int} index Index of item to parse
|
||||
*/
|
||||
parseEl: function(index) {
|
||||
var item = mfp.items[index],
|
||||
type;
|
||||
|
||||
if(item.tagName) {
|
||||
item = { el: $(item) };
|
||||
} else {
|
||||
type = item.type;
|
||||
item = { data: item, src: item.src };
|
||||
}
|
||||
|
||||
if(item.el) {
|
||||
var types = mfp.types;
|
||||
|
||||
// check for 'mfp-TYPE' class
|
||||
for(var i = 0; i < types.length; i++) {
|
||||
if( item.el.hasClass('mfp-'+types[i]) ) {
|
||||
type = types[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
item.src = item.el.attr('data-mfp-src');
|
||||
if(!item.src) {
|
||||
item.src = item.el.attr('href');
|
||||
}
|
||||
}
|
||||
|
||||
item.type = type || mfp.st.type || 'inline';
|
||||
item.index = index;
|
||||
item.parsed = true;
|
||||
mfp.items[index] = item;
|
||||
_mfpTrigger('ElementParse', item);
|
||||
|
||||
return mfp.items[index];
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Initializes single popup or a group of popups
|
||||
*/
|
||||
addGroup: function(el, options) {
|
||||
var eHandler = function(e) {
|
||||
e.mfpEl = this;
|
||||
mfp._openClick(e, el, options);
|
||||
};
|
||||
|
||||
if(!options) {
|
||||
options = {};
|
||||
}
|
||||
|
||||
var eName = 'click.magnificPopup';
|
||||
options.mainEl = el;
|
||||
|
||||
if(options.items) {
|
||||
options.isObj = true;
|
||||
el.off(eName).on(eName, eHandler);
|
||||
} else {
|
||||
options.isObj = false;
|
||||
if(options.delegate) {
|
||||
el.off(eName).on(eName, options.delegate , eHandler);
|
||||
} else {
|
||||
options.items = el;
|
||||
el.off(eName).on(eName, eHandler);
|
||||
}
|
||||
}
|
||||
},
|
||||
_openClick: function(e, el, options) {
|
||||
var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;
|
||||
|
||||
|
||||
if(!midClick && ( e.which === 2 || e.ctrlKey || e.metaKey ) ) {
|
||||
return;
|
||||
}
|
||||
|
||||
var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;
|
||||
|
||||
if(disableOn) {
|
||||
if($.isFunction(disableOn)) {
|
||||
if( !disableOn.call(mfp) ) {
|
||||
return true;
|
||||
}
|
||||
} else { // else it's number
|
||||
if( _window.width() < disableOn ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if(e.type) {
|
||||
e.preventDefault();
|
||||
|
||||
// This will prevent popup from closing if element is inside and popup is already opened
|
||||
if(mfp.isOpen) {
|
||||
e.stopPropagation();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
options.el = $(e.mfpEl);
|
||||
if(options.delegate) {
|
||||
options.items = el.find(options.delegate);
|
||||
}
|
||||
mfp.open(options);
|
||||
},
|
||||
|
||||
|
||||
/**
|
||||
* Updates text on preloader
|
||||
*/
|
||||
updateStatus: function(status, text) {
|
||||
|
||||
if(mfp.preloader) {
|
||||
if(_prevStatus !== status) {
|
||||
mfp.container.removeClass('mfp-s-'+_prevStatus);
|
||||
}
|
||||
|
||||
if(!text && status === 'loading') {
|
||||
text = mfp.st.tLoading;
|
||||
}
|
||||
|
||||
var data = {
|
||||
status: status,
|
||||
text: text
|
||||
};
|
||||
// allows to modify status
|
||||
_mfpTrigger('UpdateStatus', data);
|
||||
|
||||
status = data.status;
|
||||
text = data.text;
|
||||
|
||||
mfp.preloader.html(text);
|
||||
|
||||
mfp.preloader.find('a').on('click', function(e) {
|
||||
e.stopImmediatePropagation();
|
||||
});
|
||||
|
||||
mfp.container.addClass('mfp-s-'+status);
|
||||
_prevStatus = status;
|
||||
}
|
||||
},
|
||||
|
||||
|
||||
/*
|
||||
"Private" helpers that aren't private at all
|
||||
*/
|
||||
// Check to close popup or not
|
||||
// "target" is an element that was clicked
|
||||
_checkIfClose: function(target) {
|
||||
|
||||
if($(target).hasClass(PREVENT_CLOSE_CLASS)) {
|
||||
return;
|
||||
}
|
||||
|
||||
var closeOnContent = mfp.st.closeOnContentClick;
|
||||
var closeOnBg = mfp.st.closeOnBgClick;
|
||||
|
||||
if(closeOnContent && closeOnBg) {
|
||||
return true;
|
||||
} else {
|
||||
|
||||
// We close the popup if click is on close button or on preloader. Or if there is no content.
|
||||
if(!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0]) ) {
|
||||
return true;
|
||||
}
|
||||
|
||||
// if click is outside the content
|
||||
if( (target !== mfp.content[0] && !$.contains(mfp.content[0], target)) ) {
|
||||
if(closeOnBg) {
|
||||
// last check, if the clicked element is in DOM, (in case it's removed onclick)
|
||||
if( $.contains(document, target) ) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
} else if(closeOnContent) {
|
||||
return true;
|
||||
}
|
||||
|
||||
}
|
||||
return false;
|
||||
},
|
||||
_addClassToMFP: function(cName) {
|
||||
mfp.bgOverlay.addClass(cName);
|
||||
mfp.wrap.addClass(cName);
|
||||
},
|
||||
_removeClassFromMFP: function(cName) {
|
||||
this.bgOverlay.removeClass(cName);
|
||||
mfp.wrap.removeClass(cName);
|
||||
},
|
||||
_hasScrollBar: function(winHeight) {
|
||||
return ( (mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()) );
|
||||
},
|
||||
_setFocus: function() {
|
||||
(mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus();
|
||||
},
|
||||
_onFocusIn: function(e) {
|
||||
if( e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target) ) {
|
||||
mfp._setFocus();
|
||||
return false;
|
||||
}
|
||||
},
|
||||
_parseMarkup: function(template, values, item) {
|
||||
var arr;
|
||||
if(item.data) {
|
||||
values = $.extend(item.data, values);
|
||||
}
|
||||
_mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item] );
|
||||
|
||||
$.each(values, function(key, value) {
|
||||
if(value === undefined || value === false) {
|
||||
return true;
|
||||
}
|
||||
arr = key.split('_');
|
||||
if(arr.length > 1) {
|
||||
var el = template.find(EVENT_NS + '-'+arr[0]);
|
||||
|
||||
if(el.length > 0) {
|
||||
var attr = arr[1];
|
||||
if(attr === 'replaceWith') {
|
||||
if(el[0] !== value[0]) {
|
||||
el.replaceWith(value);
|
||||
}
|
||||
} else if(attr === 'img') {
|
||||
if(el.is('img')) {
|
||||
el.attr('src', value);
|
||||
} else {
|
||||
el.replaceWith( '<img src="'+value+'" class="' + el.attr('class') + '" />' );
|
||||
}
|
||||
} else {
|
||||
el.attr(arr[1], value);
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
template.find(EVENT_NS + '-'+key).html(value);
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_getScrollbarSize: function() {
|
||||
// thx David
|
||||
if(mfp.scrollbarSize === undefined) {
|
||||
var scrollDiv = document.createElement("div");
|
||||
scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
|
||||
document.body.appendChild(scrollDiv);
|
||||
mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
|
||||
document.body.removeChild(scrollDiv);
|
||||
}
|
||||
return mfp.scrollbarSize;
|
||||
}
|
||||
|
||||
}; /* MagnificPopup core prototype end */
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Public static functions
|
||||
*/
|
||||
$.magnificPopup = {
|
||||
instance: null,
|
||||
proto: MagnificPopup.prototype,
|
||||
modules: [],
|
||||
|
||||
open: function(options, index) {
|
||||
_checkInstance();
|
||||
|
||||
if(!options) {
|
||||
options = {};
|
||||
} else {
|
||||
options = $.extend(true, {}, options);
|
||||
}
|
||||
|
||||
|
||||
options.isObj = true;
|
||||
options.index = index || 0;
|
||||
return this.instance.open(options);
|
||||
},
|
||||
|
||||
close: function() {
|
||||
return $.magnificPopup.instance && $.magnificPopup.instance.close();
|
||||
},
|
||||
|
||||
registerModule: function(name, module) {
|
||||
if(module.options) {
|
||||
$.magnificPopup.defaults[name] = module.options;
|
||||
}
|
||||
$.extend(this.proto, module.proto);
|
||||
this.modules.push(name);
|
||||
},
|
||||
|
||||
defaults: {
|
||||
|
||||
// Info about options is in docs:
|
||||
// http://dimsemenov.com/plugins/magnific-popup/documentation.html#options
|
||||
|
||||
disableOn: 0,
|
||||
|
||||
key: null,
|
||||
|
||||
midClick: false,
|
||||
|
||||
mainClass: '',
|
||||
|
||||
preloader: true,
|
||||
|
||||
focus: '', // CSS selector of input to focus after popup is opened
|
||||
|
||||
closeOnContentClick: false,
|
||||
|
||||
closeOnBgClick: true,
|
||||
|
||||
closeBtnInside: true,
|
||||
|
||||
showCloseBtn: true,
|
||||
|
||||
enableEscapeKey: true,
|
||||
|
||||
modal: false,
|
||||
|
||||
alignTop: false,
|
||||
|
||||
removalDelay: 0,
|
||||
|
||||
prependTo: null,
|
||||
|
||||
fixedContentPos: 'auto',
|
||||
|
||||
fixedBgPos: 'auto',
|
||||
|
||||
overflowY: 'auto',
|
||||
|
||||
closeMarkup: '<button title="%title%" type="button" class="mfp-close">×</button>',
|
||||
|
||||
tClose: 'Close (Esc)',
|
||||
|
||||
tLoading: 'Loading...'
|
||||
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
|
||||
$.fn.magnificPopup = function(options) {
|
||||
_checkInstance();
|
||||
|
||||
var jqEl = $(this);
|
||||
|
||||
// We call some API method of first param is a string
|
||||
if (typeof options === "string" ) {
|
||||
|
||||
if(options === 'open') {
|
||||
var items,
|
||||
itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,
|
||||
index = parseInt(arguments[1], 10) || 0;
|
||||
|
||||
if(itemOpts.items) {
|
||||
items = itemOpts.items[index];
|
||||
} else {
|
||||
items = jqEl;
|
||||
if(itemOpts.delegate) {
|
||||
items = items.find(itemOpts.delegate);
|
||||
}
|
||||
items = items.eq( index );
|
||||
}
|
||||
mfp._openClick({mfpEl:items}, jqEl, itemOpts);
|
||||
} else {
|
||||
if(mfp.isOpen)
|
||||
mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));
|
||||
}
|
||||
|
||||
} else {
|
||||
// clone options obj
|
||||
options = $.extend(true, {}, options);
|
||||
|
||||
/*
|
||||
* As Zepto doesn't support .data() method for objects
|
||||
* and it works only in normal browsers
|
||||
* we assign "options" object directly to the DOM element. FTW!
|
||||
*/
|
||||
if(_isJQ) {
|
||||
jqEl.data('magnificPopup', options);
|
||||
} else {
|
||||
jqEl[0].magnificPopup = options;
|
||||
}
|
||||
|
||||
mfp.addGroup(jqEl, options);
|
||||
|
||||
}
|
||||
return jqEl;
|
||||
};
|
||||
|
||||
|
||||
//Quick benchmark
|
||||
/*
|
||||
var start = performance.now(),
|
||||
i,
|
||||
rounds = 1000;
|
||||
|
||||
for(i = 0; i < rounds; i++) {
|
||||
|
||||
}
|
||||
console.log('Test #1:', performance.now() - start);
|
||||
|
||||
start = performance.now();
|
||||
for(i = 0; i < rounds; i++) {
|
||||
|
||||
}
|
||||
console.log('Test #2:', performance.now() - start);
|
||||
*/
|
||||
93
public/js/magnific-popup/js/fastclick.js
Normal file
@@ -0,0 +1,93 @@
|
||||
/**
|
||||
* FastClick event implementation. (removes 300ms delay on touch devices)
|
||||
* Based on https://developers.google.com/mobile/articles/fast_buttons
|
||||
*
|
||||
* You may use it outside the Magnific Popup by calling just:
|
||||
*
|
||||
* $('.your-el').mfpFastClick(function() {
|
||||
* console.log('Clicked!');
|
||||
* });
|
||||
*
|
||||
* To unbind:
|
||||
* $('.your-el').destroyMfpFastClick();
|
||||
*
|
||||
*
|
||||
* Note that it's a very basic and simple implementation, it blocks ghost click on the same element where it was bound.
|
||||
* If you need something more advanced, use plugin by FT Labs https://github.com/ftlabs/fastclick
|
||||
*
|
||||
*/
|
||||
|
||||
(function() {
|
||||
var ghostClickDelay = 1000,
|
||||
supportsTouch = 'ontouchstart' in window,
|
||||
unbindTouchMove = function() {
|
||||
_window.off('touchmove'+ns+' touchend'+ns);
|
||||
},
|
||||
eName = 'mfpFastClick',
|
||||
ns = '.'+eName;
|
||||
|
||||
|
||||
// As Zepto.js doesn't have an easy way to add custom events (like jQuery), so we implement it in this way
|
||||
$.fn.mfpFastClick = function(callback) {
|
||||
|
||||
return $(this).each(function() {
|
||||
|
||||
var elem = $(this),
|
||||
lock;
|
||||
|
||||
if( supportsTouch ) {
|
||||
|
||||
var timeout,
|
||||
startX,
|
||||
startY,
|
||||
pointerMoved,
|
||||
point,
|
||||
numPointers;
|
||||
|
||||
elem.on('touchstart' + ns, function(e) {
|
||||
pointerMoved = false;
|
||||
numPointers = 1;
|
||||
|
||||
point = e.originalEvent ? e.originalEvent.touches[0] : e.touches[0];
|
||||
startX = point.clientX;
|
||||
startY = point.clientY;
|
||||
|
||||
_window.on('touchmove'+ns, function(e) {
|
||||
point = e.originalEvent ? e.originalEvent.touches : e.touches;
|
||||
numPointers = point.length;
|
||||
point = point[0];
|
||||
if (Math.abs(point.clientX - startX) > 10 ||
|
||||
Math.abs(point.clientY - startY) > 10) {
|
||||
pointerMoved = true;
|
||||
unbindTouchMove();
|
||||
}
|
||||
}).on('touchend'+ns, function(e) {
|
||||
unbindTouchMove();
|
||||
if(pointerMoved || numPointers > 1) {
|
||||
return;
|
||||
}
|
||||
lock = true;
|
||||
e.preventDefault();
|
||||
clearTimeout(timeout);
|
||||
timeout = setTimeout(function() {
|
||||
lock = false;
|
||||
}, ghostClickDelay);
|
||||
callback();
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
elem.on('click' + ns, function() {
|
||||
if(!lock) {
|
||||
callback();
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
$.fn.destroyMfpFastClick = function() {
|
||||
$(this).off('touchstart' + ns + ' click' + ns);
|
||||
if(supportsTouch) _window.off('touchmove'+ns+' touchend'+ns);
|
||||
};
|
||||
})();
|
||||
229
public/js/magnific-popup/js/gallery.js
Normal file
@@ -0,0 +1,229 @@
|
||||
/**
|
||||
* Get looped index depending on number of slides
|
||||
*/
|
||||
var _getLoopedId = function(index) {
|
||||
var numSlides = mfp.items.length;
|
||||
if(index > numSlides - 1) {
|
||||
return index - numSlides;
|
||||
} else if(index < 0) {
|
||||
return numSlides + index;
|
||||
}
|
||||
return index;
|
||||
},
|
||||
_replaceCurrTotal = function(text, curr, total) {
|
||||
return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total);
|
||||
};
|
||||
|
||||
$.magnificPopup.registerModule('gallery', {
|
||||
|
||||
options: {
|
||||
enabled: false,
|
||||
arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',
|
||||
preload: [0,2],
|
||||
navigateByImgClick: true,
|
||||
arrows: true,
|
||||
|
||||
tPrev: 'Previous (Left arrow key)',
|
||||
tNext: 'Next (Right arrow key)',
|
||||
tCounter: '%curr% of %total%'
|
||||
},
|
||||
|
||||
proto: {
|
||||
initGallery: function() {
|
||||
|
||||
var gSt = mfp.st.gallery,
|
||||
ns = '.mfp-gallery',
|
||||
supportsFastClick = Boolean($.fn.mfpFastClick);
|
||||
|
||||
mfp.direction = true; // true - next, false - prev
|
||||
|
||||
if(!gSt || !gSt.enabled ) return false;
|
||||
|
||||
_wrapClasses += ' mfp-gallery';
|
||||
|
||||
_mfpOn(OPEN_EVENT+ns, function() {
|
||||
|
||||
if(gSt.navigateByImgClick) {
|
||||
mfp.wrap.on('click'+ns, '.mfp-img', function() {
|
||||
if(mfp.items.length > 1) {
|
||||
mfp.next();
|
||||
return false;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
_document.on('keydown'+ns, function(e) {
|
||||
if (e.keyCode === 37) {
|
||||
mfp.prev();
|
||||
} else if (e.keyCode === 39) {
|
||||
mfp.next();
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
_mfpOn('UpdateStatus'+ns, function(e, data) {
|
||||
if(data.text) {
|
||||
data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);
|
||||
}
|
||||
});
|
||||
|
||||
_mfpOn(MARKUP_PARSE_EVENT+ns, function(e, element, values, item) {
|
||||
var l = mfp.items.length;
|
||||
values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';
|
||||
});
|
||||
|
||||
_mfpOn('BuildControls' + ns, function() {
|
||||
if(mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {
|
||||
var markup = gSt.arrowMarkup,
|
||||
arrowLeft = mfp.arrowLeft = $( markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left') ).addClass(PREVENT_CLOSE_CLASS),
|
||||
arrowRight = mfp.arrowRight = $( markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right') ).addClass(PREVENT_CLOSE_CLASS);
|
||||
|
||||
var eName = supportsFastClick ? 'mfpFastClick' : 'click';
|
||||
arrowLeft[eName](function() {
|
||||
mfp.prev();
|
||||
});
|
||||
arrowRight[eName](function() {
|
||||
mfp.next();
|
||||
});
|
||||
|
||||
// Polyfill for :before and :after (adds elements with classes mfp-a and mfp-b)
|
||||
if(mfp.isIE7) {
|
||||
_getEl('b', arrowLeft[0], false, true);
|
||||
_getEl('a', arrowLeft[0], false, true);
|
||||
_getEl('b', arrowRight[0], false, true);
|
||||
_getEl('a', arrowRight[0], false, true);
|
||||
}
|
||||
|
||||
mfp.container.append(arrowLeft.add(arrowRight));
|
||||
}
|
||||
});
|
||||
|
||||
_mfpOn(CHANGE_EVENT+ns, function() {
|
||||
if(mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);
|
||||
|
||||
mfp._preloadTimeout = setTimeout(function() {
|
||||
mfp.preloadNearbyImages();
|
||||
mfp._preloadTimeout = null;
|
||||
}, 16);
|
||||
});
|
||||
|
||||
|
||||
_mfpOn(CLOSE_EVENT+ns, function() {
|
||||
_document.off(ns);
|
||||
mfp.wrap.off('click'+ns);
|
||||
|
||||
if(mfp.arrowLeft && supportsFastClick) {
|
||||
mfp.arrowLeft.add(mfp.arrowRight).destroyMfpFastClick();
|
||||
}
|
||||
mfp.arrowRight = mfp.arrowLeft = null;
|
||||
});
|
||||
|
||||
},
|
||||
next: function() {
|
||||
mfp.direction = true;
|
||||
mfp.index = _getLoopedId(mfp.index + 1);
|
||||
mfp.updateItemHTML();
|
||||
},
|
||||
prev: function() {
|
||||
mfp.direction = false;
|
||||
mfp.index = _getLoopedId(mfp.index - 1);
|
||||
mfp.updateItemHTML();
|
||||
},
|
||||
goTo: function(newIndex) {
|
||||
mfp.direction = (newIndex >= mfp.index);
|
||||
mfp.index = newIndex;
|
||||
mfp.updateItemHTML();
|
||||
},
|
||||
preloadNearbyImages: function() {
|
||||
var p = mfp.st.gallery.preload,
|
||||
preloadBefore = Math.min(p[0], mfp.items.length),
|
||||
preloadAfter = Math.min(p[1], mfp.items.length),
|
||||
i;
|
||||
|
||||
for(i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {
|
||||
mfp._preloadItem(mfp.index+i);
|
||||
}
|
||||
for(i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {
|
||||
mfp._preloadItem(mfp.index-i);
|
||||
}
|
||||
},
|
||||
_preloadItem: function(index) {
|
||||
index = _getLoopedId(index);
|
||||
|
||||
if(mfp.items[index].preloaded) {
|
||||
return;
|
||||
}
|
||||
|
||||
var item = mfp.items[index];
|
||||
if(!item.parsed) {
|
||||
item = mfp.parseEl( index );
|
||||
}
|
||||
|
||||
_mfpTrigger('LazyLoad', item);
|
||||
|
||||
if(item.type === 'image') {
|
||||
item.img = $('<img class="mfp-img" />').on('load.mfploader', function() {
|
||||
item.hasSize = true;
|
||||
}).on('error.mfploader', function() {
|
||||
item.hasSize = true;
|
||||
item.loadError = true;
|
||||
_mfpTrigger('LazyLoadError', item);
|
||||
}).attr('src', item.src);
|
||||
}
|
||||
|
||||
|
||||
item.preloaded = true;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
/*
|
||||
Touch Support that might be implemented some day
|
||||
|
||||
addSwipeGesture: function() {
|
||||
var startX,
|
||||
moved,
|
||||
multipleTouches;
|
||||
|
||||
return;
|
||||
|
||||
var namespace = '.mfp',
|
||||
addEventNames = function(pref, down, move, up, cancel) {
|
||||
mfp._tStart = pref + down + namespace;
|
||||
mfp._tMove = pref + move + namespace;
|
||||
mfp._tEnd = pref + up + namespace;
|
||||
mfp._tCancel = pref + cancel + namespace;
|
||||
};
|
||||
|
||||
if(window.navigator.msPointerEnabled) {
|
||||
addEventNames('MSPointer', 'Down', 'Move', 'Up', 'Cancel');
|
||||
} else if('ontouchstart' in window) {
|
||||
addEventNames('touch', 'start', 'move', 'end', 'cancel');
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
_window.on(mfp._tStart, function(e) {
|
||||
var oE = e.originalEvent;
|
||||
multipleTouches = moved = false;
|
||||
startX = oE.pageX || oE.changedTouches[0].pageX;
|
||||
}).on(mfp._tMove, function(e) {
|
||||
if(e.originalEvent.touches.length > 1) {
|
||||
multipleTouches = e.originalEvent.touches.length;
|
||||
} else {
|
||||
//e.preventDefault();
|
||||
moved = true;
|
||||
}
|
||||
}).on(mfp._tEnd + ' ' + mfp._tCancel, function(e) {
|
||||
if(moved && !multipleTouches) {
|
||||
var oE = e.originalEvent,
|
||||
diff = startX - (oE.pageX || oE.changedTouches[0].pageX);
|
||||
|
||||
if(diff > 20) {
|
||||
mfp.next();
|
||||
} else if(diff < -20) {
|
||||
mfp.prev();
|
||||
}
|
||||
}
|
||||
});
|
||||
},
|
||||
*/
|
||||
102
public/js/magnific-popup/js/iframe.js
Normal file
@@ -0,0 +1,102 @@
|
||||
|
||||
var IFRAME_NS = 'iframe',
|
||||
_emptyPage = '//about:blank',
|
||||
|
||||
_fixIframeBugs = function(isShowing) {
|
||||
if(mfp.currTemplate[IFRAME_NS]) {
|
||||
var el = mfp.currTemplate[IFRAME_NS].find('iframe');
|
||||
if(el.length) {
|
||||
// reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug
|
||||
if(!isShowing) {
|
||||
el[0].src = _emptyPage;
|
||||
}
|
||||
|
||||
// IE8 black screen bug fix
|
||||
if(mfp.isIE8) {
|
||||
el.css('display', isShowing ? 'block' : 'none');
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$.magnificPopup.registerModule(IFRAME_NS, {
|
||||
|
||||
options: {
|
||||
markup: '<div class="mfp-iframe-scaler">'+
|
||||
'<div class="mfp-close"></div>'+
|
||||
'<iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe>'+
|
||||
'</div>',
|
||||
|
||||
srcAction: 'iframe_src',
|
||||
|
||||
// we don't care and support only one default type of URL by default
|
||||
patterns: {
|
||||
youtube: {
|
||||
index: 'youtube.com',
|
||||
id: 'v=',
|
||||
src: '//www.youtube.com/embed/%id%?autoplay=1'
|
||||
},
|
||||
vimeo: {
|
||||
index: 'vimeo.com/',
|
||||
id: '/',
|
||||
src: '//player.vimeo.com/video/%id%?autoplay=1'
|
||||
},
|
||||
gmaps: {
|
||||
index: '//maps.google.',
|
||||
src: '%id%&output=embed'
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
proto: {
|
||||
initIframe: function() {
|
||||
mfp.types.push(IFRAME_NS);
|
||||
|
||||
_mfpOn('BeforeChange', function(e, prevType, newType) {
|
||||
if(prevType !== newType) {
|
||||
if(prevType === IFRAME_NS) {
|
||||
_fixIframeBugs(); // iframe if removed
|
||||
} else if(newType === IFRAME_NS) {
|
||||
_fixIframeBugs(true); // iframe is showing
|
||||
}
|
||||
}// else {
|
||||
// iframe source is switched, don't do anything
|
||||
//}
|
||||
});
|
||||
|
||||
_mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function() {
|
||||
_fixIframeBugs();
|
||||
});
|
||||
},
|
||||
|
||||
getIframe: function(item, template) {
|
||||
var embedSrc = item.src;
|
||||
var iframeSt = mfp.st.iframe;
|
||||
|
||||
$.each(iframeSt.patterns, function() {
|
||||
if(embedSrc.indexOf( this.index ) > -1) {
|
||||
if(this.id) {
|
||||
if(typeof this.id === 'string') {
|
||||
embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id)+this.id.length, embedSrc.length);
|
||||
} else {
|
||||
embedSrc = this.id.call( this, embedSrc );
|
||||
}
|
||||
}
|
||||
embedSrc = this.src.replace('%id%', embedSrc );
|
||||
return false; // break;
|
||||
}
|
||||
});
|
||||
|
||||
var dataObj = {};
|
||||
if(iframeSt.srcAction) {
|
||||
dataObj[iframeSt.srcAction] = embedSrc;
|
||||
}
|
||||
mfp._parseMarkup(template, dataObj, item);
|
||||
|
||||
mfp.updateStatus('ready');
|
||||
|
||||
return template;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
245
public/js/magnific-popup/js/image.js
Normal file
@@ -0,0 +1,245 @@
|
||||
var _imgInterval,
|
||||
_getTitle = function(item) {
|
||||
if(item.data && item.data.title !== undefined)
|
||||
return item.data.title;
|
||||
|
||||
var src = mfp.st.image.titleSrc;
|
||||
|
||||
if(src) {
|
||||
if($.isFunction(src)) {
|
||||
return src.call(mfp, item);
|
||||
} else if(item.el) {
|
||||
return item.el.attr(src) || '';
|
||||
}
|
||||
}
|
||||
return '';
|
||||
};
|
||||
|
||||
$.magnificPopup.registerModule('image', {
|
||||
|
||||
options: {
|
||||
markup: '<div class="mfp-figure">'+
|
||||
'<div class="mfp-close"></div>'+
|
||||
'<figure>'+
|
||||
'<div class="mfp-img"></div>'+
|
||||
'<figcaption>'+
|
||||
'<div class="mfp-bottom-bar">'+
|
||||
'<div class="mfp-title"></div>'+
|
||||
'<div class="mfp-counter"></div>'+
|
||||
'</div>'+
|
||||
'</figcaption>'+
|
||||
'</figure>'+
|
||||
'</div>',
|
||||
cursor: 'mfp-zoom-out-cur',
|
||||
titleSrc: 'title',
|
||||
verticalFit: true,
|
||||
tError: '<a href="%url%">The image</a> could not be loaded.'
|
||||
},
|
||||
|
||||
proto: {
|
||||
initImage: function() {
|
||||
var imgSt = mfp.st.image,
|
||||
ns = '.image';
|
||||
|
||||
mfp.types.push('image');
|
||||
|
||||
_mfpOn(OPEN_EVENT+ns, function() {
|
||||
if(mfp.currItem.type === 'image' && imgSt.cursor) {
|
||||
$(document.body).addClass(imgSt.cursor);
|
||||
}
|
||||
});
|
||||
|
||||
_mfpOn(CLOSE_EVENT+ns, function() {
|
||||
if(imgSt.cursor) {
|
||||
$(document.body).removeClass(imgSt.cursor);
|
||||
}
|
||||
_window.off('resize' + EVENT_NS);
|
||||
});
|
||||
|
||||
_mfpOn('Resize'+ns, mfp.resizeImage);
|
||||
if(mfp.isLowIE) {
|
||||
_mfpOn('AfterChange', mfp.resizeImage);
|
||||
}
|
||||
},
|
||||
resizeImage: function() {
|
||||
var item = mfp.currItem;
|
||||
if(!item || !item.img) return;
|
||||
|
||||
if(mfp.st.image.verticalFit) {
|
||||
var decr = 0;
|
||||
// fix box-sizing in ie7/8
|
||||
if(mfp.isLowIE) {
|
||||
decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'),10);
|
||||
}
|
||||
item.img.css('max-height', mfp.wH-decr);
|
||||
}
|
||||
},
|
||||
_onImageHasSize: function(item) {
|
||||
if(item.img) {
|
||||
|
||||
item.hasSize = true;
|
||||
|
||||
if(_imgInterval) {
|
||||
clearInterval(_imgInterval);
|
||||
}
|
||||
|
||||
item.isCheckingImgSize = false;
|
||||
|
||||
_mfpTrigger('ImageHasSize', item);
|
||||
|
||||
if(item.imgHidden) {
|
||||
if(mfp.content)
|
||||
mfp.content.removeClass('mfp-loading');
|
||||
|
||||
item.imgHidden = false;
|
||||
}
|
||||
|
||||
}
|
||||
},
|
||||
|
||||
/**
|
||||
* Function that loops until the image has size to display elements that rely on it asap
|
||||
*/
|
||||
findImageSize: function(item) {
|
||||
|
||||
var counter = 0,
|
||||
img = item.img[0],
|
||||
mfpSetInterval = function(delay) {
|
||||
|
||||
if(_imgInterval) {
|
||||
clearInterval(_imgInterval);
|
||||
}
|
||||
// decelerating interval that checks for size of an image
|
||||
_imgInterval = setInterval(function() {
|
||||
if(img.naturalWidth > 0) {
|
||||
mfp._onImageHasSize(item);
|
||||
return;
|
||||
}
|
||||
|
||||
if(counter > 200) {
|
||||
clearInterval(_imgInterval);
|
||||
}
|
||||
|
||||
counter++;
|
||||
if(counter === 3) {
|
||||
mfpSetInterval(10);
|
||||
} else if(counter === 40) {
|
||||
mfpSetInterval(50);
|
||||
} else if(counter === 100) {
|
||||
mfpSetInterval(500);
|
||||
}
|
||||
}, delay);
|
||||
};
|
||||
|
||||
mfpSetInterval(1);
|
||||
},
|
||||
|
||||
getImage: function(item, template) {
|
||||
|
||||
var guard = 0,
|
||||
|
||||
// image load complete handler
|
||||
onLoadComplete = function() {
|
||||
if(item) {
|
||||
if (item.img[0].complete) {
|
||||
item.img.off('.mfploader');
|
||||
|
||||
if(item === mfp.currItem){
|
||||
mfp._onImageHasSize(item);
|
||||
|
||||
mfp.updateStatus('ready');
|
||||
}
|
||||
|
||||
item.hasSize = true;
|
||||
item.loaded = true;
|
||||
|
||||
_mfpTrigger('ImageLoadComplete');
|
||||
|
||||
}
|
||||
else {
|
||||
// if image complete check fails 200 times (20 sec), we assume that there was an error.
|
||||
guard++;
|
||||
if(guard < 200) {
|
||||
setTimeout(onLoadComplete,100);
|
||||
} else {
|
||||
onLoadError();
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
// image error handler
|
||||
onLoadError = function() {
|
||||
if(item) {
|
||||
item.img.off('.mfploader');
|
||||
if(item === mfp.currItem){
|
||||
mfp._onImageHasSize(item);
|
||||
mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );
|
||||
}
|
||||
|
||||
item.hasSize = true;
|
||||
item.loaded = true;
|
||||
item.loadError = true;
|
||||
}
|
||||
},
|
||||
imgSt = mfp.st.image;
|
||||
|
||||
|
||||
var el = template.find('.mfp-img');
|
||||
if(el.length) {
|
||||
var img = document.createElement('img');
|
||||
img.className = 'mfp-img';
|
||||
if(item.el && item.el.find('img').length) {
|
||||
img.alt = item.el.find('img').attr('alt');
|
||||
}
|
||||
item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);
|
||||
img.src = item.src;
|
||||
|
||||
// without clone() "error" event is not firing when IMG is replaced by new IMG
|
||||
// TODO: find a way to avoid such cloning
|
||||
if(el.is('img')) {
|
||||
item.img = item.img.clone();
|
||||
}
|
||||
|
||||
img = item.img[0];
|
||||
if(img.naturalWidth > 0) {
|
||||
item.hasSize = true;
|
||||
} else if(!img.width) {
|
||||
item.hasSize = false;
|
||||
}
|
||||
}
|
||||
|
||||
mfp._parseMarkup(template, {
|
||||
title: _getTitle(item),
|
||||
img_replaceWith: item.img
|
||||
}, item);
|
||||
|
||||
mfp.resizeImage();
|
||||
|
||||
if(item.hasSize) {
|
||||
if(_imgInterval) clearInterval(_imgInterval);
|
||||
|
||||
if(item.loadError) {
|
||||
template.addClass('mfp-loading');
|
||||
mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src) );
|
||||
} else {
|
||||
template.removeClass('mfp-loading');
|
||||
mfp.updateStatus('ready');
|
||||
}
|
||||
return template;
|
||||
}
|
||||
|
||||
mfp.updateStatus('loading');
|
||||
item.loading = true;
|
||||
|
||||
if(!item.hasSize) {
|
||||
item.imgHidden = true;
|
||||
template.addClass('mfp-loading');
|
||||
mfp.findImageSize(item);
|
||||
}
|
||||
|
||||
return template;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
66
public/js/magnific-popup/js/inline.js
Normal file
@@ -0,0 +1,66 @@
|
||||
|
||||
var INLINE_NS = 'inline',
|
||||
_hiddenClass,
|
||||
_inlinePlaceholder,
|
||||
_lastInlineElement,
|
||||
_putInlineElementsBack = function() {
|
||||
if(_lastInlineElement) {
|
||||
_inlinePlaceholder.after( _lastInlineElement.addClass(_hiddenClass) ).detach();
|
||||
_lastInlineElement = null;
|
||||
}
|
||||
};
|
||||
|
||||
$.magnificPopup.registerModule(INLINE_NS, {
|
||||
options: {
|
||||
hiddenClass: 'hide', // will be appended with `mfp-` prefix
|
||||
markup: '',
|
||||
tNotFound: 'Content not found'
|
||||
},
|
||||
proto: {
|
||||
|
||||
initInline: function() {
|
||||
mfp.types.push(INLINE_NS);
|
||||
|
||||
_mfpOn(CLOSE_EVENT+'.'+INLINE_NS, function() {
|
||||
_putInlineElementsBack();
|
||||
});
|
||||
},
|
||||
|
||||
getInline: function(item, template) {
|
||||
|
||||
_putInlineElementsBack();
|
||||
|
||||
if(item.src) {
|
||||
var inlineSt = mfp.st.inline,
|
||||
el = $(item.src);
|
||||
|
||||
if(el.length) {
|
||||
|
||||
// If target element has parent - we replace it with placeholder and put it back after popup is closed
|
||||
var parent = el[0].parentNode;
|
||||
if(parent && parent.tagName) {
|
||||
if(!_inlinePlaceholder) {
|
||||
_hiddenClass = inlineSt.hiddenClass;
|
||||
_inlinePlaceholder = _getEl(_hiddenClass);
|
||||
_hiddenClass = 'mfp-'+_hiddenClass;
|
||||
}
|
||||
// replace target inline element with placeholder
|
||||
_lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);
|
||||
}
|
||||
|
||||
mfp.updateStatus('ready');
|
||||
} else {
|
||||
mfp.updateStatus('error', inlineSt.tNotFound);
|
||||
el = $('<div>');
|
||||
}
|
||||
|
||||
item.inlineElement = el;
|
||||
return el;
|
||||
}
|
||||
|
||||
mfp.updateStatus('ready');
|
||||
mfp._parseMarkup(template, {}, item);
|
||||
return template;
|
||||
}
|
||||
}
|
||||
});
|
||||
35
public/js/magnific-popup/js/retina.js
Normal file
@@ -0,0 +1,35 @@
|
||||
|
||||
var RETINA_NS = 'retina';
|
||||
|
||||
$.magnificPopup.registerModule(RETINA_NS, {
|
||||
options: {
|
||||
replaceSrc: function(item) {
|
||||
return item.src.replace(/\.\w+$/, function(m) { return '@2x' + m; });
|
||||
},
|
||||
ratio: 1 // Function or number. Set to 1 to disable.
|
||||
},
|
||||
proto: {
|
||||
initRetina: function() {
|
||||
if(window.devicePixelRatio > 1) {
|
||||
|
||||
var st = mfp.st.retina,
|
||||
ratio = st.ratio;
|
||||
|
||||
ratio = !isNaN(ratio) ? ratio : ratio();
|
||||
|
||||
if(ratio > 1) {
|
||||
_mfpOn('ImageHasSize' + '.' + RETINA_NS, function(e, item) {
|
||||
item.img.css({
|
||||
'max-width': item.img[0].naturalWidth / ratio,
|
||||
'width': '100%'
|
||||
});
|
||||
});
|
||||
_mfpOn('ElementParse' + '.' + RETINA_NS, function(e, item) {
|
||||
item.src = st.replaceSrc(item, ratio);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
});
|
||||
184
public/js/magnific-popup/js/zoom.js
Normal file
@@ -0,0 +1,184 @@
|
||||
var hasMozTransform,
|
||||
getHasMozTransform = function() {
|
||||
if(hasMozTransform === undefined) {
|
||||
hasMozTransform = document.createElement('p').style.MozTransform !== undefined;
|
||||
}
|
||||
return hasMozTransform;
|
||||
};
|
||||
|
||||
$.magnificPopup.registerModule('zoom', {
|
||||
|
||||
options: {
|
||||
enabled: false,
|
||||
easing: 'ease-in-out',
|
||||
duration: 300,
|
||||
opener: function(element) {
|
||||
return element.is('img') ? element : element.find('img');
|
||||
}
|
||||
},
|
||||
|
||||
proto: {
|
||||
|
||||
initZoom: function() {
|
||||
var zoomSt = mfp.st.zoom,
|
||||
ns = '.zoom',
|
||||
image;
|
||||
|
||||
if(!zoomSt.enabled || !mfp.supportsTransition) {
|
||||
return;
|
||||
}
|
||||
|
||||
var duration = zoomSt.duration,
|
||||
getElToAnimate = function(image) {
|
||||
var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),
|
||||
transition = 'all '+(zoomSt.duration/1000)+'s ' + zoomSt.easing,
|
||||
cssObj = {
|
||||
position: 'fixed',
|
||||
zIndex: 9999,
|
||||
left: 0,
|
||||
top: 0,
|
||||
'-webkit-backface-visibility': 'hidden'
|
||||
},
|
||||
t = 'transition';
|
||||
|
||||
cssObj['-webkit-'+t] = cssObj['-moz-'+t] = cssObj['-o-'+t] = cssObj[t] = transition;
|
||||
|
||||
newImg.css(cssObj);
|
||||
return newImg;
|
||||
},
|
||||
showMainContent = function() {
|
||||
mfp.content.css('visibility', 'visible');
|
||||
},
|
||||
openTimeout,
|
||||
animatedImg;
|
||||
|
||||
_mfpOn('BuildControls'+ns, function() {
|
||||
if(mfp._allowZoom()) {
|
||||
|
||||
clearTimeout(openTimeout);
|
||||
mfp.content.css('visibility', 'hidden');
|
||||
|
||||
// Basically, all code below does is clones existing image, puts in on top of the current one and animated it
|
||||
|
||||
image = mfp._getItemToZoom();
|
||||
|
||||
if(!image) {
|
||||
showMainContent();
|
||||
return;
|
||||
}
|
||||
|
||||
animatedImg = getElToAnimate(image);
|
||||
|
||||
animatedImg.css( mfp._getOffset() );
|
||||
|
||||
mfp.wrap.append(animatedImg);
|
||||
|
||||
openTimeout = setTimeout(function() {
|
||||
animatedImg.css( mfp._getOffset( true ) );
|
||||
openTimeout = setTimeout(function() {
|
||||
|
||||
showMainContent();
|
||||
|
||||
setTimeout(function() {
|
||||
animatedImg.remove();
|
||||
image = animatedImg = null;
|
||||
_mfpTrigger('ZoomAnimationEnded');
|
||||
}, 16); // avoid blink when switching images
|
||||
|
||||
}, duration); // this timeout equals animation duration
|
||||
|
||||
}, 16); // by adding this timeout we avoid short glitch at the beginning of animation
|
||||
|
||||
|
||||
// Lots of timeouts...
|
||||
}
|
||||
});
|
||||
_mfpOn(BEFORE_CLOSE_EVENT+ns, function() {
|
||||
if(mfp._allowZoom()) {
|
||||
|
||||
clearTimeout(openTimeout);
|
||||
|
||||
mfp.st.removalDelay = duration;
|
||||
|
||||
if(!image) {
|
||||
image = mfp._getItemToZoom();
|
||||
if(!image) {
|
||||
return;
|
||||
}
|
||||
animatedImg = getElToAnimate(image);
|
||||
}
|
||||
|
||||
|
||||
animatedImg.css( mfp._getOffset(true) );
|
||||
mfp.wrap.append(animatedImg);
|
||||
mfp.content.css('visibility', 'hidden');
|
||||
|
||||
setTimeout(function() {
|
||||
animatedImg.css( mfp._getOffset() );
|
||||
}, 16);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
_mfpOn(CLOSE_EVENT+ns, function() {
|
||||
if(mfp._allowZoom()) {
|
||||
showMainContent();
|
||||
if(animatedImg) {
|
||||
animatedImg.remove();
|
||||
}
|
||||
image = null;
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
_allowZoom: function() {
|
||||
return mfp.currItem.type === 'image';
|
||||
},
|
||||
|
||||
_getItemToZoom: function() {
|
||||
if(mfp.currItem.hasSize) {
|
||||
return mfp.currItem.img;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
},
|
||||
|
||||
// Get element postion relative to viewport
|
||||
_getOffset: function(isLarge) {
|
||||
var el;
|
||||
if(isLarge) {
|
||||
el = mfp.currItem.img;
|
||||
} else {
|
||||
el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);
|
||||
}
|
||||
|
||||
var offset = el.offset();
|
||||
var paddingTop = parseInt(el.css('padding-top'),10);
|
||||
var paddingBottom = parseInt(el.css('padding-bottom'),10);
|
||||
offset.top -= ( $(window).scrollTop() - paddingTop );
|
||||
|
||||
|
||||
/*
|
||||
|
||||
Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.
|
||||
|
||||
*/
|
||||
var obj = {
|
||||
width: el.width(),
|
||||
// fix Zepto height+padding issue
|
||||
height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop
|
||||
};
|
||||
|
||||
// I hate to do this, but there is no another option
|
||||
if( getHasMozTransform() ) {
|
||||
obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';
|
||||
} else {
|
||||
obj.left = offset.left;
|
||||
obj.top = offset.top;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
323
public/js/menu.js
Normal file
@@ -0,0 +1,323 @@
|
||||
// Title: tigra menu
|
||||
// Description: See the demo at url
|
||||
// URL: http://www.softcomplex.com/products/tigra_menu/
|
||||
// Version: 2.0 (commented source)
|
||||
// Date: 04-05-2003 (mm-dd-yyyy)
|
||||
// Contact: feedback@softcomplex.com (specify product title in the subject)
|
||||
// Tech. Support: http://www.softcomplex.com/forum/forumdisplay.php?fid=40
|
||||
// Notes: This script is free. Visit official site for further details.
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// global collection containing all menus on current page
|
||||
var A_MENUS = [];
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// menu class
|
||||
function menu (a_items, a_tpl) {
|
||||
|
||||
// browser check
|
||||
if (!document.body || !document.body.style)
|
||||
return;
|
||||
|
||||
// store items structure
|
||||
this.a_config = a_items;
|
||||
|
||||
// store template structure
|
||||
this.a_tpl = a_tpl;
|
||||
|
||||
// get menu id
|
||||
this.n_id = A_MENUS.length;
|
||||
|
||||
// declare collections
|
||||
this.a_index = [];
|
||||
this.a_children = [];
|
||||
|
||||
// assigh methods and event handlers
|
||||
this.expand = menu_expand;
|
||||
this.collapse = menu_collapse;
|
||||
|
||||
this.onclick = menu_onclick;
|
||||
this.onmouseout = menu_onmouseout;
|
||||
this.onmouseover = menu_onmouseover;
|
||||
this.onmousedown = menu_onmousedown;
|
||||
|
||||
// default level scope description structure
|
||||
this.a_tpl_def = {
|
||||
'block_top' : 16,
|
||||
'block_left' : 16,
|
||||
'top' : 20,
|
||||
'left' : 4,
|
||||
'width' : 120,
|
||||
'height' : 22,
|
||||
'hide_delay' : 0,
|
||||
'expd_delay' : 0,
|
||||
'css' : {
|
||||
'inner' : '',
|
||||
'outer' : ''
|
||||
}
|
||||
};
|
||||
|
||||
// assign methods and properties required to imulate parent item
|
||||
this.getprop = function (s_key) {
|
||||
return this.a_tpl_def[s_key];
|
||||
};
|
||||
|
||||
this.o_root = this;
|
||||
this.n_depth = -1;
|
||||
this.n_x = 0;
|
||||
this.n_y = 0;
|
||||
|
||||
// init items recursively
|
||||
for (n_order = 0; n_order < a_items.length; n_order++)
|
||||
new menu_item(this, n_order);
|
||||
|
||||
// register self in global collection
|
||||
A_MENUS[this.n_id] = this;
|
||||
|
||||
// make root level visible
|
||||
for (var n_order = 0; n_order < this.a_children.length; n_order++)
|
||||
this.a_children[n_order].e_oelement.style.visibility = 'visible';
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
function menu_collapse (n_id) {
|
||||
// cancel item open delay
|
||||
clearTimeout(this.o_showtimer);
|
||||
|
||||
// by default collapse to root level
|
||||
var n_tolevel = (n_id ? this.a_index[n_id].n_depth : 0);
|
||||
|
||||
// hide all items over the level specified
|
||||
for (n_id = 0; n_id < this.a_index.length; n_id++) {
|
||||
var o_curritem = this.a_index[n_id];
|
||||
if (o_curritem.n_depth > n_tolevel && o_curritem.b_visible) {
|
||||
o_curritem.e_oelement.style.visibility = 'hidden';
|
||||
o_curritem.b_visible = false;
|
||||
}
|
||||
}
|
||||
|
||||
// reset current item if mouse has gone out of items
|
||||
if (!n_id)
|
||||
this.o_current = null;
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
function menu_expand (n_id) {
|
||||
|
||||
// expand only when mouse is over some menu item
|
||||
if (this.o_hidetimer)
|
||||
return;
|
||||
|
||||
// lookup current item
|
||||
var o_item = this.a_index[n_id];
|
||||
|
||||
// close previously opened items
|
||||
if (this.o_current && this.o_current.n_depth >= o_item.n_depth)
|
||||
this.collapse(o_item.n_id);
|
||||
this.o_current = o_item;
|
||||
|
||||
// exit if there are no children to open
|
||||
if (!o_item.a_children)
|
||||
return;
|
||||
|
||||
// show direct child items
|
||||
for (var n_order = 0; n_order < o_item.a_children.length; n_order++) {
|
||||
var o_curritem = o_item.a_children[n_order];
|
||||
o_curritem.e_oelement.style.visibility = 'visible';
|
||||
o_curritem.b_visible = true;
|
||||
}
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
//
|
||||
// --------------------------------------------------------------------------------
|
||||
function menu_onclick (n_id) {
|
||||
// don't go anywhere if item has no link defined
|
||||
return Boolean(this.a_index[n_id].a_config[1]);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
function menu_onmouseout (n_id) {
|
||||
|
||||
// lookup new item's object
|
||||
var o_item = this.a_index[n_id];
|
||||
|
||||
// apply rollout
|
||||
o_item.e_oelement.className = o_item.getstyle(0, 0);
|
||||
o_item.e_ielement.className = o_item.getstyle(1, 0);
|
||||
|
||||
// update status line
|
||||
o_item.upstatus(7);
|
||||
|
||||
// run mouseover timer
|
||||
this.o_hidetimer = setTimeout('A_MENUS['+ this.n_id +'].collapse();',
|
||||
o_item.getprop('hide_delay'));
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
function menu_onmouseover (n_id) {
|
||||
|
||||
// cancel mouseoute menu close and item open delay
|
||||
clearTimeout(this.o_hidetimer);
|
||||
this.o_hidetimer = null;
|
||||
clearTimeout(this.o_showtimer);
|
||||
|
||||
// lookup new item's object
|
||||
var o_item = this.a_index[n_id];
|
||||
|
||||
// update status line
|
||||
o_item.upstatus();
|
||||
|
||||
// apply rollover
|
||||
o_item.e_oelement.className = o_item.getstyle(0, 1);
|
||||
o_item.e_ielement.className = o_item.getstyle(1, 1);
|
||||
|
||||
// if onclick open is set then no more actions required
|
||||
if (o_item.getprop('expd_delay') < 0)
|
||||
return;
|
||||
|
||||
// run expand timer
|
||||
this.o_showtimer = setTimeout('A_MENUS['+ this.n_id +'].expand(' + n_id + ');',
|
||||
o_item.getprop('expd_delay'));
|
||||
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// called when mouse button is pressed on menu item
|
||||
// --------------------------------------------------------------------------------
|
||||
function menu_onmousedown (n_id) {
|
||||
|
||||
// lookup new item's object
|
||||
var o_item = this.a_index[n_id];
|
||||
|
||||
// apply mouse down style
|
||||
o_item.e_oelement.className = o_item.getstyle(0, 2);
|
||||
o_item.e_ielement.className = o_item.getstyle(1, 2);
|
||||
|
||||
this.expand(n_id);
|
||||
// this.items[id].switch_style('onmousedown');
|
||||
}
|
||||
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// menu item Class
|
||||
function menu_item (o_parent, n_order) {
|
||||
|
||||
// store parameters passed to the constructor
|
||||
this.n_depth = o_parent.n_depth + 1;
|
||||
this.a_config = o_parent.a_config[n_order + (this.n_depth ? 3 : 0)];
|
||||
|
||||
// return if required parameters are missing
|
||||
if (!this.a_config) return;
|
||||
|
||||
// store info from parent item
|
||||
this.o_root = o_parent.o_root;
|
||||
this.o_parent = o_parent;
|
||||
this.n_order = n_order;
|
||||
|
||||
// register in global and parent's collections
|
||||
this.n_id = this.o_root.a_index.length;
|
||||
this.o_root.a_index[this.n_id] = this;
|
||||
o_parent.a_children[n_order] = this;
|
||||
|
||||
// calculate item's coordinates
|
||||
var o_root = this.o_root,
|
||||
a_tpl = this.o_root.a_tpl;
|
||||
|
||||
// assign methods
|
||||
this.getprop = mitem_getprop;
|
||||
this.getstyle = mitem_getstyle;
|
||||
this.upstatus = mitem_upstatus;
|
||||
|
||||
this.n_x = n_order
|
||||
? o_parent.a_children[n_order - 1].n_x + this.getprop('left')
|
||||
: o_parent.n_x + this.getprop('block_left');
|
||||
|
||||
this.n_y = n_order
|
||||
? o_parent.a_children[n_order - 1].n_y + this.getprop('top')
|
||||
: o_parent.n_y + this.getprop('block_top');
|
||||
|
||||
// generate item's HMTL
|
||||
document.write (
|
||||
'<a id="e' + o_root.n_id + '_'
|
||||
+ this.n_id +'o" class="' + this.getstyle(0, 0) + '" href="' + this.a_config[1] + '"'
|
||||
+ (this.a_config[2] && this.a_config[2]['tw'] ? ' target="'
|
||||
+ this.a_config[2]['tw'] + '"' : '') + ' style="position: absolute; top: '
|
||||
+ this.n_y + 'px; left: ' + this.n_x + 'px; width: '
|
||||
+ this.getprop('width') + 'px; height: '
|
||||
+ this.getprop('height') + 'px; visibility: hidden;'
|
||||
+' z-index: ' + this.n_depth + ';" '
|
||||
+ 'onclick="return A_MENUS[' + o_root.n_id + '].onclick('
|
||||
+ this.n_id + ');" onmouseout="A_MENUS[' + o_root.n_id + '].onmouseout('
|
||||
+ this.n_id + ');" onmouseover="A_MENUS[' + o_root.n_id + '].onmouseover('
|
||||
+ this.n_id + ');" onmousedown="A_MENUS[' + o_root.n_id + '].onmousedown('
|
||||
+ this.n_id + ');"><div id="e' + o_root.n_id + '_'
|
||||
+ this.n_id +'i" class="' + this.getstyle(1, 0) + '">'
|
||||
+ this.a_config[0] + "</div></a>\n"
|
||||
);
|
||||
this.e_ielement = document.getElementById('e' + o_root.n_id + '_' + this.n_id + 'i');
|
||||
this.e_oelement = document.getElementById('e' + o_root.n_id + '_' + this.n_id + 'o');
|
||||
|
||||
this.b_visible = !this.n_depth;
|
||||
|
||||
// no more initialization if leaf
|
||||
if (this.a_config.length < 4)
|
||||
return;
|
||||
|
||||
// node specific methods and properties
|
||||
this.a_children = [];
|
||||
|
||||
// init downline recursively
|
||||
for (var n_order = 0; n_order < this.a_config.length - 3; n_order++)
|
||||
new menu_item(this, n_order);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// reads property from template file, inherits from parent level if not found
|
||||
// ------------------------------------------------------------------------------------------
|
||||
function mitem_getprop (s_key) {
|
||||
|
||||
// check if value is defined for current level
|
||||
var s_value = null,
|
||||
a_level = this.o_root.a_tpl[this.n_depth];
|
||||
|
||||
// return value if explicitly defined
|
||||
if (a_level)
|
||||
s_value = a_level[s_key];
|
||||
|
||||
// request recursively from parent levels if not defined
|
||||
return (s_value == null ? this.o_parent.getprop(s_key) : s_value);
|
||||
}
|
||||
// --------------------------------------------------------------------------------
|
||||
// reads property from template file, inherits from parent level if not found
|
||||
// ------------------------------------------------------------------------------------------
|
||||
function mitem_getstyle (n_pos, n_state) {
|
||||
|
||||
var a_css = this.getprop('css');
|
||||
var a_oclass = a_css[n_pos ? 'inner' : 'outer'];
|
||||
|
||||
// same class for all states
|
||||
if (typeof(a_oclass) == 'string')
|
||||
return a_oclass;
|
||||
|
||||
// inherit class from previous state if not explicitly defined
|
||||
for (var n_currst = n_state; n_currst >= 0; n_currst--)
|
||||
if (a_oclass[n_currst])
|
||||
return a_oclass[n_currst];
|
||||
}
|
||||
|
||||
// ------------------------------------------------------------------------------------------
|
||||
// updates status bar message of the browser
|
||||
// ------------------------------------------------------------------------------------------
|
||||
function mitem_upstatus (b_clear) {
|
||||
window.setTimeout("window.status=unescape('" + (b_clear
|
||||
? ''
|
||||
: (this.a_config[2] && this.a_config[2]['sb']
|
||||
? escape(this.a_config[2]['sb'])
|
||||
: escape(this.a_config[0]) + (this.a_config[1]
|
||||
? ' ('+ escape(this.a_config[1]) + ')'
|
||||
: ''))) + "')", 10);
|
||||
}
|
||||
|
||||
// --------------------------------------------------------------------------------
|
||||
// that's all folks
|
||||
48
public/js/menu_items.js
Normal file
@@ -0,0 +1,48 @@
|
||||
/*
|
||||
--- menu items ---
|
||||
note that this structure has changed its format since previous version.
|
||||
additional third parameter is added for item scope settings.
|
||||
Now this structure is compatible with Tigra Menu GOLD.
|
||||
Format description can be found in product documentation.
|
||||
*/
|
||||
var MENU_ITEMS = [
|
||||
['Audio',null,null,
|
||||
['Winamp',"link.php",null],
|
||||
['Winamp',"link.php",null],
|
||||
['Winamp',"link.php",null],
|
||||
['Winamp',"link.php",null],
|
||||
['Winamp',"link.php",null],
|
||||
['Winamp',"link.php",null]
|
||||
|
||||
],
|
||||
|
||||
['Menu Compatibility', null, null,
|
||||
['Supported Browsers', null, null,
|
||||
['Win32 Browsers', null, null,
|
||||
['Internet Explorer 5+'],
|
||||
['Netscape 6.0+'],
|
||||
['Mozilla 0.9+'],
|
||||
['AOL 5+'],
|
||||
['Opera 5+']
|
||||
],
|
||||
['Mac OS Browsers', null, null,
|
||||
['Internet Explorer 5+'],
|
||||
['Netscape 6.0+'],
|
||||
['Mozilla 0.9+'],
|
||||
['AOL 5+'],
|
||||
['Safari 1.0+']
|
||||
],
|
||||
['KDE (Linux, FreeBSD)', null, null,
|
||||
['Netscape 6.0+'],
|
||||
['Mozilla 0.9+']
|
||||
]
|
||||
],
|
||||
['Unsupported Browsers', null, null,
|
||||
['Internet Explorer 4.x'],
|
||||
['Netscape 4.x']
|
||||
],
|
||||
['Report test results', 'mailto:feedback@softcomplex.com?subject=Tigra Menu Test Results'],
|
||||
]
|
||||
|
||||
];
|
||||
|
||||
49
public/js/menu_tpl.js
Normal file
@@ -0,0 +1,49 @@
|
||||
/*
|
||||
--- menu level scope settins structure ---
|
||||
note that this structure has changed its format since previous version.
|
||||
Now this structure has the same layout as Tigra Menu GOLD.
|
||||
Format description can be found in product documentation.
|
||||
*/
|
||||
var MENU_POS = [
|
||||
{
|
||||
// item sizes
|
||||
'height': 24,
|
||||
'width': 120,
|
||||
// menu block offset from the origin:
|
||||
// for root level origin is upper left corner of the page
|
||||
// for other levels origin is upper left corner of parent item
|
||||
'block_top': 170,
|
||||
'block_left': 150,
|
||||
// offsets between items of the same level
|
||||
'top': 0,
|
||||
'left': 119,
|
||||
// time in milliseconds before menu is hidden after cursor has gone out
|
||||
// of any items
|
||||
'hide_delay': 200,
|
||||
'expd_delay': 200,
|
||||
'css' : {
|
||||
'outer': ['m0l0oout', 'm0l0oover'],
|
||||
'inner': ['m0l0iout', 'm0l0iover']
|
||||
}
|
||||
},
|
||||
{
|
||||
'height': 20,
|
||||
'width': 150,
|
||||
'block_top': 23,
|
||||
'block_left': 0,
|
||||
'top': 21,
|
||||
'left': 0,
|
||||
'css': {
|
||||
'outer' : ['m0l1oout', 'm0l1oover'],
|
||||
'inner' : ['m0l1iout', 'm0l1iover']
|
||||
}
|
||||
},
|
||||
{
|
||||
'block_top': 5,
|
||||
'block_left': 140,
|
||||
'css': {
|
||||
'outer': ['m0l2oout', 'm0l2oover'],
|
||||
'inner': ['m0l1iout', 'm0l2iover']
|
||||
}
|
||||
}
|
||||
]
|
||||
6
public/js/mmenu/.gitignore
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
# Ignore Mac system files.
|
||||
._*
|
||||
|
||||
# Ignore sass-cache files.
|
||||
*.sass-cache*
|
||||
*.scssc
|
||||
123
public/js/mmenu/Guardfile
Normal file
@@ -0,0 +1,123 @@
|
||||
# Guardfile for the jQuery mmenu plugin javascript files.
|
||||
# Basically, all non-minified files in the "src/js" directory are minified in the "dist/js" directory.
|
||||
|
||||
# For some reason, uglify only seems to work if the input and output is the same file.
|
||||
# Therefor, we need to copy the contents from the original files to the minified files (using concat) before they can be minified.
|
||||
# IMHO, this is pretty idiotic.
|
||||
|
||||
|
||||
|
||||
|
||||
# Minify core functionality (on canvas)
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.oncanvas), input_dir: "src/js", output: "dist/js/jquery.mmenu.oncanvas.min"
|
||||
guard 'uglify', :destination_file => "dist/js/jquery.mmenu.oncanvas.min.js" do
|
||||
watch ('dist/js/jquery.mmenu.oncanvas.min.js')
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
# Minify addons
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.autoheight), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.autoheight.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.autoheight.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.autoheight.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.backbutton), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.backbutton.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.backbutton.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.backbutton.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.buttonbars), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.buttonbars.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.buttonbars.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.buttonbars.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.counters), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.counters.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.counters.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.counters.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.dividers), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.dividers.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.dividers.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.dividers.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.dragopen), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.dragopen.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.dragopen.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.dragopen.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.fixedelements), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.fixedelements.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.fixedelements.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.fixedelements.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.footer), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.footer.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.footer.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.footer.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.header), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.header.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.header.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.header.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.offcanvas), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.offcanvas.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.offcanvas.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.offcanvas.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.searchfield), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.searchfield.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.searchfield.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.searchfield.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.sectionindexer), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.sectionindexer.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.sectionindexer.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.sectionindexer.min.js')
|
||||
end
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.toggles), input_dir: "src/js/addons", output: "dist/js/addons/jquery.mmenu.toggles.min"
|
||||
guard 'uglify', :destination_file => "dist/js/addons/jquery.mmenu.toggles.min.js" do
|
||||
watch ('dist/js/addons/jquery.mmenu.toggles.min.js')
|
||||
end
|
||||
|
||||
|
||||
|
||||
|
||||
# Concatenate core functionality + off canvas
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.oncanvas.min addons/jquery.mmenu.offcanvas.min), input_dir: "dist/js", output: "dist/js/jquery.mmenu.min"
|
||||
|
||||
|
||||
|
||||
|
||||
# Concatenate core functionality + off canvas + addons
|
||||
|
||||
guard :concat, type: "js", files: %w(jquery.mmenu.min addons/jquery.mmenu.autoheight.min addons/jquery.mmenu.backbutton.min addons/jquery.mmenu.buttonbars.min addons/jquery.mmenu.counters.min addons/jquery.mmenu.dividers.min addons/jquery.mmenu.dragopen.min addons/jquery.mmenu.fixedelements.min addons/jquery.mmenu.footer.min addons/jquery.mmenu.header.min addons/jquery.mmenu.searchfield.min addons/jquery.mmenu.sectionindexer.min addons/jquery.mmenu.toggles.min), input_dir: "dist/js", output: "dist/js/jquery.mmenu.min.all"
|
||||
|
||||
|
||||
|
||||
|
||||
# Umd all minified files
|
||||
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/jquery.mmenu.oncanvas.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/jquery.mmenu.oncanvas.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/jquery.mmenu.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/jquery.mmenu.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/jquery.mmenu.min.all js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/jquery.mmenu.umd.all"
|
||||
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.autoheight.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.autoheight.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.backbutton.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.backbutton.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.buttonbars.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.buttonbars.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.counters.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.counters.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.dividers.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.dividers.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.dragopen.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.dragopen.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.fixedelements.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.fixedelements.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.footer.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.footer.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.header.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.header.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.offcanvas.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.offcanvas.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.searchfield.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.searchfield.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.sectionindexer.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.searchfield.umd"
|
||||
guard :concat, type: "js", files: %w(js_umd/_inc/prefix js/addons/jquery.mmenu.toggles.min js_umd/_inc/affix), input_dir: "dist", output: "dist/js_umd/addons/jquery.mmenu.toggles.umd"
|
||||
36
public/js/mmenu/README.md
Normal file
@@ -0,0 +1,36 @@
|
||||
jQuery.mmenu
|
||||
================
|
||||
|
||||
The best jQuery plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp. It is very customizable through a wide range of options, extensions and add-ons and it will always fit your needs.<br />
|
||||
Demos, a tutorial, documentation and support: http://mmenu.frebsite.nl
|
||||
|
||||
<img src="http://mmenu.frebsite.nl/img/preview-3.png" alt="jQuery mmenu" width="100%" />
|
||||
|
||||
**Position and z-position**<br />
|
||||
The menu can be positioned at the top, right, bottom or left, at the back, front or next to the page.
|
||||
|
||||
**Submenus**<br />
|
||||
Use sliding horizontal or expanding vertical submenus.
|
||||
|
||||
**Touch-ready**<br />
|
||||
Optionally reveal the menu by dragging the page out of the viewport.
|
||||
|
||||
**Add-ons**<br />
|
||||
Add a search field, headers, labels, counters, toggles and more.
|
||||
|
||||
**Extensions**<br />
|
||||
Easily add opening and closing effects, change the color scheme or change the size and position.
|
||||
|
||||
**Support**<br />
|
||||
Plays nicely with jQuery Mobile and works well on all major desktop and mobile browsers.
|
||||
|
||||
### Learn more
|
||||
+ [Tutorial](http://mmenu.frebsite.nl/tutorial/)
|
||||
+ [Options](http://mmenu.frebsite.nl/documentation/options/)
|
||||
+ [Custom events](http://mmenu.frebsite.nl/documentation/custom-events.html)
|
||||
+ [Extensions](http://mmenu.frebsite.nl/documentation/extensions/)
|
||||
+ [Add-ons](http://mmenu.frebsite.nl/documentation/addons/)
|
||||
|
||||
### Licence
|
||||
The jQuery.mmenu plugin is dual licensed under the MIT license:
|
||||
+ http://en.wikipedia.org/wiki/MIT_License
|
||||
24
public/js/mmenu/bower.json
Normal file
@@ -0,0 +1,24 @@
|
||||
{
|
||||
"name" : "jQuery.mmenu",
|
||||
"version" : "5.0.4",
|
||||
"authors" : "Fred Heusschen <info@frebsite.nl>",
|
||||
"description" : "The best jQuery plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp.",
|
||||
"keywords" : [
|
||||
"app",
|
||||
"list",
|
||||
"listview",
|
||||
"megamenu",
|
||||
"menu",
|
||||
"mmenu",
|
||||
"mobile",
|
||||
"navigation",
|
||||
"off-canvas",
|
||||
"on-canvas",
|
||||
"panels",
|
||||
"submenu"
|
||||
],
|
||||
"license": "MIT",
|
||||
"dependencies" : {
|
||||
"jquery" : ">= 1.7.0"
|
||||
}
|
||||
}
|
||||
21
public/js/mmenu/composer.json
Normal file
@@ -0,0 +1,21 @@
|
||||
{
|
||||
"name" : "jQuery.mmenu",
|
||||
"version" : "5.0.4",
|
||||
"authors" : "Fred Heusschen <info@frebsite.nl>",
|
||||
"description" : "The best jQuery plugin for app look-alike on- and off-canvas menus with sliding submenus for your website and webapp.",
|
||||
"keywords" : [
|
||||
"app",
|
||||
"list",
|
||||
"listview",
|
||||
"megamenu",
|
||||
"menu",
|
||||
"mmenu",
|
||||
"mobile",
|
||||
"navigation",
|
||||
"off-canvas",
|
||||
"on-canvas",
|
||||
"panels",
|
||||
"submenu"
|
||||
],
|
||||
"license": "MIT"
|
||||
}
|
||||
62
public/js/mmenu/demo/advanced.html
Normal file
@@ -0,0 +1,62 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="author" content="www.frebsite.nl" />
|
||||
<meta name="viewport" content="width=device-width initial-scale=1.0 maximum-scale=1.0 user-scalable=yes" />
|
||||
|
||||
<title>jQuery.mmenu demo</title>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="css/demo.css" />
|
||||
<link type="text/css" rel="stylesheet" href="../dist/css/jquery.mmenu.all.css" />
|
||||
|
||||
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
|
||||
<script type="text/javascript" src="../dist/js/jquery.mmenu.min.all.js"></script>
|
||||
<script type="text/javascript">
|
||||
$(function() {
|
||||
$('nav#menu').mmenu({
|
||||
extensions : [ 'effect-slide', 'pageshadow' ],
|
||||
header : true,
|
||||
searchfield : true,
|
||||
counters : true,
|
||||
footer : {
|
||||
add : true,
|
||||
content : '<a href="mmenu.frebsite.nl">Visit website ›</a>'
|
||||
}
|
||||
});
|
||||
});
|
||||
</script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="page">
|
||||
<div class="header">
|
||||
<a href="#menu"></a>
|
||||
Demo
|
||||
</div>
|
||||
<div class="content">
|
||||
<p><strong>This is an advanced demo.</strong><br />
|
||||
Click the menu icon to open the menu.</p>
|
||||
<p>For more demos, a tutorial, documentation and support, please visit <a href="http://mmenu.frebsite.nl" target="_blank">mmenu.frebsite.nl</a></p>
|
||||
</div>
|
||||
<nav id="menu">
|
||||
<ul>
|
||||
<li><a href="#">Home</a></li>
|
||||
<li><a href="#about">About us</a>
|
||||
<ul>
|
||||
<li><a href="#about/history">History</a></li>
|
||||
<li><a href="#about/team">The team</a>
|
||||
<ul>
|
||||
<li><a href="#about/team/management">Management</a></li>
|
||||
<li><a href="#about/team/sales">Sales</a></li>
|
||||
<li><a href="#about/team/development">Development</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#about/address">Our address</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#contact">Contact</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
98
public/js/mmenu/demo/css/demo.css
Normal file
@@ -0,0 +1,98 @@
|
||||
html, body
|
||||
{
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
body
|
||||
{
|
||||
background-color: #fff;
|
||||
font-family: Arial, Helvetica, Verdana;
|
||||
font-size: 14px;
|
||||
line-height: 22px;
|
||||
color: #666;
|
||||
position: relative;
|
||||
-webkit-text-size-adjust: none;
|
||||
}
|
||||
body *
|
||||
{
|
||||
text-shadow: none;
|
||||
}
|
||||
h1, h2, h3, h4, h5, h6
|
||||
{
|
||||
line-height: 1;
|
||||
font-weight: bold;
|
||||
margin: 20px 0 10px 0;
|
||||
}
|
||||
h1, h2, h3
|
||||
{
|
||||
font-size: 18px;
|
||||
}
|
||||
h4, h5, h6
|
||||
{
|
||||
font-size: 16px;
|
||||
}
|
||||
p
|
||||
{
|
||||
margin: 0 0 10px 0;
|
||||
}
|
||||
a, a:link, a:active, a:visited, a:hover
|
||||
{
|
||||
color: inherit;
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
nav:not(.mm-menu)
|
||||
{
|
||||
display: none;
|
||||
}
|
||||
|
||||
.header,
|
||||
.content,
|
||||
.footer
|
||||
{
|
||||
text-align: center;
|
||||
}
|
||||
.header,
|
||||
.footer
|
||||
{
|
||||
background: #777;
|
||||
font-size: 16px;
|
||||
font-weight: bold;
|
||||
color: #fff;
|
||||
line-height: 40px;
|
||||
|
||||
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
width: 100%;
|
||||
height: 40px;
|
||||
padding: 0 50px;
|
||||
}
|
||||
.header.fixed
|
||||
{
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.footer.fixed
|
||||
{
|
||||
position: fixed;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
}
|
||||
.header a
|
||||
{
|
||||
background: center center no-repeat transparent;
|
||||
background-image: url( data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAZCAYAAADE6YVjAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAADhJREFUeNpi/P//PwOtARMDHQBdLGFBYtMq3BiHT3DRPU4YR4NrNAmPJuHRJDyahEeT8Ii3BCDAAF0WBj5Er5idAAAAAElFTkSuQmCC );
|
||||
|
||||
display: block;
|
||||
width: 40px;
|
||||
height: 40px;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 10px;
|
||||
}
|
||||
.content
|
||||
{
|
||||
padding: 150px 50px 50px 50px;
|
||||
}
|
||||