/// <summary>
        /// sets the instancesspecific configuration.
        /// this configuration will be merged with the application and global configuration.
        /// the merged configuration will be stored to the current session.
        /// </summary>
        /// <param name="configuration"></param>
        public void SetConfiguration(PluploadConfiguration configuration)
        {
            LogWriter.Debug("merge configuration: " + configuration.ToJSON());
            
            if (configuration != null)
                HttpContext.Current.Session[PluploadConstants.REQUEST_CONFIGURATION] = this.Merge(configuration);

            LogWriter.Debug("the new merged configuration:" + PluploadContext.Instance.GetConfiguration().ToJSON());
        }
        /// <summary>
        /// merges an in instance of the plupload configuration with the given configuration
        /// </summary>
        /// <param name="configuration">instance to be merged</param>
        /// <returns>merged plupload configuration</returns>
        public PluploadConfiguration Merge(PluploadConfiguration configuration)
        {
            if (configuration == null)
            {
                return(this);
            }

            PluploadConfiguration merged = new PluploadConfiguration();

            merged.CSSLightBox       = (configuration.CSSLightBox != null)? configuration.CSSLightBox : this.CSSLightBox;
            merged.CSSPluploadDotNet = (configuration.CSSPluploadDotNet != null) ? configuration.CSSPluploadDotNet : this.CSSPluploadDotNet;
            merged.CSSPluploadQueue  = (configuration.CSSPluploadQueue != null) ? configuration.CSSPluploadQueue : this.CSSPluploadQueue;


            merged.FileFilters = (configuration.FileFilters != null && configuration.FileFilters.Count > 0) ? configuration.FileFilters : this.FileFilters;

            merged.JSBrowserPlus           = (configuration.JSBrowserPlus != null) ? configuration.JSBrowserPlus : this.JSBrowserPlus;
            merged.JSjQuery                = (configuration.JSjQuery != null) ? configuration.JSjQuery : this.JSjQuery;
            merged.JSjQueryUI              = (configuration.JSjQueryUI != null) ? configuration.JSjQueryUI : this.JSjQueryUI;
            merged.JSLightbox              = (configuration.JSLightbox != null) ? configuration.JSLightbox : this.JSLightbox;
            merged.JSPluploadDotNet        = (configuration.JSPluploadDotNet != null) ? configuration.JSPluploadDotNet : this.JSPluploadDotNet;
            merged.JSPluploadDynamicLoader = (configuration.JSPluploadDynamicLoader != null) ? configuration.JSPluploadDynamicLoader : this.JSPluploadDynamicLoader;

            merged.JSPluploadFull    = (configuration.JSPluploadFull != null)? configuration.JSPluploadFull : this.JSPluploadFull;
            merged.JSPluploadQueue   = (configuration.JSPluploadQueue != null)? configuration.JSPluploadQueue : this.JSPluploadQueue;
            merged.MaxFileSize       = (configuration.MaxFileSize != null) ? configuration.MaxFileSize : this.MaxFileSize;
            merged.MultipleQueues    = (configuration.MultipleQueues.HasValue)? configuration.MultipleQueues : this.MultipleQueues;
            merged.PluploadServerURL = (configuration.PluploadServerURL != null) ? configuration.PluploadServerURL : this.PluploadServerURL;
            merged.Resize            = (configuration.Resize != null) ? configuration.Resize : this.Resize;
            merged.Runtimes          = (configuration.Runtimes != null) ? configuration.Runtimes : this.Runtimes;
            merged.SaveOptions       = (configuration.SaveOptions != SaveOptions.None) ? configuration.SaveOptions : this.SaveOptions;
            merged.UploadDirectory   = (configuration.UploadDirectory != null) ? configuration.UploadDirectory : this.UploadDirectory;
            merged.LogDirectory      = (configuration.LogDirectory != null) ? configuration.LogDirectory : this.LogDirectory;
            merged.URLStreamUpload   = (configuration.URLStreamUpload.HasValue) ? configuration.URLStreamUpload : this.URLStreamUpload;
            merged.UseCDN            = (configuration.UseCDN.HasValue) ? configuration.UseCDN : this.UseCDN;

            merged.Flash       = (configuration.Flash != null) ? configuration.Flash : this.Flash;
            merged.Silverlight = (configuration.Silverlight != null) ? configuration.Silverlight : this.Silverlight;

            merged.Debug             = (configuration.Debug != null) ? configuration.Debug : this.Debug;
            merged.JSPluploadPreload = (configuration.JSPluploadPreload != null) ? configuration.JSPluploadPreload : this.JSPluploadPreload;

            merged.AutoInit = (configuration.AutoInit.HasValue) ? configuration.AutoInit : this.AutoInit;
            merged.IncludeAllScriptsAndStyles = (configuration.IncludeAllScriptsAndStyles.HasValue) ? configuration.IncludeAllScriptsAndStyles : this.IncludeAllScriptsAndStyles;

            return(merged);
        }
 /// <summary>
 /// merges the configuration given by config witch the current merged configuration.
 /// </summary>
 /// <param name="config">the configuration to be merged</param>
 /// <returns>a merged result a new PluploadConfiguration instance</returns>
 private PluploadConfiguration Merge(PluploadConfiguration config) 
 {
     return this.MergedConfiguration.Merge(config);
 }
        /// <summary>
        /// merges an in instance of the plupload configuration with the given configuration
        /// </summary>
        /// <param name="configuration">instance to be merged</param>
        /// <returns>merged plupload configuration</returns>            
        public PluploadConfiguration Merge(PluploadConfiguration configuration) 
        {                                                   
            if (configuration == null) return this;

            PluploadConfiguration merged = new PluploadConfiguration();
            merged.CSSLightBox = (configuration.CSSLightBox != null)? configuration.CSSLightBox : this.CSSLightBox;
            merged.CSSPluploadDotNet = (configuration.CSSPluploadDotNet != null) ? configuration.CSSPluploadDotNet : this.CSSPluploadDotNet;
            merged.CSSPluploadQueue = (configuration.CSSPluploadQueue != null) ? configuration.CSSPluploadQueue : this.CSSPluploadQueue;


            merged.FileFilters = (configuration.FileFilters != null && configuration.FileFilters.Count > 0) ? configuration.FileFilters : this.FileFilters;

            merged.JSBrowserPlus = (configuration.JSBrowserPlus != null) ? configuration.JSBrowserPlus : this.JSBrowserPlus;
            merged.JSjQuery = (configuration.JSjQuery != null) ? configuration.JSjQuery : this.JSjQuery;
            merged.JSjQueryUI = (configuration.JSjQueryUI != null) ? configuration.JSjQueryUI : this.JSjQueryUI;
            merged.JSLightbox = (configuration.JSLightbox != null) ? configuration.JSLightbox : this.JSLightbox;
            merged.JSPluploadDotNet = (configuration.JSPluploadDotNet != null) ? configuration.JSPluploadDotNet : this.JSPluploadDotNet;
            merged.JSPluploadDynamicLoader = (configuration.JSPluploadDynamicLoader != null) ? configuration.JSPluploadDynamicLoader : this.JSPluploadDynamicLoader;

            merged.JSPluploadFull = (configuration.JSPluploadFull != null)? configuration.JSPluploadFull : this.JSPluploadFull;
            merged.JSPluploadQueue = (configuration.JSPluploadQueue != null)? configuration.JSPluploadQueue : this.JSPluploadQueue;
            merged.MaxFileSize = (configuration.MaxFileSize != null) ? configuration.MaxFileSize : this.MaxFileSize;
            merged.MultipleQueues = (configuration.MultipleQueues.HasValue)? configuration.MultipleQueues : this.MultipleQueues;
            merged.PluploadServerURL = (configuration.PluploadServerURL != null) ? configuration.PluploadServerURL : this.PluploadServerURL;
            merged.Resize = (configuration.Resize != null) ? configuration.Resize : this.Resize;
            merged.Runtimes = (configuration.Runtimes != null) ? configuration.Runtimes : this.Runtimes;
            merged.SaveOptions = (configuration.SaveOptions != SaveOptions.None) ? configuration.SaveOptions : this.SaveOptions;
            merged.UploadDirectory = (configuration.UploadDirectory != null) ? configuration.UploadDirectory : this.UploadDirectory;
            merged.LogDirectory = (configuration.LogDirectory != null) ? configuration.LogDirectory : this.LogDirectory;            
            merged.URLStreamUpload = (configuration.URLStreamUpload.HasValue) ? configuration.URLStreamUpload : this.URLStreamUpload;
            merged.UseCDN = (configuration.UseCDN.HasValue) ? configuration.UseCDN : this.UseCDN;

            merged.Flash = (configuration.Flash != null) ? configuration.Flash : this.Flash;
            merged.Silverlight = (configuration.Silverlight != null) ? configuration.Silverlight : this.Silverlight;

            merged.Debug = (configuration.Debug != null) ? configuration.Debug : this.Debug;
            merged.JSPluploadPreload = (configuration.JSPluploadPreload != null) ? configuration.JSPluploadPreload : this.JSPluploadPreload;

            merged.AutoInit = (configuration.AutoInit.HasValue) ? configuration.AutoInit : this.AutoInit;
            merged.IncludeAllScriptsAndStyles = (configuration.IncludeAllScriptsAndStyles.HasValue) ? configuration.IncludeAllScriptsAndStyles : this.IncludeAllScriptsAndStyles;
            
            return merged;
        }