/*
DivBox v1.2
@copyright: http://wwww.phpbasic.com
@Download: http://code.google.com/p/divbox
@Contact: w2ajax@gmail.com for lastest version.
*/
(function ($) {
	$.fn.divbox = function (opt) {
		var _cfg = {
			width: null,
			height: null,
			speed: 250,
			left: null,
			top: null,
			type: null,
			src: 'href',
			ext: '',
			param_request: '',
			scrollbar: 'auto',
			btn_closed: '#divbox_frame .closed',
			btn_prev: '#divbox_frame .prev',
			btn_next: '#divbox_frame .next',
			btn_number: '#divbox_frame .number',
			path: '/Composants/Dinao/divbox/players/',
			full_drag_handle: false,
			resize_large_image: true,
			click_full_image: true,
			overlay: true,
			caption: true,
			caption_control: true,
			caption_number: false,
			event: 'click',
			container: document.forms,
			download_able: ['zip', 'gz', 'rar'],
			languages: {
				btn_close: 'Close',
				btn_next: 'Next',
				btn_prev: 'Prev',
				click_full_image: 'Click on here to view full image',
				error_not_youtube: 'This is not a youtube link',
				error_cannot_load: "We can't load this page\nError: "
			},
			api: {
				start: null,
				beginLoad: null,
				afterLoad: null,
				closed: null
			}

		}
		if (opt) $.extend(_cfg, opt);

		var oMatch = this;
		var objArr = [];
		$(oMatch).each(function (i, o) {
			objArr[i] = o;
		});
		function _run(index, init) {
			var fn = {}
			fn.closed = function () {
				$('#divbox_frame').animate({
					'top': _click.top,
					'left': _click.left,
					width: '0px',
					height: '0px'
				}, _cfg.speed, function () {
					$(this).remove();
					$('#divbox').remove();
					fn.toggleObj('forms', 'show');
					if (typeof (_cfg.api.closed) == 'function') _cfg.api.closed(this);
				});
			}

			fn.toggleObj = function (o, act) {
				if (ie6) {
					if (act == 'show') $(o).find('embed,object,select').show();
					else $(o).find('embed,object,select').hide();
				}
			}

			fn.init = function () {
				if (typeof (_cfg.api.start) == 'function') _cfg.api.start(obj);
				var requires = '#divbox,#divbox_frame,#divbox_content,#divbox_ajax';
				$(requires).remove();
				$(_cfg.container).prepend('<div id="divbox"></div><div id="divbox_ajax"></div><div id="divbox_frame"><div class="closed" title="' + _cfg.languages.btn_close + '"></div><div id="divbox_data"><div id="divbox_content"></div><div class="prev" title="' + _cfg.languages.btn_prev + '"></div><div class="caption"></div><div class="number">10/10</div><div class="next" title="' + _cfg.languages.btn_next + '"></div></div></div>');
				$(_cfg.btn_closed + ',' + _cfg.btn_next + ',' + _cfg.btn_prev + ',' + _cfg.btn_number).hide();
				if (_cfg.overlay) {
					$('#divbox').css({
						'width': sizesystem[0] + 'px',
						'height': sizesystem[1] + 'px',
						'position': 'absolute',
						'zIndex': '10001',
						'left': '0',
						'top': '0'
					}).click(function () {
						fn.closed();
					});
				}
				$('#divbox_frame').css({
					'position': 'absolute',
					'top': _click.top,
					'left': _click.left,
					'zIndex': '10002',
					'width': 0,
					'height': 0
				}).animate({
					width: 50,
					height: 50,
					top: _cfg.top ? sizesystem[3] + _cfg.top : sizesystem[3] + Math.round(sizesystem[5] / 2),
					left: _cfg.left ? sizesystem[2] + _cfg.left : Math.round(sizesystem[4] / 2)
				});
			}
			fn.resizeWindow = function (resizeW) {
				var sizesystem = pageSize(ie);
				$('#divbox').css({
					'width': sizesystem[0] + 'px',
					'height': sizesystem[1] + 'px'
				});
				var w = $(oFrame).outerWidth();
				var h = $(oFrame).outerHeight();
				$(oFrame).css({
					top: _cfg.top ? sizesystem[3] + _cfg.top : sizesystem[3] + Math.round((sizesystem[5] - h) / 2),
					left: _cfg.left ? sizesystem[2] + _cfg.left : Math.round((sizesystem[4] - w) / 2)
				});
			}
			fn.animate = function (t, l, w, h, fncallback, fnclosed, caption) {
				$('#divbox').unbind('click');
				$(document).unbind('keydown');
				$(_cfg.btn_closed + ',' + _cfg.btn_next + ',' + _cfg.btn_prev + ',' + _cfg.btn_number).hide();
				var border = 0; //ie?parseInt($(oFrame).css('border-left-width'))+parseInt($(oFrame).css('border-right-width')):0;
				$(oFrame).removeClass('white').animate({
					left: _cfg.left ? _cfg.left : l,
					width: _cfg.width ? _cfg.width + border : w + border
				}, _cfg.speed).animate({
					top: _cfg.top ? sizesystem[3] + _cfg.top : t,
					height: _cfg.height ? _cfg.height : h
				}, _cfg.speed, function () {
					fn.toggleObj('forms');
					var oContent = $('#divbox_content');
					if (typeof (_cfg.api.beginLoad) == 'function') _cfg.api.beginLoad(oContent);
					if (typeof (fncallback) == 'function') fncallback(oContent);
					if (typeof (_cfg.api.afterLoad) == 'function') _cfg.api.afterLoad(oContent);

					$(_cfg.btn_closed).show().click(function () {
						if (typeof (fnclosed) == 'function') fnclosed(oContent);
						fn.closed();
					});
					$('#divbox').bind('click', function () {
						if (typeof (fnclosed) == 'function') fnclosed(oContent);
						fn.closed();
					});

					$(this).addClass('white');

					var c = $(oFrame).find('.caption');

					if (_cfg.caption != false && (caption != '' || _cfg.caption_control == true)) {
						var cH = c.outerHeight(true);
						$(oFrame).animate({ height: h + cH }).find('.caption').show();

						if (_cfg.caption_control == true) {// caption control
							var btn_top = h + parseInt(c.css('padding-top')); // 12 = 1/2 height of button prev/next icon
							$(_cfg.btn_prev + ',' + _cfg.btn_next + ',' + _cfg.btn_number).css({ top: btn_top }).show();
							if (index * 1 > 0) {
								$(_cfg.btn_prev).removeClass('prevDisabled').bind('click', function () {
									fn.prevItem(index);
								});
							} else {
								$(_cfg.btn_prev).addClass('prevDisabled').unbind('click');
							}
							if (_cfg.caption_number) {
								$(_cfg.btn_number).html((index * 1 + 1) + '/' + total)
							} else {
								$(_cfg.btn_number).remove();
							}
							if (index * 1 < total - 1) {
								$(_cfg.btn_next).removeClass('nextDisabled').bind('click', function () {
									fn.nextItem(index);
								});
							} else {
								$(_cfg.btn_next).addClass('nextDisabled').unbind('click');
							}
						} else { // have no caption control
							$(c).css({ 'padding-left': '5px', 'padding-right': '5px' });
						}

					}



					$(document).bind('keydown', function (e) {
						var k = e ? e.keyCode : event.keyCode;
						if (k == 27) {
							if (typeof (fnclosed) == 'function') fnclosed($('#divbox_content'));
							fn.closed();
						}
						if (_cfg.caption != '' && _cfg.caption_control == true) {
							if (k == 38 || k == 39) { fn.nextItem(index); return false; }
							if (k == 37 || k == 40) { fn.prevItem(index); return false; }
						}
					});

					try {
						var drag_handle = _cfg.caption == false ? '#divbox_frame' : '#divbox_frame .caption';
						$("#divbox_frame").draggable({ handle: $(drag_handle) }).css({ cursor: 'move' });
						if (!_cfg.full_drag_handle) $('#divbox_content').css({ cursor: 'pointer' });
					} catch (e) { /* requires jQuery UI draggables */ }

					$(window).bind('resize scroll', function () {
						fn.resizeWindow();
					});


				});
			}


			fn.prevItem = function (index) {
				if (index * 1 > 0) _run(index * 1 - 1);
			}

			fn.nextItem = function (index) {
				if (index * 1 < total - 1) _run(index * 1 + 1);
			}

			fn.parseType = function (src) {
				if (_cfg.type) return _cfg.type;
				if (src.match(/youtu/i)) {
					return 'youtube';
				}
				var aExt = src.split('.');
				var ext = aExt[aExt.length - 1];
				return ext.toLowerCase();
			}
			fn.viewImage = function (src, caption) {
				$('#divbox_content').html('<img src="' + src + '" />').find('img').hide();
				var Img = new Image();
				Img.onload = function () {
					$('#divbox_content img').attr('src', src);
					var imgW = Img.width;
					var imgH = Img.height;
					var zoom = 0;
					if (_cfg.resize_large_image) {
						if (imgW >= sizesystem[4] - 100 || imgH >= sizesystem[5] - 100) {
							if (imgW >= sizesystem[4] - 100) {
								imgW = sizesystem[4] - 100;
								imgH = Math.round(imgW * Img.height / Img.width);
							}
							if (imgH >= sizesystem[5] - 100) {
								tH = sizesystem[5] - 100;
								imgW = Math.round(imgW * tH / imgH);
								imgH = tH;
							}
							if (_cfg.click_full_image) zoom = 1;
						}
					}
					var top = sizesystem[3] + Math.round((sizesystem[5] - imgH) / 2);
					var left = Math.round((sizesystem[4] - imgW) / 2);
					fn.animate(top, left, imgW, imgH, function (o) {
						if (ie6 && ext == 'png') {
							$(o).find('img').wrap('<span style="display:inline-block;width: ' + imgW + 'px;height: ' + imgH + 'px;filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(src=' + src + ');"></span>');
						} else {
							$(o).find('img').css({ 'width': imgW, 'height': imgH, 'display': 'block' }).fadeIn();
						}
						if (zoom) $(o).find('img').addClass('zoom').attr({ 'title': _cfg.languages.click_full_image }).click(function () {
							window.open(src, 'wDivBox');
						});
					}, false, caption)
					//IE 
					Img.onload = function () { };
				}
				Img.src = src;

			}
			fn.flashEmbedString = function (file, w, h, type) { // default type is FLV
				var flashvar = '&provider=video';
				var swf_file = type == 'swf' ? file : _cfg.path + 'jwplayer.swf';
				if (type == 'mp3') flashvar = '&provider=sound';
				var str = '<object id="player" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" name="player" width="' + w + '" height="' + h + '">';
				str += '<param name="movie" value="' + swf_file + '" />';
				str += '<param name="allowfullscreen" value="true" />';
				if (type != 'swf') str += '<param name="flashvars" value="file=' + file + '&autostart=true' + flashvar + '" />';
				str += '<embed  pluginspage="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash" quality="high"';
				str += ' type="application/x-shockwave-flash"';
				str += ' id="player2"';
				str += ' name="player2"';
				str += ' src="' + swf_file + '" ';
				str += ' width="' + w + '" ';
				str += ' height="' + h + '"';
				str += ' allowfullscreen="true"';
				if (type != 'swf') str += ' flashvars="file=' + file + '&start=true&autostart=true' + flashvar + '" ';
				str += ' />';
				str += '</object>';
				return str;

			}

			fn.Html5String = function (file, w, h, type) { // default type is FLV
				var str = '<video controls="controls" autoplay="autoplay" height="' + h + '" width="' + w + '">';
				str += '<source src="' + file + '" type="video/mp4"/>';
				str += '</video>';
				return str;

			}

			fn.viewFLV = function (src, caption) {
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = Math.round((sizesystem[4] - winW) / 2);
				var str = fn.flashEmbedString(obj.href, winW, winH, 'flv');
				fn.animate(top, left, winW, winH, function (o) {
					$(o).html(str);
				}, false, caption);
			}
			// For use within normal web clients 
			var isiPad = navigator.userAgent.match(/iPad/i) != null;

			// For use within iPad developer UIWebView
			// Thanks to Andrew Hedges!
			var ua = navigator.userAgent;
			var isiPad = /iPad/i.test(ua) || /iPhone OS/i.test(ua);

			if (isiPad) {
				fn.viewMP4 = function (src, caption) {
					var winW = _cfg.width;
					var winH = _cfg.height;
					var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
					var left = Math.round((sizesystem[4] - winW) / 2);
					var str = fn.Html5String(src, winW, winH, 'mp4');
					fn.animate(top, left, winW, winH, function (o) {
						$(o).html(str);
					}, false, caption);
				}
			} else {
				fn.viewMP4 = function (src, caption) {
					var winW = _cfg.width;
					var winH = _cfg.height;
					var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
					var left = Math.round((sizesystem[4] - winW) / 2);
					var str = fn.flashEmbedString(obj.href, winW, winH, 'mp4');
					fn.animate(top, left, winW, winH, function (o) {
						$(o).html(str);
					}, false, caption);
				}
			}
			fn.viewMP3 = function (src, caption) {
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = Math.round((sizesystem[4] - winW) / 2);
				var str = fn.flashEmbedString(src, winW, winH, 'mp3');
				fn.animate(top, left, winW, winH, function (o) {
					$(o).html(str);
				}, false, caption);
			}
			fn.viewWMV = function (src, caption) {
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = Math.round((sizesystem[4] - winW) / 2);
				var str = '<object  type="application/x-oleobject" classid="CLSID:22D6f312-B0F6-11D0-94AB-0080C74C7E95" codebase="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=6,4,7,1112"';
				str += ' width="' + winW + '" height="' + winH + '">';
				str += '<param name="filename" value="' + src + '" />';
				str += '<param name="Showcontrols" value="true" />';
				str += '<param name="autoStart" value="true" />';
				str += '<embed type="application/x-mplayer2" src="' + src + '" Showcontrols="true" autoStart="true" width="' + winW + '" height="' + winH + '"></embed>';
				str += '<object/>';
				fn.animate(top, left, winW, winH, function (o) {
					$(o).html(str);
				}, false, caption);
			}
			fn.viewSWF = function (src, caption) {
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = Math.round((sizesystem[4] - winW) / 2);
				var str = fn.flashEmbedString(src, winW, winH, 'swf');
				fn.animate(top, left, winW, winH, function (o) {
					$(o).html(str);
				}, false, caption);
			}
			fn.viewElement = function (caption) {
				var e = '#' + $(obj).attr('rel');
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = Math.round((sizesystem[4] - winW) / 2);
				fn.animate(top, left, winW, winH, function (o) {
					$(o).html($(e).html());
					fn.toggleObj(o, 'show');
					$(e).html('');
				}, function (o) {
					$(e).html($(o).html());
				}, caption);
			}
			fn.viewAjax = function (src, caption) {
				$.ajax({
					url: src,
					success: function (data) {
						if (_cfg.width) $('#divbox_ajax').css({ 'width': _cfg.width });
						if (_cfg.height) $('#divbox_ajax').css({ 'height': _cfg.height });
						$('#divbox_ajax').html(data);
						var winW = $('#divbox_ajax').outerWidth();
						var winH = $('#divbox_ajax').outerHeight();
						var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
						var left = Math.round((sizesystem[4] - winW) / 2);
						fn.animate(top, left, winW, winH, function (o) {
							$(o).html(data);

							$('#divbox_ajax').remove();
						}, false, caption);
					},
					error: function (x, e) {
						alert(_cfg.languages.error_cannot_load + x.responseText);
					}
				});
			}
			fn.viewDefault = function (src, caption) {
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = sizesystem[2] + Math.round((sizesystem[4] - winW) / 2);
				fn.animate(top, left, winW, winH, function (o) {
					var temp_param = '';
					if (_cfg.param_request.length > 0) {
						if (src.search("\\?") != -1) {
							temp_param = '&' + _cfg.param_request
						} else {
							temp_param = '?' + _cfg.param_request
						}
					}
					$(o).html('<iframe src="' + src + '' + temp_param + '" width="' + winW + '" frameborder="0" scrolling="' + _cfg.scrollbar + '" height="' + winH + '"></iframe>');
				}, false, caption);
			}


			fn.viewYouTube = function (src, caption) {
				if (!src.match(/youtu/i)) {
					alert(_cfg.languages.error_not_youtube);
					return false;
				}

				if (src.match(/youtube\.com\/watch/i)) {
					var vidId = src.split('v=')[1].split('&')[0];
				};
				if (src.match(/youtu\.be/i)) {
					var vidId = src.split('\/').slice(3);
				};

				var vidSrc = "http://www.youtube.com/v/" + vidId + "&hl=en&fs=1&autoplay=1&rel=0";
				var winW = _cfg.width;
				var winH = _cfg.height;
				var top = sizesystem[3] + Math.round((sizesystem[5] - winH) / 2);
				var left = Math.round((sizesystem[4] - winW) / 2);
				var str = '<object width="' + winW + '" height="' + winH + '"><param name="movie" value="' + vidSrc + '"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="' + vidSrc + '" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="' + winW + '" height="' + winH + '"></embed></object>';
				//var str = fn.flashEmbedString(src,winW,winH,'youtube');
				fn.animate(top, left, winW, winH, function (o) {
					$(o).html(str);
				}, false, caption);
			}
			var obj = objArr[index];
			var ie = $.browser.msie;
			var ie6 = (ie && parseInt($.browser.version) == 6) ? true : false;
			var sizesystem = pageSize(ie);
			var total = $(oMatch).length;
			var _click = $(obj).offset();
			var src = $(obj).attr(_cfg.src).toString();
			var ext = fn.parseType(src);
			if (_cfg.ext.length > 0) ext = _cfg.ext

			// Download able
			for (var i in _cfg.download_able) if (ext == _cfg.download_able[i]) {
				return window.open(src);
			}

			//
			var caption = '';
			if (typeof (_cfg.caption) == 'function') {
				caption = _cfg.caption(obj);
			} else if (_cfg.caption === true) {
				caption = $(obj).attr('title');
			}

			if (init) fn.init();
			$(_cfg.btn_prev).unbind('click');
			$(_cfg.btn_next).unbind('click');
			var oFrame = $('#divbox_frame');
			$(oFrame).find('.caption').hide().html(caption);

			switch (ext) {
				case 'jpg':
				case 'jpeg':
				case 'gif':
				case 'png': fn.viewImage(src, caption); break;
				case 'pdf':
				case 'doc':
				case 'docx':
				case 'xls':
				case 'xslx':
				case 'ppt':
				case 'pptx':
				case 'csv': fn.viewDefault(src, caption); break;
				case 'flv': fn.viewFLV(src, caption); break;
				case 'avi':
				case 'mpeg':
				case 'mpg':
				case 'wmv': fn.viewWMV(src, caption); break;
				case 'mp3': fn.viewMP3(src, caption); break;
				case 'm4v':
				case 'mp4': fn.viewMP4(src, caption); break;
				case 'swf': fn.viewSWF(src, caption); break;
				case 'element': fn.viewElement(caption); break;
				case 'ajax': fn.viewAjax(src, caption); break;
				case 'youtube': fn.viewYouTube(src, caption); break;
				default: fn.viewDefault(src, caption); break;
			}

			return false;
		}

		$(oMatch).bind(_cfg.event, function () {
			var index = 0;
			for (var i in objArr) if (objArr[i] === this) index = i;
			_run(index, true);
			return false;
		});
	}

	function pageSize(ie) {
		var de = document.documentElement;
		var winW = window.innerWidth || self.innerWidth || (de && de.clientWidth) || document.body.clientWidth;
		winW -= 18;
		var winH = window.innerHeight || self.innerHeight || (de && de.clientHeight) || document.body.clientHeight;
		var x = window.pageXOffset || self.pageXOffset || (de && de.scrollLeft) || document.body.scrollLeft;
		var y = window.pageYOffset || self.pageYOffset || (de && de.scrollTop) || document.body.scrollTop;
		var pW = window.innerWidth || document.body.scrollWidth || document.body.offsetWidth;
		var pH = window.innerHeight + window.scrollMaxY || document.body.scrollHeight || document.body.offsetHeight;
		var w = pW < winW ? winW : pW;
		w -= 18;
		var h = pH < winH ? winH : pH;
		arrayPageSize = [w, h, x, y, winW, winH];
		return arrayPageSize;
	}

})(jQuery)
