//
// Author: Ake Tangkananond
// Ventek International
//

String.prototype.trim = function () {
  return this.replace(/^\s*(\S*(\s+\S+)*)\s*$/, "$1");
};

var iPortal = {
	
	settings : {
		
		nColumns : 3,
		classPageColumn : ['pageColumn0', 'pageColumn1', 'pageColumn2'],
		classWidgetColumn : ['widgetColumn0', 'widgetColumn1', 'widgetColumn2'],
		classWidgetContainer : 'widgetContainer',
		classWidgetTitle : 'widgetTitle',
		classWidgetDragging : 'widgetDragging',
		classWidgetPlaceHolder : 'widgetPlaceHolder',
		classWidgetTargetPlaceHolder : 'widgetTargetPlaceHolder',
		
		idWidgetShadow : 'widgetShadow',
		idWidgetTarget : 'widgetTarget',
		idWidgetPrefix : 'w_',
		idCookieLUp : 'p-lupdate',
		
		urlWidget : 'pw.htm?',
		urlWidgetList : 'pws.htm?',
		urlLoading: 'jsp/themes/default/loading.gif'
		
	},
	
	listWidgetsDefault : [
		{ col : 0, qwidget : 'clock', qconfig : '' },
		//{ col : 0, qwidget : 'calendar', qconfig : 'sa' },
		//{ col : 0, qwidget : 'calculator', qconfig : '' },
		//{ col : 0, qwidget : 'dilbert', qconfig : '' },
		//{ col : 1, qwidget : 'weather', qconfig : 'city:bangkok,country:thailand' },
		//{ col : 1, qwidget : 'dictionary', qconfig : '' },
		{ col : 1, qwidget : 'unitConverter', qconfig : '' },
		{ col : 2, qwidget : 'notepad', qconfig : '' },
		//{ col : 2, qwidget : 'editor', qconfig : '' },
		//{ col : 2, qwidget : 'cgblog', qconfig : '' },
		//{ col : 2, qwidget : 'scholarBlog', qconfig : '' },
		//{ col : 2, qwidget : 'favfood', qconfig : 'salmon' },
		//{ col : 2, qwidget : 'favfood', qconfig : 'nagiri' },
		//{ col : 2, qwidget : 'favfood', qconfig : 'nagirii' }
	],
	
	draggingWidget : null,
	
	listWidgets : null,
	
	pageloaded : false,

	version : 1.33,
	
	_id : 1,
	
	
	_getNewWidgetId : function () {
	
		var num = '00000' + iPortal._id++;
		return 'w' + num.substr( num.length - 3 );
		
	},
	
	_getWidgetById : function ( id ) {
		
		var listWidgets = iPortal.listWidgets;
		var widget = null;
		
		for ( var i = 0; i < listWidgets.length; i++ ) {
		
			for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
			
				widget = listWidgets[i].widgets[j];
				if ( widget.dummy )
					continue;
				if ( widget.query.id == id )
					return widget;
					
			}
			
		}
		
		return widget;
		 
	},
	
	_addEvent : function ( obj, type, fn ) {
		
		if ( obj.addEventListener )
			obj.addEventListener( type, fn, false );
		else if ( obj.attachEvent ) {
		
			obj[ 'e' + type + fn ] = fn;
			obj[ type + fn ] = function() { obj[ 'e' + type + fn ]( window.event ); }
			obj.attachEvent( 'on' + type, obj[ type + fn ] );
			
		}
		
	},
	
	
	_removeEvent : function ( obj, type, fn ) {
		
		if ( obj.removeEventListener )
			obj.removeEventListener( type, fn, false );
		else if ( obj.detachEvent ) {
		
			obj.detachEvent( 'on' + type, obj[ type + fn ] );
			obj[ type + fn ] = null;
			obj[ "e" + type + fn ] = null;
			
		}
		
	},
	
	_attachCSS : function ( widget, css ) {
		var domHead = document.getElementsByTagName('head')[0];
		var domCSS = document.createElement('link');
		domCSS.type = 'text/css';
		domCSS.rel = 'stylesheet';
		domCSS.href = css;
		domCSS.media = 'screen';
		//domCSS.id = widget.query.id;
		domHead.appendChild(domCSS);
	},
	
	_getPos : function ( obj ) {
		
		var x = 0, y = 0;
		
		do {
		
			x += obj.offsetLeft;
			y += obj.offsetTop;
			
		} while ( obj = obj.offsetParent );
		
		return {x: x, y: y};
		
	},
	
	_getCookie : function ( name ) {
		
		var start, end;
		if ( document.cookie.length > 0 ) {
		
			start = document.cookie.indexOf( name + '=' );
			if ( start != -1 ) { 
			
				start = start + name.length + 1; 
				end = document.cookie.indexOf(';', start);
				if ( end == -1 )
					end = document.cookie.length;
			
				return unescape( document.cookie.substring(start, end) );
				
	   		}
	   		
	  	}
		return '';
  	
	},
	
	_setCookie : function ( data, expiredays ) {
		
		var s = ''
		if ( data.length > 0 )
			s += data[0].name + '=' + escape(data[0].value);
		for ( var i = 1; i < data.length; i++ )
			s += '; ' + data[i].name + '=' + escape(data[i].value);
		
		if ( expiredays ) {
			var exdate = new Date();
			exdate.setDate( exdate.getDate() + expiredays );
			s += ';expires=' + exdate.toGMTString() + ';path=/portal';
		}
		else {
			s += ';;path=/portal';
		}
		
		
		document.cookie = s;
		
	},
	
	_getXmlHttpObject : function() {
		
		try { return new XMLHttpRequest(); } catch(e) {}
		try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {}
		try { return new ActiveXObject("Microsoft.XMLHTTP"); } catch (e) {}
		return null;
		
	},
	
	_xmlGetText : function ( node ) {
		var s = "";
		cnode = node.childNodes;
		for ( var j = 0; j < cnode.length; j++)
			s += cnode[j].nodeValue.trim();
		return s;
	},
	
	_ajaxWidgetLoaded : function ( widget, xmlHttp, save ) {
		
		var settings = iPortal.settings;
		
		if ( xmlHttp.readyState == 4 && xmlHttp.responseXML && xmlHttp.responseXML.documentElement) {
			
			var docXML = xmlHttp.responseXML.documentElement;
			var s;
			
			// Assign title
			s = iPortal._xmlGetText( docXML.getElementsByTagName('title')[0] );
			widget.content.domptr.widgetTitleText.innerHTML = s;
			
			// Assign body
			s = iPortal._xmlGetText( docXML.getElementsByTagName('content')[0] );
			widget.content.domptr.widgetBody.innerHTML = s;
			
			// Assign config string
			s = iPortal._xmlGetText( docXML.getElementsByTagName('config-string')[0] );
			widget.query.config = s;
			
			// Assign and eval java script
			s = iPortal._xmlGetText( docXML.getElementsByTagName('jscript')[0] );
			widget.jscript.code = s;
			eval( widget.jscript.code );
			
		}
		
		if ( save )
			iPortal.saveConfigurations();

	},
	
	_ajaxLoadWidgetParams : function( widget, params ) {

		var settings = iPortal.settings;
		
		var sURL = settings.urlWidget +
			'id=' + encodeURI( widget.query.id ) + 
			'&widget=' + encodeURI( widget.query.widget ) +
			'&config=' + encodeURI( widget.query.config );
		
		// special case
		if ( widget.query.widget == 'ssrbizz' ) {
			sURL += '&list=' + encodeURI( iPortal._getCookie('ssrbizz') );
		} else if ( widget.query.widget == 'ssrpeople' ) {
			sURL += '&list=' + encodeURI( iPortal._getCookie('ssrpeople') );
		}
		
		if ( params != null ) {
			sURL += '&params=' + params;
		}
		
		var xmlHttp = iPortal._getXmlHttpObject();
		
		xmlHttp.onreadystatechange = function() { 
			iPortal._ajaxWidgetLoaded( widget, xmlHttp, false );
		}
		xmlHttp.open('GET', sURL, true);
		xmlHttp.send(null);
		
	},
	
	_ajaxLoadWidget : function( widget ) {
		
		iPortal._ajaxLoadWidgetParams( widget, null );
		
	},
	
	_ajaxRefreshWidget : function( widget ) {
		
		var settings = iPortal.settings;
		var pos = iPortal._getPos( widget.content.domptr.widgetBody )
		var width = widget.content.domptr.widgetBody.clientWidth;
		var height = widget.content.domptr.widgetBody.clientHeight;
		var e = document.createElement('div');
		var _e = document.createElement('img');
		_e.alt = 'Loading';
		_e.src = settings.urlLoading;
		_e.style.padding = '0 auto';
		e.appendChild(_e);
		e.style.position = 'absolute';
		e.style.left = pos.x + 'px';
		e.style.top = pos.y + (height - 48) / 2 + 'px';
		e.style.width = width + 'px';
		e.className = 'widgetLoading';
		widget.content.domptr.widgetBody.appendChild( e );
			
		iPortal._ajaxLoadWidget( widget );
		
	},
	
	_ajaxConfigRequestWidget : function ( widget ) {
		
		var settings = iPortal.settings;
		var pos = iPortal._getPos( widget.content.domptr.widgetBody )
		var width = widget.content.domptr.widgetBody.clientWidth;
		var height = widget.content.domptr.widgetBody.clientHeight;
		var e = document.createElement('div');
		var _e = document.createElement('img');
		_e.alt = 'Loading';
		_e.src = settings.urlLoading;
		e.appendChild(_e);
		e.style.position = 'absolute';
		e.style.left = pos.x + 'px';
		e.style.top = pos.y + (height - 48) / 2 + 'px';
		e.style.width = width + 'px';
		e.className = 'widgetLoading';
		widget.content.domptr.widgetBody.appendChild( e );
		
		var sURL = settings.urlWidget +
			'id=' + encodeURI( widget.query.id ) + 
			'&widget=' + encodeURI( widget.query.widget ) +
			'&config=' + encodeURI( widget.query.config ) +
			'&action=' + 'cr';
		var xmlHttp = iPortal._getXmlHttpObject();
		
		xmlHttp.onreadystatechange = function() { 
			iPortal._ajaxWidgetLoaded( widget, xmlHttp, false );
		}
		xmlHttp.open('GET', sURL, true);
		xmlHttp.send(null);
		
	},
	
	_ajaxConfigSubmitWidget : function ( widget, request ) {
		
		var settings = iPortal.settings;
		var pos = iPortal._getPos( widget.content.domptr.widgetBody )
		var width = widget.content.domptr.widgetBody.clientWidth;
		var height = widget.content.domptr.widgetBody.clientHeight;
		var e = document.createElement('div');
		var _e = document.createElement('img');
		_e.alt = 'Loading';
		_e.src = settings.urlLoading;
		e.appendChild(_e);
		e.style.position = 'absolute';
		e.style.left = pos.x + 'px';
		e.style.top = pos.y + (height - 48) / 2 + 'px';
		e.style.width = width + 'px';
		e.className = 'widgetLoading';
		widget.content.domptr.widgetBody.appendChild( e );
		
		var sURL = settings.urlWidget +
			'id=' + encodeURI( widget.query.id ) + 
			'&widget=' + encodeURI( widget.query.widget ) +
			'&config=' + encodeURI( widget.query.config ) +
			'&action=' + 'cs';
			
		for ( var i = 0; i < request.length; i++ ) {
			sURL += '&' + encodeURI( request[i].name ) + '=' + encodeURI( request[i].value );
		}
		
		var xmlHttp = iPortal._getXmlHttpObject();
		
		xmlHttp.onreadystatechange = function() { 
			iPortal._ajaxWidgetLoaded( widget, xmlHttp, true );
		}
		xmlHttp.open('GET', sURL, true);
		xmlHttp.send(null);
		
	},
	
	init : function () {
		if ( arguments.length > 0 )
			iPortal.settings = arguments[0];
		
		var version = iPortal._getCookie('version');
		if ( parseFloat( version ) < iPortal.version ) {
			iPortal._clearCookie('widgets');
			iPortal._clearCookie('skinIndex');
			iPortal._clearCookie('date');
		}
		
		iPortal.loadConfigurations();
		iPortal.initWidgets();
		iPortal.loadWidgets();
		
		iPortal._addEvent(
			window,
			'load',
			function() {
				iPortal.pageloaded = true;
			}
		);
		
		document.getElementById( iPortal.settings.idCookieLUp ).innerHTML = iPortal._getCookie('date');
				
	},
	
	_clearCookie : function ( name ) {
		
		var date = new Date();
		date.setTime(date.getTime() - 1);
		
		cookies = new Array();
		cookies.push( { name: name, value: null } );
		iPortal._setCookie( cookies, date );
		
	},
	
	loadListWidget : function ( domContainer ) {
		var listWidgets = iPortal.listWidgets;
		var widgets = new Array();
		var widgetstr = '';
		
		for ( var i = 0; i < listWidgets.length; i++ ) {
			for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
				if ( !listWidgets[i].widgets[j].dummy )
					widgets.push( listWidgets[i].widgets[j].query.widget )
			}
		}
		
		widgetstr = widgets.join(',');
		
		var settings = iPortal.settings;
		var sURL = settings.urlWidgetList +
			'&w=' + encodeURI( widgetstr );
		var xmlHttp = iPortal._getXmlHttpObject();
		
		xmlHttp.onreadystatechange = function() { 
			if ( xmlHttp.readyState == 4 && xmlHttp.responseText ) {
				domContainer.innerHTML = xmlHttp.responseText;
			}
		}
		xmlHttp.open('GET', sURL, true);
		xmlHttp.send(null);
	},
	
	loadConfigurations : function () {
		
		var _getCookie = iPortal._getCookie;
		var listWidgets = iPortal.listWidgets;
		var listWidgetsDefault = iPortal.listWidgetsDefault;
		var cssTheme = iPortal.cssTheme;
		var settings = iPortal.settings;
		var widgetConfig = _getCookie('widgets');
		var version = _getCookie('version');
		var theme = _getCookie('csstheme');
		
		// Load widget configurations
		if ( version != iPortal.version ) 
			widgetConfig = '';
		
		if ( widgetConfig.length > 0 ) { // load configuration from cookie
			
			var widgets;
			var columns;
			
			listWidgets = iPortal.listWidgets = new Array();
			columns = widgetConfig.split('||');
			
			for ( var i = 0; i < columns.length; i++ ) {
				
				listWidgets[i] = new Object();
				listWidgets[i].column = i;
				listWidgets[i].widgets = new Array();
				
				if ( columns[i].length > 0 ) {
				
					widgets = columns[i].split('|');
					
					for ( var j = 0; j < widgets.length; j++ ) {
						var s = widgets[j].split('#');
						var widget = new Object();
						widget.type = 'widget';
						widget.query = new Object();
						widget.query.id = iPortal._getNewWidgetId();
						widget.query.widget = s[0];
						widget.query.config = s[1];
						widget.jscript = new Object();
				
						listWidgets[i].widgets.push( widget );
					}
				
				}
					
			}
			
		}
		else { // load configuration from a default profile
			
			var column;
			
			listWidgets = iPortal.listWidgets = new Array();
			
			for ( var i = 0; i < listWidgetsDefault.length; i++ ) {
				
				if ( listWidgetsDefault[i] == null )
					break;
					
				column = listWidgetsDefault[i].col;

				if ( !listWidgets[column] ) {
					
					listWidgets[column] = new Object();
					listWidgets[column].column = column;
					listWidgets[column].widgets = new Array();
					
				}
				
				var widget = new Object();
				widget.type = 'widget';
				widget.query = new Object();
				widget.query.id = iPortal._getNewWidgetId();
				widget.query.widget = listWidgetsDefault[i].qwidget;
				widget.query.config = listWidgetsDefault[i].qconfig;
				widget.jscript = new Object();
				
				listWidgets[column].widgets.push( widget );
				
			}
			
			iPortal.saveConfigurations();
			
		}
		
		// Load theme configurations
		if ( version != iPortal.version )
			theme = '';
		
		if ( theme.length > 0 ) {
			cssTheme = theme;
		}
		else {
			cssTheme = 'default';
		}
		var domCSSTheme = document.createElement('link');
		var domHead = document.getElementsByTagName('head')[0];
		domCSSTheme.rel = 'stylesheet';
		domCSSTheme.id = 'csstheme';	
		domCSSTheme.href = '/portal/jsp/themes/' + cssTheme + '/style.css';
		domHead.appendChild(domCSSTheme);
		
	},
	
	saveConfigurations : function () { // saveConfigurations
		var settings = iPortal.settings;
		var cookies
		
		// Widget cookie
		var listWidgets = iPortal.listWidgets;
		var date = new Date();
		var column = new Array();
		
		for ( var i = 0; i < listWidgets.length; i++ ) {
			
			var widgets = new Array();
			
			for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
				
				if ( !listWidgets[i].widgets[j].dummy )
					widgets.push( 
						[listWidgets[i].widgets[j].query.widget, listWidgets[i].widgets[j].query.config].join('#')  
					);
					
			}
			
			column.push( widgets.join('|') );
			
		}
		
		cookies = new Array();
		cookies.push( { name: 'version', value: iPortal.version } );
		iPortal._setCookie( cookies, 90 );
		
		cookies = new Array();
		cookies.push( { name: 'widgets', value: column.join('||') } );
		iPortal._setCookie( cookies, 90 );
		
		// Date cookie
		
		var month = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
		
		cookies = new Array();
		cookies.push( { name: 'date', value: 
			[date.getDate(), 
			month[date.getMonth()], 
			date.getFullYear(), 
			iPortal._leadingZero( date.getHours(), 2 ) + ':' + iPortal._leadingZero( date.getMinutes(), 2 )
			].join(' ') } );
		iPortal._setCookie( cookies, 90 );
	},
	
	_leadingZero : function ( intstr, digits ) {
		intstr += '';
		while ( intstr.length < digits )
			intstr = '0' + intstr;
		return intstr;
	},
	
	_btnRemoveWidget : function ( widget ) {
		
		var listWidgets = iPortal.listWidgets;
		var ret = confirm('Are you sure you want to remove this widget?');
		
		if (ret == true) {
			
			for ( var i = 0; i < listWidgets.length; i++ ) {
				for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
					if ( listWidgets[i].widgets[j] == widget ) {
						
						listWidgets[i].widgets.splice(j, 1);
						widget.content.dom.parentNode.removeChild( widget.content.dom );
						
					}
				}
			}
			
		}
		
		iPortal.saveConfigurations();
		
	},
	
	_btnRefreshWidget : function ( widget ) {
		iPortal._ajaxRefreshWidget( widget );
	},
	
	_btnConfigWidget : function ( widget ) {
		iPortal._ajaxConfigRequestWidget( widget );
	},
	
	createWidget : function ( widget, col ) {
		
		var settings = iPortal.settings;
		var _addEvent = iPortal._addEvent;
		
		widget.content.domptr = new Object();
		
		widget.content.dom = document.createElement('div');
		widget.content.dom.className = settings.classWidgetContainer + ' ' + settings.classWidgetColumn[col];
			
			var _e = document.createElement('div');
			_e.className = 'rnd_modtop';
				
				var __e = document.createElement('div');
				__e.className = 'rnd1';
				_e.appendChild( __e );
				
				var __e = document.createElement('div');
				__e.className = 'rnd2';
				_e.appendChild( __e );
				
				var __e = document.createElement('div');
				__e.className = 'rnd3';
				_e.appendChild( __e );
				
			widget.content.dom.appendChild(_e);
				
			
			var _e = document.createElement('div');
			_e.className = settings.classWidgetTitle;
			_e.title = 'Click and drag to move this widget';
			_addEvent( _e, 'mousedown', iPortal.widgetMouseDown );
			widget.content.domptr.widgetTitle = _e;
			
				var __e = document.createElement('a');
				__e.className = 'widgetTitleText';
				__e.innerHTML = '- Loading -';
				_e.appendChild(__e);
				widget.content.domptr.widgetTitleText = __e;
				
				var __e = document.createElement('a');
				__e.className = 'widgetDelBtn';
				__e.title = 'Delete';
				__e.href = '#';
				_addEvent( __e, 'click', function( event ) {
					if ( !event )	var event = window.event;
					
					iPortal._btnRemoveWidget( widget );
					
					if ( event.preventDefault ) event.preventDefault();
					event.returnValue = false;
				} );
				_e.appendChild(__e);
				
				var __e = document.createElement('a');
				__e.className = 'widgetConfigBtn';
				__e.title = 'Config';
				__e.id = widget.query.id + '-btnconfig';
				__e.href = '#';
				_addEvent( __e, 'click', function( event ) {
					if ( !event )	var event = window.event;

					iPortal._btnConfigWidget( widget );
					
					if ( event.preventDefault ) event.preventDefault();
					event.returnValue = false;
				} );
				_e.appendChild(__e);
				
				var __e = document.createElement('a');				
				__e.className = 'widgetRefreshBtn';
				__e.title = 'Refresh';
				__e.href = '#';
				_addEvent( __e, 'click', function( event ) {
					if ( !event )	var event = window.event;

					iPortal._btnRefreshWidget( widget );

					if ( event.preventDefault ) event.preventDefault();
					event.returnValue = false;
				} );
				_e.appendChild(__e);
				
			widget.content.dom.appendChild(_e);
				
			var _e = document.createElement('div');
			_e.className = 'widgetBody';
			widget.content.domptr.widgetBody = _e;
			
				var __e = document.createElement('img');
				__e.alt = 'Loading';
				__e.src = settings.urlLoading;
				_e.appendChild(__e);
		
			widget.content.dom.appendChild(_e);
			
			var _e = document.createElement('div');
			_e.className = 'rnd_modbottom';
				
				var __e = document.createElement('div');
				__e.className = 'rnd3';
				_e.appendChild( __e );
				
				var __e = document.createElement('div');
				__e.className = 'rnd2';
				_e.appendChild( __e );
				
				var __e = document.createElement('div');
				__e.className = 'rnd1';
				_e.appendChild( __e );
				
			widget.content.dom.appendChild(_e);

	},
	
	hideBtnConfig : function ( widget ) {
		
		var domBtnConfig = document.getElementById( widget.query.id + '-btnconfig' );
		domBtnConfig.style.display = 'none';
		
	},
	
	initWidgets : function () {
		
		var settings = iPortal.settings;
		var listWidgets = iPortal.listWidgets;
		var column;
		
		for ( var i = 0; i < listWidgets.length; i++ ) {
			
			listWidgets[i].dom = document.getElementById( settings.classPageColumn[i] );
			
			for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
				
				listWidgets[i].widgets[j].content = new Object();
				iPortal.createWidget( listWidgets[i].widgets[j], i );
				
				column = document.getElementById( settings.classPageColumn[ listWidgets[i].column ] );
				column.appendChild( listWidgets[i].widgets[j].content.dom );
				
			}
			
		}
		
	},
	
	addWidget : function( widgetname, config, col ) {
	
		var listWidgets = iPortal.listWidgets;
		var settings = iPortal.settings;
		var widget = new Object();
		var len;
		
		if ( col == -1 ) {
			var w0 = listWidgets[0].widgets.length;
			var w1 = listWidgets[1].widgets.length;
			var w2 = listWidgets[2].widgets.length;
			if ( w0 < (w1 + w2) / 2 )
				col = 0;
			else if ( w1 < w2 )
				col = 1;
			else
				col = 2;
		}
		
		widget.type = 'widget';
		widget.query = new Object();
		widget.query.id = iPortal._getNewWidgetId();
		widget.query.widget = widgetname;
		widget.query.config = config;
		widget.jscript = new Object();
		
		listWidgets[col].widgets.unshift( widget );
		
		listWidgets[col].widgets[0].content = new Object();
		iPortal.createWidget( listWidgets[col].widgets[0], col );
		
		column = document.getElementById( settings.classPageColumn[ listWidgets[col].column ] );
		if ( listWidgets[col].widgets.length == 1 )
			column.appendChild( listWidgets[col].widgets[0].content.dom );
		else if ( ! listWidgets[col].widgets[1].content )
			column.appendChild( listWidgets[col].widgets[0].content.dom );
		else
			column.insertBefore( listWidgets[col].widgets[0].content.dom, listWidgets[col].widgets[1].content.dom );
			
		iPortal._ajaxLoadWidget( listWidgets[col].widgets[0] );
		iPortal.saveConfigurations();
		
		var domWidget = document.getElementById('p-widgets');
		domWidget.style.display = 'none';
	
	},
	
	loadWidgets : function () {
		
		var settings = iPortal.settings;
		var listWidgets = iPortal.listWidgets;
		
		for ( var i = 0; i < listWidgets.length; i++ ) {
			for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
				iPortal._ajaxLoadWidget( listWidgets[i].widgets[j] );
			}
		}
		
	},
	
	initializeGrid : function () {
		
		var settings = iPortal.settings;
		var _getPos = iPortal._getPos;
		var listWidgets = iPortal.listWidgets;
		var draggingWidget = iPortal.draggingWidget;
		var prevDragging;
		
		for ( var i = 0; i < listWidgets.length; i++ ) {
			
			listWidgets[i].dimension = new Object();
			listWidgets[i].dimension.x = _getPos( listWidgets[i].dom ).x;
			listWidgets[i].dimension.width = listWidgets[i].dom.clientWidth;
			listWidgets[i].dimension.xmid = listWidgets[i].dimension.x + listWidgets[i].dimension.width / 2;
			prevDragging = false;
			
			for ( var j = 0; j < listWidgets[i].widgets.length; j++ ) {
				
				if ( listWidgets[i].widgets[j].dummy )
					break;
				
				if ( listWidgets[i].widgets[j].content.dom == draggingWidget.dragging.dom ) {
					
					draggingWidget.dragging.i = i;
					draggingWidget.dragging.j = j;
					draggingWidget.dragging.widgetPtr = listWidgets[i].widgets[j];
					listWidgets[i].widgets.splice( j, 1 );
					j--;
					prevDragging = true;
					continue;
					
				}
				else if ( prevDragging ) {
					
					listWidgets[i].widgets[j].allowInsert = false;
					prevDragging = false;
					
				}
				else {
					
					listWidgets[i].widgets[j].allowInsert = true;
					
				}
				
				listWidgets[i].widgets[j].dimension = new Object();
				listWidgets[i].widgets[j].dimension.y = _getPos( listWidgets[i].widgets[j].content.dom ).y;
				listWidgets[i].widgets[j].dimension.height = listWidgets[i].widgets[j].content.dom.clientHeight;
				listWidgets[i].widgets[j].dimension.ymid = listWidgets[i].widgets[j].dimension.y + listWidgets[i].widgets[j].dimension.height / 2;
				
			}
			
			listWidgets[i].widgets[j] = new Object();
			listWidgets[i].widgets[j].dummy = true;
			listWidgets[i].widgets[j].allowInsert = (prevDragging) ? false : true;
			listWidgets[i].widgets[j].dimension = new Object();
			listWidgets[i].widgets[j].dimension.y = 1000000;
			listWidgets[i].widgets[j].dimension.height = 0;
			listWidgets[i].widgets[j].dimension.ymid = listWidgets[i].widgets[j].dimension.y + listWidgets[i].widgets[j].dimension.height / 2;
			
		}
		
	},
	
	widgetMouseDown : function ( event ) {
		
		if ( !( event.button == 1 && window.event != null || event.button == 0) )
			return;
		
		var target = (window.event) ? event.srcElement : event.target;
		if ( target.nodeName.toLowerCase() == 'a' )
			return;

		
		var draggingWidget = iPortal.draggingWidget;
		var settings = iPortal.settings;
		var _getPos = iPortal._getPos;
		var widget = this.parentNode;
		var pos;
		
		
		if ( draggingWidget && draggingWidget.dragging ) {
			
			iPortal.dragStop( event );
			return;
			
		}
		
		draggingWidget = iPortal.draggingWidget = new Object();
		pos = _getPos( widget );
		
		draggingWidget.dragging = new Object();
		draggingWidget.dragging.dom = widget;
		draggingWidget.dragging.mouseX = event.clientX;
		draggingWidget.dragging.mouseY = event.clientY;
		draggingWidget.dragging.widgetX = pos.x;
		draggingWidget.dragging.widgetY = pos.y;
		draggingWidget.dragging.offsetX = pos.x - event.clientX;
		draggingWidget.dragging.offsetY = pos.y - event.clientY;
		
		draggingWidget.shadow = new Object();
		draggingWidget.shadow.dom = widget.cloneNode(false);
		draggingWidget.shadow.dom.className = settings.classWidgetPlaceHolder;
		draggingWidget.shadow.dom.id = settings.idWidgetShadow;
		draggingWidget.shadow.dom.style.height = ( widget.clientHeight - 2 ) + 'px';
		draggingWidget.dragging.dom.parentNode.insertBefore( draggingWidget.shadow.dom, draggingWidget.dragging.dom );
		
		iPortal.dragStart( event );
		
	},
	
	dragStart : function ( event ) {
		
		var draggingWidget = iPortal.draggingWidget;
		var settings = iPortal.settings;
		var _addEvent = iPortal._addEvent;
		
		if ( draggingWidget.dragging.dom != null ) {
			
			draggingWidget.dragging.dom.className += ' ' + settings.classWidgetDragging;
			draggingWidget.dragging.dom.style.width = draggingWidget.dragging.dom.clientWidth + 'px';
			draggingWidget.dragging.dom.style.position = 'absolute';
			_addEvent( document, 'mousemove', iPortal.dragMoving );
			_addEvent( document, 'mouseup', iPortal.dragStop );
			
			//disable text selection
			if ( event.preventDefault )
				event.preventDefault();
			else
				document.onselectstart = function () { return false; };
	
			iPortal.initializeGrid();
			iPortal.dragMoving( event );
			
		}
		
	},
	
	dragMoving : function ( event ) {
		
		var settings = iPortal.settings;
		var draggingWidget = iPortal.draggingWidget;
		var listWidgets = iPortal.listWidgets;
		
		if ( draggingWidget.dragging.dom != null ) {
			
			draggingWidget.dragging.x = draggingWidget.dragging.offsetX + event.clientX;
			draggingWidget.dragging.y = draggingWidget.dragging.offsetY + event.clientY;
			draggingWidget.dragging.xmid = draggingWidget.dragging.x + draggingWidget.dragging.dom.clientWidth / 2;
			draggingWidget.dragging.ymid = draggingWidget.dragging.y + draggingWidget.dragging.dom.clientHeight / 2;
			
			draggingWidget.dragging.dom.style.left = draggingWidget.dragging.x + 'px';
			draggingWidget.dragging.dom.style.top = draggingWidget.dragging.y + 'px';

			// locate widget position				
			var found = false;
			var i, j;
			
			for ( i = 0; i < listWidgets.length; i++ ) { // locate column
				
					if ( Math.abs( draggingWidget.dragging.xmid - listWidgets[i].dimension.xmid ) < listWidgets[i].dimension.width / 2 ) { 
						
						for ( j = 0; j < listWidgets[i].widgets.length; j++ ) { // locate position in the column
							
							if ( draggingWidget.dragging.ymid - listWidgets[i].widgets[j].dimension.ymid < 0 ) {
								
								if ( listWidgets[i].widgets[j].allowInsert )
									found = true;
									
								break;
								
							}
							
						}

						break;
						
					}
					
			}
			
			if ( found ) {
				
				var draw = true;
				
				if ( draggingWidget.target ) {
					
					if ( draggingWidget.target.i == i && draggingWidget.target.j == j ) 
						draw = false;
					else {
						draggingWidget.target.dom.parentNode.removeChild( draggingWidget.target.dom );
						draggingWidget.target = null;
					}
					
				}
				
				if ( draw ) {
					
					draggingWidget.target = new Object();
					draggingWidget.target.dom = draggingWidget.shadow.dom.cloneNode(false);
					draggingWidget.target.i = i;
					draggingWidget.target.j = j;
					
					draggingWidget.target.dom.className = settings.classWidgetTargetPlaceHolder;
					draggingWidget.target.dom.style.height = (draggingWidget.dragging.dom.clientHeight - 2) + 'px';
					draggingWidget.target.dom.style.width= null;
					draggingWidget.target.dom.style.position = 'static';
					
					if ( listWidgets[i].widgets[j].dummy )
						listWidgets[i].dom.appendChild( draggingWidget.target.dom );
					else
						listWidgets[i].dom.insertBefore( draggingWidget.target.dom, listWidgets[i].widgets[j].content.dom );
					
					
				}
			}
			else {
				
				if ( draggingWidget.target ) {
					
					draggingWidget.target.dom.parentNode.removeChild( draggingWidget.target.dom );
					draggingWidget.target = null;
					
				}
				
			}
			
		}

	},
	
	dragStop : function ( event ) {
		
		var draggingWidget = iPortal.draggingWidget;
		var listWidgets = iPortal.listWidgets;
		var settings = iPortal.settings;
		var _removeEvent = iPortal._removeEvent;
		
		if ( draggingWidget.dragging != null ) {
			draggingWidget.shadow.dom.parentNode.removeChild( draggingWidget.shadow.dom );
			
			if ( draggingWidget.target ) {
				
				draggingWidget.target.dom.parentNode.insertBefore( draggingWidget.dragging.dom , draggingWidget.target.dom );
				draggingWidget.target.dom.parentNode.removeChild( draggingWidget.target.dom );
				draggingWidget.dragging.dom.className = settings.classWidgetContainer + ' ' + settings.classWidgetColumn[draggingWidget.target.i];
				
				listWidgets[draggingWidget.target.i].widgets.splice( draggingWidget.target.j, 0, new Object() );
				listWidgets[draggingWidget.target.i].widgets[draggingWidget.target.j] = draggingWidget.dragging.widgetPtr;
				
			}
			else {
				
				listWidgets[draggingWidget.dragging.i].widgets.splice( draggingWidget.dragging.j, 0, draggingWidget.dragging.widgetPtr );
				
			}
			
			draggingWidget.dragging.dom.className = draggingWidget.dragging.dom.className.replace( / widgetDragging/g, '' );
			draggingWidget.dragging.dom.style.left = null;
			draggingWidget.dragging.dom.style.top = null;
			draggingWidget.dragging.dom.style.width = null;
			draggingWidget.dragging.dom.style.position = 'static';
		}
		
		draggingWidget.target = null;
		draggingWidget.dragging = null;
		draggingWidget.shadow = null;

		_removeEvent( document, 'mousemove', iPortal.dragMoving );
		_removeEvent( document, 'mouseup', iPortal.dragStop );
		
		// reenable text selection
		document.onselectstart = null;
		iPortal.saveConfigurations();
	  
	}
	
};
