
var DomwinDesktop = new Class({
	options: {
		draggable: true,
		resizable: false,
		minimizable: true, // this is automatically reset to false if there is no dock
		maximizable: true, // this is automatically reset to false if #domwinDesktop is not present
		closable: true,
		headerHeight: 25,
		footerHeight: 30,
		cornerRadius: 9,
		desktopTopOffset: 20, // use a negative number if neccessary to place first window where you want it
		desktopLeftOffset: 290,
		domwinTopOffset: 70, // initial vertical spacing of each window
		domwinLeftOffset: 70, // initial horizontal spacing of each window
		newWindowPosTop: 0, // In the current setup this just initializes the variable and does not effect the position
		newWindowPosLeft: 0, // In the current setup this just initializes the variable and does not effect the position
		minWidth: 150, // minimum width of windows when resized
		maxWidth: 2500, // maximum width of windows when resized
		minHeight: 50,	// minimum height of windows when resized	
		maxHeight: 2000, // maximum height of windows when resized	
		flagPath: '/css/admin/langs/',
		languages:['cz','en','de']
	},
	initialize: function(options){
		this.setOptions(options);
		// Private properties		
		this.indexLevel = 1;
		this.domwinControlsWidth = 0;
		this.minimizebuttonX = 0;
		this.maximizebuttonX = 0;
		this.closebuttonX = 0;
		this.scrollWidthOffset = 6;
		this.windowIDCount = 0;
		new Element('canvas');
		// Add properties to elements in the DOM
		// Consider moving this to windowProperties
		// so it is not added to all the elements in the DOM
		// but just to the windows
		Element.implement({oldTop: ''});
		Element.implement({oldLeft: ''});
		Element.implement({oldWidth: ''});
		Element.implement({oldHeight: ''});
		Element.implement({maximizeToggle: 'maximize'});
		Element.implement({modal: ''});
		Element.implement({iframe: ''});
		Element.implement({contentURL: ''});
		$$('div.domwin').setStyle('display', 'block');
				
		if ($('domwinDesktop')) {
			this.setDesktopSize();
		} else {
			//this.options.maximizable = false;  only for special div
		}
		if ($('domwinDock')) { // div for minimalization
			if (this.options.minimizable == true){
				$('domwinDock').setStyles({
					'position': 'absolute',
					'top': null,
					'bottom': 0,
					'left': 0
				});
				this.initDock($('domwinDock'));
				this.drawDock($('domwinDock'));
			}
			else {
				$('domwinDock').setStyle('display', 'none');	
			}
		} else {
			this.options.minimizable = false;
		}
		this.insertWindowElements($$('div.domwin'));
		this.drawAll();
		this.attachDraggable($$('div.domwin'));
		this.attachResizable($$('div.domwin'));
		this.attachFocus($$('div.domwin'));
		this.attachMinimize($$('div.domwin'));
		this.attachMaximize($$('div.domwin'));
		this.attachClose($$('div.domwin'));
		this.arrangeCascade();

		// Modal initialization
		var domwinModal = new Element('div', {
			'id': 'domwinModalBackground'
		});		

		if ($('domwinDesktop')){
			domwinModal.injectInside($('domwinDesktop'));
		}
		else {
			domwinModal.injectInside(document.body);
		}
		this.setModalSize();

		domwinModal.setStyle('opacity', .4);
		this.modalOpenMorph = new Fx.Morph($('domwinModalBackground'), {
				'duration': 200
				});
		this.modalCloseMorph = new Fx.Morph($('domwinModalBackground'), {
			'duration': 200,
			onComplete: function(){
				$('domwinModalBackground').setStyle('display', 'none');
			}.bind(this)
		});		
		
		if (Browser.Engine.trident && $("domwinDesktopNavbar")){ // fix for dropdown menus in IE
			var sfEls = $("domwinDesktopNavbar").getElementsByTagName("LI");
			for (var i=0; i<sfEls.length; i++) {
				sfEls[i].onmouseover=function(){
					this.className += " sfhover";
				}
				sfEls[i].onmouseout = function(){
					this.className = this.className.replace(new RegExp(" sfhover\\b"), "");
				}
			}
		};
		
		window.onresize = function(){
			this.setDesktopSize();
			this.setModalSize();
			setTimeout( function(){
				this.drawAll();
			}.bind(this), 100);
		}.bind(this)
	},
	/*
	
	Method: newWindow
	
	Arguments: 
		properties

	*/	
	newWindow: function(properties){
		windowProperties = $extend({
			id: null,
			title: 'New Window',
			loadMethod: 'html', 				// html, xhr, or iframe
			content: '', 						// used if loadMethod is set to 'html'
			contentURL: 'www.fastest.cz',	// used if loadMethod is set to 'xhr' or 'iframe'			
			modal: false,
			width: 300,
			height: 125, 
			scrollbars: true,
			x: null,
			y: null,
			paddingVertical: 10,
			paddingHorizontal: 12,
			bgColor: '#fff',
			onBeforeLoad: $empty,
			onContentLoaded: $empty,			// Event, fired when content is successfully loaded via XHR
			onFocus: $empty,					// Event, fired when the window is focused
			onResize: $empty,					// Event, fired when the window is resized
			onMinimize: $empty,					// Event, fired when the window is minimized
			onMaximize: $empty,					// Event, fired when the window is maximized
			onClose: $empty,					// Event, fired just before the window is closed
			onCloseComplete: $empty,		    // Event, fired after the window is closed	
			languages: false					// used for render languages box 
		}, properties || {});
		
		this.options.langEnabled = windowProperties.languages;
		// Check if window already exists
		if ( $(windowProperties.id) ) {
			if ( $(windowProperties.id).getStyle('display') == 'none' ) {
				// If window is minimized, instead of creating a duplicate window, restore minimized window
				$(windowProperties.id).setStyle('display','block');
				$$('button.domwinDockButton').each(function(el){
					if (el.getProperty('winAssociated') == windowProperties.id){
						el.dispose();
					}
				});
			}
			// If window exists and is not minimized, give the findow focus			
			setTimeout(function(){ this.focusWindow($(windowProperties.id)); }.bind(this),10);			
			return;
		}
		
		// Create window div
		var domwinNewWindow = new Element('div', {
			'class': 'domwin',
			'id': 'win' + (++this.windowIDCount)
		});
		
		// Set window ID. This is being set twice. Might think about how to consolidate the two instances
		if (windowProperties.id){
			domwinNewWindow.setProperty('id', windowProperties.id);
		}		
		
		// Inject window in the page
		if ($('domwinDesktop')){
			domwinNewWindow.injectInside($('domwinDesktop'));
		}
		else {
			domwinNewWindow.injectInside(document.body);
		}
		
		// Add content to window
		if (windowProperties.loadMethod == 'html') {
			domwinNewWindow.setHTML(windowProperties.content);	
		}
		
		// Is the window modal or not
		if (windowProperties.modal) {
			domwinNewWindow.modal = true;
		}

		// Does the window use an Iframe for it's content?
		if (windowProperties.contentURL && windowProperties.loadMethod != 'html') {
			domwinNewWindow.contentURL = windowProperties.contentURL;
			if (windowProperties.loadMethod == 'iframe'){
				domwinNewWindow.iframe = true;
			}
		}

		// Set height and width of window
		domwinNewWindow.setStyles({
			'width': windowProperties.width,
			'height': windowProperties.height,
			'display': 'block'
		});
		
		// Create window header
		new Element('h3', {
			'class': 'domwinTitle'
		}).setHTML(windowProperties.title).injectTop(domwinNewWindow);

		// Here is where the new windows and the onstart windows use the same code.
		// We want to merge new window and onstart window creation 
		domwinNewWindow.onBeforeLoad = windowProperties.onBeforeLoad;
		this.insertWindowElements([domwinNewWindow]);
		
		// Add canvas gui to new window
		this.drawWindow(domwinNewWindow);

		// Set scrollbars to auto or hidden
		var scrollbars = windowProperties.scrollbars ? 'auto' : 'hidden';
		domwinNewWindow.getElement('.domwinScroller').setStyles({
			'overflow-y': scrollbars,
			'background': windowProperties.bgColor
		});

		// Set content padding
		domwinNewWindow.getElement('.domwinScrollerpad').setStyles({
			'padding-top': windowProperties.paddingVertical,
			'padding-bottom': windowProperties.paddingVertical,
			'padding-left': windowProperties.paddingHorizontal,
			'padding-right': windowProperties.paddingHorizontal
		});
	
		// Set events for the window
		
		domwinNewWindow.onContentLoaded = windowProperties.onContentLoaded;
		domwinNewWindow.onFocus = windowProperties.onFocus;
		domwinNewWindow.onResize	= windowProperties.onResize;
		domwinNewWindow.onMinimize = windowProperties.onMinimize,
		domwinNewWindow.onMaximize = windowProperties.onMaximize;
		domwinNewWindow.onClose = windowProperties.onClose;
		domwinNewWindow.onCloseComplete = windowProperties.onCloseComplete;
		
		// Attach events to the window
		if (!domwinNewWindow.modal) {
			this.attachDraggable([domwinNewWindow]);
			this.attachResizable([domwinNewWindow], windowProperties.onResize);
			this.attachFocus([domwinNewWindow], windowProperties.onFocus);
			this.attachMinimize([domwinNewWindow], windowProperties.onMinimize);
			this.attachMaximize([domwinNewWindow], windowProperties.onMaximize);
		}
		this.attachClose([domwinNewWindow]);

		// Move new window into position
		if (windowProperties.x && windowProperties.y) {
			this.options.newWindowPosTop = windowProperties.y;
			this.options.newWindowPosLeft = windowProperties.x;
		}
		else {
			/*var top = (this.getWindowHeight() * .5) - (domwinNewWindow.offsetHeight * .5);*/
			
			var top = (document.getCoordinates().height * .5) - (domwinNewWindow.offsetHeight * .5) + window.getScroll().y;
			var left= (this.getWindowWidth() * .5) - (domwinNewWindow.offsetWidth * .5);
			this.options.newWindowPosTop = (top<0)?3:top;
			this.options.newWindowPosLeft = (left<0)?3:left;
		}
		
		if (domwinNewWindow.modal) {
			$('domwinModalBackground').setStyle('display', 'block');
			this.modalOpenMorph.start({
				'opacity': .55
			});
			domwinNewWindow.setStyles({
				'top': this.options.newWindowPosTop,
				'left': this.options.newWindowPosLeft
			});
		} else {
			var domwinMorph = new Fx.Morph(domwinNewWindow, {
				'duration': 300,
				onComplete: function(){
					if (domwinNewWindow.onBeforeLoad) domwinNewWindow.onBeforeLoad();
				}
			});
			domwinMorph.start({
				'top': this.options.newWindowPosTop,
				'left': this.options.newWindowPosLeft
			});
		}
		
		// Set the zIndex for the new window
		if (windowProperties.modal) {
			domwinNewWindow.setStyles({
				'zIndex': 100000
			});
		}
		else {
			setTimeout(function(){ this.focusWindow(domwinNewWindow); }.bind(this), 10);
		}
		return;
	},
	/*
	
	Method: closeWindow
	
	Arguments: 
		el: the $(window) to be closed

	Returns:
		true: the window was closed
		false: the window was not closed

	*/
	closeWindow: function(el) {
		var element = $(el);
		
		if (el.onClose){	
			el.onClose();
		}
		
		// redraws IE windows without shadows since IE messes up canvas alpha when you change element opacity
		//if (Browser.Engine.trident) this.drawWindow(el, false); 
		
		if (element.modal) {
			this.modalCloseMorph.start({
				opacity: 0
			});
		}
		
		var closeMorph = new Fx.Morph(element, {
			duration: 250,
			onComplete: function(){
				element.dispose();
				if (el.onCloseComplete){
					el.onCloseComplete();
				}	
			}.bind(this)
		});

		closeMorph.start({
			opacity: .4
		});

		return true;
	},
	focusWindow: function(el){
		this.indexLevel ++;
		el.setStyle('zIndex', this.indexLevel);
	},
	getWindowWidth: function(){
		var windowDimensions = document.getCoordinates();
		return windowDimensions.width;
	},
	getWindowHeight: function(){
		/* old version 
		var windowDimensions = document.getCoordinates();
		return windowDimensions.height;
		*/
		var windowDimensions = document.getScrollSize();
		return windowDimensions.x;
	},	
	setDesktopSize: function(){
		if ($('domwinDesktop')) {
			$('domwinDesktop').setStyle('width', this.getWindowWidth() - 20); // To adjust for broswer scrollbar
			setTimeout( function(){
				$('domwinDesktop').setStyle('width', this.getWindowWidth());
			}.bind(this), 100);
			$('domwinDesktop').setStyle('height', this.getWindowHeight());
			if ($('domwinPageWrapper')){
				$('domwinPageWrapper').setStyle('height', this.getWindowHeight());
			}
		}
	},
	setModalSize: function(){
	
		//$('domwinModalBackground').setStyle('height', this.getWindowHeight());
		$('domwinModalBackground').setStyle('height', window.getScrollSize().y);
	},	
	insertWindowElements: function(elementArray){
		elementArray.each(function(el){
			var domwinTempContents = el.innerHTML;
			el.empty();

			if (Browser.Engine.trident4){
				el.innerHTML = '<iframe class="zIndexFix" scrolling="no" marginwidth="0" src="" marginheight="0"></iframe>';
			}
			
			var domwinOverlay = new Element('div', {
				'class': 'domwinOverlay'
			}).injectInside(el);
			
			if (Browser.Engine.trident){
				domwinOverlay.setStyle('zIndex', 2)
			}
			// Create language box
			var domwinLanguagebar = new Element('div',{'class':'domwinLanguage'})
				.setStyles({
					'position'	: 'absolute',
					'right'		: -29,
					'width'		: 	35,
					'top'		:	31,
					'z-index'	:	'9999'
				}).injectTop(domwinOverlay);
				
			if (this.options.langEnabled){
				this.options.languages.each(function(item){
					new Element('img',{'src':'/css/admin/langs/' + item + '.gif','style':'margin:2px 2px 2px 2px; cursor:pointer'})
					.addEvent('click',(function(){
						el.getElement('.domwinContent').getElements('.languages').setStyle('display','none');
						el.getElement('.domwinContent').getElements('.languages.lang_' + item).setStyle('display','block');
					}).bindWithEvent(this))
					.inject(domwinLanguagebar);
				});
			}
			
							


			//Insert domwinTitlebar
			var domwinTitlebar = new Element('div', {
				'class': 'domwinTitlebar'
			}).injectTop(domwinOverlay);
			
			if (this.options.draggable && !el.modal){
				domwinTitlebar.setStyle('cursor', 'move');
			}

			var domwinContent = new Element('div', {
				'class': 'domwinContent'
			}).injectInside(domwinOverlay);

			domwinContent.setStyles({
				width: el.getStyle('width'),
				height: el.getStyle('height')
			});

			var domwinScroller = new Element('div', {
				'class': 'domwinScroller'
			}).injectTop(domwinContent);

			var domwinScrollerpad = new Element('div', {
				'class': 'domwinScrollerpad'
			}).setHTML(domwinTempContents).injectInside(domwinScroller);
			
			if (el.iframe){
				var domwinIframe = new Element('iframe', {
					'id': el.id + 'Iframe',						  
					'class': 'domwinIframe',
					'src': el.contentURL,
					'marginwidth': 0,
					'marginheight': 0,
					'frameBorder': 0,
					'scrolling': 'auto'
				}).injectInside(domwinScrollerpad);
			}			
			
			var domwinTitlebarH3 = domwinScrollerpad.getElement('h3.domwinTitle').clone().injectInside(domwinTitlebar);
			domwinScrollerpad.getElement('.domwinTitle').dispose();
			
			
			
			if(el.contentURL && !el.iframe){
				new Request.HTML({
					url: el.contentURL,
					onRequest: function(){
					},
					onFailure: function(){
						domwinScrollerpad.setHTML('<p><strong>Error Loading XMLHttpRequest</strong></p><p>Problém s naèítaním dane URL adresy</p>');
					},
					onSuccess: (function(response) {
						if ( el.onContentLoaded ) el.onContentLoaded();
						
						if (this.options.langEnabled){
							el.getElement('.domwinContent').getElements('.languages').setStyle('display','none');
							el.getElement('.domwinContent').getElement('.languages').setStyle('display','block');
						}
					}).bind(this),
					update:domwinScrollerpad,
					evalScripts	:true
				}).get();
			}
			
			//Insert canvas
			var canvas = new Element('canvas', {
				'class': 'domwinCanvas',
				'width': 1,
				'height': 1,
				'z-index': 1001
			}).injectInside(el);

			// Dynamically initialize canvas using excanvas. This is only required by IE
			if (Browser.Engine.trident) {
				G_vmlCanvasManager.initElement(canvas);
			}
			
			//Insert resize handles
			if (this.options.resizable && !el.modal){
				var resizeHandle = new Element('div', {
					'class': 'resizeHandle'
				}).injectAfter(domwinOverlay);
			}

			if (Browser.Engine.trident && !el.modal){
				$$(resizeHandle).setStyle('z-index', 2)	
			}

			//Insert domwinTitlebar controls
			var domwinControls = new Element('div', {
				'class': 'domwinControls','style':'border:1px solid #FF0000'
			}).injectAfter(domwinOverlay);

			if (Browser.Engine.trident){
				domwinControls.setStyle('zIndex', 2)
			}

			//Insert close button
			if (this.options.closable || el.modal){
				new Element('div', {
					'class': 'domwinClose',
					'title': 'Zavřít'
				}).setHTML('aaa').injectInside(domwinControls);
			}				

			//Insert maximize button
			if (this.options.maximizable && !el.modal){
				new Element('div', {
					'class': 'maximizeToggle',
					'title': 'Maximalizovat'
				}).inject(domwinControls);
			}

			//Insert minimize button
			if (this.options.minimizable){
				new Element('div', {
					'class': 'minimizeToggle',
					'title': 'Minimalizovat'
				}).injectInside(domwinControls);
			}

		}.bind(this));
	},
	drawAll: function(){
		$$('div.domwin').each(function(el){
			if (el.getStyle('display') != 'none'){
				this.drawWindow(el);
			}
		}.bind(this));
	},
	/*
	
	Method: drawWindow
	
	Arguments: 
		el: the $(window)
		shadows: (boolean) false will draw a window without shadows
		
	Notes: This is where we create the canvas GUI	

	*/	
	drawWindow: function(el, shadows) {
		var domwinIframe = el.getElement('.zIndexFix');
		var domwinOverlay = el.getElement('.domwinOverlay');
		var domwinContent = el.getElement('.domwinContent'); 
		var domwinScroller = el.getElement('.domwinScroller');
		var domwinTitlebar = el.getElement('.domwinTitlebar');
		//var domwinCanvas = el.getElement('.domwinCanvas');
		
		var domwinControls = el.getElement('.domwinControls');
		var domwinLanguage = el.getElement('.domwinLanguage');

			
		//var cv = new Canvas();
		//var ctx = cv.getContext('2d');
		//el.adopt(cv.addClass('domwinCanvas'));
		var domwinCanvas = el.getElement('.domwinCanvas');
		
		//var cv = new Canvas(domwinCanvas);
		//var ctx = cv.getContext('2d');
	
		var ctx = domwinCanvas.getContext('2d');

		//Assign a unique id to each window, 
		//that doesn't yet have an id.
		//This is happening at least three times for windows not created onstart.
		//Should rethink the flow on this.
		if(el.id == ""){el.id = 'win' + (++this.windowIDCount);}

		//This should probably be in the insertWindowElements method rather than here
		this.setDomwinControlsWidth(el);

		if (el.maximizeToggle == 'restore') {
			domwinContent.setStyle('height', (this.getWindowHeight() - this.options.headerHeight - this.options.footerHeight + 6));
			domwinContent.setStyle('width', this.getWindowWidth());
		}
		
		domwinScroller.setStyle('height', domwinContent.getStyle('height'));
		domwinScroller.setStyle('width', domwinContent.getStyle('width'));
		
		//Resize iframe when window is resized
		if (el.iframe) {
			el.getElement('.domwinIframe').setStyles({
				'height': domwinContent.getStyle('height')
			});
		}
	
		domwinHeight = domwinContent.scrollHeight;
		domwinWidth = domwinContent.scrollWidth + this.scrollWidthOffset;
		domwinHeight += this.options.headerHeight + this.options.footerHeight;
		
		//Firefox returns null and IE returns empty string difference
		// Definitely in the wrong place
		var sTitleBarTitle = domwinTitlebar.getProperty('title');
		
		//Firefox
		//Also in the wrong place
		if(sTitleBarTitle == null) {
			sTitleBarTitle = "";
		}

		domwinOverlay.setStyle('height', domwinHeight);
		el.setStyle('height', domwinHeight);

		if (window.webkit) {
			domwinCanvas.setProperties({
				'width': 4000,
				'height': 2000
			});
		} else {
			domwinCanvas.width = domwinWidth+30;
			domwinCanvas.height = domwinHeight;
		}

		// Part of the fix for IE6 select z-index bug and FF on Mac scrollbar z-index bug
		if (Browser.Engine.trident4){
			domwinIframe.setStyle('width', domwinWidth);
			domwinIframe.setStyle('height', domwinHeight);
		}

		// Set width		
		domwinOverlay.setStyle('width', domwinWidth); 
		el.setStyle('width', domwinWidth);
		domwinTitlebar.setStyle('width', domwinWidth - 6);
	
		// Draw shapes
		ctx.clearRect(0, 0, this.getWindowWidth(), this.getWindowHeight());
		var langsYA = Array();
		
		langsYA[0] = 0;
		langsYA[1] = 55;
		langsYA[2] = 120;
		langsYA[3] = 180;
		
		var langY = langsYA[this.options.languages.length];
		
		if (!this.options.langEnabled){
			if (shadows == null || shadows == false && !Browser.Engine.trident){
				this.roundedRect(ctx, 0, 0, domwinWidth, domwinHeight, this.options.cornerRadius, 0, 0, 0, 0.06,langY); //shadow
				this.roundedRect(ctx, 1, 1, domwinWidth - 2, domwinHeight - 2, this.options.cornerRadius, 0, 0, 0, 0.08,langY); //shadow
				this.roundedRect(ctx, 2, 2, domwinWidth - 4, domwinHeight - 4, this.options.cornerRadius, 0, 0, 0, 0.3,langY); //shadow
			}		
			this.roundedRect(ctx,3,2,domwinWidth-6,domwinHeight-6,this.options.cornerRadius,246,246,246,1.0,langY);	//domwin body		
		} else {
			if (shadows == null || shadows == false && !Browser.Engine.trident){
				this.roundedRectLang(ctx, 0, 0, domwinWidth, domwinHeight, this.options.cornerRadius, 0, 0, 0, 0.06,langY); //shadow
				this.roundedRectLang(ctx, 1, 1, domwinWidth - 2, domwinHeight - 2, this.options.cornerRadius, 0, 0, 0, 0.08,langY); //shadow
				this.roundedRectLang(ctx, 2, 2, domwinWidth - 4, domwinHeight - 4, this.options.cornerRadius, 0, 0, 0, 0.3,langY); //shadow
			}		
		
			this.roundedRectLang(ctx,3,2,domwinWidth-6,domwinHeight-6,this.options.cornerRadius,246,246,246,1.0,langY);	//domwin body
		}
		this.topRoundedRect(ctx,3,2,domwinWidth-this.scrollWidthOffset,this.options.headerHeight,this.options.cornerRadius); //domwin header

		if (this.options.closable && this.options.maximizable){
			this.minimizebuttonX = domwinWidth - 53;
		} else if (this.options.closable || this.options.maximizable){
			this.minimizebuttonX = domwinWidth - 34;
		} else {
			this.minimizebuttonX = domwinWidth - 15;
		}

		if (this.options.closable){
			this.maximizebuttonX = domwinWidth - 34;
		}
		else {
			this.maximizebuttonX = domwinWidth - 15;
		}

		this.closebuttonX = domwinWidth - 15;

			if (this.options.closable || el.modal){
				this.closebutton(ctx, this.closebuttonX, 15, 229, 217, 217, 1.0);
			}
			if (this.options.maximizable && !el.modal){
				this.maximizebutton(ctx, this.maximizebuttonX, 15, 217, 229, 217, 1.0);
			}
			if (this.options.minimizable && !el.modal){
				this.minimizebutton(ctx, this.minimizebuttonX, 15, 231, 231, 209, 1.0); //Minimize
			}
			if (this.options.resizable && !el.modal){
			this.triangle(ctx, domwinWidth - 20, domwinHeight - 20, 12, 12, 209, 209, 209, 1.0); //resize handle
			}
			this.triangle(ctx, domwinWidth - 20, domwinHeight - 20, 10, 10, 0, 0, 0, 0); //invisible dummy object. The last element drawn is not rendered consistently while resizing in IE6 and IE7.

	},
	//domwin body
	roundedRect: function(ctx,x,y,width,height,radius,r,g,b,a){
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.beginPath();
		ctx.moveTo(x,y+radius);
		ctx.lineTo(x,y+height-radius);
		ctx.quadraticCurveTo(x,y+height,x+radius,y+height);
		ctx.lineTo(x+width-radius,y+height);
		ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);
		ctx.lineTo(x+width,y+radius);
		ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
		ctx.lineTo(x+radius,y);
		ctx.quadraticCurveTo(x,y,x,y+radius);
		ctx.fill(); 
	},

	roundedRectLang: function(ctx,x,y,width,height,radius,r,g,b,a,langY){
		var radius_small = radius-5;
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.beginPath();
		ctx.moveTo(x,y+radius);
		ctx.lineTo(x,y+height-radius);
		ctx.quadraticCurveTo(x,y+height,x+radius,y+height);
		ctx.lineTo(x+width-radius,y+height);
		ctx.quadraticCurveTo(x+width,y+height,x+width,y+height-radius);
		ctx.lineTo(x+width,y+langY);
		// doprava
		ctx.lineTo(x+width + 20 ,y+langY);
	
		// nahoru
		ctx.quadraticCurveTo(
			x + width + 22 + radius_small, 
			y + langY , 
			x + width + 22 + radius_small, 
			y + langY - radius_small
		);
		ctx.lineTo(x+width + 22 + radius_small ,y + 2*radius_small+22);
		ctx.quadraticCurveTo(
			x+width + 22 + radius_small ,
			y + radius_small+22,
			x+width + 22,
			y + radius_small+22
		);
		ctx.lineTo(x+width ,y + radius_small+22);
		ctx.lineTo(x+width,y+radius);
			
		
		ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
		ctx.lineTo(x+radius,y);
		ctx.quadraticCurveTo(x,y,x,y+radius);
		ctx.fill(); 
	},
	//domwin header with gradient background
	topRoundedRect: function(ctx,x,y,width,height,radius){

		// Create gradient
		if (window.opera != null ){
			var lingrad = ctx.createLinearGradient(0,0,0,this.options.headerHeight+2);
		}
		else {
			var lingrad = ctx.createLinearGradient(0,0,0,this.options.headerHeight);
		}
		lingrad.addColorStop(0, 'rgba(158, 174, 190,100)');
		lingrad.addColorStop(1, 'rgba(67, 84, 104,100)');
		ctx.fillStyle = lingrad;

		// draw header
		ctx.beginPath();
		ctx.moveTo(x,y);
		ctx.lineTo(x,y+height);
		ctx.lineTo(x+width,y+height);
		ctx.lineTo(x+width,y+radius);
		ctx.quadraticCurveTo(x+width,y,x+width-radius,y);
		ctx.lineTo(x+radius,y);
		ctx.quadraticCurveTo(x,y,x,y+radius);
		ctx.fill(); 
	},
	// resize handle
	triangle: function(ctx,x,y,width,height,r,g,b,a){
		ctx.beginPath();
		ctx.moveTo(x+width,y);
		ctx.lineTo(x,y+height);
		ctx.lineTo(x+width,y+height);
		ctx.closePath();
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.fill();
	},
	drawCircle: function(ctx,x,y,diameter,r,g,b,a){
		//circle
		ctx.beginPath();
		ctx.moveTo(x,y);
		ctx.arc(x,y,diameter,0,Math.PI*2,true);
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.fill();
	},
	maximizebutton: function(ctx,x,y,r,g,b,a){ // this could reuse the drawCircle method above
		//circle
		ctx.beginPath();
		ctx.moveTo(x,y);
		ctx.arc(x,y,7,0,Math.PI*2,true);
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.fill();
		//X sign
		ctx.beginPath();
		ctx.moveTo(x,y-4);
		ctx.lineTo(x,y+4);
		ctx.stroke();
		ctx.beginPath();
		ctx.moveTo(x-4,y);
		ctx.lineTo(x+4,y);
		ctx.stroke();
	},
	closebutton: function(ctx,x,y,r,g,b,a){ // this could reuse the drawCircle method above
		//circle
		ctx.beginPath();
		ctx.moveTo(x,y);
		ctx.arc(x,y,7,0,Math.PI*2,true);
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.fill();
		//plus sign
		ctx.beginPath();
		ctx.moveTo(x-3,y-3);
		ctx.lineTo(x+3,y+3);
		ctx.stroke();
		ctx.beginPath();
		ctx.moveTo(x+3,y-3);
		ctx.lineTo(x-3,y+3);
		ctx.stroke();
	},
	minimizebutton: function(ctx,x,y,r,g,b,a){ // this could reuse the drawCircle method above
		//circle
		ctx.beginPath();
		ctx.moveTo(x,y);
		ctx.arc(x,y,7,0,Math.PI*2,true);
		ctx.fillStyle = 'rgba(' + r +',' + g + ',' + b + ',' + a + ')';
		ctx.fill();
		//minus sign
		ctx.beginPath();
		ctx.moveTo(x-4,y);
		ctx.lineTo(x+4,y);
		ctx.stroke();
	},
	attachDraggable: function(elementArray){
		elementArray.each(function(el){
			if (this.options.draggable && !el.modal){
				var domwinHandle = el.getElement('.domwinTitlebar');
				new Drag.Move(el, {
					handle: domwinHandle,
					onStart: function(){  
						el.getElement('.domwinContent').setStyle('display','none');
						this.focusWindow(el);
						if (el.iframe) {
							el.getElement('.domwinIframe').setStyles({
								'display': 'none'
							});
						}
					}.bind(this),
					onComplete: function(){
						if (el.iframe) {
							el.getElement('.domwinIframe').setStyles({
								'display': 'block'
							});
						}
						el.getElement('.domwinContent').setStyle('display','block');
					}.bind(this),
					limit: {
						x: [
							function() { return (window.getScrollLeft()); }, 
							function() { return window.getWidth() - el.offsetWidth + (window.getScrollLeft()); }
						], 
						y: [
							function() { return (window.getScrollTop()); },
							function() { return window.getHeight() - el.offsetHeight + (window.getScrollTop()); }
						]
					}
				});
			}
		}.bind(this));
	},
	attachResizable: function(elementArray){
		elementArray.each(function(el){		
			if (this.options.resizable && !el.modal){
				var domwinContent = el.getElement('.domwinContent');
				var resizeHandle = el.getElement('.resizeHandle');
				domwinContent.makeResizable({
					handle: resizeHandle,
					modifiers: {
						x: 'width',
						y: 'height'
					},
					limit: {
						x:[this.options.minWidth,this.options.maxWidth],
						y:[this.options.minHeight,this.options.maxHeight]
					},
					//limit: {
					//	x: [
					//		this.options.minWidth, 
					//		function() { return window.getWidth() - el.offsetWidth + (window.getScrollLeft()); }
					//	], 
					//	y: [
					//		this.options.minHeight,
					//		function() { return window.getHeight() - el.offsetHeight + (window.getScrollTop()); }
					//	]
					//},
					onStart: function(){
						if (el.iframe) {
							el.getElement('.domwinIframe').setStyles({
								'display': 'none'
							});
						}
					}.bind(this),
					onDrag: function(){
						this.drawWindow(el);
					}.bind(this),
					onComplete: function(){
						if (el.iframe) {
							el.getElement('.domwinIframe').setStyles({
								'display': 'block'
							});
						}
					if (el.onResize){ // checks for onResize since windows generated at startup do not have this option			
						el.onResize();  // later I may just assign $empty functions for onclose and so forth to the original windows
					}	
					}.bind(this)
				});
			}
		}.bind(this));
	},
	attachFocus: function(elementArray){
		elementArray.each(function(element) {
			element.addEvent('click', function(event){
				// Only focus when needed, otherwize onFocus() will run on every click
				if ( element.getStyle('zIndex').toInt() < this.indexLevel ) {
				this.focusWindow(element);
					if (element.onFocus){
						element.onFocus();
					}
				}
			}.bind(this));
		}.bind(this));
	},
	attachMinimize: function(elementArray){	
		elementArray.each(function(element) {
			if (this.options.minimizable && !element.modal){
				element.getElement('.minimizeToggle').addEvent('click', function(event){
					var domwinControls = event.target.parentNode;
					var el = domwinControls.parentNode;
					this.minimizeWindow(el);
					if (el.onMinimize){
						el.onMinimize();
					}
				}.bind(this));
			}
		}.bind(this));
	},
	attachMaximize: function(elementArray) {	
		elementArray.each(function(element) {
			if (this.options.maximizable && !element.modal){
				element.getElement('.maximizeToggle').addEvent('click', function(event){
					var domwinControls = event.target.parentNode;
					var el = domwinControls.parentNode;
					if (el.maximizeToggle == 'maximize') {
						element.getElement('.maximizeToggle').setProperty('title', 'Minimalizovat'); //Set title
						this.maximizeWindow(el);
						if(el.onMaximize){
							el.onMaximize();
						}
						$(window.document.body).setStyle('overflow-x','hidden');
						$(window.document.body).setStyle('overflow-y','hidden');
					} else {
						element.getElement('.maximizeToggle').setProperty('title', 'Maximalizovat'); //Set title
						this.restoreWindow(el);
						$(window.document.body).setStyle('overflow-x','scroll');
						$(window.document.body).setStyle('overflow-y','scroll');
					}
				}.bind(this));
			}
		}.bind(this));
	},
	attachClose: function(elementArray){
		elementArray.each(function(element) {
			if (this.options.closable || element.modal){
				element.getElement('.domwinClose').addEvent('click', function(event){
					var domwinControls = event.target.parentNode;
					var el = domwinControls.parentNode;
					this.closeWindow(element);
				}.bind(this));
			}
		}.bind(this));
	},
	setDomwinControlsWidth: function(el){
		this.domwinControlsWidth = 0;
		if (this.options.minimizable && !el.modal){
			this.domwinControlsWidth += 19;
			if (this.options.maximizable){
				el.getElement('.maximizeToggle').setStyle('margin-left', 5);
			}
		}
		if (this.options.maximizable && !el.modal){
			this.domwinControlsWidth += 19;

		}		
		if (this.options.closable || el.modal){
			this.domwinControlsWidth += 19;
			if (this.options.maximizable || this.options.minimizable){
				el.getElement('.domwinClose').setStyle('margin-left', 5);
			}
		}
		el.getElement('.domwinControls').setStyle('width', this.domwinControlsWidth - 5);
	},
	maximizeWindow: function(el) {
		var domwinContent = el.getElement('.domwinContent');	

		$(el).oldTop = $(el).getStyle('top');
		$(el).oldLeft = $(el).getStyle('left');
		domwinContent.oldWidth = domwinContent.getStyle('width');
		domwinContent.oldHeight = domwinContent.getStyle('height');

		var domwinMorph = new Fx.Morph(el, { 
			'duration': 200,
			'onComplete': function(el){
				domwinContent.setStyle('height', (this.getWindowWidth() - this.options.headerHeight - this.options.footerHeight + 6));
				domwinContent.setStyle('width', this.getWindowHeight());
				this.drawWindow(el);
			}.bind(this)
		});
		domwinMorph.start({
			'top': -3, // takes shadow width into account
			'left': -3 // takes shadow width into account
		});
		$(el).maximizeToggle = 'restore';
	},
	restoreWindow: function(el) {
		var domwinContent = el.getElement('.domwinContent');
		domwinContent.setStyle('width', domwinContent.oldWidth);
		domwinContent.setStyle('height', domwinContent.oldHeight);
		$(el).maximizeToggle = 'maximize';
		this.drawWindow(el);
		var domwinMorph = new Fx.Morph(el, { 
			'duration': 150
		});
		domwinMorph.start({
			'top': $(el).oldTop,
			'left': $(el).oldLeft
		});
	},
	minimizeWindow: function(el) {
		var domwinContent = el.getElement('.domwinContent');
		this.addToMinimizeDock(el)
	},
	addToMinimizeDock: function (el) {
		//get handle to window
		var domwinControls = el.getElement('.domwinControls');
		var objWin  = domwinControls.parentNode
	
		//capture title bar text
		var sTitleBarHTML = el.getElement('.domwinTitlebar').innerHTML;
		var sTitleBarText = el.getElement('.domwinTitle').innerHTML; //must use domwinTitle and innerhtml because firefox doesn't support innerText on domwinTitlebar element
			
		//check for long title
		var sLongTitle = "...";
		if(sTitleBarText.length <= 13){sLongTitle = ""};
		
		//hide window
		objWin.setStyle('display','none');
		
		var btnEl = new Element('button', {
			'winAssociated': objWin.id,
			'class': 'domwinDockButton',
			'title': sTitleBarText,
			'id': 'DockButton'+objWin.id
		}).setHTML((sTitleBarText.substring(0,13) + sLongTitle)).injectInside($('domwinDock'));
				
		btnEl.addEvent('click', function(event){
			//click event will restore the window
			var objWin = $(event.target.getProperty('winAssociated'));
			objWin.setStyle('display','block');

			this.focusWindow(objWin);

			//remove this btn element 
			event.target.dispose();
		}.bind(this));
		
	},	
	initDock: function (el){
		document.addEvent('mousemove', function (objDoc){
			if(objDoc.event.clientY > (document.body.clientHeight -10) && $('domwinDock').getProperty('autoHide')) { 
				$('domwinDock').setStyle('display','block');
			}
		});		

		//Insert canvas
		var canvas = new Element('canvas', {
			'class': 'domwinCanvas',
			'id': 'canv1'
		}).injectInside(el);
		
		canvas.setStyles({
			position: 'absolute',
			top: '4px',
			left: '2px'
		});

		canvas.width=15;
		canvas.height=18;

		// Dynamically initialize canvas using excanvas. This is only required by IE
		if (Browser.Engine.trident) {
			G_vmlCanvasManager.initElement(canvas);
		}
		
		//Position top or bottom selector
		$('domwinDockPlacement').setProperty('title','Position Dock Top');
			
		//Auto Hide on/off 
		$('domwinDockAutoHide').setProperty('title','Turn Auto Hide On');
		
		//attach event
		$('domwinDockPlacement').addEvent('click', function(event){
			var objDock=event.target.parentNode;
			var ctx = el.getElement('.domwinCanvas').getContext('2d');
			
			//switch to top position
			if (objDock.getStyle('position') != 'absolute'){
				objDock.setStyles({
					'position': 'absolute',
					'bottom': 0,
					'border-top': '1px solid #bbb',
					'border-bottom': '1px solid #fff'
				})
				$('domwinDesktopHeader').setStyle('height', 54);
				objDock.setProperty('dockPosition','Bottom');
				this.drawCircle(ctx, 5, 4, 3, 241, 102, 116, 1.0); 

				if ($('domwinDock').getProperty('autoHide') != 'true' || $('domwinDock').getProperty('autoHideDisabled') != 'true') {
					this.drawCircle(ctx, 5 , 14, 3, 241, 102, 116, 1.0); 
				}
				} else {
					objDock.setStyles({
						'position': 'relative',
						'bottom': null,
						'border-top': '1px solid #fff',
						'border-bottom': '1px solid #bbb'
					})
					$('domwinDesktopHeader').setStyle('height', 74);
					objDock.setProperty('dockPosition','Top');	
					this.drawCircle(ctx, 5, 4, 3, 0, 255, 0, 1.0);
					this.drawCircle(ctx, 5, 14, 3, 212, 208, 200, 1.0);
				}

			//diasble/enable autohide and grey/orange/green out button
			if($('domwinDock').getProperty('autoHide') == 'true' || $('domwinDock').getProperty('autoHideDisabled') == 'true')
			{
				if (objDock.getProperty('dockPosition') == 'Bottom') {
					$('domwinDock').setProperty('autoHideDisabled', 'false');
					$('domwinDock').setProperty('autoHide', 'true')
					this.drawCircle(ctx, 5, 14, 3, 0, 255, 0, 1.0);
				}
				else{
					$('domwinDock').setProperty('autoHideDisabled', 'true');
					$('domwinDock').setProperty('autoHide', 'false')
				}

			}

			//update title tag
			$('domwinDockPlacement').setProperty('title',(objDock.getStyle('position') == 'relative')?'Position Dock Bottom':'Position Dock Top');
		}.bind(this));

		//attach event Auto Hide 
		$('domwinDockAutoHide').addEvent('click', function(event){
			var objDock=event.target.parentNode;
			var ctx = el.getElement('.domwinCanvas').getContext('2d');

			//disable auto hide when Dock bar on top
			if(objDock.getProperty('dockPosition')=='Top'){return false;}
		
			//update title tag
			if(objDock.getProperty('autoHide') == 'true'){
				$('domwinDockAutoHide').setProperty('title', 'Turn Auto Hide On');
				this.drawCircle(ctx, 5 , 14, 3, 241, 102, 116, 1.0);
				objDock.setProperty('autoHide','false');
				objDock.setStyle('display','block');
			}
			else{
				$('domwinDockAutoHide').setProperty('title','Turn Auto Hide Off');
				this.drawCircle(ctx, 5 , 14, 3, 0, 255, 0, 1.0); 
				objDock.setProperty('autoHide','true');
				objDock.setStyle('display','none');
			}
		}.bind(this));		

		$('domwinDock').addEvent('mouseleave', function(objDock)
		{	if(this.getProperty('autoHide') == 'true'){ //mozilla doesn't understand true evaluations, so made the property a string???
				if((objDock.event.clientY < (document.body.clientHeight - this.getStyle('height').toInt()))){
					this.setStyle('display', 'none');
				}
			}
		});
		
	},
	drawDock: function (el){
		var ctx = el.getElement('.domwinCanvas').getContext('2d');
		this.drawCircle(ctx, 5 , 4, 3, 241, 102, 116, 1.0); 
		this.drawCircle(ctx, 5 , 14, 3, 241, 102, 116, 1.0);
	},	
	/*
	
	Method: arrangeCascade
	
	*/	
	arrangeCascade: function(){
		var x = this.options.desktopLeftOffset
		var y = this.options.desktopTopOffset;
		$$('div.domwin').each(function(el){
			if (el.getStyle('display') != 'none'){
				this.focusWindow(el);
				x += this.options.domwinLeftOffset;
				y += this.options.domwinTopOffset;
				var domwinMorph = new Fx.Morph(el, {
					'duration': 550
				});
				domwinMorph.start({
					'top': y,
					'left': x
				});
			}
		}.bind(this));
	}
});
DomwinDesktop.implement(new Options);

/* -----------------------------------------------------------------

	DOMWIN SCREENS
	Notes: This class can be removed if you are not creating multiple screens/workspaces.

   ----------------------------------------------------------------- */

var DomwinScreens = new Class({
	options: {
		defaultScreen: 0 // Default screen	
	},
	initialize: function(options){
		this.setOptions(options);
		this.setScreen(this.options.defaultScreen);
	},
	setScreen: function(index) {
		if ( !$('domwinScreens') )
			return;
		$$('#domwinScreens div.screen').each(function(el,i) {
			el.setStyle('display', i == index ? 'block' : 'none');
		});
	}
});
DomwinScreens.implement(new Options);


window.addEvent('load', function(){
		document.domwinScreens = new DomwinScreens();
		document.domwinDesktop = new DomwinDesktop();
});

