(function( win, _rootPath, _ajaxUrl )
{
	var Indigo = (function() {
		var Indigo = function() {
			return new Indigo.init();
		},
		
		rootPath = _rootPath,
		ajaxUrl = _ajaxUrl,
		str = {},		
		version = '1.0';
		
		var undefined;
		var m_Version = '1.0';
		var m_aCachedViews = {};
		var m_MessagesContainer;
		var m_MessageList = null;
		var m_ErrorList = null;
		var m_RefreshIntervalId;

		/*--------------------------------------------------------------------------------------------------------------
		** get strings
		*/
		$.when( $.post( rootPath + ajaxUrl, {actionCommand: 'GET_JS_STRINGS'}, function( rs )
		{
			if( rs.bSuccess )
			{
				str = rs.data;
			}
		}, 'json' ) ).fail( function() { alert( "Unable to communicate with the server." ); } );

				
		/*--------------------------------------------------------------------------------------------------------------
		** Date class extension
		*/
		Date.prototype.formatDate = function( format )
		{
			format = format.replace( "YYYY", this.getFullYear() );
			var month = (this.getMonth() < 9 ? '0' + (this.getMonth() + 1) : this.getMonth() + 1);
			var day = (this.getDate() < 10 ? '0' + this.getDate() : this.getDate());
			format = format.replace( "MM", month );
			format = format.replace( "DD", day );
			format = format.replace( "mmm", Indigo.getStr( "JSSTR_INDIGO_DATEPICKER_MONTH_" + this.getMonth() ) );
			return format;
		}
		
		/*--------------------------------------------------------------------------------------------------------------
		** JsWindow class
		*/
		function JsWindow( options )
		{
			var dragStartX, dragStartY;
			var defaults = {
				posX: 10,
				posY: 10,
				width: 400,
				height: 400,
				title: '',
				closeButton: true,
				onClose: null,
				resize: true,
				vScroll: true,
				cssClassName: 'jsWindow',
				drag: true,
				minWidth: 100,
				minHeight: 20
			};
			
			var options = $.extend( defaults, options );
			
			if( options.closeButton )
			{
				this.m_CloseButton = $( '<div class="' + options.cssClassName + 'CloseButton">' );
				this.m_CloseButton.click( function( event )
					{
						win = $(event.currentTarget).parent().parent();
						win.css( "display", "none" );
						if( options.onClose != null )	options.onClose();
					}
				);
			}
		
			this.m_Title = $( '<span class="' + options.cssClassName + 'Title">' + options.title + '</span>' );
		
		
			this.m_DragBar = $( '<div class="' + options.cssClassName + 'DragBar"></div>' );
			this.m_DragBar.append( this.m_Title );
			if( options.closeButton )	this.m_DragBar.append( this.m_CloseButton );
			
			if( options.drag )
			{
				var move = function( event, win )
				{
					event.preventDefault();
					var x = event.screenX - dragStartX;
					var y = event.screenY - dragStartY;
					if( x < 0 )	x = 0;
					if( y < 0 )	y = 0;
					win.css( { left: x + "px", top: y + "px" } );
				}
				this.m_DragBar.mousedown( function( event )
				{
					event.preventDefault();
					win = $(event.currentTarget).parent();
					pos = win.position();
					dragStartX = event.screenX - pos.left;
					dragStartY = event.screenY - pos.top;
					$(document).mousemove( function( event ) { move( event, win ); } );
					$(document).mouseup( function( event ) { $(document).unbind( 'mousemove' ); $(document).unbind( 'mouseup' ); } );
				});
			}
			else
			{
				this.m_DragBar.css( 'cursor', 'default' );
			}
		
			this.m_Content = $( '<div class="' + options.cssClassName + 'Content"></div>' );
			if( options.vScroll )	this.m_Content.css( 'overflowY', 'scroll' );
		
			this.m_StatusBar = $( '<div class="' + options.cssClassName + 'StatusBar"> </div>' );

			if( options.resize )
			{
				var resize = function( event, win )
				{
					event.preventDefault();
					var w = event.screenX - dragStartX;
					var h = event.screenY - dragStartY;
					if( w < options.minWidth )	w = options.minWidth;
					if( h < options.minHeight )	h = options.minHeight;
					win.css( { width: w + "px", height: h + "px" } );
				}
				this.m_ReSizeKnob = $( '<div class="' + options.cssClassName + 'ReSizeKnob"> </div>' );
				this.m_ReSizeKnob.mousedown( function( event )
				{
					event.preventDefault();
					win = $(event.currentTarget).parent().parent();
					dragStartX = event.screenX - win.width();
					dragStartY = event.screenY - win.height();
					$(document).mousemove( function( event ) { resize( event, win ); } );
					$(document).mouseup( function( event ) { $(document).unbind( 'mousemove' ); $(document).unbind( 'mouseup' ); } );
				});
				this.m_StatusBar.append( this.m_ReSizeKnob );
			}
		
			this.m_ContainerDiv = $( '<div class="' + options.cssClassName + '"></div>' );
			if( options.id != undefined && options.id != null && options.id != '' )	this.m_ContainerDiv.attr( 'id', options.id );
			this.m_ContainerDiv.css( { left: options.posX + "px", top: options.posY + "px" } );
			if( options.width != null )	this.m_ContainerDiv.css( 'width', (options.minWidth > options.width ? options.minWidth : options.width) + 'px' );
			if( options.height != null )	this.m_ContainerDiv.css( 'height', (options.minHeight > options.height ? options.minHeight : options.height) + 'px' );
			if( options.footerHeight != undefined )	this.m_ContainerDiv.css( 'paddingBottom', (17 + options.footerHeight) + 'px' );
			this.m_ContainerDiv.append( this.m_DragBar );
			this.m_ContainerDiv.append( this.m_Content );
			this.m_ContainerDiv.append( this.m_StatusBar );
			$( 'body' ).append( this.m_ContainerDiv );
			if( this.m_ContainerDiv.width() < options.minWidth )	this.m_ContainerDiv.css( 'minWidth', options.minWidth + 'px' );
			if( this.m_ContainerDiv.height() < options.minHeight )	this.m_ContainerDiv.css( 'minHeight', options.minHeight + 'px' );
		}
		
		JsWindow.prototype.show = function()
		{
			this.m_ContainerDiv.css( { display: "block" } );
		}
		
		JsWindow.prototype.hide = function()
		{
			this.m_ContainerDiv.css( { display: "none" } );
		}
		
		JsWindow.prototype.close = function()
		{
			this.m_CloseButton.click();
		}
		
		JsWindow.prototype.clearContent = function()
		{
			this.m_Content.empty();
		}
		
		JsWindow.prototype.appendContentNode = function( node )
		{
			this.m_Content.append( node );
		}
		
		JsWindow.prototype.setTitle = function( title )
		{
			this.m_Title[0].innerHTML = title;
		}
		
		JsWindow.prototype.remove = function()
		{
			this.m_ContainerDiv.remove();
		}

		/*--------------------------------------------------------------------------------------------------------------
		** FileManager class
		*/
		function FileManager( options )
		{
			this.m_Path = "";
			this.m_MediaPath = "/media/upload/";					
			this.m_Controls = $( '<div class="mmControls"><input type="text" id="mmDirName" size="32" /> <input id="mmCreateDirNameButton" type="button" value="' + Indigo.getStr( 'JSSTR_FILE_MANAGER_BUTTON_CREATE_FOLDER' ) + '" /><br/><input type="file" id="uploadFile" name="uploadFile" size="32"> <input type="button" id="mmUploadFileButton" value="' + Indigo.getStr( 'JSSTR_FILE_MANAGER_BUTTON_UPLOAD' ) + '" /></div>' );
			this.load();
		}
		
		FileManager.prototype.setSelectCallback = function( selectCallback )
		{
			this.m_SelectCallback = selectCallback;
		}
		
		FileManager.prototype.load = function()
		{
			var s = this;
			Indigo.doCommand( {controller: "fileManager.do", params: {actionCommand: "getList", path: this.m_Path}, success: function( retval )
			{
				s.displayResult( retval );
			}});		
		}
		
		FileManager.prototype.displayResult = function( retval )
		{
			var s = this;
			this.m_aFiles = retval.data.entries;
			if( this.m_Window == null )
			{
				if( this.m_WindowX == null )
				{
					this.m_WindowX = 100;
					this.m_WindowY = 100;
					this.m_WindowWidth = 668;
					this.m_WindowHeight = 668;
				}
				this.m_Window = Indigo.JsWindow( { posX: this.m_WindowX, posY: this.m_WindowY, width: this.m_WindowWidth, height: this.m_WindowHeight } );
			}
	
			this.m_Window.clearContent();
			this.m_Window.setTitle( Indigo.getStr( "JSSTR_FILE_MANAGER_WINDOW_TITLE" ) + this.m_Path );
			this.m_Window.appendContentNode( this.m_Controls );
			this.m_Controls.children( '#mmCreateDirNameButton' ).click( function( event ) { s.createDir(); } );
			this.m_Controls.children( '#mmUploadFileButton' ).click( function( event ) { s.uploadFile(); } );
			if( this.m_Path != "" && this.m_Path != null )
			{
				var aParts = this.m_Path.split( "/" );
				var parentPath = "";
				if( aParts.length > 2 )
				{
					for( var iPath = 0; iPath < aParts.length - 2; iPath++ )
					{
						parentPath += aParts[iPath] + "/";
					}
				}
				
				var node = $( '<div class="mmContainer"><img class="mmContainer" src="/indigo/images/folder.png" alt="' + parentPath + '" /><p class="mmContainer">..</p></div>' );
				node.children('img').click( function( event ) { s.dirSelected( event ); } );
				this.m_Window.appendContentNode( node );
			}
			for( var i = 0; i < this.m_aFiles.length; i++ )
			{
				var file = this.m_aFiles[i];
				if( file.isFile )
				{
					var ws = '';
					var hs = '';
					if( file.width > 100 )
					{
						if( file.width > file.height )
						{
							ws = ' width="100" ';
						}
						else
						{
							hs = ' height="100" ';
						}
					}
					else if( file.hs > 100 )
					{
						hs = ' height="100" ';
					}
					var img = $( '<div class="mmContainer"><img class="mmDeleteButton" src="/indigo/images/delete_icon.png" alt="' + file.fileName + '" id="mmDelete_' + i + '" title="' + Indigo.getStr( 'JSSTR_FILE_MANAGER_DELETE_FILE_ICON_TOOLTIP' ) + '"/><img id="mmFile_' + i + '" class="mmContainer" src="/media/upload/' + this.m_Path + file.fileName + '"' + ws + hs + ' alt="' + this.m_Path + file.fileName + '" /><p class="mmContainer"><a class="mmContainer" href="' + this.m_MediaPath + this.m_Path + file.fileName + '" target="_blank">' + file.fileName + '</a></p></div>' );
					img.children( '#mmFile_' + i ).click( function( event ) { s.fileSelected( event ); } );
					img.children( '#mmDelete_' + i ).click( function( event ) { s.removeFile( event ); } );
					this.m_Window.appendContentNode( img );
				}
				else
				{
					var node = $( '<div class="mmContainer"><img class="mmDeleteButton" src="/indigo/images/delete_icon.png" alt="' + file.fileName + '" id="mmDelete_' + i + '" title="' + Indigo.getStr( 'JSSTR_FILE_MANAGER_DELETE_FOLDER_ICON_TOOLTIP' ) + '"/><img id="mmFolder_' + i + '" class="mmContainer" src="/indigo/images/folder.png" alt="' + this.m_Path + file.fileName + '/" /><p class="mmContainer">' + file.fileName + '</p></div>' );
					node.children( '#mmFolder_' + i ).click( function( event ) { s.dirSelected( event ); } );
					node.children( '#mmDelete_' + i ).click( function( event ) { s.removeDir( event ); } );
					this.m_Window.appendContentNode( node );
				}
			}
			
			this.m_Window.show();
		}
		
		FileManager.prototype.dirSelected = function( event )
		{
			this.m_Path = event.target.alt;
			this.load();
		}
		
		FileManager.prototype.fileSelected = function( event )
		{
			if( this.m_SelectCallback != null && this.m_SelectCallback != undefined && this.m_SelectCallback != "" )
			{
				this.m_SelectCallback( event.currentTarget.alt );
			}
		}
		
		FileManager.prototype.removeDir = function( event )
		{
			var s = this;
			if( confirm( Indigo.getStr( 'JSSTR_FILE_MANAGER_MSG_CONFIRM_DELETE_FOLDER' ) ) )
			{
				Indigo.doCommand( {controller: "fileManager.do", params: {actionCommand: "removeDir", dirName: event.currentTarget.alt, path: this.m_Path}, success: function( retval )
				{
					s.displayResult( retval );
				}});
			}
		}
		
		FileManager.prototype.createDir = function( event )
		{
			var s = this;
			var dirName = $( '#mmDirName' )[0].value;
			if( dirName.length > 0 )
			{
				Indigo.doCommand( {controller: "fileManager.do", params: {actionCommand: "createDir", dirName: dirName, path: this.m_Path}, success: function( retval )
				{
					s.displayResult( retval )
				}});
				$( '#mmDirName' )[0].value = '';
			}
		}
		
		FileManager.prototype.uploadFile = function( event )
		{
			var s = this;
			var id = new Date().getTime();
			var frameId = 'mmUploadFrame' + id;
			var formId = 'mmUploadForm' + id;
			var form = $('<form style="display: none;" target="' + frameId + '" action="' + Indigo.getAjaxPath() + 'fileManager.do" method="post" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"><input type="hidden" name="actionCommand" value="uploadFile" /><input type="hidden" name="path" value="' + this.m_Path + '" /></form>');	
			var orgFile = $('#uploadFile');
			var newFile = orgFile.clone();
			orgFile.before( newFile );
			orgFile.appendTo( form );		
			form.appendTo('body');		
		
			var iframe = $('<iframe id="' + frameId + '" name="' + frameId + '" style="display: none" />' );
			$('body').append( iframe );
		
			iframe.load( function()
			{
				try 
				{
					var responseText = "";
					if( iframe[0].contentWindow )
					{
						responseText = iframe[0].contentWindow.document.body ? iframe[0].contentWindow.document.body.innerHTML : "";
					}
					else if( iframe[0].contentDocument )
					{
						responseText = iframe[0].contentDocument.document.body ? iframe[0].contentDocument.document.body.innerHTML : "";
					}
	
					var retval = $.parseJSON( responseText );
					if( retval.bSuccess )
					{
						s.load();
					}
					else
					{
						if( retval.msg != undefined && retval.msg != "" )	alert( retval.msg );
					}
				}
				catch(e)
				{
					alert( e );
				}
		
				iframe.unbind()
				iframe.remove();
				form.remove();
			});
			
			form.submit();
		}
		
		FileManager.prototype.removeFile = function( event )
		{
			var s = this;
			if( confirm( Indigo.getStr( 'JSSTR_FILE_MANAGER_MSG_CONFIRM_DELETE_FILE' ) ) )
			{
				Indigo.doCommand( {controller: 'fileManager.do', params: {actionCommand: 'removeFile', fileName: event.currentTarget.alt, path: this.m_Path}, success: function( rs ) { s.displayResult( rs ); } } );
			}
		}
				
		/*--------------------------------------------------------------------------------------------------------------
		** Indigo object methods
		*/
		$.extend( Indigo, 
		{
			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Safe trace output...
			*/
			dump: function( str )
			{
				try
				{
					if( window.console != undefined )
					{
						if( console.debug != undefined )
						{
							console.debug( str );
						}
					}
				}
				catch(e){}
			},

			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Message handling
			*/
			clearMessages: function( messageContainer )
			{
				(messageContainer || m_MessagesContainer).empty();
				m_MessageList = null;
				m_ErrorList = null;
			},
			addErrorMessage: function( msg, messageContainer )
			{
				if( m_ErrorList == null )
				{
					m_ErrorList = $( '<ul class="error"></ul>' );
					(messageContainer || m_MessagesContainer).append( m_ErrorList );
				}

				if( msg instanceof Array )
				{
					for( var i = 0, ii = msg.length; i < ii; i++ )
					{
						m_ErrorList.append( '<li class="error">' + msg[i] + '</li>' );
					}
				}
				else
				{
					m_ErrorList.append( '<li class="error">' + msg + '</li>' );
				}
			},
			addMessage: function( msg, messageContainer )
			{
				if( m_MessageList == null )
				{
					m_MessageList = $( '<ul class="message"></ul>' );
					(messageContainer || m_MessagesContainer).append( m_MessageList );
				}
				if( msg instanceof Array )
				{
					for( var i = 0, ii = msg.length; i < ii; i++ )
					{
						m_MessageList.append( '<li class="message">' + msg[i] + '</li>' );
					}
				}
				else
				{
					m_MessageList.append( '<li class="message">' + msg + '</li>' );
				}
			},

			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Talks to the backend, this is the only method wich does that - handels error messages and session validation as well.
			*/
			doCommand: function( options )
			{
				var bSupressMessages = (options.supressMessages || false);
				var params = jQuery.extend( {}, (options.params || {}) );;
				var messageContainer = (options.messageContainer || m_MessagesContainer);
				if( !bSupressMessages )	Indigo.clearMessages( messageContainer );
				jQuery.when( jQuery.post( rootPath + ajaxUrl + options.controller, params, function( retval )
				{
					if( (retval.bSuccess || false) )
					{
						// success
						if( !bSupressMessages && (retval.msg || '') != '' )
						{
							if( retval.redirectView == undefined )
							{
								Indigo.addMessage( retval.msg, messageContainer );
							}
							else if( window.sessionStorage != undefined )
							{
								sessionStorage.setItem( 'lastMessage', retval.msg );
							}
						}
						if( options.success instanceof Function )	options.success( retval );
						if( retval.redirectView != undefined )
						{
							var url = (retval.redirectView != '' ? retval.redirectView : window.location);
							window.location = url;
						}
					}
					else if( (retval.data.bNeedAuthentication || false) )
					{
						// need authentication
						if( !bSupressMessages && (retval.msg || '') != '' )
						{
							Indigo.addErrorMessage( retval.msg, messageContainer );
						}

						if( m_RefreshIntervalId != undefined )	clearInterval( m_RefreshIntervalId );

						if( options.authenticate instanceof Function )
						{
							options.authenticate( retval );
						}
						else
						{
							if( (retval.data.redirectUrl || '') != '' )
							{
								window.location = retval.data.redirectUrl;
							}
						}
					}
					else
					{
						// failed
						if( !bSupressMessages && (retval.msg || '') != '' )
						{
							Indigo.addErrorMessage( retval.msg, messageContainer );
						}
						if( options.failure instanceof Function )	options.failure( retval );
					}
				}, 'json' ) ).fail( function() { Indigo.addErrorMessage( "Unable to communicate with the server.", messageContainer ); } );
			},
		
			/*---------------------------------------------------------------------------------------------------------------------------------------
			* get view
			*/
			getView: function( view, callback, options )
			{
				var opts = $.extend( {noCache: false}, (options || {}) );
				if( m_aCachedViews[view] != undefined )
				{
					callback( m_aCachedViews[view] )
				}
				else
				{
					var params = $.extend( {}, (opts.params || {}) );
					$.get( rootPath + 'views/' + view, params, function( data )
					{
						if( !opts.noCache )	m_aCachedViews[view] = data;
						callback( data )
					});
				}
			},

			refreshSession: function()
			{
				Indigo.doCommand( {controller: 'session.do', params: {actionCommand: 'REFRESH'}} );
			},
			
			doAction: function( action )
			{
				$( '#actionCommand' ).val( action );
				$( '#adminform' ).submit();
			},
			
			doIdAction: function( action, id )
			{
				$( '#actionId' ).val( id );
				Indigo.doAction( action );
			},
			
			confirmAction: function( action, question )
			{
				var bOk = confirm( question );
				if( bOk )
				{
					Indigo.doAction( action );
				}
			},
			
			confirmIdAction: function( action, id, question )
			{
				var bOk = confirm( question );
				if( bOk )
				{
					Indigo.doIdAction( action, id );
				}
			},
			
			stopEvent: function( event )
			{
				if( window.event != null )
				{
					window.event.cancelBubble = true;
				}
				if( event != null )
				{
					if( event.stopPropagation )	event.stopPropagation();
					event.cancelBubble = true;
				}
			},
			
			getStr: function( id )
			{
				return str[id];
			},
			
			getRootPath: function()
			{
				return rootPath;
			},
			
			getAjaxPath: function()
			{
				return ajaxUrl;
			},
			
			calcPriceExVat: function( priceIncId, vatId, priceExId )
			{
				var priceInc = $( '#' + priceIncId ).val();
				if( priceInc != '' )
				{
					var vat = ($( '#' + vatId ).val()) / 100;
					$( '#' + priceExId ).val( priceInc / (1 + vat) );
				}
			},
			
			calcPriceIncVat: function( priceExId, vatId, priceIncId )
			{
				var priceEx = $( '#' + priceExId ).val();
				if( priceEx != '' )
				{
					var vat = $( '#' + vatId ).val();
					$( '#' + priceIncId ).val( parseFloat(priceEx) + parseFloat(priceEx * vat / 100) );
				}
			},
			
			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Login
			*/
			login: function( username, password)
			{
				if( username != '' && password != '' )
				{
					Indigo.doCommand( {controller: 'session.do', params: {actionCommand: 'LOGIN', u: username, p: password}});
				}
			},
			
			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Register member
			*/
			registerMember: function( params )
			{
				var defaults = {
					userName: null,
					firstName: null,
					lastName: null,
					address: null,
					zipCode: null,
					city: null,
					country: null,
					phone: null,
					email: null,
					password: null,
					agreeNewsletter: null
				};
				
				params = $.extend( defaults, params );
				var data = {actionCommand: 'REGISTER_MEMBER'};
				for( attr in params )
				{
					if( params[attr] != null )
					{
						data[attr] = params[attr];
					}
				}
				Indigo.doCommand( {controller: 'session.do', params: data});
			},
			
			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Forgotten password dialog
			*/
			forgottenPasswordDialog: function( options )
			{
				if( $( '#requestPasswordResetDialog' ).length == 0 )
				{
					var windowOptions = { id: "requestPasswordResetDialog", title: str.JSSTR_INDIGO_FORGOTTEN_PASSWORD_DIALOG_TITLE, onClose: function() { pwDialog.remove(); }, width: null, height: null, resize: false, vScroll: false };
					if( options != undefined && options.cssClassName != undefined )	windowOptions.cssClassName = options.cssClassName;
					var pwDialog = Indigo.JsWindow( windowOptions );
					var content = $('<div class="forgottenPasswordDialog"><h1 class="forgottenPasswordDialog">' + str.JSSTR_INDIGO_FORGOTTEN_PASSWORD_DIALOG_HEADING + '</h1>' );
					var sendButton = $('<input class="forgottenPasswordDialog" type="button" value="' + str.JSSTR_INDIGO_GENERIC_BUTTON_SEND + '" />');
					var indicator = $( '<img src="' + rootPath + '/indigo/images/ajax-loader.gif" alt="" class="forgottenPasswordDialog" />' );
					var msg = $('<p>');
					var input = $('<input type="text" class="forgottenPasswordDialog" maxlength="64" />');
	
					sendButton.click( function( event )
					{
						if( input.val() != '' )
						{
							msg.text( '' );
							indicator.css( 'display', 'inline' );
							sendButton.attr( 'disabled', true );
							input.attr( 'disabled', true );
							Indigo.doCommand( {controller: 'session.do', params: {actionCommand: 'REQUEST_PASSWORD', id: input.val()}, supressMessages: true, success: function( rs )
							{
								indicator.css( 'display', 'none' );
								sendButton.attr( 'disabled', false );
								input.attr( 'disabled', false );
								input.val( '' )
								msg.addClass( 'forgottenPasswordDialogMsg' );
								msg.removeClass( 'forgottenPasswordDialogError' );
								msg.text( rs.msg );
							}, failure: function( rs )
							{
								indicator.css( 'display', 'none' );
								sendButton.attr( 'disabled', false );
								input.attr( 'disabled', false );
								msg.addClass( 'forgottenPasswordDialogError' );
								msg.removeClass( 'forgottenPasswordDialogMsg' );
								msg.text( rs.msg );
							}});
						}
					});
	
					input.keydown( function( event )
					{
						if( event.keyCode == 13 )
						{
							sendButton.click();
						}
					});
					
					content.append( input );
					content.append( sendButton );
					content.append( indicator );
					content.append( msg );
					pwDialog.appendContentNode( content );
				}
			},
			
			/*--------------------------------------------------------------------------------------------------------------
			** upload file
			*/
			uploadFile: function( options )
			{
				var id = new Date().getTime();
				var frameId = options.frameId != undefined ? options.frameId + id : "IndigoUploadFileFrame" + id;
				var formId = options.formId != undefined ? options.formId + id : "IndigoUploadFileForm" + id;
				var form = $('<form style="display: none;" target="' + frameId + '" action="' + rootPath + ajaxUrl + options.controller + '" method="post" name="' + formId + '" id="' + formId + '" enctype="multipart/form-data"><input type="hidden" name="actionCommand" value="' + options.actionCommand + '" /></form>');
				
				if( options.params != undefined )
				{
					for( prop in options.params )
					{
						form.append( '<input type="hidden" name="' + prop + '" value="' + options.params[prop] + '" />' );
					}
				}
				
				var orgFile = $( '#' + options.fileInputId);
				var newFile = orgFile.clone();
				orgFile.before( newFile );
				orgFile.appendTo( form );		
				form.appendTo('body');		
			
				var iframe = $('<iframe id="' + frameId + '" name="' + frameId + '" style="display: none" />' );
				$('body').append( iframe );
			
				iframe.load( function()
				{
					try 
					{
						var responseText = "";
						if( iframe[0].contentWindow )
						{
							responseText = iframe[0].contentWindow.document.body ? iframe[0].contentWindow.document.body.innerHTML : "";
						}
						else if( iframe[0].contentDocument )
						{
							responseText = iframe[0].contentDocument.document.body ? iframe[0].contentDocument.document.body.innerHTML : "";
						}
		
						var retval = $.parseJSON( responseText );
						if( retval.bSuccess )
						{
							if( options.callback != undefined )
							{
								options.callback( retval );
							}
						}
						else
						{
							if( retval.msg != undefined && retval.msg != "" )	alert( retval.msg );
						}
					}
					catch(e)
					{
						alert( e );
					}
			
					iframe.unbind()
					iframe.remove();
					form.remove();
				});
				
				form.submit();
			},

			/*--------------------------------------------------------------------------------------------------------------
			** productSelectorDialog
			*/
			productSelectorDialog: function( options )
			{
				if( $( '#productSelectorDialog' ).length == 0 )
				{
					var windowOptions = { id: "productSelectorDialog", title: "Välj produkter", onClose: function() { dialog.remove(); }, width: null, height: null, resize: true, vScroll: true, minWidth: 680, minHeight: 100 };
					if( options != undefined && options.cssClassName != undefined )	windowOptions.cssClassName = options.cssClassName;
					var dialog = Indigo.JsWindow( windowOptions );
					var content = $('<div class="productSelectorDialog">' );
					var table = $( '<table class="productSelectorDialog" border="0" cellspacing="0" cellpadding="0">' );
					var head = $( '<tr><th>Id</th><th>Artikelnummer</th><th>Namn</th><th>Kategori</th></tr>' );
					var filter = $('<tr><td><input type="text" id="productSelectDialogIdInput"></td><td><input type="text" id="productSelectDialogArticleNumberInput"></td><td><input type="text" id="productSelectDialogNameInput"></td><td><input type="text" id="productSelectDialogCategoryInput"></td></tr>' );

					table.append( head );
					table.append( filter );
					
					var loadList = function()
					{
						table.find('.productLine').remove();
						Indigo.doCommand( {controller: 'productOfferAdmin.do', params: {actionCommand: "GET_AVAILABLE_PRODUCTS", id: $('#productSelectDialogIdInput').val(), article: $('#productSelectDialogArticleNumberInput').val(), name: $('#productSelectDialogNameInput').val(), category: $('#productSelectDialogCategoryInput').val()}, success: function( retval )
						{
							for( var i = 0; i < retval.data.length; i++ )
							{
								var product = retval.data[i];
								var pl = $('<tr class="productLine"><td>' + product["id"] + '</td><td>' + product["article"] + '</td><td>' + product["name"] + '</td><td>' + product["category"] + '</td></tr>' );
								
								if( options != undefined && options.clickCallback != undefined && options.clickCallback != '' )
								{
									pl.click( options.clickCallback );
									pl.data( "seqid", product["id"] );
								}
								
								table.append( pl );
							}
						}});
					};
					
					filter.find( 'input' ).keydown( function( event )
					{
						if( event.keyCode == 13 )
						{
							loadList();
						}						
					});
										
					content.append( table );
					dialog.appendContentNode( content );
					
					loadList();
				}
			},

			addProductToOffer: function( event )
			{
				var productLine = $(event.currentTarget);
				var productId = productLine.data( "seqid" );
				productLine.remove();
				Indigo.doCommand( {controller: "productOfferAdmin.do", params: {actionCommand: 'ADD_PRODUCT', actionId: productId}, success: function( retval )
				{
					var line = $(retval.data.line);
					$('#' + retval.data.containerId ).append( line );
				}});
			},
			
			updateOfferedProductPrice: function( id )
			{
				Indigo.doCommand( {controller: "productOfferAdmin.do", params: {actionCommand: 'UPDATE_PRODUCT_PRICE', actionId: id, price: $('#offeredProductPrice_' + id).val()}} );
			},
			
			/*--------------------------------------------------------------------------------------------------------------
			**
			*/
			sortProductsDialog: function( options )
			{
				if( $( '#sortProductsDialog' ).length == 0 )
				{
					var windowOptions = { id: "sortProductsDialog", title: "Sortera produkter för " + options.categoryName, onClose: function() { dialog.remove(); }, width: 350, height: 300, resize: true, vScroll: true, minWidth: 320, minHeight: 50, posX: 650, posY: 40 };
					if( options != undefined && options.cssClassName != undefined )	windowOptions.cssClassName = options.cssClassName;
					var dialog = Indigo.JsWindow( windowOptions );

					var content = $('<div class="sortProductsDialog">' );
					var table = $( '<table class="sortProductsDialog" border="0" cellspacing="0" cellpadding="0">' );
					
					Indigo.doCommand( {controller: 'productCategoryAdmin.do', params: {actionCommand: "GET_SELECTED_PRODUCTS", id: options.categoryId}, success: function( retval )
					{
						var head = $( '<tr></tr>' );
						var columns = retval.data.columns
						var nCols = columns.length;
						for( var i = 0; i < nCols; i++ )
						{
							var column = columns[i];
							head.append( '<th>' + column.label + '</th>' );
						}
						table.append( head );
						var products = retval.data.products;
						for( var i = 0, ii = products.length; i < ii; i++ )
						{
							var product = products[i];
							var compositeRow = $('<tr class="sortProductLine" id="pid_' + product["id"] + '">');
							for( var c = 0; c < nCols; c++ )
							{
								var column = columns[c];
								compositeRow.append( '<td>' + product[column.id] + '</td>' );
							}
							
							table.append( compositeRow );
						}
						table.find( 'tbody' ).sortable( {items: 'tr.sortProductLine', axis: 'y', containment: 'parent'} );
					}});

					var saveButton = $( '<input class="aiInput aiFormButton" type="button" value="Spara" />' );
					saveButton.click( function()
					{
						var order = '';
						table.find( 'tr' ).each( function( index, element )
						{
							var id = $(element).attr( 'id' );
							if( id != undefined )
							{
								if( order == '' )
									order = "" + id.substring( 4 );
								else
									order += "," + id.substring( 4 );
							}
						});
						Indigo.doCommand( {controller: 'productCategoryAdmin.do', params: {actionCommand: 'UPDATE_PRODUCT_ORDER', id: options.categoryId, order: order}, success: function( retval )
						{
							dialog.remove();
						}});
					});
					
					var closeButton = $( '<input class="aiInput aiFormButton aiMarginLeftSmall" type="button" value="Stäng, utan att spara" />' );
					closeButton.click( function() { dialog.remove(); } );

					content.append( table );
					content.append( saveButton );
					content.append( closeButton );
					dialog.appendContentNode( content );
				}
			},

			/*--------------------------------------------------------------------------------------------------------------
			** resetPassword
			*/
			resetPassword: function( id, accessToken )
			{
				var pw1 = $( '#newPw' ).val();
				var pw2 = $( '#newPwVer' ).val();
				if( pw1 == pw2 && pw1 != '' )
				{
					$( '#newPw' ).css( 'backgroundColor', '' );
					$( '#newPwVer' ).css( 'backgroundColor', '' );
					Indigo.doCommand( {controller: 'myProfile.do', params: {actionCommand: 'UPDATE_PASSWORD', actionId: id, accessToken: accessToken, password: pw1}});
				}
				else
				{
					if( pw1 == "" || (pw1 != pw2 && pw2 != "") )	$( '#newPw' ).css( 'backgroundColor', '#ff8080' );
					if( pw2 == "" || (pw1 != pw2 && pw1 != "") )	$( '#newPwVer' ).css( 'backgroundColor', '#ff8080' );
				}
			},
			
			/*--------------------------------------------------------------------------------------------------------------
			** editMyProfile
			*/
			editMyProfile: function()
			{
				Indigo.doCommand( {controller: 'myProfile.do', params: {actionCommand: 'EDIT' }});
			},

			/*--------------------------------------------------------------------------------------------------------------
			** updateMyProfile
			*/
			updateMyProfile: function()
			{
				var aFields = ["firstName", "lastName", "address", "zipCode", "city", "country", "phone", "email", "password", "newpassword", "newpasswordver", "agreeNewsletter"];
				
				var params = {actionCommand: 'UPDATE'};
				for( var i = 0; i < aFields.length; i++ )
				{
					if( $( '#' + aFields[i] ).length != 0 )
					{						
						params[aFields[i]] = $( '#' + aFields[i] ).val();
					}
				}
				Indigo.doCommand( {controller: 'myProfile.do', params: params});
			},

			/*--------------------------------------------------------------------------------------------------------------
			** postForm, post a form to a controller.
			*/
			postForm: function( options )
			{
				var formFields = {actionCommand: 'POST_FORM'};
				var bOk = true;
				// collect form fields
				options.container.find( '.formField' ).each( function( index, element )
				{
					var field = $(element);
					if( field.hasClass( 'validateNotEmpty' ) )
					{
						if( field.val() == '' )
						{
							field.css( 'backgroundColor', '#fff0f0' );
							bOk = false;
						}
						else
						{
							field.css( 'backgroundColor', '' );
						}
					}
					var fieldName = $(element).attr( 'name' );
					formFields[fieldName] = $(element).val();
				});

				// disable send button?
				if( options.sendButton != undefined )
				{
					if( options.sendButton.prop( 'disabled' ) )
					{
						bOk = false;
					}
					else if( bOk )
					{
						options.sendButton.addClass( 'aiDisabled' );
						options.sendButton.prop( 'disabled', true );
					}
				}

				if( bOk )
				{
					Indigo.doCommand( {controller: options.controller, params: formFields, messageContainer: (options.messageContainer || undefined), success: function( retval )
					{
						if( options.sendButton != undefined )
						{
							options.sendButton.prop( 'disabled', false );
							options.sendButton.removeClass( 'aiDisabled' );
						}
						options.container.find('.clearAfterSend').val('');
					}, failure: function( retval )
					{
						if( options.sendButton != undefined )
						{
							options.sendButton.prop( 'disabled', false );
							options.sendButton.removeClass( 'aiDisabled' );
						}
					}});
				}
			},

			/*--------------------------------------------------------------------------------------------------------------
			** updateContentTemplateTitleElement
			*/
			updateContentTemplateTitleElement: function( seqId, layerId, elementId )
			{
				var input = $('#' + elementId);
				Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'UPDATE_CONTENT_TEMPLATE', id: seqId, layerId: layerId, titleValue: input.val()}});				
			},

			/*--------------------------------------------------------------------------------------------------------------
			** updateContentTemplateParagraphElement
			*/
			updateContentTemplateParagraphElement: function( seqId, layerId, elementId )
			{
				var input = $('#' + elementId);
				Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'UPDATE_CONTENT_TEMPLATE', id: seqId, layerId: layerId, textValue: input.val()}});				
			},

			/*--------------------------------------------------------------------------------------------------------------
			** contentTemplateDialog
			*/
			openContentTemplateDialog: function( options )
			{
				// check if the dialog is already open
				if( $('#contentTemplateDialog').length == 0 && options.type != undefined )
				{
					// no, open
					if( options.seqId == undefined )
					{
						var postParams = {seqId:'' , actionCommand: 'UPDATE_CONTENT_TEMPLATE', type: options.type};
						Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: postParams, success: function( retval )
						{
							options.seqId = retval.data.seqId;
							Indigo.openContentTemplateDialog( options );
						}});
						
						return;						
					}
					
					var seqId = options.seqId;
					
					// links
					var removeLinkButton = $( '<input type="button" class="contentTemplateDialogDeleteLinkButton"  title="Ta bort denna länk" />' );
					var removeLinkButtonClickFunction = function()
					{
						var linkId = $(this).data( 'linkId' );
						Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'REMOVE_LINK', seqId: seqId, linkId: linkId}, success: function( retval )
						{
							$( '#contentTemplateDialogLinkContainer_' + linkId ).remove();
						}});
					};
					
					// list items
					var createRemoveListItemButton = function( itemId )
					{
						var button = $( '<input type="button" class="contentTemplateDialogDeleteListItemButton"  title="Ta bort denna punkt" />' );
						button.data( 'itemId', itemId );
						button.click( function()
						{
							var itemId = $( this ).data( 'itemId' );
							Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'REMOVE_LIST_ITEM', seqId: seqId, itemId: itemId}, success: function( retval )
							{
								$( '#contentTemplateDialogListItemContainer_' + itemId ).remove();
							}});
						});
						
						return button;
					};
					
					// images
					var removeLinkImageButton = $( '<input type="button" class="contentTemplateDialogDeleteImageButton"  title="Ta bort bild" />' );
					var removeLinkImageButtonClickFunction = function()
					{
						var linkId = $(this).data( 'linkId' );
						Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'REMOVE_LINK_IMAGE', seqId: seqId, linkId: linkId}, success: function( retval )
						{
							$( '#contentTemplateDialogLinkImage_' + linkId ).attr( 'src', '' );
						}});
					};

					var createDialogLinkElement = function( linkId, linkData )
					{
 						var linkContainer = $( '<div id="contentTemplateDialogLinkContainer_' + linkId + '" class="contentTemplateDialogLinkContainer"><table border="0" cellspacing="0" cellpadding="2"><tr><td>Namn:</td><td><input type="text" id="contentTemplateDialogLinkText_' + linkId + '" value="' + (linkData != undefined ? linkData.text : '') + '" class="aiInput dataField"/></td></tr><tr><td>Sida:</td><td><select id="contentTemplateDialogLinkPage_' + linkId + '" class="aiInput dataField"><option value="">Extern sida</option></select><input ' + ((linkData != undefined && linkData.internalPageId != null && !isNaN(linkData.internalPageId)) ? 'style="display: none;"' : '') + ' type="text" id="contentTemplateDialogLinkUrl_' + linkId + '" value="' + (linkData != undefined ? linkData.url : '') + '" class="aiInput dataField" /></td></tr><tr><td>Öppna i:</td><td><select id="contentTemplateDialogLinkUrlTarget_' + linkId + '" class="aiInput dataField"><option value="_self"' + (linkData != undefined && linkData.target == '_self' ? ' selected="selected"' : '') + '>samma fönster</option><option value="_blank"' + (linkData != undefined && linkData.target == '_blank' ? ' selected="selected"' : '') + '>nytt fönster</option></select></td></tr></table></div>' );

						Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'LIST_PAGES'}, success: function( retval )
						{
							var pageSelector = linkContainer.find( '#contentTemplateDialogLinkPage_' + linkId );
							pageSelector.change( function()
							{
								linkContainer.find( '#contentTemplateDialogLinkUrl_' + linkId ).css( {display: (pageSelector.val() == "" ? 'block' : 'none')} );
							});
							for( var i = 0; i < retval.data.pages.length; i++ )
							{
								var page = retval.data.pages[i];
								pageSelector.append( '<option value="' + page.id + '"' + (linkData != undefined && page.id == linkData.internalPageId ? ' selected="selected"' : '') + '>[' + page.id + '] ' + page.name + '</option>' );
							}
						}});
 						
						var addImage = $('<input class="aiInput aiFormButton" type="button" value="Ladda upp bild" />');
						addImage.click( function( event )
						{
							Indigo.uploadFile( {controller: 'contentTemplateAdmin.do', fileInputId: 'contentTemplateDialogImageUpload_' + linkId, actionCommand: 'UPLOAD_LINK_IMAGE', params: {seqId: seqId, linkId: linkId}, callback: function( retval )
							{
								if( retval.data.url != undefined )
								{
									$( '#contentTemplateDialogLinkImage_' + linkId ).attr( 'src', retval.data.url );
								}
								if( retval.msg != undefined && retval.msg != '' )	alert( retval.msg );
							}});
						});
						
						var rib = removeLinkImageButton.clone();
						rib.click( removeLinkImageButtonClickFunction );
						rib.data( 'linkId', linkId );
						
						var imageCell = $( '<td>' );
						imageCell.append( $('<div id="contentTemplateDialogLinkImageContainer_' + linkId + '" class="contentTemplateDialogLinkImageContainer"><img id="contentTemplateDialogLinkImage_' + linkId + '" class="contentTemplateDialogImage" ' + ((linkData != undefined && linkData.imgUrl != '') ? 'src="' + linkData.imgUrl + '" ' : '' ) + ' alt="" /></div>' ).append( rib ) );
						imageCell.append( $('<div id="contentTemplateDialogLinkImageInputContainer_' + linkId + '"><input class="aiInput aiFileField" type="file" id="contentTemplateDialogImageUpload_' + linkId + '" name="contentTemplateDialogImageUpload_' + linkId + '" /></td>' ).append( addImage ) );
						linkContainer.children().append( $( '<tr><td>Bild:</td>' ).append( imageCell ) );
						
						var rlb = removeLinkButton.clone();
						rlb.click( removeLinkButtonClickFunction );
						rlb.data( 'linkId', linkId );
						
						linkContainer.append( rlb );
 						return linkContainer;
 					};

					var createDialogListItemElement = function( itemId, itemData )
					{
						var itemContainer = $( '<div id="contentTemplateDialogListItemContainer_' + itemId + '" class="contentTemplateDialogListItemContainer"><input type="text" id="contentTemplateDialogListItemText_' +  itemId + '" value="' + (itemData != undefined ? itemData.text : '') + '" class="aiInput dataField"></div>' );
						
						itemContainer.append( createRemoveListItemButton( itemId ) );
						return itemContainer;
					};

					var wysiwygEditor = null;

					var display = function( windowTitle, retval )
					{						
						var closeHandler = function( event )
						{
							if( wysiwygEditor != null )	wysiwygEditor.save();
							
							var postParams = {seqId: seqId, actionCommand: 'UPDATE_CONTENT_TEMPLATE', type: options.type};
							container.find( '.dataField' ).each( function( index, element )
							{
								var id = $(element).attr('id');
								if( id != undefined && id != '' )
								{
									postParams[id] = $(element).val();
								}
							});
							
							Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: postParams, success: function( retval )
							{
								$( '#actionCommand' ).val( "UPDATE_VIEW" );
								$( '#adminform' ).submit();
							}});
						}

						var saveAndCloseButton = $( '<input class="aiInput aiFormButton" type="button" value="Avsluta redigeringen" />' );
						saveAndCloseButton.click( closeHandler );
						
						var blocker = $('<div style="position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; background-color: #ffffff; opacity: 0.5;"></div>' );
						$('#pageContentAdminArea').append( blocker );
						
						var windowOptions = { drag: false, closeButton: false, resize: false, vScroll: false, id: 'contentTemplateDialog', height: null };
						if( options.width != undefined )	windowOptions.width = options.width;
						if( options.left != undefined )	windowOptions.posX = options.left;
						if( options.top != undefined )	windowOptions.posY = options.top;
						if( options.title != undefined )	windowOptions.title = options.title;
						if( windowTitle != undefined )	windowOptions.title = windowTitle;
						var dialog = Indigo.JsWindow( windowOptions );
						
						var container = $( '<div>' );
						var content = $( '<div class="contentTemplateDialogContent">' );

						if( options.type == 'WYSIWYG' )
						{
							content.append( '<textarea rows="2" cols="2" id="contentTemplateDialogWysiwyg" class="dataField" style="display: none;">' + (retval.data.contentTemplateDialogWysiwyg || '') + '</textarea>' );
						}

						if( options.type == '1' || options.type == '2' || options.type == '3' || options.type == '4' ||  options.type == "Title" || options.type == "SubTitle" || options.type == "List" )
						{
							content.append( '<textarea rows="2" cols="48" id="contentTemplateDialogTitle" class="aiInput dataField"></textarea>' );
						}

						if( options.type == '1' || options.type == '2' || options.type == '3' || options.type == '4' || options.type == "Paragraph" )
						{
							content.append( '<textarea id="contentTemplateDialogParagraph" rows="4" cols="48" class="aiInput dataField"></textarea>' );
						}

						if( options.type == 'LatestNews'|| options.type == 'LatestProducts' )
						{
							content.append( '<p>Rubrik</p><input type="text" id="contentTemplateDialogTitle" class="aiInput dataField">' );
						}
												
						if( options.type == 'TwoFields' )
						{
							content.append( '<p>Rubrik</p><input type="text" id="contentTemplateDialogTitle" class="aiInput dataField">' );
							content.append( '<p>ParagrafLeft</p><textarea id="contentTemplateDialogParagraphLeft" rows="4" cols="48" class="aiInput dataField"></textarea>' );
							content.append( '<p>ParagrafRight</p><textarea id="contentTemplateDialogParagraphRight" rows="4" cols="48" class="aiInput dataField"></textarea>' );
						}
						
						if( options.type == '1' || options.type == '2' || options.type == 'ImageRotator' || options.type == 'TwoFields' || options.type == 'ImageRotatorShow' || options.type == 'ImageRotatorInspiration' || options.type == 'ImageGallery' )
						{
							var images = $('<div id="contentTemplateImageList" class="contentTemplateDialogImageListContainer">');
							if( options.type == '1' || options.type == '2' || options.type == 'TwoFields' )	images.append( '<p>Bilder</p>' );
							var addImage = $('<input class="aiInput aiFormButton" type="button" value="Ladda upp bild" />');
							addImage.click( function( event )
							{
								Indigo.uploadFile( {controller: 'contentTemplateAdmin.do', fileInputId: 'contentTemplateDialogImageUpload', actionCommand: 'UPLOAD_IMAGE', params: {seqId: seqId}, callback: function( retval )
								{
									if( retval.data.url != undefined )
									{
										var removeButton = $( '<input type="button" class="contentTemplateDialogDeleteImageButton"  title="Ta bort denna bild" />' );
										if( options.type == "1" || options.type == "TwoFields" )
										{
											images.append( $('<div id="contentTemplateDialogImageContainer_' + retval.data.id + '" class="contentTemplateDialogImageContainer"><img class="contentTemplateDialogImage" src="' + retval.data.url + '" alt="" /><input type="text" id="contentTemplateDialogImageText_' + retval.data.id + '" class="aiInput dataField" /></div>' ).append( removeButton ) );
										}
										else if( options.type == "2" || options.type == 'ImageGallery' )
										{
											images.append( $('<div id="contentTemplateDialogImageContainer_' + retval.data.id + '" class="contentTemplateDialogImageContainer"><a href="' + retval.data.enlargedUrl + '" target="_blank"><img class="contentTemplateDialogImage" src="' + retval.data.url + '" alt="" /></a><input type="text" id="contentTemplateDialogImageText_' + retval.data.id + '" class="aiInput dataField" /></div>' ).append( removeButton ) );
										}
										else if( options.type == 'ImageRotator' || options.type == 'ImageRotatorShow' || options.type == 'ImageRotatorInspiration' )
										{
											images.append( $('<div id="contentTemplateDialogImageContainer_' + retval.data.id + '" class="contentTemplateDialogImageContainer"><img class="contentTemplateDialogImage" src="' + retval.data.url + '" alt="" /></div>' ).append( removeButton ) );
										}
									}
									if( retval.msg != undefined && retval.msg != '' )	alert( retval.msg );
								}});
							});
							content.append( images );
							content.append( '<input class="aiInput aiFileField" type="file" id="contentTemplateDialogImageUpload" name="contentTemplateDialogImageUpload" />' );
							content.append( addImage );
						}
						
						// links
						if( options.type == '3' || options.type == 'Links' )
						{
							var links = $( '<div id="contentTemplateLinkList" class="contentTemplateLinkListContainer"><p>Länkar, orientering: <select id="contentTemplateDialogOrientation" class="aiInput dataField"><option value="Horizontal">Horisontellt</option><option value="Vertical">Vertikalt</option></p>' );
							var addLink = $( '<input class="aiInput aiFormButton" type="button" value="Ny länk" />' );
							addLink.click( function()
							{
								Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'NEW_LINK', seqId: seqId}, success: function( retval )
								{
									links.append( createDialogLinkElement( retval.data.id ) );
								}});
							});
							
							content.append( links );
							content.append( addLink );
						}
						
						// list
						if( options.type == '4' )
						{
							var list = $( '<div id="contentTemplateList" class="contentTemplateListContainer"><p>Lista, typ: <select id="contentTemplateDialogListType" class="aiInput dataField"><option value="Bullet">Punktlista</option><option value="Number">Nummerlista</option></p>' );
							var addListItem = $( '<input class="aiInput aiFormButton" type="button" value="Ny punkt" />' );
							addListItem.click( function()
							{
								Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'NEW_LIST_ITEM', seqId: seqId}, success: function( retval )
								{
									list.append( createDialogListItemElement( retval.data.id ) );
								}});
							});
							
							content.append( list );
							content.append( addListItem );
						}						
						
						var buttonRow = $('<div id="contentTemplateDialogButtonRow" class="contentTemplateDialogButtonRow">');
						buttonRow.append( saveAndCloseButton );
						
						container.append( content );
						container.append( buttonRow );
						dialog.appendContentNode( container );
						
						if( options.type == "WYSIWYG" )
						{
							wysiwygEditor = new indigoEd.init( 'editor', { bodyCssClass: 'ctWysiwyg', id: 'contentTemplateDialogWysiwyg', width: '100%', height: '100%', resize: true, cssFile: '/styles/style.css', resize: true, buttons:['bold', 'italic', 'underline', 'strikethrough', '|', 'subscript', 'superscript', '|', 'orderedlist', 'unorderedlist', '|', 'outdent', 'indent', '|', 'leftalign', 'centeralign', 'rightalign', 'blockjustify', '|', 'unformat', '|', 'undo', 'redo', 'n', 'font', 'size', '|', 'style', '|', 'hr', 'link', 'unlink', '|', 'html'] } );
						}
					};
					
					if( seqId != '' )
					{
						// get template data
						Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'GET_CONTENT_TEMPLATE', seqId: seqId}, success: function( retval )
						{
							display( retval.data.typeName, retval );
							
							if( retval.data.cssClasses != undefined )
							{
								var cssOpts = "";
								for( var prop in retval.data.cssClasses )
								{
									cssOpts += '<option value="' + prop + '">' + retval.data.cssClasses[prop] + '</option>';
								}
								$('#contentTemplateDialogButtonRow').append( '<span style="margin-left: 20px; color: #ffffff;">Stil: </span><select id="contentTemplateDialogCssClass" class="aiInput dataField">' + cssOpts + '</select>' );
							}
							
							if( retval.data.contentTemplateDialogTitle != undefined )	$('#contentTemplateDialogTitle').val( retval.data.contentTemplateDialogTitle );
							if( retval.data.contentTemplateDialogParagraph != undefined )	$('#contentTemplateDialogParagraph').val( retval.data.contentTemplateDialogParagraph );
							if( retval.data.contentTemplateDialogParagraphLeft != undefined )	$('#contentTemplateDialogParagraphLeft').val( retval.data.contentTemplateDialogParagraphLeft );
							if( retval.data.contentTemplateDialogParagraphRight != undefined )	$('#contentTemplateDialogParagraphRight').val( retval.data.contentTemplateDialogParagraphRight );
							if( retval.data.contentTemplateDialogOrientation != undefined )	$( '#contentTemplateDialogOrientation' ).val( retval.data.contentTemplateDialogOrientation );
							if( retval.data.contentTemplateDialogListType != undefined )	$( '#contentTemplateDialogListType' ).val( retval.data.contentTemplateDialogListType );
							if( retval.data.contentTemplateDialogCssClass != undefined )	$( '#contentTemplateDialogCssClass' ).val( retval.data.contentTemplateDialogCssClass );
							
							if( retval.data.contentTemplateDialogImages != undefined )
							{
								var aImages = retval.data.contentTemplateDialogImages;
								for( var i = 0; i < aImages.length; i++ )
								{
									var removeButton = $( '<input type="button" class="contentTemplateDialogDeleteImageButton"  title="Ta bort denna bild" />' );
									removeButton.data( 'imageId', aImages[i].id );
									removeButton.click( function( event )
									{
										var imgId = $(this).data('imageId');
										Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'REMOVE_IMAGE', seqId: seqId, imageId: imgId}, success: function( retval )
										{
											$( '#contentTemplateDialogImageContainer_' + imgId ).remove();
										}});
									});
									
									if( options.type == '1' || options.type == 'TwoFields' )
									{
										$('#contentTemplateImageList').append( $( '<div id="contentTemplateDialogImageContainer_' + aImages[i].id + '" class="contentTemplateDialogImageContainer"><img class="contentTemplateDialogImage" src="' + aImages[i].url + '" alt="" /><input type="text" id="contentTemplateDialogImageText_' + aImages[i].id + '" value="' + aImages[i].text + '" class="aiInput dataField" /></div>' ).append( removeButton ) );
									}
									else if( options.type == '2' || options.type == 'ImageGallery' )
									{
										$('#contentTemplateImageList').append( $( '<div id="contentTemplateDialogImageContainer_' + aImages[i].id + '" class="contentTemplateDialogImageContainer"><a href="' + aImages[i].enlargedUrl + '" target="_blank"><img class="contentTemplateDialogImage" src="' + aImages[i].url + '" alt="" /></a><input type="text" id="contentTemplateDialogImageText_' + aImages[i].id + '" value="' + aImages[i].text + '" class="aiInput dataField" /></div>' ).append( removeButton ) );
									}
									else if( options.type == 'ImageRotator' || options.type == 'ImageRotatorShow' || options.type == 'ImageRotatorInspiration' )
									{
										$('#contentTemplateImageList').append( $( '<div id="contentTemplateDialogImageContainer_' + aImages[i].id + '" class="contentTemplateDialogImageContainer"><img class="contentTemplateDialogImage" src="' + aImages[i].url + '" alt="" /></a></div>' ).append( removeButton ) );
									}
								}
							}
							
							if( retval.data.contentTemplateDialogLinks != undefined )
							{
								var aLinks = retval.data.contentTemplateDialogLinks;
								for( var i = 0; i < aLinks.length; i++ )
								{
									$('#contentTemplateLinkList').append( createDialogLinkElement( aLinks[i].id, aLinks[i] ) );
								}
							}
							
							if( retval.data.contentTemplateDialogListItems != undefined )
							{
								var aItems = retval.data.contentTemplateDialogListItems;
								for( var i = 0; i < aItems.length; i++ )
								{
									$('#contentTemplateList').append( createDialogListItemElement( aItems[i].id, aItems[i] ) );
								}
							}
						}});
					}
					else display();
				}
			},

			/*--------------------------------------------------------------------------------------------------------------
			** updateContentTemplateOrder
			*/
			updateContentTemplateOrder: function( containerId, bLegacy )
			{
				var order = "";
				if( bLegacy == undefined || bLegacy )
				{
					$( '#' + containerId ).children().each( function( index, element )
						{
							var id = $(element).children( '.layerId' ).val();
							if( id == undefined && $(element).hasClass( "contentTemplateContainer" ) )
							{
								id = $(element).attr( 'id' ).substr( 3 );
							}
							if( id != undefined ){
								order = (order == '' ? id : order + ',' + id);
							}
						}
					);
				}
				else
				{
					$( '#' + containerId ).find('.contentTemplateContainer').each( function( index, element )
						{
							var id = $(element).attr( 'id' ).substr( 3 );
							order = (order == '' ? id : order + ',' + id);
						}
					);
				}
				Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'REORDER_CONTENT_TEMPLATES', order: order}});
			},

			/*--------------------------------------------------------------------------------------------------------------
			** imageBox
			*/
			imageBox : function( aElements )
			{
				aElements.each( function( index, element ) { $( element ).click( function() { Indigo.imageBoxDialog( $( element ) ); return false; } ); } );
			},

			imageBoxDialog: function( anchor, prevImage )
			{				
				$( '.ctEnlargedImageContainer' ).click();
				
				var loader = $( '<img src="' + anchor.attr( 'href' ) + '" alt="" />' );
				var options = $.parseJSON( anchor.attr( 'rel' ).replace( /'/g, '"' ) );

				var thumb = anchor.children();
				var thumbPos = thumb.offset();
				var startPos = (prevImage != undefined ? prevImage.offset() : thumb.offset());
				var width = (prevImage != undefined ? prevImage.width() : thumb.width());
				var height = (prevImage != undefined ? prevImage.height() : thumb.height());
				var startSrc = (prevImage != undefined ? prevImage.find( 'img' ).attr( 'src' ) : thumb.attr( 'src' ));
				
				var windowHeight = (window.innerHeight || document.documentElement.clientHeight);
				if( $('body').height() < windowHeight )	windowHeight = $('body').height();
				var targetLeft = ($( 'body' ).width() - options.width) / 2;
				var targetTop = ((windowHeight - options.height) / 2) + $(window).scrollTop();
				if( targetTop < 0 )	targetTop = 0;
				if( targetLeft < 0 )	targetLeft = 0;
				
				var container = $( '<div class="ctEnlargedImageContainer">' );
				var image = $( '<div class="ctEnlargedImageImageContainer"><img class="ctEnlargedImage" src="' + startSrc + '" alt="" /></div>' );
				container.append( image );
				container.append( $( '<div class="ctEnlargedImageTitle">' + options.title + '</div>' ) );
				container.css( {left: startPos.left, top: startPos.top, width: width, height: height, opacity: (prevImage != undefined ? 1 : 0) });

				var closeButton = $('<div title="' + Indigo.getStr( 'JSSTR_INDIGO_IMAGEBOX_CLOSE_BUTTON' ) + '" class="ctEnlargedImageClose"></div>' );
				closeButton.css( 'opacity', 0 );
				closeButton.mouseover( function() {$(this).animate( {opacity: 0.8}, {duration: 250, easing: 'linear'} )} );
				closeButton.mouseout( function() {$(this).animate( {opacity: 0}, {duration: 250, easing: 'linear'} )} );
				image.append( $('<div class="ctEnlargedImageCloseContainer">').append( closeButton ) );

				if( (options.prev || '') != '' )
				{
					var prevButton = $('<div class="ctEnlargedImagePrevious" title="' + Indigo.getStr( 'JSSTR_INDIGO_IMAGEBOX_PREV_BUTTON' ) + '"></div>' );
					prevButton.css( 'opacity', 0 );
					prevButton.mouseover( function() {$(this).animate( {opacity: 0.8}, {duration: 250, easing: 'linear'} )} );
					prevButton.mouseout( function() {$(this).animate( {opacity: 0}, {duration: 250, easing: 'linear'} )} );
					prevButton.click( function( event )
					{
						Indigo.imageBoxDialog( $( '.' + options.prev ), container );
					});
					image.append( prevButton );
				}

				if( (options.next || '') != '' )
				{
					var nextButton = $('<div class="ctEnlargedImageNext" title="' + Indigo.getStr( 'JSSTR_INDIGO_IMAGEBOX_NEXT_BUTTON' ) + '"></div>' );
					nextButton.css( 'opacity', 0 );
					nextButton.mouseover( function() {$(this).animate( {opacity: 0.8}, {duration: 250, easing: 'linear'} )} );
					nextButton.mouseout( function() {$(this).animate( {opacity: 0}, {duration: 250, easing: 'linear'} )} );
					nextButton.click( function()
					{
						Indigo.imageBoxDialog( $( '.' + options.next ), container );
					});
					image.append( nextButton );
				}
	
				$( 'body' ).append( container );
				loader.load( function( event ) { image.find( 'img' ).attr( 'src', loader.attr( 'src' ) ); } );

				var animOpacity = function()
				{
					image.find( 'img' ).css( 'opacity', image.css( 'opacity' ));
				};

				var closeHandler = function()
				{
					$( 'body' ).unbind( 'click', closeHandler );
					container.unbind( 'click' );
					container.animate( {width: thumb.width(), height: thumb.height(), opacity: 0, left: thumbPos.left, top: thumbPos.top}, {duration: 400, easing: "linear", complete: function() { container.remove(); }, step: animOpacity} );
				};

				container.animate( {width: options.width, height: options.height, opacity: 1, left: targetLeft, top: targetTop}, {duration: 400, easing: "linear", complete: function()
				{
					container.click( closeHandler );
					$( 'body' ).click( closeHandler );
				}, step: animOpacity});

				if( prevImage != undefined )	prevImage.css( 'display' ,'none' );

				return false;
			},

			/*--------------------------------------------------------------------------------------------------------------
			** imageRotator
			*/
			imageRotator: function( options )
			{
				if( options.containerId != undefined && options.images != undefined )
				{
					var defaults = {
						delay: 3000,
						fadeDuration: 1000,
						slide: false
					};
					
					options = $.extend( defaults, options );
					var aImages = options.images;
					var iImage = -1;
					var container = $( '#'+ options.containerId );
					var containerWidth = container.width();
					var containerHeight = container.height();
					
					container.empty();
					
					var aFrames = new Array();
					aFrames[0] = $( '<div style="position: absolute;"><img src="" alt="" style="display: none;"/></div>' );
					aFrames[1] = $( '<div style="position: absolute;"><img src="" alt="" style="display: none;" /></div>' );
					
					container.append( aFrames[1] );
					container.append( aFrames[0] );
					
					var iLoadFrame = 0;
					
					var loadNextImage = function()
					{
						var img = aImages[++iImage] || aImages[iImage = 0];
						var element = aFrames[iLoadFrame].children();
						element.css( {opacity: 0, display: 'none'} );
						element.attr( 'src', img.url );
						element.data( 'img', img );

						iLoadFrame = (iLoadFrame == 0 ? 1 : 0);
					};
					
					container.data( "nextImage", loadNextImage );
					
					var imageLoaded = function()
					{
						var element = $(this);
						var cid = options.containerId;
						container.append( element.parent() );
						if( options.slide )
						{
							var imgData = element.data( "img" );
							var maxDeltaY = (imgData.height > containerHeight ? imgData.height - containerHeight : 0);
							var maxDeltaX = (imgData.width > containerWidth ? imgData.width - containerWidth : 0);
							if( maxDeltaY > 0 || maxDeltaX > 0 )
							{
								var startX = (Math.random() * maxDeltaX) | 0;
								var endX = (Math.random() * maxDeltaX) | 0;
								var startY = (Math.random() * maxDeltaY) | 0;
								var endY = (Math.random() * maxDeltaY) | 0;
								element.parent().css( {top: -startY + "px", left: -startX + "px"} );
								element.parent().animate( {left: -endX + "px", top: -endY + "px"}, options.delay + options.fadeDuration * 2, "linear" );
							}
						}
						element.css( 'display', 'inline' );
						element.animate( {opacity: 1}, options.fadeDuration, "linear", function() { setTimeout( "$('#" + cid + "').data('nextImage')();", options.delay );} );
					}
					
					aFrames[0].children().load( imageLoaded );
					aFrames[1].children().load( imageLoaded );
					
					loadNextImage();					
				}
			},

			/*--------------------------------------------------------------------------------------------------------------
			** datePicker
			*/
			datePicker : function( aElements )
			{
				aElements.each( function( index, element ) { $(element).focus( Indigo.datePickerDialog ); $(element).click( function( event ) { event.stopPropagation(); } ); } );
			},
			
			datePickerDialog: function( event )
			{
				var input = $(this);
				var inputPos = input.offset();
				
				var closeHandler = function( event )
				{
					dialog.remove();
					$('body').unbind( 'click', closeHandler );
					input.unbind( 'keydown' );
				};
				
				$('body').click( closeHandler );
				input.keydown( function( event )
				{
					if( event.keyCode == 9 )
					{
						closeHandler();
					}
				});
				
				var windowOptions = { title: Indigo.getStr( 'JSSTR_INDIGO_DATEPICKER_TITLE' ), onClose: closeHandler, posX: inputPos.left, posY: inputPos.top + input.outerHeight(), width: null, height: null, resize: false, vScroll: false, drag: false };
				var dialog = Indigo.JsWindow( windowOptions );
				dialog.m_ContainerDiv.click( function( event )
				{
					event.stopPropagation();
				});

				var date = new Date();
				var time = Date.parse( input.val() );
				if( !isNaN( time ) )
				{
					date.setTime( time );
				}
				
				var content = $('<div class="datePickerDialogContent">');
				var prev = $('<input class="aiInput aiFormButton" type="button" value="<" />');
				var month = $('<td class="datePickerDialogDate">');
				var next = $('<input class="aiInput aiFormButton" type="button" value=">" />');
				var headerRow = $('<tr>');
				headerRow.append( $('<td>').append( $('<label class="buttonUnPaired orange"> </label>').append( prev ) ) );
				headerRow.append( month );
				headerRow.append( $('<td style="text-align: right;">').append( $('<label class="buttonUnPaired orange"> </label>').append( next ) ) );
				var header = $('<table border="0" cellspacing="0" cellpaddnig="0" class="datePickerDialogHeader">').append( headerRow );
				var table = $('<table class="datePickerDialogDateTable" border="0" cellspacing="0" cellpadding="0">');
				
				var refresh = function()
				{
					var toDay = (new Date()).formatDate( "YYYY-MM-DD" );
					var d = new Date();
					d.setTime( date.getTime() );
										
					month.html( d.formatDate( "YYYY-MM, (mmm)" ) );
					table.empty();
					
					table.append( '<tr><th>Må</th><th>Ti</th><th>On</th><th>To</th><th>Fr</th><th>Lö</th><th>Sö</th></tr>' );
					var iDate = 1;
					d.setDate( iDate );
					var iMonth = d.getMonth();
					var day = (d.getDay() + 6) % 7;
					
					var bDone = false;
					var bFirstLine = true;
					while( !bDone )
					{
						var line = $('<tr>');
						for( var i = 0; i < 7; i++ )
						{
							d.setDate( iDate );
							if( (bFirstLine && i >= day) || (!bFirstLine && d.getMonth() == iMonth) )
							{
								var toDayCss = (d.formatDate( "YYYY-MM-DD" ) == toDay) ? ' datePickerDialogDateButtonToDay' : '';
								var dateInput = $('<input type="button" value="' + iDate + '" class="datePickerDialogDateButton' + toDayCss + '" />' );
								dateInput.data( 'date', d.formatDate( "YYYY-MM-DD" ) );
								dateInput.click( function( event )
									{
										input.val( $(this).data( 'date' ) );
										closeHandler();
									}
								);
								line.append( $( '<td>' ).append( dateInput ) );
								iDate++;
							}
							else
							{
								line.append( '<td>&nbsp;</td>' );
								if( !bFirstLine )	bDone = true;
							}
						}
						bFirstLine = false;
						table.append( line );
					}
				};
				
				content.append( header );
				content.append( table );
				
				refresh();
				
				prev.click( function( event )
				{
					var month = date.getMonth();
					if( month == 0 )
					{
						date.setMonth( 11 );
						date.setFullYear( date.getFullYear() - 1 );
					}
					else
					{
						date.setMonth( month - 1 );
					}
					refresh();
				});
				
				next.click( function( event )
				{
					var month = date.getMonth();
					if( month == 11 )
					{
						date.setMonth( 0 );
						date.setFullYear( date.getFullYear() + 1 );
					}
					else
					{
						date.setMonth( month + 1 );
					}
					refresh();
				});
				
				dialog.appendContentNode( content );
			},

			/*--------------------------------------------------------------------------------------------------------------
			** fileManager
			*/
			fileManager: function( options )
			{
				return new FileManager( options );
			},
						
			/*--------------------------------------------------------------------------------------------------------------
			** window
			*/
			JsWindow: function( options )
			{				
				return new JsWindow( options );
			},

			/*--------------------------------------------------------------------------------------------------------------
			** Questions & Answers search
			*/
			searchQnA: function( aContainers )
			{
				aContainers.each( function( index, container )
				{
					var input = $(container).find( '.modQnaSearchInput' );
					input.focus( function()
					{
						if( !input.hasClass( 'modQnaSearchActivated' ) )
						{
							input.val( '' );
							input.addClass( 'modQnaSearchActivated' );
						}
					});
					input.keydown( function( event )
					{
						if( event.keyCode == 13 )
						{
							if( input.val() != '' )
							{
								var resultContainer = $(container).find( '.modQnaSearchResult' );
								resultContainer.empty();
								resultContainer.append( '<img src="/indigo/images/ajax-loader-big.gif" class="modQnaSearchSearching" />' );
								Indigo.doCommand( {controller: 'QnA.do', params: {actionCommand: 'SEARCH', search: input.val()}, success: function( retval ) { Indigo.showQnAResult( retval, resultContainer ); }} );
							}
						}
					});
				});
			},
			
			showQnAResult: function( retval, resultContainer )
			{
				resultContainer.empty();
				Indigo.getView( 'QnAentry.html', function( view )
				{
					for( var i = 0, ii = retval.data.entries.length; i < ii; i++ )
					{
						var entry = retval.data.entries[i];
						var entryContainer = $( view );
						for( prop in entry )
						{
							entryContainer.find( '.field_' + prop ).text( entry[prop] );
						}
						
						resultContainer.append( entryContainer );
					}
				});
			},

			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Initialize Content Template Admin
			*/
			initializeContentTemplatesAdmin: function()
			{
				var aCts = $('.contentTemplateContainer');
				aCts.each( function( index, element )
				{
					var div = $(element);
					var id = div.attr( 'id' ).substr( 3 );
					div.data( 'id', id );
					div.data( 'editMode', false );
					div.click( Indigo.showContentTemplateAdminMenu );
					$('body').click( Indigo.closeContentTemplateAdminMenu );
				});
			},

			closeContentTemplateAdminMenu: function( event )
			{
				$( '#ctAdminMenu' ).remove();
			},

			showContentTemplateAdminMenu: function( event )
			{
				Indigo.closeContentTemplateAdminMenu();
				var id = $(this).data('id');
				var left = event.pageX - 8;
				var top = event.pageY - 8;
				Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'IS_LAYER_EDITABLE', seqId: id}, success: function( retval )
				{
					var adminMenu = $('<ul id="ctAdminMenu" class="ctAdminMenu" style="top: ' + top + 'px; left: ' + left + 'px;"></ul>' );
					if( retval.data.bIsEditable)
					{
						var editButton = $('<li class="ctAdminMenuItem">Redigera</li>');
						editButton.click( function() {Indigo.editContentTemplateContent( id );} );
						adminMenu.append( editButton );
					}
					var removeButton = $('<li class="ctAdminMenuItem">Ta bort</li>');
					removeButton.click( function() {Indigo.confirmIdAction( 'REMOVE_CONTENT_TEMPLATE', id, 'Är du säker på att du vill ta bort detta lager?' );} );
					adminMenu.append( removeButton );
					$('body').append(adminMenu);
				}});
				event.stopPropagation();
			},
			
			editContentTemplateContent: function( id )
			{
				Indigo.doCommand( {controller: 'contentTemplateAdmin.do', params: {actionCommand: 'GET_LAYER_TYPE', seqId: id}, success: function( retval )
				{
					var container = $( '#ct_' + id );
					Indigo.openContentTemplateDialog( {seqId: id, type: retval.data.type, width: $('#pageContentAdminArea').innerWidth(), left: $('#pageContentAdminArea').offset().left, top: container.offset().top, title: retval.data.typeName} );
				}});
			},

			/*---------------------------------------------------------------------------------------------------------------------------------------
			* Initialize Indigo
			*/
			init: function()
			{
				jQuery.fx.interval = 40;
				m_MessagesContainer = $('#messages');
				Indigo.doCommand( {controller: 'session.do', supressMessages: true, params: {actionCommand: 'REFRESH'}, authenticate: function() {}, success: function()
				{
					// if we're logged in, start the refresh task
					m_RefreshIntervalId = setInterval( "Indigo.refreshSession();", 1000 * 60 * 5 );
				}});
				Indigo.datePicker( $('.datePicker') );
				Indigo.imageBox( $('.imageBox') );
				if( window.sessionStorage != undefined )
				{
					if( (sessionStorage.getItem( "lastMessage" ) || '' ) != '' )
					{
						Indigo.addMessage( sessionStorage.getItem( "lastMessage" ) );
						sessionStorage.setItem( "lastMessage", '' );
					}
				}
			}
		});
	
		return (win.Indigo = Indigo);
	})();
}
)(window,'/','indigo/ajax/');
$(document).ready( Indigo.init );


var dragStartX;
var dragStartY;
var dragWindow;
var dragContainer;
var dragWindowId;
var bDragging = false;
var bDragged = false;
var g_Editor = null;
var g_EditLayerId;
function dragStart( event, windowId )
{
	if( g_Editor != null || $( '#' + windowId + '_bodytext' ).css( 'display' ) == 'block' )	return;
	
	bDragged = false;
	dragWindowId = windowId;
	
	if( event == null )	event = window.event;
	
	if( event.preventDefault )	event.preventDefault();
	if( event.stopPropagation )	event.stopPropagation();
	event.cancelBubble = true;
	
	dragWindow = $('#' + windowId );
	dragContainer = dragWindow.parent();
	var winX = parseInt( dragWindow.css( 'left' ) );
	if( isNaN( winX) )	winX = 0;
	var winY = parseInt( dragWindow.css( 'top' ) );
	if( isNaN( winY ) )	winY = 0;
	dragStartX = event.clientX - winX;
	dragStartY = event.clientY - winY;
	bDragging = true;
	$( document.body ).mousemove( dragMove );
	$( document.body ).mouseup( dragStop );
	$( '#' + windowId ).css( "zIndex", 900 );
}
function dragMove( event )
{
	if( bDragging )
	{
		if( event == null )	event = window.event;
		var x = event.clientX - dragStartX;
		var y = event.clientY - dragStartY;
		if( x + dragWindow.outerWidth() > dragContainer.width() )	x = dragContainer.width() - dragWindow.outerWidth();
		if( x < 0 )	x = 0;
		if( y < 0 )	y = 0;
		dragWindow.css( { left: x + "px", top: y + "px" } );
		bDragged = true;
	}
}
function dragStop( event )
{
	bDragging = false;
	$( document.body ).unbind( 'mousemove' );
	dragWindow.unbind( 'mouseup' );
	dragWindow.unbind( 'mouseout' );
	dragWindow.unbind( 'mouseleave' );
	if( bDragged )
	{
		$( '#' + dragWindowId + '_top' ).val( parseInt( dragWindow.css( 'top' ) ) );
		$( '#' + dragWindowId + '_left' ).val( parseInt( dragWindow.css( 'left' ) ) );
		$( '#' + dragWindowId ).css( "zIndex", 10 );
	}
}

function editLayer( windowId )
{
	if( g_Editor == null )
	{
		g_EditLayerId = windowId;
		var width = $( '#layer_' + windowId + '_width' ).val();
		var height = $( '#layer_' + windowId + '_height' ).val();
		$( '#layer_topedit' ).val( $( '#layer_' + windowId + '_top' ).val() );
		$( '#layer_leftedit' ).val( $( '#layer_' + windowId + '_left' ).val() );
		$( '#layer_widthedit' ).val( width );
		$( '#layer_heightedit' ).val( height );

		height = $( '#layer_' + windowId ).height();

		$( '#layer_' + windowId + '_content' ).css( { display: "none" } );
		$( '#layer_' + windowId + '_bodytext' ).css( { display: "block" } );
		$( '#layer_' + windowId + '_bodytext' ).focus();
		$( '#layer_' + windowId ).css( "zIndex", 1000 );
		$( '#layer_' + windowId ).children( '.editLayerBorder' ).css( 'display', 'none' );
		$( '#editLayerControls' ).css( 'display', 'block' );
		if( width < 500 )	width = 500;
		g_Editor = new indigoEd.init( 'editor', { id:'layer_'+windowId+'_bodytext', width: width, height: height, resize: true, cssFile: '/styles/store.css', resize: true, buttons:['bold', 'italic', 'underline', 'strikethrough', '|', 'subscript', 'superscript', '|', 'orderedlist', 'unorderedlist', '|', 'outdent', 'indent', '|', 'leftalign', 'centeralign', 'rightalign', 'blockjustify', '|', 'unformat', '|', 'undo', 'redo', 'n', 'font', 'size', '|', 'style', '|', 'hr', 'link', 'unlink', '|', 'cut', 'copy', 'paste', 'html', 'image'] } );
	}
}
function cancelEditLayer()
{
	if( g_Editor != null )
	{
		$( '#layer_' + g_EditLayerId + '_bodytext' ).val( $( '#layer_' + g_EditLayerId + '_text' ).val() );
		$( '#layer_' + g_EditLayerId + '_content' ).css( { display: "block" } );
		$( '#layer_' + g_EditLayerId + '_bodytext' ).css( { display: "none" } );
		$( '#layer_' + g_EditLayerId ).css( "zIndex", 10 );
		$( '#layer_' + g_EditLayerId ).children( '.editLayerBorder' ).css( 'display', 'block' );
		$( '#editLayerControls' ).css( 'display', 'none' );
		g_Editor.close();
		g_Editor = null;
	}
}
function saveEditLayer()
{
	if( g_Editor != null )
	{
		g_Editor.save();
		g_Editor.close();
		g_Editor = null;
		$( '#layer_' + g_EditLayerId + '_top' ).val( $( '#layer_topedit' ).val() );
		$( '#layer_' + g_EditLayerId + '_left' ).val( $( '#layer_leftedit' ).val() );
		$( '#layer_' + g_EditLayerId + '_width' ).val( $( '#layer_widthedit' ).val() );
		$( '#layer_' + g_EditLayerId + '_height' ).val( $( '#layer_heightedit' ).val() );
		$( '#layer_' + g_EditLayerId + '_content' ).css( { display: "block" } );
		$( '#layer_' + g_EditLayerId + '_bodytext' ).css( { display: "none" } );
		$( '#layer_' + g_EditLayerId ).css( "zIndex", 10 );
		$( '#layer_' + g_EditLayerId ).children( '.editLayerBorder' ).css( 'display', 'block' );
		$( '#editLayerControls' ).css( 'display', 'none' );
		Indigo.doIdAction( 'saveLayer', g_EditLayerId );
	}
}





