0
|
1 |
(function($){ |
|
2 |
|
|
3 |
//closeDOMWindow |
|
4 |
$.fn.closeDOMWindow = function(settings){ |
|
5 |
|
|
6 |
if(!settings){settings={};} |
|
7 |
|
|
8 |
var run = function(passingThis){ |
|
9 |
|
|
10 |
if(settings.anchoredClassName){ |
|
11 |
var $anchorClassName = $('.'+settings.anchoredClassName); |
|
12 |
$anchorClassName.fadeOut('fast',function(){ |
|
13 |
if($.fn.draggable){ |
|
14 |
$anchorClassName.draggable('destory').trigger("unload").remove(); |
|
15 |
}else{ |
|
16 |
$anchorClassName.trigger("unload").remove(); |
|
17 |
} |
|
18 |
}); |
|
19 |
if(settings.functionCallOnClose){settings.functionCallAfterClose();} |
|
20 |
}else{ |
|
21 |
var $DOMWindowOverlay = $('#DOMWindowOverlay'); |
|
22 |
var $DOMWindow = $('#DOMWindow'); |
|
23 |
$DOMWindowOverlay.fadeOut('fast',function(){ |
|
24 |
$DOMWindowOverlay.trigger('unload').unbind().remove(); |
|
25 |
}); |
|
26 |
$DOMWindow.fadeOut('fast',function(){ |
|
27 |
if($.fn.draggable){ |
|
28 |
$DOMWindow.draggable("destroy").trigger("unload").remove(); |
|
29 |
}else{ |
|
30 |
$DOMWindow.trigger("unload").remove(); |
|
31 |
} |
|
32 |
}); |
|
33 |
|
|
34 |
$(window).unbind('scroll.DOMWindow'); |
|
35 |
$(window).unbind('resize.DOMWindow'); |
|
36 |
|
|
37 |
if($.fn.openDOMWindow.isIE6){$('#DOMWindowIE6FixIframe').remove();} |
|
38 |
if(settings.functionCallOnClose){settings.functionCallAfterClose();} |
|
39 |
} |
|
40 |
}; |
|
41 |
|
|
42 |
if(settings.eventType){//if used with $(). |
|
43 |
return this.each(function(index){ |
|
44 |
$(this).bind(settings.eventType, function(){ |
|
45 |
run(this); |
|
46 |
return false; |
|
47 |
}); |
|
48 |
}); |
|
49 |
}else{//else called as $.function |
|
50 |
run(); |
|
51 |
} |
|
52 |
|
|
53 |
}; |
|
54 |
|
|
55 |
//allow for public call, pass settings |
|
56 |
$.closeDOMWindow = function(s){$.fn.closeDOMWindow(s);}; |
|
57 |
|
|
58 |
//openDOMWindow |
|
59 |
$.fn.openDOMWindow = function(instanceSettings){ |
|
60 |
|
|
61 |
var shortcut = $.fn.openDOMWindow; |
|
62 |
|
|
63 |
//default settings combined with callerSettings//////////////////////////////////////////////////////////////////////// |
|
64 |
|
|
65 |
shortcut.defaultsSettings = { |
|
66 |
anchoredClassName:'', |
|
67 |
anchoredSelector:'', |
|
68 |
borderColor:'#ccc', |
|
69 |
borderSize:'4', |
|
70 |
draggable:0, |
|
71 |
eventType:null, //click, blur, change, dblclick, error, focus, load, mousedown, mouseout, mouseup etc... |
|
72 |
fixedWindowY:100, |
|
73 |
functionCallOnOpen:null, |
|
74 |
functionCallOnClose:null, |
|
75 |
height:500, |
|
76 |
loader:0, |
|
77 |
loaderHeight:0, |
|
78 |
loaderImagePath:'', |
|
79 |
loaderWidth:0, |
|
80 |
modal:0, |
|
81 |
overlay:1, |
|
82 |
overlayColor:'#000', |
|
83 |
overlayOpacity:'85', |
|
84 |
positionLeft:0, |
|
85 |
positionTop:0, |
|
86 |
positionType:'centered', // centered, anchored, absolute, fixed |
|
87 |
width:500, |
|
88 |
windowBGColor:'#fff', |
|
89 |
windowBGImage:null, // http path |
|
90 |
windowHTTPType:'get', |
|
91 |
windowPadding:10, |
|
92 |
windowSource:'inline', //inline, ajax, iframe |
|
93 |
windowSourceID:'', |
|
94 |
windowSourceURL:'', |
|
95 |
windowSourceAttrURL:'href' |
|
96 |
}; |
|
97 |
|
|
98 |
var settings = $.extend({}, $.fn.openDOMWindow.defaultsSettings , instanceSettings || {}); |
|
99 |
|
|
100 |
//Public functions |
|
101 |
|
|
102 |
shortcut.viewPortHeight = function(){ return self.innerHeight || document.documentElement.clientHeight || document.body.clientHeight;}; |
|
103 |
shortcut.viewPortWidth = function(){ return self.innerWidth || document.documentElement.clientWidth || document.body.clientWidth;}; |
|
104 |
shortcut.scrollOffsetHeight = function(){ return self.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop;}; |
|
105 |
shortcut.scrollOffsetWidth = function(){ return self.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft;}; |
|
106 |
shortcut.isIE6 = typeof document.body.style.maxHeight === "undefined"; |
|
107 |
|
|
108 |
//Private Functions///////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
109 |
|
|
110 |
var sizeOverlay = function(){ |
|
111 |
var $DOMWindowOverlay = $('#DOMWindowOverlay'); |
|
112 |
if(shortcut.isIE6){//if IE 6 |
|
113 |
var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4; |
|
114 |
var overlayViewportWidth = document.documentElement.offsetWidth - 21; |
|
115 |
$DOMWindowOverlay.css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'}); |
|
116 |
}else{//else Firefox, safari, opera, IE 7+ |
|
117 |
$DOMWindowOverlay.css({'height':'100%','width':'100%','position':'fixed'}); |
|
118 |
} |
|
119 |
}; |
|
120 |
|
|
121 |
var sizeIE6Iframe = function(){ |
|
122 |
var overlayViewportHeight = document.documentElement.offsetHeight + document.documentElement.scrollTop - 4; |
|
123 |
var overlayViewportWidth = document.documentElement.offsetWidth - 21; |
|
124 |
$('#DOMWindowIE6FixIframe').css({'height':overlayViewportHeight +'px','width':overlayViewportWidth+'px'}); |
|
125 |
}; |
|
126 |
|
|
127 |
var centerDOMWindow = function() { |
|
128 |
var $DOMWindow = $('#DOMWindow'); |
|
129 |
if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe |
|
130 |
$DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2)); |
|
131 |
}else{ |
|
132 |
$DOMWindow.css('left',Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindow.outerWidth())/2)); |
|
133 |
$DOMWindow.css('top',Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindow.outerHeight())/2)); |
|
134 |
} |
|
135 |
}; |
|
136 |
|
|
137 |
var centerLoader = function() { |
|
138 |
var $DOMWindowLoader = $('#DOMWindowLoader'); |
|
139 |
if(shortcut.isIE6){//if IE 6 |
|
140 |
$DOMWindowLoader.css({'left':Math.round(shortcut.viewPortWidth()/2) + shortcut.scrollOffsetWidth() - Math.round(($DOMWindowLoader.innerWidth())/2),'position':'absolute'}); |
|
141 |
$DOMWindowLoader.css({'top':Math.round(shortcut.viewPortHeight()/2) + shortcut.scrollOffsetHeight() - Math.round(($DOMWindowLoader.innerHeight())/2),'position':'absolute'}); |
|
142 |
}else{ |
|
143 |
$DOMWindowLoader.css({'left':'50%','top':'50%','position':'fixed'}); |
|
144 |
} |
|
145 |
|
|
146 |
}; |
|
147 |
|
|
148 |
var fixedDOMWindow = function(){ |
|
149 |
var $DOMWindow = $('#DOMWindow'); |
|
150 |
$DOMWindow.css('left', settings.positionLeft + shortcut.scrollOffsetWidth()); |
|
151 |
$DOMWindow.css('top', + settings.positionTop + shortcut.scrollOffsetHeight()); |
|
152 |
}; |
|
153 |
|
|
154 |
var showDOMWindow = function(instance){ |
|
155 |
if(arguments[0]){ |
|
156 |
$('.'+instance+' #DOMWindowLoader').remove(); |
|
157 |
$('.'+instance+' #DOMWindowContent').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}}); |
|
158 |
$('.'+instance+ '.closeDOMWindow').click(function(){ |
|
159 |
$.closeDOMWindow(); |
|
160 |
return false; |
|
161 |
}); |
|
162 |
}else{ |
|
163 |
$('#DOMWindowLoader').remove(); |
|
164 |
$('#DOMWindow').fadeIn('fast',function(){if(settings.functionCallOnOpen){settings.functionCallOnOpen();}}); |
|
165 |
$('#DOMWindow .closeDOMWindow').click(function(){ |
|
166 |
$.closeDOMWindow(); |
|
167 |
return false; |
|
168 |
}); |
|
169 |
} |
|
170 |
|
|
171 |
}; |
|
172 |
|
|
173 |
var urlQueryToObject = function(s){ |
|
174 |
var query = {}; |
|
175 |
s.replace(/b([^&=]*)=([^&=]*)b/g, function (m, a, d) { |
|
176 |
if (typeof query[a] != 'undefined') { |
|
177 |
query[a] += ',' + d; |
|
178 |
} else { |
|
179 |
query[a] = d; |
|
180 |
} |
|
181 |
}); |
|
182 |
return query; |
|
183 |
}; |
|
184 |
|
|
185 |
//Run Routine /////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
186 |
var run = function(passingThis){ |
|
187 |
|
|
188 |
//get values from element clicked, or assume its passed as an option |
|
189 |
settings.windowSourceID = $(passingThis).attr('href') || settings.windowSourceID; |
|
190 |
settings.windowSourceURL = $(passingThis).attr(settings.windowSourceAttrURL) || settings.windowSourceURL; |
|
191 |
settings.windowBGImage = settings.windowBGImage ? 'background-image:url('+settings.windowBGImage+')' : ''; |
|
192 |
var urlOnly, urlQueryObject; |
|
193 |
|
|
194 |
if(settings.positionType == 'anchored'){//anchored DOM window |
|
195 |
|
|
196 |
var anchoredPositions = $(settings.anchoredSelector).position(); |
|
197 |
var anchoredPositionX = anchoredPositions.left + settings.positionLeft; |
|
198 |
var anchoredPositionY = anchoredPositions.top + settings.positionTop; |
|
199 |
|
|
200 |
$('body').append('<div class="'+settings.anchoredClassName+'" style="'+settings.windowBGImage+';background-repeat:no-repeat;padding:'+settings.windowPadding+'px;overflow:auto;position:absolute;top:'+anchoredPositionY+'px;left:'+anchoredPositionX+'px;height:'+settings.height+'px;width:'+settings.width+'px;background-color:'+settings.windowBGColor+';border:'+settings.borderSize+'px solid '+settings.borderColor+';z-index:10001"><div id="DOMWindowContent" style="display:none"></div></div>'); |
|
201 |
//loader |
|
202 |
if(settings.loader && settings.loaderImagePath !== ''){ |
|
203 |
$('.'+settings.anchoredClassName).append('<div id="DOMWindowLoader" style="width:'+settings.loaderWidth+'px;height:'+settings.loaderHeight+'px;"><img src="'+settings.loaderImagePath+'" /></div>'); |
|
204 |
|
|
205 |
} |
|
206 |
|
|
207 |
if($.fn.draggable){ |
|
208 |
if(settings.draggable){$('.' + settings.anchoredClassName).draggable({cursor:'move'});} |
|
209 |
} |
|
210 |
|
|
211 |
switch(settings.windowSource){ |
|
212 |
case 'inline'://////////////////////////////// inline ////////////////////////////////////////// |
|
213 |
$('.' + settings.anchoredClassName+" #DOMWindowContent").append($(settings.windowSourceID).children()); |
|
214 |
$('.' + settings.anchoredClassName).unload(function(){// move elements back when you're finished |
|
215 |
$('.' + settings.windowSourceID).append( $('.' + settings.anchoredClassName+" #DOMWindowContent").children()); |
|
216 |
}); |
|
217 |
showDOMWindow(settings.anchoredClassName); |
|
218 |
break; |
|
219 |
case 'iframe'://////////////////////////////// iframe ////////////////////////////////////////// |
|
220 |
$('.' + settings.anchoredClassName+" #DOMWindowContent").append('<iframe frameborder="0" hspace="0" wspace="0" src="'+settings.windowSourceURL+'" name="DOMWindowIframe'+Math.round(Math.random()*1000)+'" style="width:100%;height:100%;border:none;background-color:#fff;" class="'+settings.anchoredClassName+'Iframe" ></iframe>'); |
|
221 |
$('.'+settings.anchoredClassName+'Iframe').load(showDOMWindow(settings.anchoredClassName)); |
|
222 |
break; |
|
223 |
case 'ajax'://////////////////////////////// ajax ////////////////////////////////////////// |
|
224 |
if(settings.windowHTTPType == 'post'){ |
|
225 |
|
|
226 |
if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string |
|
227 |
urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?")); |
|
228 |
urlQueryObject = urlQueryToObject(settings.windowSourceURL); |
|
229 |
}else{ |
|
230 |
urlOnly = settings.windowSourceURL; |
|
231 |
urlQueryObject = {}; |
|
232 |
} |
|
233 |
$('.' + settings.anchoredClassName+" #DOMWindowContent").load(urlOnly,urlQueryObject,function(){ |
|
234 |
showDOMWindow(settings.anchoredClassName); |
|
235 |
}); |
|
236 |
}else{ |
|
237 |
if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one |
|
238 |
settings.windowSourceURL += '?'; |
|
239 |
} |
|
240 |
$('.' + settings.anchoredClassName+" #DOMWindowContent").load( |
|
241 |
settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){ |
|
242 |
showDOMWindow(settings.anchoredClassName); |
|
243 |
}); |
|
244 |
} |
|
245 |
break; |
|
246 |
} |
|
247 |
|
|
248 |
}else{//centered, fixed, absolute DOM window |
|
249 |
|
|
250 |
//overlay & modal |
|
251 |
if(settings.overlay){ |
|
252 |
$('body').append('<div id="DOMWindowOverlay" style="z-index:10000;display:none;position:absolute;top:0;left:0;background-color:'+settings.overlayColor+';filter:alpha(opacity='+settings.overlayOpacity+');-moz-opacity: 0.'+settings.overlayOpacity+';opacity: 0.'+settings.overlayOpacity+';"></div>'); |
|
253 |
if(shortcut.isIE6){//if IE 6 |
|
254 |
$('body').append('<iframe id="DOMWindowIE6FixIframe" src="blank.html" style="width:100%;height:100%;z-index:9999;position:absolute;top:0;left:0;filter:alpha(opacity=0);"></iframe>'); |
|
255 |
sizeIE6Iframe(); |
|
256 |
} |
|
257 |
sizeOverlay(); |
|
258 |
var $DOMWindowOverlay = $('#DOMWindowOverlay'); |
|
259 |
$DOMWindowOverlay.fadeIn('fast'); |
|
260 |
if(!settings.modal){$DOMWindowOverlay.click(function(){$.closeDOMWindow();});} |
|
261 |
} |
|
262 |
|
|
263 |
//loader |
|
264 |
if(settings.loader && settings.loaderImagePath !== ''){ |
|
265 |
$('body').append('<div id="DOMWindowLoader" style="z-index:10002;width:'+settings.loaderWidth+'px;height:'+settings.loaderHeight+'px;"><img src="'+settings.loaderImagePath+'" /></div>'); |
|
266 |
centerLoader(); |
|
267 |
} |
|
268 |
|
|
269 |
//add DOMwindow |
|
270 |
$('body').append('<div id="DOMWindow" style="background-repeat:no-repeat;'+settings.windowBGImage+';overflow:auto;padding:'+settings.windowPadding+'px;display:none;height:'+settings.height+'px;width:'+settings.width+'px;background-color:'+settings.windowBGColor+';border:'+settings.borderSize+'px solid '+settings.borderColor+'; position:absolute;z-index:10001"></div>'); |
|
271 |
|
|
272 |
var $DOMWindow = $('#DOMWindow'); |
|
273 |
//centered, absolute, or fixed |
|
274 |
switch(settings.positionType){ |
|
275 |
case 'centered': |
|
276 |
centerDOMWindow(); |
|
277 |
if(settings.height + 50 > shortcut.viewPortHeight()){//added 50 to be safe |
|
278 |
$DOMWindow.css('top', (settings.fixedWindowY + shortcut.scrollOffsetHeight()) + 'px'); |
|
279 |
} |
|
280 |
break; |
|
281 |
case 'absolute': |
|
282 |
$DOMWindow.css({'top':(settings.positionTop+shortcut.scrollOffsetHeight())+'px','left':(settings.positionLeft+shortcut.scrollOffsetWidth())+'px'}); |
|
283 |
if($.fn.draggable){ |
|
284 |
if(settings.draggable){$DOMWindow.draggable({cursor:'move'});} |
|
285 |
} |
|
286 |
break; |
|
287 |
case 'fixed': |
|
288 |
fixedDOMWindow(); |
|
289 |
break; |
|
290 |
case 'anchoredSingleWindow': |
|
291 |
var anchoredPositions = $(settings.anchoredSelector).position(); |
|
292 |
var anchoredPositionX = anchoredPositions.left + settings.positionLeft; |
|
293 |
var anchoredPositionY = anchoredPositions.top + settings.positionTop; |
|
294 |
$DOMWindow.css({'top':anchoredPositionY + 'px','left':anchoredPositionX+'px'}); |
|
295 |
|
|
296 |
break; |
|
297 |
} |
|
298 |
|
|
299 |
$(window).bind('scroll.DOMWindow',function(){ |
|
300 |
if(settings.overlay){sizeOverlay();} |
|
301 |
if(shortcut.isIE6){sizeIE6Iframe();} |
|
302 |
if(settings.positionType == 'centered'){centerDOMWindow();} |
|
303 |
if(settings.positionType == 'fixed'){fixedDOMWindow();} |
|
304 |
}); |
|
305 |
|
|
306 |
$(window).bind('resize.DOMWindow',function(){ |
|
307 |
if(shortcut.isIE6){sizeIE6Iframe();} |
|
308 |
if(settings.overlay){sizeOverlay();} |
|
309 |
if(settings.positionType == 'centered'){centerDOMWindow();} |
|
310 |
}); |
|
311 |
|
|
312 |
switch(settings.windowSource){ |
|
313 |
case 'inline'://////////////////////////////// inline ////////////////////////////////////////// |
|
314 |
$DOMWindow.append($(settings.windowSourceID).children()); |
|
315 |
$DOMWindow.unload(function(){// move elements back when you're finished |
|
316 |
$(settings.windowSourceID).append($DOMWindow.children()); |
|
317 |
}); |
|
318 |
showDOMWindow(); |
|
319 |
break; |
|
320 |
case 'iframe'://////////////////////////////// iframe ////////////////////////////////////////// |
|
321 |
$DOMWindow.append('<iframe frameborder="0" hspace="0" wspace="0" src="'+settings.windowSourceURL+'" name="DOMWindowIframe'+Math.round(Math.random()*1000)+'" style="width:100%;height:100%;border:none;background-color:#fff;" id="DOMWindowIframe" ></iframe>'); |
|
322 |
$('#DOMWindowIframe').load(showDOMWindow()); |
|
323 |
break; |
|
324 |
case 'ajax'://////////////////////////////// ajax ////////////////////////////////////////// |
|
325 |
if(settings.windowHTTPType == 'post'){ |
|
326 |
|
|
327 |
if(settings.windowSourceURL.indexOf("?") !== -1){//has a query string |
|
328 |
urlOnly = settings.windowSourceURL.substr(0, settings.windowSourceURL.indexOf("?")); |
|
329 |
urlQueryObject = urlQueryToObject(settings.windowSourceURL); |
|
330 |
}else{ |
|
331 |
urlOnly = settings.windowSourceURL; |
|
332 |
urlQueryObject = {}; |
|
333 |
} |
|
334 |
$DOMWindow.load(urlOnly,urlQueryObject,function(){ |
|
335 |
showDOMWindow(); |
|
336 |
}); |
|
337 |
}else{ |
|
338 |
if(settings.windowSourceURL.indexOf("?") == -1){ //no query string, so add one |
|
339 |
settings.windowSourceURL += '?'; |
|
340 |
} |
|
341 |
$DOMWindow.load( |
|
342 |
settings.windowSourceURL + '&random=' + (new Date().getTime()),function(){ |
|
343 |
showDOMWindow(); |
|
344 |
}); |
|
345 |
} |
|
346 |
break; |
|
347 |
} |
|
348 |
|
|
349 |
}//end if anchored, or absolute, fixed, centered |
|
350 |
|
|
351 |
};//end run() |
|
352 |
|
|
353 |
if(settings.eventType){//if used with $(). |
|
354 |
return this.each(function(index){ |
|
355 |
$(this).bind(settings.eventType,function(){ |
|
356 |
run(this); |
|
357 |
return false; |
|
358 |
}); |
|
359 |
}); |
|
360 |
}else{//else called as $.function |
|
361 |
run(); |
|
362 |
} |
|
363 |
|
|
364 |
};//end function openDOMWindow |
|
365 |
|
|
366 |
//allow for public call, pass settings |
|
367 |
$.openDOMWindow = function(s){$.fn.openDOMWindow(s);}; |
|
368 |
|
|
369 |
})(jQuery); |