kamiro = {
	plugins : {
		add : function(name, plugin) {
			var o = this[name]=plugin;						
			kamiro.window = o.init(kamiro.container);	
					
		}
	},
	DOM: {
		Element : function(id,attribs) {
			if ($(id)) return $(id);
			return (new Element('div',{id:id}));
		},
		Event : {
			add : function(id, type, event) {
				if ($type(id) == 'array') {
					$each(id, function(value, index){
    					$(value).addEvent(type, event);
					});	
				} else {
					$(id).addEvent(type, event);
				}
				return event;
			},
			remove : function(id, type, event){$(id).removeEvent(type, event)},
			clear : function(){},
			cancel : function(event) {event.stop()}			
		} ,
		add: function(id, type, options) {
			if (options.style && $type(options.style) == 'object') {
				options.styles=options.style;
			}
			return (new Element(type,options)).inject(id)
		},
		remove : function(id) {if ($(id)) $(id).destroy()},
		get: $,
		create: function(type, options) {return new Element(type, options)},
		setStyle : function(id, style) {if ($(id)) $(id).setStyle(style)},	
		setStyles : function(id, styles) {if ($(id)) $(id).setStyles(styles)},
		hasClass : function(id, value) {return $(id).hasClass(value)},
		addClass : function(id, value) {$(id).addClass(value)},
		removeClass : function(id, value) {if ($(id)) $(id).removeClass(value)},				
		setAttrib : function(id, attrib, value) {$(id).set(attrib,value)},
		getViewPort : function() {
			var pos = $(window).getScroll();
			var size = $(window).getSize();
			return {x:pos.x,y:pos.y,w:size.x,h:size.y}
		}, 
		uniqueId : function() {return 'win' + 1},	
		doc : document,
		isIE : Browser.ie,
		isIE6 : false,
		isGecko : Browser.firefox 
	},
	container : {
		focus : function() {},
		settings: {}
	},
	is: function(obj, type){return (type == $type(obj))},
	each : $each
};


// extend mootools
Element.implement({
	on : function(type, event) {return $(this).addEvent(type, event)},
	remove : function() {this.destroy()},
	getXY : function() {return $(this).getPosition()},
	moveTo : function(x,y) {$(this).setPosition({x:x,y:y})},
	resizeTo : function(w,h) {$(this).setStyles({height:h,width:w})},
	moveBy : function(x,y) {
		var p = $(this).getPosition();
		$(this).setPosition({x:p.x + x,y:p.y + y});
	},
	resizeBy : function(w,h) {
		var s = $(this).getSize();
		$(this).setStyles({height:s.y + h,width:s.x + w});
	}					
});	

//redux.loadAsset([{url:'/inc/redux/30/window/plugin.js',type:'JS',title:'windows',id:'windows'}]);

/**
 * editor_plugin_src.js
 *
 * Copyright 2009, Moxiecode Systems AB
 * Released under LGPL License.
 *
 * License: http://tinymce.moxiecode.com/license
 * Contributing: http://tinymce.moxiecode.com/contributing
 */

(function() {
	//var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = DOM.Event, each = tinymce.each, is = tinymce.is;
	
	if (!kamiro.DOM) return;
	
	var DOM = kamiro.DOM, Element = DOM.Element, Event = DOM.Event, each = kamiro.each, is = kamiro.is;

	//tinymce.create('tinymce.plugins.InlinePopups', {
	//	init : function(ed, url) {
			// Replace window manager
	//		ed.onBeforeRenderUI.add(function() {
	//			ed.windowManager = new tinymce.InlineWindowManager(ed);
	//			DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'mochawin') + "/window.css");
	//		});
	//	},

	//	getInfo : function() {
	//		return {
	//			longname : 'InlinePopups',
	//			author : 'Moxiecode Systems AB',
	//			authorurl : 'http://tinymce.moxiecode.com',
	//			infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',
	//			version : tinymce.majorVersion + "." + tinymce.minorVersion
	//		};
	//	}
	//});

	kamiro.plugins.add('window', {
		init : function(ed) {
			var t = this;
			//t.parent(ed);
			t.editor = ed; 
			t.zIndex = 100000;
			t.count = 0;
			t.windows = {};
			return this;
		},
		hook : {
			createWindow : function(id,h,opt) {
				if (!opt) var opt={};
				if (!opt.scrollbars) opt.scrollbars=false;
				
				opt.id=(opt.id)?"window_"+opt.id:"window_"+id;
			
				if (!opt.title) {
					// If content begins with an H1 make a title out of it
					var ret=new RegExp("<\s*h1[^>]*>(.*?)<\s*/\s*h1>","g").exec(h);
					if (ret) {if (ret.length > 1) opt.title=ret[1]; h=h.replace(ret[0],"");}
				}
					
				if (h.length == 0 || opt.close) {
					this.close(opt.id);
					return;
				}
				opt.width = (opt.width || 'auto');
				opt.height = (opt.height || 'auto');
				opt.html = h;
				opt.styles = {backgroundColor: (opt.contentBgColor || 'white')};
				this.open(opt);
			}
		},
		debug : function(msg) {
			//if (console && console.log) {
			//	console.log(msg);
			//}
		},
		update : function (f, id) {
			var ifr = DOM.get(id + '_ifr');
			if (f.html) ifr.set('html',f.html);
			if (f.title) {
				DOM.get(id + '_title').set('html', f.title);
				if (f.icon) 
					this._addAll(DOM.get(id + '_title'), ['img', {
						style: 'float:left;padding-right:3px',
						align: 'top',
						src: f.icon
					}]);
			}
			$(ifr).setStyles({'overflowY':(f.scrollbars?'scroll':'hidden')});
			return this;	
		},
		open : function(f, p) {
			
			function debug(msg) {
				//if (console && console.log) {
				//	console.log(msg);
				//}
				
			}
			
			var t = this, id, opt = '', ed = t.editor, vp, po, mdf, clf, we, w, u, ifr, parentWindow;

			f = f || {};
			p = p || {};

			id = (f.id || DOM.uniqueId());

			// Check to if this window already exists
			if (t.windows[id]) return t.update(f,id);

			// Run native windows
			//if (!f.inline)
			//	return t.parent(f, p);

			parentWindow = t._frontWindow();
			if (parentWindow && DOM.get(parentWindow.id + '_ifr') && !f.html) {
				parentWindow.focussedElement = DOM.get(parentWindow.id + '_ifr').contentWindow.document.activeElement;
			}
			
			
			
			// Only store selection if the type is a normal window
			//if (!f.type)
			//	t.bookmark = ed.selection.getBookmark(1);

			f.width = (f.width || 320);
			f.height = (f.height || 240);
			if (f.height != 'auto') f.height += (Browser.Engine.trident ? 8 : 0);
			
			f.min_width = parseInt(f.min_width || 150);
			f.min_height = parseInt(f.min_height || 100);
			f.max_width = parseInt(f.max_width || 2000);
			f.max_height = parseInt(f.max_height || 2000);

			f.movable = f.resizable = true;
			p.mce_width = f.width;
			p.mce_height = f.height;
			p.mce_inline = true;
			p.mce_window_id = id;
			p.mce_auto_focus = f.auto_focus;

			t.features = f;
			t.params = p;
			//t.onOpen.dispatch(t, f, p);

			if (f.type) {
				opt += ' mceModal';

				if (f.type)
					opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1);

				f.resizable = false;
			}

			if (f.statusbar)
				opt += ' mceStatusbar';

			if (f.resizable)
				opt += ' mceResizable';

			if (f.minimizable)
				opt += ' mceMinimizable';

			if (f.maximizable)
				opt += ' mceMaximizable';

			if (f.movable)
				opt += ' mceMovable';

			// Create DOM objects
			t._addAll(DOM.doc.body, 
				['div', {id : id, role : 'dialog', 'aria-labelledby': f.type ? id + '_content' : id + '_title', 'class' : ('mochawin') + (DOM.isIE && window.getSelection ? ' ie9' : ''), style : 'width:100px;height:100px'}, 
					['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt},
						['div', {id : id + '_top', 'class' : 'mceTop'}, 
							['div', {'class' : 'mceLeft'}],
							['div', {'class' : 'mceCenter'}],
							['div', {'class' : 'mceRight'}],
							['span', {id : id + '_title'}, f.title || '']
						],
						['div', {id : id + '_middle', 'class' : 'mceMiddle'}, 
							['div', {id : id + '_left', 'class' : 'mceLeft', tabindex : '0'}],
							['div', {id : id + '_content', 'class' : 'mceContent'}],
							['div', {id : id + '_right', 'class' : 'mceRight', tabindex : '0'}]

						],
						['div', {id : id + '_bottom', 'class' : 'mceBottom'},
							['div', {'class' : 'mceLeft'}],
							['div', {'class' : 'mceCenter'}],
							['div', {'class' : 'mceRight'}],
							['span', {id : id + '_status'}, 'Content']
						],

						['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}],
						['a', {'class' : 'mceMin mceControl', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
						['a', {'class' : 'mceMax mceControl', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
						['a', {'class' : 'mceMed mceControl', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
						['a', {'class' : 'mceClose mceControl', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
						['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}],
						['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}]
					]
				]
			);


			// Load window off screen
			DOM.setStyles(id, {top : -10000, left : -10000});

			// Fix gecko rendering bug, where the editors iframe messed with window contents
			if (DOM.isGecko)
				DOM.setStyle(id, 'overflow', 'auto');

			u = f.url || f.file;
			if (u) {
				if (tinymce.relaxedDomain)
					u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;
				u = tinymce._addVer(u);
			}

			if (f.type == 'window' || f.type == 'modal' || !f.type) {
				var contentStyle = {
					border: 0,
					width: (f.width=='auto')?'100%':f.width,
					height: '100%'
				}
								
				if (f.styles) contentStyle = $merge(f.styles,contentStyle);
				
				if (f.html) {
					var contentBlock = DOM.add(id + '_content', 'div', {
						id: id + '_ifr',
						style: contentStyle
					});
					t.update(f,id);
					//DOM.setAttrib(id + '_ifr', 'src', u);				
				}
				else {
					var contentBlock = DOM.add(id + '_content', 'iframe', {
						id: id + '_ifr',
						src: 'javascript:""',
						frameBorder: 0,
						style: contentStyle
					});
					DOM.setAttrib(id + '_ifr', 'src', u);
				}
				

			} else {
				DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok');

				if (f.type == 'confirm')
					DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel');

				DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'});
				DOM.setHTML(id + '_content', f.content.replace('\n', '<br />'));
				
				Event.add(id, 'keyup', function(evt) {
					var VK_ESCAPE = 27;
					if (evt.keyCode === VK_ESCAPE) {
						f.button_func(false);
						return Event.cancel(evt);
					}
				});

				Event.add(id, 'keydown', function(evt) {
					var cancelButton, VK_TAB = 9;
					if (evt.keyCode === VK_TAB) {
						cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0];
						if (cancelButton && cancelButton !== evt.target) {
							cancelButton.focus();
						} else {
							DOM.get(id + '_ok').focus();
						}
						return Event.cancel(evt);
					}
				});
			}
			
			// Set styles if it is passed
			//if (f.styles) DOM.setStyles(id, f.styles);
			

			// Register events
			mdf = Event.add(id, 'mousedown', function(e) {
				var n = e.target, w, vp;

				w = t.windows[id];
				t.focus(id);
				
				if (n.nodeName == 'A' || n.nodeName == 'a') {

					if (DOM.hasClass(n,'mceClose')) {
						t.close(null, id);
						return Event.cancel(e);
					} else if (DOM.hasClass(n,'mceMax')) {
						w.oldPos = w.element.getXY();
						// kam
						w.oldSize = w.element.getSize();
						w.oldSize.w = w.oldSize.x; w.oldSize.h = w.oldSize.y;

						vp = DOM.getViewPort();

						// Reduce viewport size to avoid scrollbars
						vp.w -= 2;
						vp.h -= 2;

						w.element.moveTo(vp.x, vp.y);
						w.element.resizeTo(vp.w, vp.h);
						DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight});
						DOM.addClass(id + '_wrapper', 'mceMaximized');
					} else if (DOM.hasClass(n,'mceMed')) {
						// Reset to old size
						w.element.moveTo(w.oldPos.x, w.oldPos.y);
						w.element.resizeTo(w.oldSize.w, w.oldSize.h);
						w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight);

						DOM.removeClass(id + '_wrapper', 'mceMaximized');
					} else if (DOM.hasClass(n,'mceMove'))
						return t._startDrag(id, e, n.className);
					else if (DOM.hasClass(n, 'mceResize'))
						return t._startDrag(id, e, n.className.substring(13));
				}
			});

			clf = Event.add(id, 'click', function(e) {
				var n = e.target;
				t.debug('click');
				//t.focus(id);
					//if (window.console && window.console.log) console.log(n.className);
				if (n.nodeName == 'A' || n.nodeName == 'a') {
					switch (n.className) {
						case 'mceClose mceControl':
							t.close(null, id);
							return Event.cancel(e);

						case 'mceButton mceOk':
						case 'mceButton mceCancel':
							f.button_func(n.className == 'mceButton mceOk');
							return Event.cancel(e);
					}
				}
				
			});
			
			// Make sure the tab order loops within the dialog.
			Event.add([id + '_left', id + '_right'], 'focus', function(evt) {
				var iframe = DOM.get(id + '_ifr');
				if (iframe) {
					var body = iframe.contentWindow.document.body;
					var focusable = DOM.select(':input:enabled,*[tabindex=0]', body);
					if (evt.target.id === (id + '_left')) {
						focusable[focusable.length - 1].focus();
					} else {
						focusable[0].focus();
					}
				} else {
					DOM.get(id + '_ok').focus();
				}
			});
			
			// Add window
			// , container : ed.getContainer()
			
			w = t.windows[id] = {
				id : id,
				mousedown_func : mdf,
				click_func : clf,
				element : new Element(id, {blocker : 1}),
				iframeElement : new Element(id + '_ifr'),
				features : f
			};

			w.iframeElement.on('focus', function() {t.focus(id);});
			
			t._resizeWindow(id,f);

			// Setup blocker
			// k - changed to checking passed in param type f.type
			//if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') {
			if (t.count == 0 && f.type == 'modal') {
				DOM.add(DOM.doc.body, 'div', {
					id : 'mceModalBlocker',
					'class' : (t.editor.settings.inlinepopups_skin || 'mochawin') + '_modalBlocker',
					style : {zIndex : t.zIndex - 1}
				});

				//DOM.show('mceModalBlocker'); // Reduces flicker in IE
				DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true');
			} else
				DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1);

			if (DOM.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (DOM.isIE && !DOM.boxModel))
				DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});

			DOM.setAttrib(id, 'aria-hidden', 'false');
			t.focus(id);
			//t._fixIELayout(id, 1);

			// Focus ok button
			if (DOM.get(id + '_ok'))
				DOM.get(id + '_ok').focus();
			t.count++;

			return w;
		},

		focus : function(id) {
			var t = this, w;

			if (w = t.windows[id]) {
				if (id + "_wrapper" == t.lastId) return;
				w.zIndex = this.zIndex++;
				w.element.setStyle('zIndex', w.zIndex);
				//w.element.update();

				id = id + '_wrapper';
				DOM.removeClass(t.lastId, 'mceFocus');
				DOM.addClass(id, 'mceFocus');
				t.lastId = id;
			}
		},

		_resizeWindow : function(id,f)  {
			var dw =0, dh = 0, t=this, w = t.windows[id], f = w.features
			// Automatic resize
			var contentSize = DOM.get(id + '_ifr').getScrollSize();
			if (f.width=='auto') f.width=contentSize.x; //+ ((Browser.Engine.trident)?50:0);
			if (f.height=='auto') f.height=contentSize.y;
			
			// Measure borders
			dw += DOM.get(id + '_left').getSize().x;
			dw += DOM.get(id + '_right').getSize().x;
			dh += DOM.get(id + '_top').getSize().y;
			dh += DOM.get(id + '_bottom').getSize().y;	
			w.deltaWidth = dw;
			w.deltaHeight = dh;
			// Resize window
			var vp = DOM.getViewPort();
			f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0)));
			f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0)));
			DOM.setStyles(id + '_middle', {height: f.height});
			DOM.setStyles(id + '_ifr', {width: f.width, height:f.height});
			DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh});
			
			
			if (f.onResize) f.onResize({
				h: f.height,
				w: f.width
			});			
		},

		_addAll : function(te, ne) {
			var i, n, t = this //, dom = tinymce.DOM;

			//console.debug(is(ne, 'string'));
			
			if (is(ne, 'string')) {
				te.appendChild(DOM.doc.createTextNode(ne));
			}
			else {
				if (ne.length) {
					te = te.appendChild(DOM.create(ne[0], ne[1]));
					for (i = 2; i < ne.length; i++) t._addAll(te, ne[i]);
				}
			}
		},

		_startDrag : function(id, se, ac) {
			var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = $(we).getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh;



			// Get positons and sizes
//			cp = DOM.getPos(t.editor.getContainer());
			cp = {x : 0, y : 0};
			vp = DOM.getViewPort();

			// Reduce viewport size to avoid scrollbars while dragging
			vp.w -= 2;
			vp.h -= 2;
			
			//kc
			sex = se.event.screenX;
			sey = se.event.screenY;
			dx = dy = dw = dh = 0;

			// Handle mouse up
			mu = Event.add(d, 'mouseup', function(e) {
				Event.remove(d, 'mouseup', mu);
				Event.remove(d, 'mousemove', mm);

				var n = e.target;
				var f = w.features;
				
				t.debug(n.nodeName);
				
				//if (eb)	eb.remove();
				if (eb) {
					DOM.setStyles('mceEventBlocker', {
						display: 'none'
					});
					setTimeout("$('mceEventBlocker').destroy()",300);
				}
				
				f.width += dw;
				f.height += dh;
				f.top += dy;
				f.left += dx;
				t._resizeWindow(id, w.features);
				
				//$(id).hide();
				//$(id).show();

				// Forced a repaint of the window
				//$(id).style.filter = '';
				
				//t.debug(DOM.setStyles(id,{display:'block'}));
				
				//t._fixIELayout(id, 1);
				//t.focus(id);
				
				return Event.cancel(e);
			});

			//if (ac != 'Move') startMove();

			function startMove() {
				if (eb)
					return;

				t._fixIELayout(id, 0);


				

				// Setup event blocker
				DOM.add(d.body, 'div', {
					id : 'mceEventBlocker',
					'class' : 'mceEventBlocker ' + ('mochawin'),
					style : {zIndex : t.zIndex + 1}
				});

				if (DOM.isIE6 || DOM.isIE) {
					DOM.setStyles('mceEventBlocker', {
						position: 'absolute',
						left: vp.x,
						top: vp.y,
						width: vp.w - 2,
						height: vp.h - 2
					});
				}
				
				//DOM.setStyles('mceEventBlocker', {display: 'none'});

				eb = new Element('mceEventBlocker');
				//eb.update();

				// Setup placeholder
				p = we.getXY();
				sz = we.getSize();
				// kam
				sz.w = sz.x; sz.h = sz.y;

				sx = cp.x + p.x - vp.x;
				sy = cp.y + p.y - vp.y;
				DOM.add(eb, 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}});
				ph = new Element('mcePlaceHolder');
				
			};

			// Handle mouse move/drag
			mm = Event.add(d, 'mousemove', function(e) {
				var x, y, v;

				startMove();
				// kam
				x = e.event.screenX - sex;
				y = e.event.screenY - sey;

				switch (ac) {
					case 'ResizeW':
						dx = x;
						dw = 0 - x;
						break;

					case 'ResizeE':
						dw = x;
						break;

					case 'ResizeN':
					case 'ResizeNW':
					case 'ResizeNE':
						if (ac == "ResizeNW") {
							dx = x;
							dw = 0 - x;
						} else if (ac == "ResizeNE")
							dw = x;

						dy = y;
						dh = 0 - y;
						break;

					case 'ResizeS':
					case 'ResizeSW':
					case 'ResizeSE':
						if (ac == "ResizeSW") {
							dx = x;
							dw = 0 - x;
						} else if (ac == "ResizeSE")
							dw = x;

						dh = y;
						break;

					case 'mceMove':
						dx = x;
						dy = y;
						break;
				}

				// Boundary check
				if (dw < (v = w.features.min_width - sz.w)) {
					if (dx !== 0)
						dx += dw - v;

					dw = v;
				}
	
				if (dh < (v = w.features.min_height - sz.h)) {
					if (dy !== 0)
						dy += dh - v;

					dh = v;
				}

				dw = Math.min(dw, w.features.max_width - sz.w);
				dh = Math.min(dh, w.features.max_height - sz.h);
				dx = Math.max(dx, vp.x - (sx + vp.x));
				//console.debug(dx + ' ' + vp.x + ' ' + sx + ' '+ vp.x);
				
				dy = Math.max(dy, vp.y - (sy + vp.y));
				dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x));				
				dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y));

				// Move if needed
				if (dx + dy !== 0) {
					if (sx + dx < 0)
						dx = 0;
	
					if (sy + dy < 0)
						dy = 0;
					//console.debug('move' + (sx + dx) + ' ' + (sy + dy));
					ph.moveTo(sx + dx, sy + dy);
				}

				// Resize if needed
				if (dw + dh !== 0) {
					
					//console.debug('resize' + (sz.w + dw) + ' ' + (sz.h + dh));
					ph.resizeTo(sz.w + dw, sz.h + dh);
				}

				return Event.cancel(e);
			});

			return Event.cancel(se);
		},

		resizeBy : function(dw, dh, id) {
			var w = this.windows[id];
			if (w) {
				w.element.resizeBy(dw, dh);
				w.iframeElement.resizeBy(dw, dh);
			}
		},

		close : function(win, id) {
			var t = this, w, d = DOM.doc, fw, id;

			id = t._findId(id || win);

			// Probably not inline
			if (!t.windows[id]) {
				//t.parent(win);
				return;
			}

			t.count--;

			if (t.count == 0) {
				DOM.remove('mceModalBlocker');
				DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'false');
				//t.editor.focus();
			}


			if (t.windows[id].features.onClose) t.windows[id].features.onClose();
			//if (console) console.debug(t.windows[id]);


			if (w = t.windows[id]) {
				//t.onClose.dispatch(t);
				Event.remove(d, 'mousedown', w.mousedownFunc);
				Event.remove(d, 'click', w.clickFunc);
				Event.clear(id);
				Event.clear(id + '_ifr');

				DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak

				w.element.remove();
				delete t.windows[id];

				fw = t._frontWindow();

				if (fw)
					t.focus(fw.id);
			}
		},
		
		// Find front most window
		_frontWindow : function() {
			var fw, ix = 0;
			// Find front most window and focus that
			each (this.windows, function(w) {
				if (w.zIndex > ix) {
					fw = w;
					ix = w.zIndex;
				}
			});
			return fw;
		},

		setTitle : function(w, ti) {
			var e;

			w = this._findId(w);

			if (e = DOM.get(w + '_title'))
				e.innerHTML = DOM.encode(ti);
		},

		alert : function(txt, cb, s) {
			var t = this, w;

			w = t.open({
				title : t,
				type : 'alert',
				button_func : function(s) {
					if (cb)
						cb.call(s || t, s);

					t.close(null, w.id);
				},
				content : DOM.encode(t.editor.getLang(txt, txt)),
				inline : 1,
				width : 400,
				height : 130
			});
		},

		confirm : function(txt, cb, s) {
			var t = this, w;

			w = t.open({
				title : t,
				type : 'confirm',
				button_func : function(s) {
					if (cb)
						cb.call(s || t, s);

					t.close(null, w.id);
				},
				content : DOM.encode(t.editor.getLang(txt, txt)),
				inline : 1,
				width : 400,
				height : 130
			});
		},

		// Internal functions

		_findId : function(w) {
			var t = this;

			if (typeof(w) == 'string')
				return w;

			each(t.windows, function(wo) {
				var ifr = DOM.get(wo.id + '_ifr');

				if (ifr && w == ifr.contentWindow) {
					w = wo.id;
					return false;
				}
			});

			return w;
		},

		_fixIELayout : function(id, s) {
			var w, img;

			if (!DOM.isIE6) return;

			// Fixes the bug where hover flickers and does odd things in IE6
			each(['n','s','w','e','nw','ne','sw','se'], function(v) {
				var e = DOM.get(id + '_resize_' + v);

				DOM.setStyles(e, {
					width : s ? e.clientWidth : '',
					height : s ? e.clientHeight : '',
					cursor : DOM.getStyle(e, 'cursor', 1)
				});

				DOM.setStyle(id + "_bottom", 'bottom', '-1px');

				e = 0;
			});

			// Fixes graphics glitch
			if (w = this.windows[id]) {
				// Fixes rendering bug after resize
				w.element.hide();
				w.element.show();

				// Forced a repaint of the window
				//DOM.get(id).style.filter = '';

				// IE has a bug where images used in CSS won't get loaded
				// sometimes when the cache in the browser is disabled
				// This fix tries to solve it by loading the images using the image object
				each(DOM.select('div,a', id), function(e, i) {
					if (e.currentStyle.backgroundImage != 'none') {
						img = new Image();
						img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1');
					}
				});

				DOM.get(id).style.filter = '';
			}
		}
	});

	// Register plugin
	//tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups);
})();
