if(window.TOOL === undefined) {
    document.write('<script type="text/javascript" src="javascript/cropper/tool.js"></script>');
}
if(window.Position === undefined) {
    document.write('<script type="text/javascript" src="javascript/core/Position.js"></script>');
}
if(window.Animator === undefined) {
    document.write('<script type="text/javascript" src="javascript/core/Animator.js"></script>');
}

var ModalBox = (function(){
	
	var instance = null;
	
	function fnConstructor(){
		
		//default values
	 	var options = {};
	 	var boxWidth = 350;
	 	var boxHeight = 270;
	 	var pageLayer = null;
	 	var pageMask = null;
	 	var box = null;
	 	var opened = false;
	 	
	 	var initSwitch;
	 	
 		var init = function()
 		{
 			if(initSwitch)
 			{
 				EventUtil.addEventHandler(initSwitch, 'click', showBox);
 			}
 		};
 		
 		var showBox = function()
 		{
 			var oEvent = EventUtil.getEvent();
 			oEvent.preventDefault();
 			oEvent.stopPropagation();

 			open_window();
 		};
 		
 		var kill = function()
 		{
 		    document.body.removeChild(pageLayer);
 			document.body.removeChild(pageMask);
			document.body.removeChild(box);
			opened = false;
 			return true;
 		}
 		
 		var maskPage = function()
 		{
 			var oLayer = document.createElement('iframe');
 			if(TOOL.Client.IE) {
 			    var frameborder = oLayer.getAttributeNode('frameborder');
 			    frameborder.value = 0;
 			}
 			var oPageMask = document.createElement('div');
 			pageLayer = TOOL.extendElement(oLayer);
 			pageMask = TOOL.extendElement(oPageMask);
 			
 			var oStyle = {
 				'position' : 'absolute',
 				'width' : options.maskPage ? getInnerSize('width') + 'px' : boxWidth + 20 + 'px',
 				'height' : options.maskPage ? (options.scroll ? document.body.offsetHeight + 'px' : getInnerSize('height') + 'px') : boxHeight + 20 + 'px',
 				'top' : options.maskPage ? (options.scroll ? '0px' : getScrollOffset('y') + 'px') : Math.floor((getInnerSize('height')-(boxHeight+20))/2 + getScrollOffset('y')) + 'px',
 				'left' : options.maskPage ? getScrollOffset('x') + 'px' : Math.floor((getInnerSize('width')-(boxWidth+20))/2 + getScrollOffset('x')) + 'px',
 				'background-color' : '#000',
 				'opacity' : 0.6,
 				'z-index' : 1000,
 				'border' : 'none'
 			};
 			
 			pageMask.setStyle(oStyle);
 			pageLayer.setStyle(oStyle);
 			pageLayer.setStyle({'opacity' : 0});
 			// fix problems with window resizing and scrolling
 			EventUtil.addEventHandler(window, 'resize', resizeMask);
 			if (!options.scroll) EventUtil.addEventHandler(window, 'scroll', resizeMask);
 			document.body.appendChild(pageLayer);
 			document.body.appendChild(pageMask);
 		};
 		
 		var resizeMask = function()
 		{
 			var oStyle = {
 				'width' : options.maskPage ? getInnerSize('width') + 'px' : boxWidth + 20 + 'px',
 				'height' : options.maskPage ? getInnerSize('height') + 'px' : boxHeight + 20 + 'px',
 				'top' : options.maskPage ? getScrollOffset('y') + 'px' : Math.floor((getInnerSize('height')-(boxHeight+20))/2 + getScrollOffset('y')) + 'px',
 				'left' : options.maskPage ? getScrollOffset('x') + 'px' : Math.floor((getInnerSize('width')-(boxWidth+20))/2 + getScrollOffset('x')) + 'px'
 			};
 			pageLayer.setStyle(oStyle);
 			pageMask.setStyle(oStyle);
 			return false;
 		};
 		 		
 		var addBox = function()
 		{
 			var oWindow = document.createElement('div');
 			box = TOOL.extendElement(oWindow);
 			
 			var oWindowStyle = {
 				'width' : boxWidth + 'px',
 				'height' : boxHeight + 'px',
 				'position' : 'absolute',
 				'top' : Math.max((0 + getScrollOffset('y')), Math.floor((getInnerSize('height')-boxHeight)/2 + getScrollOffset('y'))) + 'px',
 				'left' : Math.max((0 + getScrollOffset('x')), Math.floor((getInnerSize('width')-boxWidth)/2 + getScrollOffset('x'))) + 'px',
 				'background-color' : options.background ? options.background : '#fff',
 				'border' : options.border ? options.border : '1px solid #ccc',
 				'padding' : options.padding ? options.padding + 'px' : '0px',
 				'z-index' : 1001
 			}
 			
 			box.setStyle(oWindowStyle);
 			
 			//place the content from the url inside the box
 			if(options.iframe)
 			{
	 			var iF = getIframeContent();
	 			box.appendChild(iF);
	 		}
	 		if(options.ajax)
	 		{
	 			var content = new Net.Updater(box, initSwitch.href)
	 		}
 			EventUtil.addEventHandler(window, 'resize', repositionBox);
 			if (!options.scroll) EventUtil.addEventHandler(window, 'scroll', repositionBox);
 			document.body.appendChild(box);
 			opened = true;
 		};
 		
 		var repositionBox = function()
 		{
 			var oBoxStyle = {
 				'top' : Math.max((0 + getScrollOffset('y')), Math.floor((getInnerSize('height')-boxHeight)/2 + getScrollOffset('y'))) + 'px',
 				'left' : Math.max((0 + getScrollOffset('x')), Math.floor((getInnerSize('width')-boxWidth)/2 + getScrollOffset('x'))) + 'px'
 			}
 			box.setStyle(oBoxStyle);
 			return false;
 		};
 		
 		var getIframeContent = function()
 		{
 			var iF = document.createElement('iframe');
 			iF = TOOL.extendElement(iF);
 			
 			var oFrameStyle = {
 				'width' : boxWidth + 'px',
 				'height' : boxHeight + 'px',
 				'border' : 'none',
 				'overflow' : 'hidden'
 			}

 			if(TOOL.Client.IE) iF.frameBorder = 0;
 			iF.setStyle(oFrameStyle);
 			iF.src = initSwitch.href;
 			return iF;
 		};
 		
 		var getInnerSize = function()
 		{
 			var myWidth = 0, myHeight = 0;
	
			if( typeof( window.innerWidth ) == 'number' ) {
				//Non-IE
				myWidth = window.innerWidth;
				myHeight = window.innerHeight;
			} else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) {
				//IE 6+ in 'standards compliant mode'
				myWidth = document.documentElement.clientWidth;
				myHeight = document.documentElement.clientHeight;
			} else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) {
			    //IE 4 compatible
				myWidth = document.body.clientWidth;
		    	myHeight = document.body.clientHeight;
			}
			var oSize = {width : myWidth, height : myHeight};
		  
			if(arguments.length > 0)
			{
				return oSize[arguments[0]];
			}
			return oSize;
 		};
 		
 		var getScrollOffset = function()
 		{
 			var scrOfX = 0, scrOfY = 0;
			if( typeof( window.pageYOffset ) == 'number' ) {
			    //Netscape compliant
			    scrOfY = window.pageYOffset;
			    scrOfX = window.pageXOffset;
		  	} else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
			    //DOM compliant
			    scrOfY = document.body.scrollTop;
			    scrOfX = document.body.scrollLeft;
		  	} else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
			    //IE6 standards compliant mode
			    scrOfY = document.documentElement.scrollTop;
			    scrOfX = document.documentElement.scrollLeft;
		  	}
		  	var oScroll = {x : scrOfX, y : scrOfY};
		  	if(arguments.length > 0)
			{
				return oScroll[arguments[0]];
			}
		 	return oScroll;
 		};
 		
 		
 		
 		// public
 		var set_options = function(oOptions)
 		{
 			options = oOptions || {};
 			boxWidth = (options.width) ? parseInt(options.width) : 350;
 			boxHeight = (options.height) ? parseInt(options.height) : 270;
 		};
 		
 		// public
 		var set_trigger = function(sLinkId)
 		{
 			initSwitch = arguments.length ? $get(arguments[0]) : {};
 			init();
 		};
 		
 		// public
 		var add_element = function(oEle)
 		{
 			if (!oEle.nodeName) return;
 			box.appendChild(oEle);
 		};
 		
 		// public
 		var open_window = function()
 		{
 			if(opened) return;
 			if(!initSwitch) initSwitch = {};
 			if(arguments.length) initSwitch.href = arguments[0];
 			maskPage();
 			addBox();
 			opened = true;
 		};
 		
 		// public
 		var close_window = function()
 		{
 			//
 			if(opened)
 			{
 				var tt = options.totalTime || 1000;
 				if(options.fade)
 				{
 					var Animations = [];
 					for (var i=0; i<2; i+=1){Animations[i] = new Animator.Opacity();}
 					Animations[0].animate(pageMask, 0, tt, 2);
 					Animations[1].animate(box, 0, tt, 2);
 					
 					setTimeout(kill, tt);
 				}
 				else if(options.collapse)
 				{
 					pageMask.setOpacity(0);
 					box.innerHTML = ''
 					box.style.border = '2px solid #aaa';
 					
 					var Css = [];
 					for (var i=0; i<2; i+=1){Css[i] = new Animator.Css();}
 					Css[0].animate(box, 'width', 0, tt, 1);
 					Css[1].animate(box, 'height', 0, tt, 1);
 					
 					//animate arc
 					var Arc = new TunnelEffect();
 					Arc.animate(box, boxWidth/2, boxHeight/2, 360, 270, tt, 2);
 					
 					setTimeout(kill, tt);
 				}
 				else
				{
					kill();
				}
 			}
 		};
 		
 		return {
 			setOptions : set_options,
 			setTrigger : set_trigger,
 			add : add_element,
 			openWindow : open_window,
 			closeWindow : close_window
 		};
	};
	
	return {
		getInstance : function()
		{
			if(!instance)
			{
				instance = fnConstructor();
			}
			return instance;
		}
	};
})();

/************************************************************************************************/
var TunnelEffect = __class__();
TunnelEffect.inherits(Animator.Arc, {
	__construct : function()
	{
		this.parent.parent.constructor.apply(this, arguments);
		this.clones = [];
	},
	arc : function()
	{
		this.parent.arc.call(this);
		if(!this.ele.id && Math.round(this.totalTime-this.elapsedTime)%2 
		&& this.totalTime-this.elapsedTime > this.elapsedTime)
		{
			var clone = document.createElement('div');
			TOOL.extend(clone.style, this.ele.style);
			clone.style.backgroundColor = 'transparent';
			clone.id = this.clones.length;
			this.clones.push(clone);
			
			document.body.appendChild(this.clones[clone.id]);
			
			var clear = this.clear.bind(this);
			var effect = new TunnelEffect();
			effect.animate(this.clones[clone.id], (TOOL.getComputedStyle(this.ele, 'width', true)/2), (TOOL.getComputedStyle(this.ele, 'height', true)/2), this.x1, this.x2, this.totalTime - this.elapsedTime, this.acceleration, this.quarterCycles, clear);
		}
		else if(this.totalTime-this.elapsedTime <= this.elapsedTime) 
		{
			try{
				var clone = this.clones.shift();
				document.body.removeChild(clone);
			}
			catch(e)
			{
				return;
			}
		}
	},
	
	clear : function()
	{
		for (var each in this.clones)
		{
			try{
				var clone = this.clones[each];
				document.body.removeChild(clone);
			}
			catch(e)
			{
				return;
			}
		}
	}
});