/*
	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: 500,
			left: null,
			top: null,
			type: null,
			src: 'href',
			scrollbar: 'auto',
			btn_closed: '#divbox_frame .closed',
			btn_prev: '#divbox_frame .prev',
			btn_next: '#divbox_frame .next',
			btn_number: '#divbox_frame .number',
			path: '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.body,
			download_able:['pdf','zip','gz','rar','doc','docx','xls','xslx','ppt','pptx','csv'],
			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('body','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('body');
					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(/youtube\.com\/watch/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 : '/js/players/jwplayer.swf'; //'/js/'+_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.viewFLV = function(src,caption){
				var winW = 400;
				var winH = 300;
				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);
			}
			fn.viewMP4 = function(src,caption){
				var winW = 400;
				var winH = 300;
				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 = 320;
				var winH = 80;
				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 = 400;
				var winH = 300;
				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 = 400;
				var winH = 300;
				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 = $(e).outerWidth();
				var winH = $(e).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($(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 = sizesystem[4]-100;
				var winH = sizesystem[5]-100;
				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){
					$(o).html('<iframe src="'+src+'" width="'+(winW-12)+'" frameborder="0" scrolling="'+_cfg.scrollbar+'" height="'+winH+'"></iframe>');	
				},false,caption);
			}
			
			
			fn.viewYouTube = function(src,caption){
				if (!src.match(/youtube\.com\/watch/i)){
					alert(_cfg.languages.error_not_youtube);
					return false;
				}
				var vidId = src.split('v=')[1].split('&')[0];
				var vidSrc = "http://www.youtube.com/v/" + vidId + "&hl=en&fs=1&autoplay=1&rel=0";
				var winW = 640;
				var winH = 385;
				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);
			
			// 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 'flv':fn.viewFLV(src,caption);break;
				case 'wmv': fn.viewWMV(src,caption);break;
				case 'mp3': fn.viewMP3(src,caption);break;
				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)
