Browse Source

[svn r17751] FS#2867 - FCKEditor, customizations plugin. Introducing new javascript routines to deal with relative, semi-absolute and absolute URLs, not activated yet.

Ivan Tcholakov 16 years ago
parent
commit
e4e97cf05a
1 changed files with 421 additions and 2 deletions
  1. 421 2
      main/inc/lib/fckeditor/editor/plugins/customizations/fckplugin.js

+ 421 - 2
main/inc/lib/fckeditor/editor/plugins/customizations/fckplugin.js

@@ -49,7 +49,7 @@
 
 /*
  **************************************************************************************
- * Reading some passed by PHP-scripts options.
+ * Initialization.
  **************************************************************************************
  */
 
@@ -73,6 +73,36 @@ else
 	FCKConfig.InDocument = false ;
 }
 
+// Absolute URL to document repository root.
+if ( !FCKConfig.CreateDocumentWebDir )
+{
+	FCKConfig.CreateDocumentWebDir = '' ;
+}
+
+// Relative path from the document to the repository root.
+if ( !FCKConfig.CreateDocumentDir )
+{
+	FCKConfig.CreateDocumentDir = '' ;
+}
+
+// This is the base of the reltive URLs that are used by the dialog system.
+if ( !FCKConfig.BaseHref || FCKConfig.BaseHref.toString().length == 0 )
+{
+	if ( FCKConfig.BaseHref.toString().length == 0 )
+	{
+		FCKConfig.BaseHref = FCKConfig.CreateDocumentWebDir ;
+	}
+}
+
+FCKConfig.BaseHref = FCKConfig.BaseHref.toString();
+
+if ( FCKConfig.BaseHref.length > 0 )
+{
+	if ( FCKConfig.BaseHref.substr( FCKConfig.BaseHref.length - 1 ) != '/' )
+	{
+		FCKConfig.BaseHref = FCKConfig.BaseHref + '/' ;
+	}
+}
 
 /*
  **************************************************************************************
@@ -998,7 +1028,7 @@ FCK.RegisterDoubleClickHandler(
 
 /*
  **************************************************************************************
- * Common utilities
+ * Routines for testing the type of a selected visual object.
  **************************************************************************************
  */
 
@@ -1173,6 +1203,395 @@ FCK.GetVideoType = function ( img )
 	return false ;
 } ;
 
+
+/*
+ **************************************************************************************
+ * Routines to deal with conversions of absolute and relative URLs.
+ **************************************************************************************
+ */
+
+// Constants for fundamental URL conversions.
+var RELATIVE_URL = 'relative' ;
+var ABSOLUTE_URL = 'absolute' ;
+var SEMI_ABSOLUTE_URL = 'semi-absolute' ;
+FCK.RELATIVE_URL = RELATIVE_URL ;
+FCK.ABSOLUTE_URL = ABSOLUTE_URL ;
+FCK.SEMI_ABSOLUTE_URL = SEMI_ABSOLUTE_URL ;
+
+// Constants used for conversions of special relative URLs.
+var REPOSITORY_RELATIVE_URL = 'repository-relative' ;
+var DOCUMENT_RELATIVE_URL = 'document-relative' ;
+FCK.REPOSITORY_RELATIVE_URL = REPOSITORY_RELATIVE_URL ;
+FCK.DOCUMENT_RELATIVE_URL = DOCUMENT_RELATIVE_URL ;
+
+// Conversion of selected by the file managers URLs.
+FCK.GetSelectedUrl = function ( url )
+{
+	url = FCK.GetUrl ( url, DOCUMENT_RELATIVE_URL ) ;
+
+	if ( FCK.GetUrlType (url) != RELATIVE_URL )
+	{
+		url = FCK.GetUrl ( url, SEMI_ABSOLUTE_URL ) ;
+	}
+
+	return url ;
+}
+
+// Conversion of a URL into desired type.
+FCK.GetUrl = function ( url, type )
+{
+	if ( !url )
+	{
+		return url ;
+	}
+
+	if ( !type )
+	{
+		return url ;
+	}
+
+	url = url.toString().Trim() ;
+
+	if ( url.indexOf( './' ) == 0 )
+	{
+		url = url.substr( 2 );
+	}
+
+	switch ( type )
+	{
+		case RELATIVE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					break ;
+
+				case ABSOLUTE_URL:
+				case SEMI_ABSOLUTE_URL:
+
+					url = FCK.ConvertUrl( url, RELATIVE_URL, FCKConfig.CreateDocumentWebDir ) ;
+					if ( FCK.GetUrlType( url ) == RELATIVE_URL )
+					{
+						url = FCK.GetUrl( url, DOCUMENT_RELATIVE_URL ) ;
+					}
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		case REPOSITORY_RELATIVE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					if ( url.indexOf( FCKConfig.CreateDocumentDir) == 0 )
+					{
+						url = url.substr( FCKConfig.CreateDocumentDir.length ) ;
+					}
+					
+					break ;
+
+				case ABSOLUTE_URL:
+
+					url = FCK.ConvertUrl( url, RELATIVE_URL, FCKConfig.CreateDocumentWebDir ) ;
+
+					break ;
+
+				case SEMI_ABSOLUTE_URL:
+
+					url = FCK.ConvertUrl( url, RELATIVE_URL, FCKConfig.CreateDocumentWebDir ) ;
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		case DOCUMENT_RELATIVE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					if ( FCKConfig.CreateDocumentDir !=  '/' )
+					{
+						url = FCKConfig.CreateDocumentDir + url ;
+					}
+					
+					break ;
+
+				case ABSOLUTE_URL:
+				case SEMI_ABSOLUTE_URL:
+
+					url = FCK.ConvertUrl( url, RELATIVE_URL, FCKConfig.CreateDocumentWebDir ) ;
+					if ( FCK.GetUrlType( url ) == RELATIVE_URL )
+					{
+						url = FCK.GetUrl( url, DOCUMENT_RELATIVE_URL ) ;
+					}
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		case ABSOLUTE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					url = FCK.GetUrl( url, REPOSITORY_RELATIVE_URL ) ;
+					url = FCK.ConvertUrl( url, ABSOLUTE_URL, FCKConfig.CreateDocumentWebDir) ;
+					
+					break ;
+
+				case ABSOLUTE_URL:
+
+					break ;
+
+				case SEMI_ABSOLUTE_URL:
+
+					url = FCK.ConvertUrl( url, ABSOLUTE_URL, FCKConfig.CreateDocumentWebDir) ;
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		case SEMI_ABSOLUTE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					url = FCK.GetUrl( url, REPOSITORY_RELATIVE_URL ) ;
+					url = FCK.ConvertUrl( url, SEMI_ABSOLUTE_URL, FCKConfig.CreateDocumentWebDir) ;
+					
+					break ;
+
+				case ABSOLUTE_URL:
+
+					url = FCK.ConvertUrl( url, SEMI_ABSOLUTE_URL, FCKConfig.CreateDocumentWebDir) ;
+
+					break ;
+
+				case SEMI_ABSOLUTE_URL:
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		default:
+			break ;
+	}
+
+	return url ;
+}
+
+// Common URL conversion routine.
+FCK.ConvertUrl = function ( url, type, base )
+{
+	if ( !url )
+	{
+		return '' ;
+	}
+
+	if ( !type )
+	{
+		return '' ;
+	}
+
+	url = url.toString().Trim() ;
+
+	if ( url.indexOf( './' ) == 0 )
+	{
+		url = url.substr( 2 );
+	}
+
+	type = type.toString().Trim() ;
+
+	if ( !base )
+	{
+		base = '' ;
+	}
+
+	base = base.toString().Trim() ;
+
+	if ( base ==  '/' )
+	{
+		base = '' ;
+	}
+
+	switch ( type )
+	{
+		case RELATIVE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case ABSOLUTE_URL:
+
+					base = FCK.ConvertUrl( base, ABSOLUTE_URL ) ;
+
+					if ( url.indexOf( base ) == 0 )
+					{
+						url = url.substr( base.length ) ;
+					}
+
+					break ;
+
+				case SEMI_ABSOLUTE_URL:
+
+					base = FCK.ConvertUrl( base, SEMI_ABSOLUTE_URL ) ;
+
+					if ( url.indexOf( base ) == 0 )
+					{
+						url = url.substr( base.length ) ;
+					}
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		case ABSOLUTE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					base = FCK.ConvertUrl( base, ABSOLUTE_URL ) ;
+
+					url = base + url ;
+
+					break ;
+
+				case SEMI_ABSOLUTE_URL:
+
+					url = FCK.GetServerBase() + url.substr( 1 ) ;
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		case SEMI_ABSOLUTE_URL:
+
+			switch ( FCK.GetUrlType( url ) )
+			{
+				case RELATIVE_URL:
+
+					base = FCK.ConvertUrl( base, SEMI_ABSOLUTE_URL ) ;
+
+					url = base + url ;
+
+					break ;
+
+				case ABSOLUTE_URL:
+
+					var serverBase = FCK.GetServerBase() ;
+					if ( serverBase == FCK.GetServerBase( url ) )
+					{
+						url = '/' + url.substr( serverBase.length ) ;
+					}
+
+					break ;
+
+				default:
+					break ;
+			}
+
+			break ;
+
+		default:
+			break ;
+	}
+
+	return url ;
+}
+
+// Returns type of a given URL.
+// Returned values:
+// RELATIVE_URL ( returned for example for images/image.png )
+// SEMI_ABSOLUTE_URL ( /dokeos/courses/TEST/document/images/image.png )
+// ABSOLUTE_URL ( http://localhost/dokeos/courses/TEST/document/images/image.png )
+// '' - in case of error
+FCK.GetUrlType = function ( url )
+{
+	if ( !url )
+	{
+		return '' ;
+	}
+
+	url = url.toString().Trim() ;
+
+	if ( url.indexOf( '/' ) == 0 )
+	{
+		return SEMI_ABSOLUTE_URL ;
+	}
+
+	if ( url.match( /^([^:]+\:)?\/\// ) )
+	{
+		return ABSOLUTE_URL ;
+	}
+
+	return RELATIVE_URL ;
+} ;
+
+// Extracts the server base from a given URL.
+// If the URL is omited, the function returns the base of the server where LMS runs.
+// Example:
+//     Your site is http://www.mysite.org/dokeos
+//     The server base is http://www.mysite.org/
+FCK.GetServerBase = function ( url )
+{
+	if ( !url )
+	{
+		if ( FCKConfig.CreateDocumentWebDir )
+		{
+			url = FCKConfig.CreateDocumentWebDir ;
+		}
+		else
+		{
+			url = location.href ;
+		}
+	}
+
+	url = url.toString().replace( /(https?:\/\/[^\/]*)\/.*/, '$1' ) + '/' ;
+
+	return url ;
+} ;
+
+
+/*
+ **************************************************************************************
+ * Deprecated routines, to be removed after full adopting the new URL-related routines.
+ **************************************************************************************
+ */
+
 // Makes a URL relative.
 FCK.RemoveBasePath = function ( url )
 {