2 * Thickbox 3.1 - One Box To Rule Them All.
3 * By Cody Lindley (http://www.codylindley.com)
4 * Copyright (c) 2007 cody lindley
5 * Licensed under the MIT License: http://www.opensource.org/licenses/mit-license.php
8 var tb_pathToImage
= "/soc/content/images/loadingAnimation.gif";
10 /*!!!!!!!!!!!!!!!!! edit below this line at your own risk !!!!!!!!!!!!!!!!!!!!!!!*/
12 //on page load call tb_init
13 $(document
).ready(function(){
14 tb_init('a.thickbox, area.thickbox, input.thickbox');//pass where to apply thickbox
15 imgLoader
= new Image();// preload image
16 imgLoader
.src
= tb_pathToImage
;
19 //add thickbox to href & area elements that have a class of .thickbox
20 function tb_init(domChunk
){
21 $(domChunk
).click(function(){
22 var t
= this.title
|| this.name
|| null;
23 var a
= this.href
|| this.alt
;
24 var g
= this.rel
|| false;
31 function tb_show(caption
, url
, imageGroup
) {//function called when the user clicks on a thickbox link
34 if (typeof document
.body
.style
.maxHeight
=== "undefined") {//if IE 6
35 $("body","html").css({height
: "100%", width
: "100%"});
36 $("html").css("overflow","hidden");
37 if (document
.getElementById("TB_HideSelect") === null) {//iframe to hide select elements in ie6
38 $("body").append("<iframe id='TB_HideSelect'></iframe><div id='TB_overlay'></div><div id='TB_window'></div>");
39 $("#TB_overlay").click(tb_remove
);
42 if(document
.getElementById("TB_overlay") === null){
43 $("body").append("<div id='TB_overlay'></div><div id='TB_window'></div>");
44 $("#TB_overlay").click(tb_remove
);
48 if(tb_detectMacXFF()){
49 $("#TB_overlay").addClass("TB_overlayMacFFBGHack");//use png overlay so hide flash
51 $("#TB_overlay").addClass("TB_overlayBG");//use background and opacity
54 if(caption
===null){caption
="";}
55 $("body").append("<div id='TB_load'><img src='"+imgLoader
.src
+"' /></div>");//add loader to the page
56 $('#TB_load').show();//show loader
59 if(url
.indexOf("?")!==-1){ //ff there is a query string involved
60 baseURL
= url
.substr(0, url
.indexOf("?"));
65 var urlString
= /\.jpg$|\.jpeg$|\.png$|\.gif$|\.bmp$/;
66 var urlType
= baseURL
.toLowerCase().match(urlString
);
68 if(urlType
== '.jpg' || urlType
== '.jpeg' || urlType
== '.png' || urlType
== '.gif' || urlType
== '.bmp'){//code to show images
79 TB_TempArray
= $("a[@rel="+imageGroup
+"]").get();
80 for (TB_Counter
= 0; ((TB_Counter
< TB_TempArray
.length
) && (TB_NextHTML
=== "")); TB_Counter
++) {
81 var urlTypeTemp
= TB_TempArray
[TB_Counter
].href
.toLowerCase().match(urlString
);
82 if (!(TB_TempArray
[TB_Counter
].href
== url
)) {
84 TB_NextCaption
= TB_TempArray
[TB_Counter
].title
;
85 TB_NextURL
= TB_TempArray
[TB_Counter
].href
;
86 TB_NextHTML
= "<span id='TB_next'> <a href='#'>Next ></a></span>";
88 TB_PrevCaption
= TB_TempArray
[TB_Counter
].title
;
89 TB_PrevURL
= TB_TempArray
[TB_Counter
].href
;
90 TB_PrevHTML
= "<span id='TB_prev'> <a href='#'>< Prev</a></span>";
94 TB_imageCount
= "Image " + (TB_Counter
+ 1) +" of "+ (TB_TempArray
.length
);
99 imgPreloader
= new Image();
100 imgPreloader
.onload = function(){
101 imgPreloader
.onload
= null;
103 // Resizing large images - orginal by Christian Montoya edited by me.
104 var pagesize
= tb_getPageSize();
105 var x
= pagesize
[0] - 150;
106 var y
= pagesize
[1] - 150;
107 var imageWidth
= imgPreloader
.width
;
108 var imageHeight
= imgPreloader
.height
;
109 if (imageWidth
> x
) {
110 imageHeight
= imageHeight
* (x
/ imageWidth
);
112 if (imageHeight
> y
) {
113 imageWidth
= imageWidth
* (y
/ imageHeight
);
116 } else if (imageHeight
> y
) {
117 imageWidth
= imageWidth
* (y
/ imageHeight
);
119 if (imageWidth
> x
) {
120 imageHeight
= imageHeight
* (x
/ imageWidth
);
126 TB_WIDTH
= imageWidth
+ 30;
127 TB_HEIGHT
= imageHeight
+ 60;
128 $("#TB_window").append("<a href='' id='TB_ImageOff' title='Close'><img id='TB_Image' src='"+url
+"' width='"+imageWidth
+"' height='"+imageHeight
+"' alt='"+caption
+"'/></a>" + "<div id='TB_caption'>"+caption
+"<div id='TB_secondLine'>" + TB_imageCount
+ TB_PrevHTML
+ TB_NextHTML
+ "</div></div><div id='TB_closeWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a> or Esc Key</div>");
130 $("#TB_closeWindowButton").click(tb_remove
);
132 if (!(TB_PrevHTML
=== "")) {
134 if($(document
).unbind("click",goPrev
)){$(document
).unbind("click",goPrev
);}
135 $("#TB_window").remove();
136 $("body").append("<div id='TB_window'></div>");
137 tb_show(TB_PrevCaption
, TB_PrevURL
, imageGroup
);
140 $("#TB_prev").click(goPrev
);
143 if (!(TB_NextHTML
=== "")) {
145 $("#TB_window").remove();
146 $("body").append("<div id='TB_window'></div>");
147 tb_show(TB_NextCaption
, TB_NextURL
, imageGroup
);
150 $("#TB_next").click(goNext
);
154 document
.onkeydown = function(e
){
155 if (e
== null) { // ie
156 keycode
= event
.keyCode
;
160 if(keycode
== 27){ // close
162 } else if(keycode
== 190){ // display previous image
163 if(!(TB_NextHTML
== "")){
164 document
.onkeydown
= "";
167 } else if(keycode
== 188){ // display next image
168 if(!(TB_PrevHTML
== "")){
169 document
.onkeydown
= "";
176 $("#TB_load").remove();
177 $("#TB_ImageOff").click(tb_remove
);
178 $("#TB_window").css({display
:"block"}); //for safari using css instead of show
181 imgPreloader
.src
= url
;
182 }else{//code to show html
184 var queryString
= url
.replace(/^[^\?]+\??/,'');
185 var params
= tb_parseQuery( queryString
);
187 TB_WIDTH
= (params
['width']*1) + 30 || 630; //defaults to 630 if no paramaters were added to URL
188 TB_HEIGHT
= (params
['height']*1) + 40 || 440; //defaults to 440 if no paramaters were added to URL
189 ajaxContentW
= TB_WIDTH
- 30;
190 ajaxContentH
= TB_HEIGHT
- 45;
192 if(url
.indexOf('TB_iframe') != -1){// either iframe or ajax window
193 urlNoQuery
= url
.split('TB_');
194 $("#TB_iframeContent").remove();
195 if(params
['modal'] != "true"){//iframe no modal
196 $("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption
+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton' title='Close'>close</a> or Esc Key</div></div><iframe frameborder='0' hspace='0' src='"+urlNoQuery
[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math
.round(Math
.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW
+ 29)+"px;height:"+(ajaxContentH
+ 17)+"px;' > </iframe>");
198 $("#TB_overlay").unbind();
199 $("#TB_window").append("<iframe frameborder='0' hspace='0' src='"+urlNoQuery
[0]+"' id='TB_iframeContent' name='TB_iframeContent"+Math
.round(Math
.random()*1000)+"' onload='tb_showIframe()' style='width:"+(ajaxContentW
+ 29)+"px;height:"+(ajaxContentH
+ 17)+"px;'> </iframe>");
201 }else{// not an iframe, ajax
202 if($("#TB_window").css("display") != "block"){
203 if(params
['modal'] != "true"){//ajax no modal
204 $("#TB_window").append("<div id='TB_title'><div id='TB_ajaxWindowTitle'>"+caption
+"</div><div id='TB_closeAjaxWindow'><a href='#' id='TB_closeWindowButton'>close</a> or Esc Key</div></div><div id='TB_ajaxContent' style='width:"+ajaxContentW
+"px;height:"+ajaxContentH
+"px'></div>");
206 $("#TB_overlay").unbind();
207 $("#TB_window").append("<div id='TB_ajaxContent' class='TB_modal' style='width:"+ajaxContentW
+"px;height:"+ajaxContentH
+"px;'></div>");
209 }else{//this means the window is already up, we are just loading new content via ajax
210 $("#TB_ajaxContent")[0].style
.width
= ajaxContentW
+"px";
211 $("#TB_ajaxContent")[0].style
.height
= ajaxContentH
+"px";
212 $("#TB_ajaxContent")[0].scrollTop
= 0;
213 $("#TB_ajaxWindowTitle").html(caption
);
217 $("#TB_closeWindowButton").click(tb_remove
);
219 if(url
.indexOf('TB_inline') != -1){
220 $("#TB_ajaxContent").append($('#' + params
['inlineId']).children());
221 $("#TB_window").unload(function () {
222 $('#' + params
['inlineId']).append( $("#TB_ajaxContent").children() ); // move elements back when you're finished
225 $("#TB_load").remove();
226 $("#TB_window").css({display
:"block"});
227 }else if(url
.indexOf('TB_iframe') != -1){
229 if($.browser
.safari
){//safari needs help because it will not fire iframe onload
230 $("#TB_load").remove();
231 $("#TB_window").css({display
:"block"});
234 $("#TB_ajaxContent").load(url
+= "&random=" + (new Date().getTime()),function(){//to do a post change this load method
236 $("#TB_load").remove();
237 tb_init("#TB_ajaxContent a.thickbox");
238 $("#TB_window").css({display
:"block"});
244 if(!params
['modal']){
245 document
.onkeyup = function(e
){
246 if (e
== null) { // ie
247 keycode
= event
.keyCode
;
251 if(keycode
== 27){ // close
262 //helper functions below
263 function tb_showIframe(){
264 $("#TB_load").remove();
265 $("#TB_window").css({display
:"block"});
268 function tb_remove() {
269 $("#TB_imageOff").unbind("click");
270 $("#TB_closeWindowButton").unbind("click");
271 $("#TB_window").fadeOut("fast",function(){$('#TB_window,#TB_overlay,#TB_HideSelect').trigger("unload").unbind().remove();});
272 $("#TB_load").remove();
273 if (typeof document
.body
.style
.maxHeight
== "undefined") {//if IE 6
274 $("body","html").css({height
: "auto", width
: "auto"});
275 $("html").css("overflow","");
277 document
.onkeydown
= "";
278 document
.onkeyup
= "";
282 function tb_position() {
283 $("#TB_window").css({marginLeft
: '-' + parseInt((TB_WIDTH
/ 2),10) + 'px', width
: TB_WIDTH
+ 'px'});
284 if ( !(jQuery
.browser
.msie
&& jQuery
.browser
.version
< 7)) { // take away IE6
285 $("#TB_window").css({marginTop
: '-' + parseInt((TB_HEIGHT
/ 2),10) + 'px'});
289 function tb_parseQuery ( query
) {
291 if ( ! query
) {return Params
;}// return empty object
292 var Pairs
= query
.split(/[;&]/);
293 for ( var i
= 0; i
< Pairs
.length
; i
++ ) {
294 var KeyVal
= Pairs
[i
].split('=');
295 if ( ! KeyVal
|| KeyVal
.length
!= 2 ) {continue;}
296 var key
= unescape( KeyVal
[0] );
297 var val
= unescape( KeyVal
[1] );
298 val
= val
.replace(/\+/g, ' ');
304 function tb_getPageSize(){
305 var de
= document
.documentElement
;
306 var w
= window
.innerWidth
|| self
.innerWidth
|| (de
&&de
.clientWidth
) || document
.body
.clientWidth
;
307 var h
= window
.innerHeight
|| self
.innerHeight
|| (de
&&de
.clientHeight
) || document
.body
.clientHeight
;
308 arrayPageSize
= [w
,h
];
309 return arrayPageSize
;
312 function tb_detectMacXFF() {
313 var userAgent
= navigator
.userAgent
.toLowerCase();
314 if (userAgent
.indexOf('mac') != -1 && userAgent
.indexOf('firefox')!=-1) {