diff --git a/wire/core/Modules.php b/wire/core/Modules.php index 2b854f81..9233fa4b 100644 --- a/wire/core/Modules.php +++ b/wire/core/Modules.php @@ -84,6 +84,12 @@ class Modules extends WireArray { */ const flagsNoUserConfig = 32; + /** + * Module where no file could be located + * + */ + const flagsNoFile = 64; + /** * Filename for module info cache file * @@ -1256,6 +1262,7 @@ class Modules extends WireArray { $needsInit = false; $noInit = !empty($options['noInit']); // force cancel of Module::init() call? $initOptions = array(); // options for initModule() call + $find = false; // try to find new location of module file? $error = ''; if(empty($key)) { @@ -1320,9 +1327,26 @@ class Modules extends WireArray { if(!$module) $error = "Module '$key' not installed and install failed"; } else { $error = "Module '$key' is not present or listed as installable"; + $find = true; } } else { $error = "Module '$key' is not present and not installable (noInstall=true)"; + $find = true; + } + + if(!$module && $find) { + // This is reached if module has moved elsewhere in file system, like from: + // site/modules/ModuleName.module to site/modules/ModuleName/ModuleName.module + // Code below tries to find the file to keep it working, but modules need Refresh. + try { + if($this->includeModule($key)) { + $module = $this->newModule($key); + } + } catch(\Exception $e) { + if(empty($options['noThrow'])) throw $e; + $error .= ($error ? " - " : "Module '$key' - ") . $e->getMessage(); + return empty($options['returnError']) ? null : $error; + } } if(!$module) { @@ -1463,32 +1487,28 @@ class Modules extends WireArray { public function includeModule($module, $file = '') { $className = ''; + $moduleName = ''; if(is_string($module)) { - $className = $module; + $moduleName = ctype_alnum($module) ? $module : wireClassName($module); + $className = wireClassName($module, true); } else if(is_object($module)) { if($module instanceof ModulePlaceholder) { - $className = $module->className(); + $moduleName = $module->className(); + $className = $module->className(true); } else if($module instanceof Module) { return true; // already included } } else { - $className = $this->getModuleClass($module); + $moduleName = $this->getModuleClass($module, false); + $className = $this->getModuleClass($module, true); } if(!$className) return false; - - if(class_exists($className, false)) { - // already included - return true; - } + + // already included + if(class_exists($className, false)) return true; - // determine if namespace was requested with module - $namespace = wireClassName($className, 1); - - // moduleName is className without namespace - $moduleName = $namespace === null ? $className : wireClassName($className, false); - // attempt to retrieve module $module = parent::get($moduleName); @@ -1497,23 +1517,47 @@ class Modules extends WireArray { if(!$module instanceof Module) $module = false; } else if($moduleName) { - // unable to retrieve module, may be an uninstalled module + // This is reached for any of the following: + // 1. an uninstalled module + // 2. an installed module that has changed locations + // 3. a module outside the \ProcessWire\ namespace + // 4. a module that does not exist + $fast = true; if(!$file) { + // determine module file, if not already provided to the method $file = $this->getModuleFile($moduleName, array('fast' => true)); - if(!$file) $file = $this->getModuleFile($moduleName, array('fast' => false)); + if(!$file) { + $fast = false; + $file = $this->getModuleFile($moduleName, array('fast' => false)); + } + // still can't figure out what file is? fail + if(!$file) return false; } - if($file) { - $this->includeModuleFile($file, $moduleName); - // now check to see if included file resulted in presence of module class - if(class_exists($className)) { - $module = true; - } else { - if(!$namespace) $namespace = $this->getModuleNamespace($moduleName, array('file' => $file)); - $nsClassName = trim($namespace, "\\") . "\\$moduleName"; - if(class_exists($nsClassName, false)) { - // successful include module - $module = true; + + if(!$this->includeModuleFile($file, $moduleName)) { + // module file failed to include(), try to identify and include file again + if($fast) { + $filePrev = $file; + $file = $this->getModuleFile($moduleName, array('fast' => false)); + if($file && $file !== $filePrev) { + $this->includeModuleFile($file, $moduleName); } + } else { + // we already tried this earlier, no point in doing it again + } + } + + // now check to see if included file resulted in presence of module class + if(class_exists($className)) { + // module in ProcessWire namespace + $module = true; + } else { + // module in root namespace or some other namespace + $namespace = $this->getModuleNamespace($moduleName, array('file' => $file)); + $className = trim($namespace, "\\") . "\\$moduleName"; + if(class_exists($className, false)) { + // successful include module + $module = true; } } } @@ -1523,6 +1567,7 @@ class Modules extends WireArray { return true; } else if(!$module) { + // darn return false; } else if($module instanceof ModulePlaceholder) { @@ -1624,7 +1669,7 @@ class Modules extends WireArray { * - Integer 1 to return array of module info for each matching module. * - Integer 2 to return array of verbose module info for each matching module. * - Integer 3 to return array of Module or ModulePlaceholder objects (whatever current state is). Added 3.0.146. - * @return array Returns array of module class names or Module objects. In either case, array indexes are class names. + * @return array Returns array of module class names, module info arrays, or Module objects. In all cases, array indexes are class names. * */ public function findByPrefix($prefix, $load = false) { @@ -2345,6 +2390,22 @@ class Modules extends WireArray { return $flags; } + /** + * Does module have flag? + * + * #pw-internal + * + * @param int|string|Module $class Module ID, class name or instance + * @param int $flag + * @return bool + * @since 3.0.170 + * + */ + public function hasFlag($class, $flag) { + $flags = $this->getFlags($class); + return $flags === false ? false : ($flags & $flag); + } + /** * Set module flags * @@ -3116,7 +3177,8 @@ class Modules extends WireArray { * @param string|Module $moduleName * @param array $options * - `file` (string): Known module path/file, as an optimization. - * - `noCache` (bool): Specify true to force reload namespace info directly from module file. + * - `noCache` (bool): Specify true to force reload namespace info directly from module file. (default=false) + * - `noLoad` (bool): Specify true to prevent loading of file for namespace discovery. (default=false) Added 3.0.170 * @return null|string Returns namespace, or NULL if unable to determine. Namespace is ready to use in a string (i.e. has trailing slashes) * */ @@ -3124,6 +3186,7 @@ class Modules extends WireArray { $defaults = array( 'file' => null, + 'noLoad' => false, 'noCache' => false, ); @@ -3161,7 +3224,9 @@ class Modules extends WireArray { return null; } - $namespace = $this->getFileNamespace($options['file']); + if(empty($options['noLoad'])) { + $namespace = $this->getFileNamespace($options['file']); + } return $namespace; } @@ -3176,7 +3241,7 @@ class Modules extends WireArray { * */ public function getFileNamespace($file) { - $namespace = $this->wire('files')->getNamespace($file); + $namespace = $this->wire()->files->getNamespace($file); if($namespace !== "\\") $namespace = "\\" . trim($namespace, "\\") . "\\"; return $namespace; } @@ -3344,13 +3409,15 @@ class Modules extends WireArray { * @param string|Module $class Module class name or object instance * @param array|bool $options Options to modify default behavior: * - `getURL` (bool): Specify true if you want to get the URL rather than file path (default=false). - * - `fast` (bool): Specify true as optimization to omit file_exists() checks (default=false). + * - `fast` (bool): Specify true to omit file_exists() checks (default=false). + * - `guess` (bool): Manufacture/guess a module location if one cannot be found (default=false) 3.0.170+ * - Note: If you specify a boolean for the $options argument, it is assumed to be the $getURL property. * @return bool|string Returns string of module file, or false on failure. * */ public function getModuleFile($class, $options = array()) { + $config = $this->wire()->config; $className = $class; if(is_bool($options)) $options = array('getURL' => $options); if(!isset($options['getURL'])) $options['getURL'] = false; @@ -3372,7 +3439,7 @@ class Modules extends WireArray { if(!$hasDuplicate) { // see if we can determine it from already stored paths - $path = $this->wire('config')->paths->$moduleName; + $path = $config->paths->$moduleName; if($path) { $file = $path . $moduleName . ($this->moduleFileExts[$moduleName] === 2 ? '.module.php' : '.module'); if(!$options['fast'] && !file_exists($file)) $file = false; @@ -3388,18 +3455,16 @@ class Modules extends WireArray { if(!$file) { $dupFile = $this->duplicates()->getCurrent($moduleName); if($dupFile) { - $rootPath = $this->wire('config')->paths->root; + $rootPath = $config->paths->root; $file = rtrim($rootPath, '/') . $dupFile; if(!file_exists($file)) { - // module in use may have been deleted, find the next available one that exist + // module in use may have been deleted, find the next available one that exists $file = ''; $dups = $this->duplicates()->getDuplicates($moduleName); foreach($dups['files'] as $pathname) { $pathname = rtrim($rootPath, '/') . $pathname; - if(file_exists($pathname)) { - $file = $pathname; - break; - } + if(file_exists($pathname)) $file = $pathname; + if($file) break; } } } @@ -3407,7 +3472,7 @@ class Modules extends WireArray { if(!$file) { // see if it's a predefined core type that can be determined from the type - // this should only come into play if something has gone wrong with the modules loader + // this should only come into play if module has moved or had a load error foreach($this->coreTypes as $typeName) { if(strpos($moduleName, $typeName) !== 0) continue; $checkFiles = array( @@ -3416,16 +3481,29 @@ class Modules extends WireArray { "$typeName/$moduleName.module", "$typeName/$moduleName.module.php", ); - $path1 = $this->wire('config')->paths->modules; + $path1 = $config->paths->modules; foreach($checkFiles as $checkFile) { $file1 = $path1 . $checkFile; - if(is_file($file1)) { - $file = $file1; - break; - } + if(file_exists($file1)) $file = $file1; + if($file) break; } if($file) break; } + if(!$file) { + // check site modules + $checkFiles = array( + "$moduleName/$moduleName.module", + "$moduleName/$moduleName.module.php", + "$moduleName.module", + "$moduleName.module.php", + ); + $path1 = $config->paths->siteModules; + foreach($checkFiles as $checkFile) { + $file1 = $path1 . $checkFile; + if(file_exists($file1)) $file = $file1; + if($file) break; + } + } } if(!$file) { @@ -3447,10 +3525,15 @@ class Modules extends WireArray { $file = false; } } + + if(!$file && !empty($options['guess'])) { + // make a guess about where module would be if we had been able to find it + $file = $config->paths->siteModules . "$moduleName/$moduleName.module"; + } if($file) { if(DIRECTORY_SEPARATOR != '/') $file = str_replace(DIRECTORY_SEPARATOR, '/', $file); - if($options['getURL']) $file = str_replace($this->wire('config')->paths->root, '/', $file); + if($options['getURL']) $file = str_replace($config->paths->root, '/', $file); } return $file; @@ -4479,6 +4562,98 @@ class Modules extends WireArray { return $errors; } + /** + * Find modules that are missing their module file on the file system + * + * Return value is array: + * ~~~~~ + * [ + * 'ModuleName' => [ + * 'id' => 123, + * 'name' => 'ModuleName', + * 'file' => '/path/to/expected/file.module' + * ], + * 'ModuleName' => [ + * ... + * ] + * ]; + * ~~~~~ + * + * #pw-internal + * + * @return array + * @since 3.0.170 + * + */ + public function findMissingModules() { + + $missing = array(); + $unflags = array(); + + $sql = "SELECT id, class FROM modules WHERE flags & :flagsNoFile ORDER BY class"; + $query = $this->wire()->database->prepare($sql); + $query->bindValue(':flagsNoFile', self::flagsNoFile, \PDO::PARAM_INT); + $query->execute(); + + while($row = $query->fetch(\PDO::FETCH_ASSOC)) { + + $class = $row['class']; + + $file = $this->getModuleFile($class, array('fast' => true)); + + if($file && file_exists($file)) { + $unflags[] = $class; + continue; + } + + $fileAlt = $this->getModuleFile($class, array('fast' => false)); + + if($fileAlt) { + $file = $fileAlt; + if(file_exists($file)) continue; + } + + if(!$file) { + $file = $this->getModuleFile($class, array('fast' => true, 'guess' => true)); + } + + $missing[$class] = array( + 'id' => $row['id'], + 'name' => $class, + 'file' => $file, + ); + } + + foreach($unflags as $name) { + $this->setFlag($name, self::flagsNoFile, false); + } + + return $missing; + } + + /** + * Remove entry for module from modules table + * + * #pw-internal + * + * @param string|int $class Module class or ID + * @return bool + * @since 3.0.170 + * + */ + public function removeModuleEntry($class) { + $database = $this->wire()->database; + if(ctype_digit("$class")) { + $query = $database->prepare('DELETE FROM modules WHERE id=:id LIMIT 1'); + $query->bindValue(':id', (int) $class, \PDO::PARAM_INT); + } else { + $query = $database->prepare('DELETE FROM modules WHERE class=:class LIMIT 1'); + $query->bindValue(':class', $class, \PDO::PARAM_STR); + } + $result = $query->execute() ? $query->rowCount() > 0 : false; + $query->closeCursor(); + return $result; + } /** * Given a module version number, format it in a consistent way as 3 parts: 1.2.3 @@ -4575,9 +4750,17 @@ class Modules extends WireArray { /** * Clear the module information cache * + * @param bool|null $showMessages Specify false to suppress messages, true to report them, or null to auto-detect + * */ - protected function clearModuleInfoCache() { - + protected function clearModuleInfoCache($showMessages = null) { + + $cache = $this->wire()->cache; + $versionChanges = array(); + $newModules = array(); + $moveModules = array(); + $missModules = array(); + // record current module versions currently in moduleInfo $moduleVersions = array(); foreach($this->moduleInfoCache as $id => $moduleInfo) { @@ -4586,13 +4769,12 @@ class Modules extends WireArray { } else { $moduleVersions[$id] = $moduleInfo['version']; } - // $moduleVersions[$id] = $moduleInfo['version']; } // delete the caches - $this->wire('cache')->delete(self::moduleInfoCacheName); - $this->wire('cache')->delete(self::moduleInfoCacheVerboseName); - $this->wire('cache')->delete(self::moduleInfoCacheUninstalledName); + $cache->delete(self::moduleInfoCacheName); + $cache->delete(self::moduleInfoCacheVerboseName); + $cache->delete(self::moduleInfoCacheUninstalledName); $this->moduleInfoCache = array(); $this->moduleInfoCacheVerbose = array(); @@ -4601,43 +4783,93 @@ class Modules extends WireArray { // save new moduleInfo cache $this->saveModuleInfoCache(); - $versionChanges = array(); - $newModules = array(); // compare new moduleInfo versions with the previous ones, looking for changes foreach($this->moduleInfoCache as $id => $moduleInfo) { + $moduleName = $moduleInfo['name']; if(!isset($moduleVersions[$id])) { - $newModules[] = $moduleInfo['name']; + if(isset($this->moduleIDs[$moduleName])) { + $moveModules[] = $moduleName; + } else { + $newModules[] = $moduleName; + } continue; } if($moduleVersions[$id] != $moduleInfo['version']) { $fromVersion = $this->formatVersion($moduleVersions[$id]); $toVersion = $this->formatVersion($moduleInfo['version']); - $versionChanges[] = "$moduleInfo[name]: $fromVersion => $toVersion"; + $versionChanges[] = "$moduleName: $fromVersion => $toVersion"; $this->modulesLastVersions[$id] = $moduleVersions[$id]; - if(strpos($moduleInfo['name'], 'Fieldtype') === 0) { + if(strpos($moduleName, 'Fieldtype') === 0) { // apply update now, to Fieldtype modules only (since they are loaded differently) - $this->getModule($moduleInfo['name']); + $this->getModule($moduleName); } } } - - // report on any changes - if(count($newModules)) { - $this->message( - sprintf($this->_n('Detected %d new module: %s', 'Detected %d new modules: %s', count($newModules)), - count($newModules), '
' . implode("\n", $newModules)) . '
', - Notice::allowMarkup); - } - if(count($versionChanges)) { - $this->message( - sprintf($this->_n('Detected %d module version change', 'Detected %d module version changes', - count($versionChanges)), count($versionChanges)) . - ' (' . $this->_('will be applied the next time each module is loaded') . '):' . - '
' . implode("\n", $versionChanges) . '
', - Notice::allowMarkup | Notice::debug); + + foreach($this->moduleIDs as $moduleName => $moduleID) { + if(isset($this->moduleInfoCache[$moduleID])) { + // module is present in moduleInfo + if($this->hasFlag($moduleID, self::flagsNoFile)) { + $file = $this->getModuleFile($moduleName, array('fast' => false)); + if($file) { + // remove flagsNoFile if file is found + $this->setFlag($moduleID, self::flagsNoFile, false); + } + } + } else { + // module is missing moduleInfo + $file = $this->getModuleFile($moduleName, array('fast' => false)); + if(!$file) { + $file = $this->getModuleFile($moduleName, array('fast' => true, 'guess' => true)); + // add flagsNoFile if file cannot be located + $missModules[] = "$moduleName => $file"; + $this->setFlag($moduleID, self::flagsNoFile, true); + } + } } $this->updateModuleVersionsCache(); + + if($showMessages === null) { + $user = $this->wire()->user; + $showMessages = ($user && $user->isSuperuser()) || $this->wire()->process == 'ProcessModule'; + } + + // report detected changes + $sanitizer = $this->wire()->sanitizer; + $reports = array( + array( + 'label' => $this->_('Found %d new module(s):'), + 'items' => $newModules, + ), + /* + array( + 'label' => $this->_('Found %d moved module(s):'), + 'items' => $moveModules, + ), + */ + array( + 'label' => $this->_('Found %d module(s) missing file:'), + 'items' => $missModules, + ), + array( + 'label' => $this->_('Found %d module version changes (applied when module is loaded):'), + 'items' => $versionChanges, + ), + ); + + foreach($reports as $report) { + if(!count($report['items'])) continue; + if($showMessages) $this->message( + $sanitizer->entities1(sprintf($report['label'], count($report['items']))) . + '
' . $sanitizer->entities(implode("\n", $report['items'])) . '
', + Notice::allowMarkup | Notice::noGroup + ); + $this->log( + sprintf($report['label'], count($report['items'])) . ' ' . + implode(', ', $report['items']) + ); + } } /** diff --git a/wire/modules/Fieldtype/FieldtypeFile.module b/wire/modules/Fieldtype/FieldtypeFile/FieldtypeFile.module similarity index 100% rename from wire/modules/Fieldtype/FieldtypeFile.module rename to wire/modules/Fieldtype/FieldtypeFile/FieldtypeFile.module diff --git a/wire/modules/Fieldtype/FieldtypeImage.module b/wire/modules/Fieldtype/FieldtypeImage/FieldtypeImage.module similarity index 99% rename from wire/modules/Fieldtype/FieldtypeImage.module rename to wire/modules/Fieldtype/FieldtypeImage/FieldtypeImage.module index 0ff2f756..220f6fe1 100644 --- a/wire/modules/Fieldtype/FieldtypeImage.module +++ b/wire/modules/Fieldtype/FieldtypeImage/FieldtypeImage.module @@ -68,7 +68,7 @@ class FieldtypeImage extends FieldtypeFile { * @return string * */ - protected function getDefaultFileExtensions() { + public function getDefaultFileExtensions() { return "gif jpg jpeg png"; } diff --git a/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.js b/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.js index 8a2e465c..6f58ed40 100644 --- a/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.js +++ b/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.js @@ -332,6 +332,16 @@ $(document).ready(function() { return false; }); + $(document).on('image-edit', '.InputfieldCKEditor', function() { + // re-initialize CKE when image-edit event triggers (from InputfieldImage.js) via rpsallis + var $editor = $(this).find('.InputfieldCKEditorNormal'); + $editor.each(function() { + var editorID = $(this).attr('id'); + if(typeof CKEDITOR.instances[editorID] !== 'undefined') CKEDITOR.instances[editorID].destroy(); + ckeInitNormal(editorID); + }); + }); + /** * Inline editors * diff --git a/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.min.js b/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.min.js index 704c623d..364af148 100644 --- a/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.min.js +++ b/wire/modules/Inputfield/InputfieldCKEditor/InputfieldCKEditor.min.js @@ -1 +1 @@ -function ckeGetProcessWireConfig(editor){var editorName=typeof editor=="string"?editor:editor.name;var configName=editorName.replace("Inputfield_","InputfieldCKEditor_");var $repeaterItem="";var settings={};configName=configName.replace("Inputfield_","InputfieldCKEditor_");if(typeof ProcessWire.config[configName]=="undefined"&&configName.indexOf("_repeater")>0){configName=configName.replace(/_repeater[0-9]+/,"");$repeaterItem=$("#"+editorName).closest(".InputfieldRepeaterItem")}if(typeof ProcessWire.config[configName]=="undefined"&&configName.indexOf("_ckeditor")>0){configName=configName.replace(/_ckeditor$/,"")}if(typeof ProcessWire.config[configName]=="undefined"&&configName.indexOf("__")>0){configName=configName.replace(/__\d+$/,"")}if(typeof ProcessWire.config[configName]=="undefined"){settings.error="Cannot find CKEditor settings for "+configName}else{settings=ProcessWire.config[configName]}if($repeaterItem.length){settings["repeaterItem"]=$repeaterItem}else{settings["repeaterItem"]=""}return settings}function ckeLoadPlugins(){for(var name in ProcessWire.config.InputfieldCKEditor.plugins){var file=ProcessWire.config.InputfieldCKEditor.plugins[name];CKEDITOR.plugins.addExternal(name,file,"")}}ckeLoadPlugins();function ckeBlurEvent(event){var editor=event.editor;var $textarea=$(editor.element.$);if(editor.checkDirty()){if($textarea.length){if($textarea.is("textarea"))$textarea.change();$textarea.closest(".Inputfield").addClass("InputfieldStateChanged")}}}function ckeFocusEvent(event){var editor=event.editor;var $textarea=$(editor.element.$);$textarea.trigger("pw-focus")}function ckeResizeEvent(event){var editor=event.editor;var $textarea=$(editor.element.$);if($textarea.length){$textarea.closest(".Inputfield").trigger("heightChanged")}}function ckeUploadEvent(event){var xhr=event.data.fileLoader.xhr;var fileLoader=event.data.fileLoader;var settings=ckeGetProcessWireConfig(event.editor);var uploadFieldName=settings?settings.pwUploadField:"_unknown";var $imageInputfield=$("#Inputfield_"+uploadFieldName);if(typeof settings.repeaterItem!="undefined"&&settings.repeaterItem.length){var $repeaterImageField=settings.repeaterItem.find(".InputfieldImage:not(.InputfieldFileSingle)");if($repeaterImageField.length)$imageInputfield=$repeaterImageField}if($imageInputfield.length){xhr.open("POST",fileLoader.uploadUrl,true);$imageInputfield.trigger("pwimageupload",{name:fileLoader.fileName,file:fileLoader.file,xhr:xhr});event.stop()}else{if(typeof settings.error!="undefined"&&settings.error.length){ProcessWire.alert(settings.error)}else{ProcessWire.alert("Unable to find images field for upload")}event.stop();return false}}function ckeInitEvents(editor){editor.on("blur",ckeBlurEvent);editor.on("focus",ckeFocusEvent);editor.on("change",ckeBlurEvent);editor.on("resize",ckeResizeEvent);editor.on("fileUploadRequest",ckeUploadEvent,null,null,4);var $textarea=$(editor.element.$);var $inputfield=$textarea.closest(".Inputfield.InputfieldColumnWidth");if($inputfield.length)setTimeout(function(){$inputfield.trigger("heightChanged")},1e3)}function ckeSaveReadyInline($inputfield){if(!$inputfield.length)return;var $inlines=$inputfield.hasClass(".InputfieldCKEditorInline")?$inputfield:$inputfield.find(".InputfieldCKEditorInline");if($inlines.length)$inlines.each(function(){var $t=$(this);var value;if($t.hasClass("InputfieldCKEditorLoaded")){var editor=CKEDITOR.instances[$t.attr("id")];if(typeof editor!="undefined"){if(editor.focusManager.hasFocus){editor.focusManager.focus(true);editor.focus()}value=editor.getData()}}else{value=$t.html()}var $input=$t.next("input");$input.attr("value",value)})}function ckeSaveReadyNormal($inputfield){var $normals=$inputfield.hasClass("InputfieldCKEditorNormal")?$inputfield:$inputfield.find(".InputfieldCKEditorNormal");$normals.each(function(){var $t=$(this);if(!$t.hasClass("InputfieldCKEditorLoaded"))return;var editor=CKEDITOR.instances[$t.attr("id")];editor.updateElement()})}function ckeInlineMouseoverEvent(event){var $t=$(this);if($t.hasClass("InputfieldCKEditorLoaded"))return;$t.effect("highlight",{},500);$t.attr("contenteditable","true");var configName=$t.attr("data-configName");var editor=CKEDITOR.inline($(this).attr("id"),ProcessWire.config[configName]);ckeInitEvents(editor);$t.addClass("InputfieldCKEditorLoaded")}function ckeInitTab(event,ui){var $t=ui.newTab;var $a=$t.find("a");if($a.hasClass("InputfieldCKEditor_init"))return;var editorID=$a.attr("data-editorID");var configName=$a.attr("data-configName");var editor=CKEDITOR.replace(editorID,config[configName]);ckeInitEvents(editor);$a.addClass("InputfieldCKEditor_init");ui.oldTab.find("a").addClass("InputfieldCKEditor_init");var $editor=$("#"+editorID);$editor.addClass("InputfieldCKEditorLoaded")}function ckeInitNormal(editorID){var $editor=$("#"+editorID);var $parent=$editor.parent();if(typeof ProcessWire.config.InputfieldCKEditor.editors[editorID]!="undefined"){var configName=ProcessWire.config.InputfieldCKEditor.editors[editorID]}else{var configName=$editor.attr("data-configName")}if($parent.hasClass("ui-tabs-panel")&&$parent.css("display")=="none"){var parentID=$editor.parent().attr("id");var $a=$parent.closest(".ui-tabs, .langTabs").find("a[href=#"+parentID+"]");$a.attr("data-editorID",editorID).attr("data-configName",configName);$parent.closest(".ui-tabs, .langTabs").on("tabsactivate",ckeInitTab)}else{var editor;if(typeof ProcessWire.config[configName]!="undefined"){var editor=CKEDITOR.replace(editorID,ProcessWire.config[configName])}else if(typeof $editor.attr("data-configdata")!="undefined"){var configData=JSON.parse($editor.attr("data-configdata"));ProcessWire.config[configName]=configData;var editor=CKEDITOR.replace(editorID,configData)}if(editor){ckeInitEvents(editor);$editor.addClass("InputfieldCKEditorLoaded")}}}$(document).ready(function(){CKEDITOR.timestamp=ProcessWire.config.InputfieldCKEditor.timestamp;for(var editorID in ProcessWire.config.InputfieldCKEditor.editors){ckeInitNormal(editorID)}$(document).on("reloaded",".InputfieldCKEditor",function(){var $editor=$(this).find(".InputfieldCKEditorNormal:not(.InputfieldCKEditorLoaded)");$editor.each(function(){ckeInitNormal($(this).attr("id"))});return false});CKEDITOR.disableAutoInline=true;$(document).on("mouseover",".InputfieldCKEditorInlineEditor",ckeInlineMouseoverEvent);$(document).on("submit","form.InputfieldForm",function(){ckeSaveReadyInline($(this))});$(document).on("saveReady",".InputfieldCKEditor",function(){ckeSaveReadyNormal($(this));ckeSaveReadyInline($(this))})}); \ No newline at end of file +function ckeGetProcessWireConfig(editor){var editorName=typeof editor=="string"?editor:editor.name;var configName=editorName.replace("Inputfield_","InputfieldCKEditor_");var $repeaterItem="";var settings={};configName=configName.replace("Inputfield_","InputfieldCKEditor_");if(typeof ProcessWire.config[configName]=="undefined"&&configName.indexOf("_repeater")>0){configName=configName.replace(/_repeater[0-9]+/,"");$repeaterItem=$("#"+editorName).closest(".InputfieldRepeaterItem")}if(typeof ProcessWire.config[configName]=="undefined"&&configName.indexOf("_ckeditor")>0){configName=configName.replace(/_ckeditor$/,"")}if(typeof ProcessWire.config[configName]=="undefined"&&configName.indexOf("__")>0){configName=configName.replace(/__\d+$/,"")}if(typeof ProcessWire.config[configName]=="undefined"){settings.error="Cannot find CKEditor settings for "+configName}else{settings=ProcessWire.config[configName]}if($repeaterItem.length){settings["repeaterItem"]=$repeaterItem}else{settings["repeaterItem"]=""}return settings}function ckeLoadPlugins(){for(var name in ProcessWire.config.InputfieldCKEditor.plugins){var file=ProcessWire.config.InputfieldCKEditor.plugins[name];CKEDITOR.plugins.addExternal(name,file,"")}}ckeLoadPlugins();function ckeBlurEvent(event){var editor=event.editor;var $textarea=$(editor.element.$);if(editor.checkDirty()){if($textarea.length){if($textarea.is("textarea"))$textarea.change();$textarea.closest(".Inputfield").addClass("InputfieldStateChanged")}}}function ckeFocusEvent(event){var editor=event.editor;var $textarea=$(editor.element.$);$textarea.trigger("pw-focus")}function ckeResizeEvent(event){var editor=event.editor;var $textarea=$(editor.element.$);if($textarea.length){$textarea.closest(".Inputfield").trigger("heightChanged")}}function ckeUploadEvent(event){var xhr=event.data.fileLoader.xhr;var fileLoader=event.data.fileLoader;var settings=ckeGetProcessWireConfig(event.editor);var uploadFieldName=settings?settings.pwUploadField:"_unknown";var $imageInputfield=$("#Inputfield_"+uploadFieldName);if(typeof settings.repeaterItem!="undefined"&&settings.repeaterItem.length){var $repeaterImageField=settings.repeaterItem.find(".InputfieldImage:not(.InputfieldFileSingle)");if($repeaterImageField.length)$imageInputfield=$repeaterImageField}if($imageInputfield.length){xhr.open("POST",fileLoader.uploadUrl,true);$imageInputfield.trigger("pwimageupload",{name:fileLoader.fileName,file:fileLoader.file,xhr:xhr});event.stop()}else{if(typeof settings.error!="undefined"&&settings.error.length){ProcessWire.alert(settings.error)}else{ProcessWire.alert("Unable to find images field for upload")}event.stop();return false}}function ckeInitEvents(editor){editor.on("blur",ckeBlurEvent);editor.on("focus",ckeFocusEvent);editor.on("change",ckeBlurEvent);editor.on("resize",ckeResizeEvent);editor.on("fileUploadRequest",ckeUploadEvent,null,null,4);var $textarea=$(editor.element.$);var $inputfield=$textarea.closest(".Inputfield.InputfieldColumnWidth");if($inputfield.length)setTimeout(function(){$inputfield.trigger("heightChanged")},1e3)}function ckeSaveReadyInline($inputfield){if(!$inputfield.length)return;var $inlines=$inputfield.hasClass(".InputfieldCKEditorInline")?$inputfield:$inputfield.find(".InputfieldCKEditorInline");if($inlines.length)$inlines.each(function(){var $t=$(this);var value;if($t.hasClass("InputfieldCKEditorLoaded")){var editor=CKEDITOR.instances[$t.attr("id")];if(typeof editor!="undefined"){if(editor.focusManager.hasFocus){editor.focusManager.focus(true);editor.focus()}value=editor.getData()}}else{value=$t.html()}var $input=$t.next("input");$input.attr("value",value)})}function ckeSaveReadyNormal($inputfield){var $normals=$inputfield.hasClass("InputfieldCKEditorNormal")?$inputfield:$inputfield.find(".InputfieldCKEditorNormal");$normals.each(function(){var $t=$(this);if(!$t.hasClass("InputfieldCKEditorLoaded"))return;var editor=CKEDITOR.instances[$t.attr("id")];editor.updateElement()})}function ckeInlineMouseoverEvent(event){var $t=$(this);if($t.hasClass("InputfieldCKEditorLoaded"))return;$t.effect("highlight",{},500);$t.attr("contenteditable","true");var configName=$t.attr("data-configName");var editor=CKEDITOR.inline($(this).attr("id"),ProcessWire.config[configName]);ckeInitEvents(editor);$t.addClass("InputfieldCKEditorLoaded")}function ckeInitTab(event,ui){var $t=ui.newTab;var $a=$t.find("a");if($a.hasClass("InputfieldCKEditor_init"))return;var editorID=$a.attr("data-editorID");var configName=$a.attr("data-configName");var editor=CKEDITOR.replace(editorID,config[configName]);ckeInitEvents(editor);$a.addClass("InputfieldCKEditor_init");ui.oldTab.find("a").addClass("InputfieldCKEditor_init");var $editor=$("#"+editorID);$editor.addClass("InputfieldCKEditorLoaded")}function ckeInitNormal(editorID){var $editor=$("#"+editorID);var $parent=$editor.parent();if(typeof ProcessWire.config.InputfieldCKEditor.editors[editorID]!="undefined"){var configName=ProcessWire.config.InputfieldCKEditor.editors[editorID]}else{var configName=$editor.attr("data-configName")}if($parent.hasClass("ui-tabs-panel")&&$parent.css("display")=="none"){var parentID=$editor.parent().attr("id");var $a=$parent.closest(".ui-tabs, .langTabs").find("a[href=#"+parentID+"]");$a.attr("data-editorID",editorID).attr("data-configName",configName);$parent.closest(".ui-tabs, .langTabs").on("tabsactivate",ckeInitTab)}else{var editor;if(typeof ProcessWire.config[configName]!="undefined"){var editor=CKEDITOR.replace(editorID,ProcessWire.config[configName])}else if(typeof $editor.attr("data-configdata")!="undefined"){var configData=JSON.parse($editor.attr("data-configdata"));ProcessWire.config[configName]=configData;var editor=CKEDITOR.replace(editorID,configData)}if(editor){ckeInitEvents(editor);$editor.addClass("InputfieldCKEditorLoaded")}}}$(document).ready(function(){CKEDITOR.timestamp=ProcessWire.config.InputfieldCKEditor.timestamp;for(var editorID in ProcessWire.config.InputfieldCKEditor.editors){ckeInitNormal(editorID)}$(document).on("reloaded",".InputfieldCKEditor",function(){var $editor=$(this).find(".InputfieldCKEditorNormal:not(.InputfieldCKEditorLoaded)");$editor.each(function(){ckeInitNormal($(this).attr("id"))});return false});$(document).on("image-edit",".InputfieldCKEditor",function(){var $editor=$(this).find(".InputfieldCKEditorNormal");$editor.each(function(){var editorID=$(this).attr("id");if(typeof CKEDITOR.instances[editorID]!=="undefined")CKEDITOR.instances[editorID].destroy();ckeInitNormal(editorID)})});CKEDITOR.disableAutoInline=true;$(document).on("mouseover",".InputfieldCKEditorInlineEditor",ckeInlineMouseoverEvent);$(document).on("submit","form.InputfieldForm",function(){ckeSaveReadyInline($(this))});$(document).on("saveReady",".InputfieldCKEditor",function(){ckeSaveReadyNormal($(this));ckeSaveReadyInline($(this))})}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldCheckbox.css b/wire/modules/Inputfield/InputfieldCheckbox/InputfieldCheckbox.css similarity index 100% rename from wire/modules/Inputfield/InputfieldCheckbox.css rename to wire/modules/Inputfield/InputfieldCheckbox/InputfieldCheckbox.css diff --git a/wire/modules/Inputfield/InputfieldCheckbox.module b/wire/modules/Inputfield/InputfieldCheckbox/InputfieldCheckbox.module similarity index 100% rename from wire/modules/Inputfield/InputfieldCheckbox.module rename to wire/modules/Inputfield/InputfieldCheckbox/InputfieldCheckbox.module diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js index 199628be..7f661b81 100755 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.js @@ -359,9 +359,12 @@ function InputfieldImage($) { .magnificPopup(options); // move all of the .ImageData elements to the edit panel - $edit.find(".InputfieldImageEdit__edit") - .attr("data-current", $el.attr("id")) + var $editEdit = $edit.find(".InputfieldImageEdit__edit"); + $editEdit.attr("data-current", $el.attr("id")) .append($el.find(".ImageData").children().not(".InputfieldFileSort")); + + // trigger image edit event (rpsallis) + $editEdit.find('.Inputfield').trigger('image-edit'); } /** diff --git a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js index da186e16..e523259d 100644 --- a/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js +++ b/wire/modules/Inputfield/InputfieldImage/InputfieldImage.min.js @@ -1 +1 @@ -function InputfieldImage($){var $uploadBeforeItem=null;var uploadReplace={file:"",item:null,edit:null};var magnificOptions={type:"image",closeOnContentClick:true,closeBtnInside:true};var cookieData=null;var retryGridItems=[];var gridSliding=false;function useAjaxUpload(){var isFileReaderSupport=window.File&&window.FileList&&window.FileReader;var isAjaxUpload=$(".InputfieldAllowAjaxUpload").length>0;var isPageIDIndicator=$("#PageIDIndicator").length>0;return isFileReaderSupport&&(isPageIDIndicator||isAjaxUpload)}function throttle(fn,threshhold,scope){threshhold||(threshhold=250);var last,deferTimer;return function(){var context=scope||this;var now=+new Date,args=arguments;if(last&&now .gridImage",start:function(e,ui){var size=getCookieData($el.closest(".Inputfield"),"size");ui.placeholder.append($("
").css({display:"block",height:size+"px",width:size+"px"}));timer=window.setTimeout(function(){closeEdit($el,null)},100);$el.addClass("InputfieldImageSorting")},stop:function(e,ui){var $this=$(this);if(timer!==null){ui.item.find(".InputfieldImageEdit__edit").click();clearTimeout(timer)}$this.children("li").each(function(n){var $sort=$(this).find(".InputfieldFileSort");if($sort.val()!=n)$sort.val(n).change()});$el.removeClass("InputfieldImageSorting")},cancel:".InputfieldImageEdit,.focusArea,input,textarea,button,select,option"};$el.sortable(sortableOptions)}function setupMagnificForRenderValue($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){var src=$(item.el).attr("data-original");if(typeof src=="undefined"||!src)src=$(item.el).attr("src");item.src=src}};options.gallery={enabled:true};$el.find("img").magnificPopup(options)}function setupMagnificForSingle($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){item.src=$(item.el).attr("src")}};options.gallery={enabled:false};$el.find("img").magnificPopup(options)}function findEditedElement($parent){return $parent.find(".InputfieldImageEdit--active")}function findEditMarkup($edit){return $("#"+$edit.find(".InputfieldImageEdit__edit").attr("data-current"))}function setDeleteStateOnAllItems($input){var checked=$input.is(":checked");var $items=$input.parents(".gridImages").find(".gridImage__deletebox");if(checked){$items.prop("checked","checked").change()}else{$items.prop("checked",false).change()}}function updateGrid($inputfield){var $gridImages;if(typeof $inputfield=="undefined"){$gridImages=$(".gridImages")}else{$gridImages=$inputfield.find(".gridImages")}$gridImages.each(function(){var $grid=$(this),$edit=findEditedElement($grid);if($edit.length){moveEdit(findEditMarkup($edit),$edit)}})}function checkInputfieldWidth($inputfield){var narrowItems=[];var mediumItems=[];var wideItems=[];var n=0,ni=0,mi=0,wi=0;var $inputfields;var $item;if(typeof $inputfield=="undefined"){$inputfields=$(".InputfieldImage.Inputfield")}else{$inputfields=$inputfield}$inputfields.removeClass("InputfieldImageNarrow InputfieldImageMedium InputfieldImageWide");$inputfields.each(function(){$item=$(this);var width=$item.width();if(width<1)return;if(width<=500){narrowItems[ni]=$item;ni++}else if(width<=900){mediumItems[mi]=$item;mi++}else{wideItems[wi]=$item;wi++}});for(n=0;n100?100:top,left:left>100?100:left,zoom:zoom>100?0:zoom};return focusData}function getFocusStr(focusObj){if(typeof focusObj=="undefined")focusObj=getFocus();return focusObj.top+" "+focusObj.left+" "+focusObj.zoom}function getFocusProperty(property){var focus=getFocus();return focus[property]}function setFocus(focusObj){focusData=focusObj;var focusStr=focusObj.top+" "+focusObj.left+" "+focusObj.zoom;$thumb.attr("data-focus",focusStr);$input=$edit.find(".InputfieldImageFocus");if(focusStr!=$input.val()){$input.val(focusStr).trigger("change")}}function setFocusProperty(property,value){var focus=getFocus();focus[property]=value;setFocus(focus)}function setFocusDragPosition(){var focus=getFocus();var $overlay=$focusCircle.parent();var w=$overlay.width();var h=$overlay.height();var x=Math.round(focus.left/100*w);var y=Math.round(focus.top/100*h);if(x<0)x=0;if(y<0)y=0;if(x>w)x=w;if(y>h)y=h;$focusCircle.css({top:y+"px",left:x+"px"})}$focusArea=$img.siblings(".focusArea");if(!$focusArea.length){$focusArea=$("
").addClass("focusArea");$img.after($focusArea)}$focusArea.css({height:$img.height()+"px",width:$img.width()+"px","background-color":"rgba(0,0,0,0.7)"}).addClass("focusActive");$focusCircle=$focusArea.find(".focusCircle");if(!$focusCircle.length){$focusCircle=$("
").addClass("focusCircle");$focusArea.append($focusCircle)}$img.parent().addClass("focusWrap");setFocusDragPosition();var zoomSlide=function(zoomPercent){var zoomBoxSize,focus,faWidth,faHeight;if(typeof zoomPercent=="undefined")zoomPercent=lastZoomPercent;lastZoomPercent=zoomPercent;faWidth=$focusArea.width();faHeight=$focusArea.height();if(faWidth>faHeight){$zoomBox.height(100-zoomPercent+"%");zoomBoxSize=$zoomBox.height();$zoomBox.width(zoomBoxSize)}else{$zoomBox.width(100-zoomPercent+"%");zoomBoxSize=$zoomBox.width();$zoomBox.height(zoomBoxSize)}focus=getFocus();var crop=getFocusZoomCropDimensions(focus.left,focus.top,zoomPercent,faWidth,faHeight,zoomBoxSize);$zoomBox.css({top:crop.top+"px",left:crop.left+"px","background-position":"-"+crop.left+"px -"+crop.top+"px","background-size":faWidth+"px "+faHeight+"px"});focus.zoom=zoomPercent;setFocusProperty("zoom",focus.zoom);if(mode=="grid")setGridSizeItem($thumb.parent(),gridSize,false,focus)};var dragEvent=function(event,ui){var $this=$(this);var circleSize=$this.outerHeight();var w=$this.parent().width();var h=$this.parent().height();var top=ui.position.top>0?ui.position.top:0;var left=ui.position.left>0?ui.position.left:0;top=top>0?top/h*100:0;left=left>0?left/w*100:0;var newFocus={top:top,left:left,zoom:getFocusProperty("zoom")};setFocus(newFocus);if(useZoomFocus){zoomSlide(newFocus.zoom)}else if(mode=="grid"){setGridSizeItem($thumb.parent(),gridSize,false,newFocus)}};$focusCircle.draggable({containment:"parent",drag:dragEvent,stop:dragEvent});if(useZoomFocus){var zoom=getFocusProperty("zoom");$zoomSlider=$("
").addClass("focusZoomSlider").css({"margin-top":"5px"});$zoomBox=$("
").addClass("focusZoomBox").css({position:"absolute",background:"transparent","background-image":"url("+$img.attr("src")+")"});$focusArea.prepend($zoomBox);$img.after($zoomSlider);$thumb.attr("src",$img.attr("src"));$zoomSlider.slider({min:0,max:50,value:zoom,range:"max",slide:function(event,ui){zoomSlide(ui.value)}});zoomSlide(zoom)}else{$focusArea.css("background-color","rgba(0,0,0,0.5)")}}function stopFocus($edit){$focusCircle=$edit.find(".focusCircle");if($focusCircle.length){var $focusWrap=$focusCircle.closest(".focusWrap");$focusWrap.find(".focusZoomSlider").slider("destroy").remove();$focusWrap.find(".focusZoomBox").remove();$focusWrap.removeClass("focusWrap");$focusCircle.draggable("destroy");$focusCircle.parent().removeClass("focusActive");$focusCircle.remove();var $button=$edit.find(".InputfieldImageButtonFocus");if($button.length){$icon=$button.find("i");$icon.removeClass("focusIconActive").toggleClass($icon.attr("data-toggle"))}}}function getFocusZoomPosition(focusPercent,sourceDimension,cropDimension){var focusPX=parseInt(sourceDimension*focusPercent/100);var position=parseInt(focusPX-cropDimension/2);var maxPosition=parseInt(sourceDimension-cropDimension);if(0>position)position=0;if(maxPosition=percentH?faWidth:faHeight;var cropDimension=maxDimension-maxDimension*zoomPercent/100;var posLeft=getFocusZoomPosition(focusLeft,faWidth,cropDimension);var posTop=getFocusZoomPosition(focusTop,faHeight,cropDimension);return{left:posLeft,top:posTop,width:cropDimension,height:cropDimension}}function getFocusZoomPosition4GridviewSquare(focusPercent,sourceDimPX,gridViewPX,zoomPercent,scale,smallestSidePX){sourceDimPX=sourceDimPX*scale;var gridViewPercent=gridViewPX/sourceDimPX*100;var adjustPercent=gridViewPercent/2;var posPercent=focusPercent-adjustPercent;var posMinVal=0;var posMaxVal=100-gridViewPercent;if(posPercent<=posMinVal)posPercent=0;if(posPercent>=posMaxVal)posPercent=posMaxVal;var posPX=sourceDimPX/100*posPercent/scale;posPX=-1*parseInt(posPX);return posPX}function getFocusZoomCropDimensions4GridviewSquare(focusLeft,focusTop,zoomPercent,w,h,gridViewSize,scale){var smallestSidePX=w>=h?h:w;var posLeft=getFocusZoomPosition4GridviewSquare(focusLeft,w,gridViewSize,zoomPercent,scale,smallestSidePX);var posTop=getFocusZoomPosition4GridviewSquare(focusTop,h,gridViewSize,zoomPercent,scale,smallestSidePX);var transformLeft=parseInt(posLeft);var transformTop=parseInt(posTop);return{transformLeft:transformLeft,transformTop:transformTop,scale:scale}}function tearDownEdit($edit){stopFocus($edit);$edit.off("click",".InputfieldImageButtonFocus");$inputArea=$edit.find(".InputfieldImageEdit__edit");if($inputArea.children().not(".InputfieldFileSort").length){var $items=$inputArea.children();$("#"+$inputArea.attr("data-current")).find(".ImageData").append($items)}}function closeEdit($parent,$not){var $edit;if($parent){$edit=$parent.find(".InputfieldImageEdit--active")}else if($not){$edit=$(".InputfieldImageEdit--active").not($not.find(".InputfieldImageEdit--active"))}else{$edit=$(".InputfieldImageEdit--active")}if($edit.length){tearDownEdit($edit);$edit.removeClass("InputfieldImageEdit--active").removeAttr("id");$("#"+$edit.attr("data-for")).removeClass("gridImageEditing")}$(".InputfieldImageEdit__replace").removeClass("InputfieldImageEdit__replace")}function moveEdit($el,$edit){if(!$el||!$el.length)return;var $children=$el.parent().children().not(".InputfieldImageEdit");var lastTop=0;var found=false;var $insertBeforeItem=null;$children.each(function(){if($insertBeforeItem)return;var $item=$(this);var top=$item.offset().top;if(found&&top!=lastTop){$insertBeforeItem=$item}else if($item.attr("id")==$el.attr("id")){found=true}lastTop=top});if($insertBeforeItem){$edit.insertBefore($insertBeforeItem)}else{$edit.insertAfter($children.eq($children.length-1))}var $arrow=$edit.find(".InputfieldImageEdit__arrow");if($arrow.length)$arrow.css("left",$el.position().left+$el.outerWidth()/2+"px")}function initGridEvents(){$(window).resize(throttle(windowResize,200));$(document).on("click dblclick",".gridImage__trash",function(e){var $input=$(this).find("input");$input.prop("checked",inverseState).change();if(e.type=="dblclick"){setDeleteStateOnAllItems($input);e.preventDefault();e.stopPropagation()}});$(document).on("change",".gridImage__deletebox",function(){updateDeleteClass($(this))});$(document).on("click",".gridImage__edit",function(e){var $el=$(this).closest(".gridImage");if(!$el.length)return;if($el.closest(".InputfieldImageEditAll").length)return false;var $all=$el.closest(".gridImages");var $edit=$all.find(".InputfieldImageEdit");if($el.hasClass("gridImageEditing")){$edit.find(".InputfieldImageEdit__close").click()}else{moveEdit($el,$edit);tearDownEdit($edit);setupEdit($el,$edit);$edit.addClass("InputfieldImageEdit--active").attr("data-for",$el.attr("id"));$all.find(".gridImageEditing").removeClass("gridImageEditing");$el.addClass("gridImageEditing")}}).on("click",".InputfieldImageEditAll img",function(e){e.stopPropagation();e.preventDefault();$.magnificPopup.close();var options=$.extend(true,{},magnificOptions);var $img=$(this);options["items"]={src:$img.attr("data-original"),title:$img.attr("alt")};$.magnificPopup.open(options);return true}).on("click",".InputfieldImageButtonFocus",function(){var $button=$(this);var $icon=$button.find("i");var $edit=$button.closest(".InputfieldImageEdit, .gridImage");var $focusCircle=$edit.find(".focusCircle");if($focusCircle.length){stopFocus($edit)}else{startFocus($edit);$icon.addClass("focusIconActive");$icon.toggleClass($icon.attr("data-toggle"))}});$(document).on("click",function(e){var $el=$(e.target);if(typeof clickLanguageTabActive!="undefined"&&clickLanguageTabActive){return}if($el.closest(".InputfieldImageEdit").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.is("input, textarea")&&$el.closest(".InputfieldImageEditAll").length){$el.focus().one("blur",function(){$el.closest(".gridImages").sortable("enable")});$el.closest(".gridImages").sortable("disable")}else if($el.closest(".gridImage__inner").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.closest(".mfp-container").length){return}else if($el.closest(".ui-dialog").length){return}else if($el.is(".mfp-close")){return}else if($el.is("a.remove")){return}else{closeEdit(null,null)}});$(document).on("click",".InputfieldImageEdit__close",function(e){closeEdit($(this).parents(".gridImages"),null)});$(document).on("change",".InputfieldImage",function(){$(this).find(".InputfieldImageButtonCrop:not(.pw-modal-dblclick)").addClass("pw-modal-dblclick ui-state-disabled")}).on("click",".InputfieldImageButtonCrop.ui-state-disabled",function(e){var $button=$(this);var $list=$button.closest(".gridImages");if(!$list.hasClass("gridImagesAlerted")){ProcessWire.alert(ProcessWire.config.InputfieldImage.labels.changes);$list.addClass("gridImagesAlerted")}setTimeout(function(){$button.removeClass("ui-state-active")},500);return false});$(".ImagesGrid").on("click","button.pw-modal",function(e){e.preventDefault()});setupEditableFilename();checkInputfieldWidth()}function setupEditableFilename(){$(document).on("click",".InputfieldImageEdit__name",function(e){var $span=$(this).children("span");var $input=$span.closest(".gridImage, .InputfieldImageEdit").find(".InputfieldFileRename");var $list=$span.closest(".gridImages");$list.sortable("disable");$input.val($span.text());$span.on("keypress",function(e){if(e.which==13){$span.blur();return false}return true});$span.attr("autocomplete","off").attr("autocorrect","off").attr("autocapitalize","off").attr("spellcheck","false");$span.focus().on("blur",function(){var val=$(this).text();if($.trim(val).length<1){$span.text($input.val())}else if(val!=$input.val()){$input.val(val).change();$list.closest(".Inputfield").trigger("change")}$span.off("keypress");$list.sortable("enable")})})}function setListSize($inputfield,pct){pct=Math.floor(pct);$inputfield.find(".gridImage__overflow").each(function(){var dataPct=100-pct;var $this=$(this);$this.css("width",pct+"%");$this.siblings(".ImageData").css("width",dataPct+"%");$this.find("img").css({top:0,left:0,transform:"none"})});setCookieData($inputfield,"listSize",pct)}function setGridSize($inputfield,gridSize,ragged){if(!gridSize)return;var size=gridSize+"px";var $gridImages=$inputfield.find(".gridImages");if(typeof ragged=="undefined"||ragged==null)ragged=$gridImages.attr("data-ragged")?true:false;if(ragged){$gridImages.attr("data-ragged",1)}else{$gridImages.removeAttr("data-ragged")}$gridImages.find(".gridImage__overflow").each(function(){setGridSizeItem($(this),gridSize,ragged)});$gridImages.find(".gridImage__edit, .gridImage__resize").css("line-height",size);$gridImages.attr("data-size",gridSize);setCookieData($inputfield,"size",gridSize);if(retryGridItems.length)setTimeout(function(){while(retryGridItems.length){var item=retryGridItems.pop();setGridSizeItem(item.item,item.gridSize,ragged)}},150)}function setGridSizeItem($item,gridSize,ragged,focus){var $img;if($item.hasClass("gridImage__overflow")){$img=$item.children("img")}else if($item.is("img")){$img=$item;$item=$img.closest(".gridImage__overflow")}else{return}if(!gridSize){$img.removeAttr("width").removeAttr("height");$item.width("auto").height("auto");return}var zoom=0;var w=$img.width();var h=$img.height();var dataW=parseInt($img.attr("data-w"));var dataH=parseInt($img.attr("data-h"));if(!w)w=dataW;if(!h)h=dataH;if(!ragged&&typeof focus=="undefined"){var focusStr=$img.attr("data-focus");if(typeof focusStr=="undefined")focusStr="50.0 50.0 0";var focusArray=focusStr.split(" ");focus={top:parseFloat(focusArray[0]),left:parseFloat(focusArray[1]),zoom:parseInt(focusArray[2])}}if(!ragged)zoom=focus.zoom;if(ragged){$img.attr("height",gridSize).removeAttr("width");$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"})}else if(zoom>0&&$item.closest(".InputfieldImageFocusZoom").length&&!gridSliding){var maxHeight,maxWidth;if(w>=h){maxHeight="100%";maxWidth="none";if(w==dataW){h=gridSize;w=h/dataH*dataW}}else{maxHeight="none";maxWidth="100%";if(h==dataH){w=gridSize;h=w/dataW*dataH}}var scale=1+zoom/100*2;var crop=getFocusZoomCropDimensions4GridviewSquare(focus.left,focus.top,zoom,w,h,gridSize,scale);$img.css({left:"0px",top:"0px","transform-origin":"0px 0px",transform:"scale("+crop.scale+") translate3d("+crop.transformLeft+"px, "+crop.transformTop+"px, 0)","max-width":maxWidth,"max-height":maxHeight})}else if(w>=h){$img.attr("height",gridSize).removeAttr("width");if(focus.left<1)focus.left=.001;$img.css({"max-height":"100%","max-width":"none",top:"50%",left:focus.left+"%",transform:"translate3d(-"+focus.left+"%, -50%, 0)"})}else if(h>w){$img.attr("width",gridSize).removeAttr("height");if(focus.top<1)focus.top=.001;$img.css({"max-height":"none","max-width":"100%",top:focus.top+"%",left:"50%",transform:"translate3d(-50%, -"+focus.top+"%, 0)"})}else{$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"});$img.removeAttr("width").attr("height",gridSize)}w=$img.width();if(w){$item.css({width:ragged?w+"px":gridSize+"px",height:gridSize+"px"})}else{var tries=$item.attr("data-tries");if(!tries)tries=0;if(typeof tries=="undefined")tries=0;tries=parseInt(tries);if(tries>3){$item.css({width:gridSize+"px",height:gridSize+"px"})}else{retryGridItems.push({item:$item,gridSize:gridSize});$item.attr("data-tries",tries+1)}}}function setupImageListToggle($target){if($target.find(".InputfieldImageListToggle").length)return;var $list=$("").append("");var $left=$("").append("");var $grid=$("").append("");var activeClass="InputfieldImageListToggle--active";var defaultMode="";var toggleClick=function(e){var $a=$(this);var $inputfield=$a.closest(".Inputfield");var href=$a.attr("href");var size;var $aPrev=$a.parent().children("."+activeClass);var hrefPrev=$aPrev.attr("href");$aPrev.removeClass(activeClass);$a.addClass(activeClass);stopFocus($inputfield);if(href=="list"){if(!$inputfield.hasClass("InputfieldImageEditAll")){$inputfield.find(".InputfieldImageEdit--active .InputfieldImageEdit__close").click();$inputfield.addClass("InputfieldImageEditAll")}size=getCookieData($inputfield,"listSize");setListSize($inputfield,size);setCookieData($inputfield,"mode","list")}else if(href=="left"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,true);setCookieData($inputfield,"mode","left");updateGrid()}else if(href=="grid"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,false);setCookieData($inputfield,"mode","grid");if(hrefPrev=="left")setTimeout(function(){setGridSize($inputfield,size,false)},100)}setupSortable($inputfield.find(".gridImages"));$a.blur();return false};$list.click(toggleClick);$left.click(toggleClick);$grid.click(toggleClick);if($target.hasClass("InputfieldImage")){$target.children(".InputfieldHeader").append($list).append($left).append($grid);defaultMode=getCookieData($target,"mode")}else{$(".InputfieldImage > .InputfieldHeader",$target).append($list).append($left).append($grid)}if(defaultMode=="list"){$list.click()}else if(defaultMode=="left"){$left.click()}else{}}function setupSizeSlider($inputfield){var $header=$inputfield.children(".InputfieldHeader");if($header.children(".InputfieldImageSizeSlider").length)return;var $gridImages=$inputfield.find(".gridImages");var gridSize=$gridImages.attr("data-gridsize");var min=gridSize/2;var max=gridSize*2;var $slider=$('');$header.append($slider);var sizeSlide=function(event,ui){var value=ui.value;var minPct=15;var divisor=Math.floor(gridSize/minPct);var v=value-min;var listSize=Math.floor(minPct+v/divisor);if($inputfield.hasClass("InputfieldImageEditAll")){setCookieData($inputfield,"size",value);setListSize($inputfield,listSize)}else{setCookieData($inputfield,"listSize",listSize);setGridSize($inputfield,value)}};$slider.slider({min:min,max:max,value:getCookieData($inputfield,"size"),range:"min",slide:sizeSlide,start:function(event,ui){gridSliding=true;if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}},stop:function(event,ui){gridSliding=false;sizeSlide(event,ui);updateGrid($inputfield)}})}function setCookieData($inputfield,property,value){var data=getCookieData($inputfield);var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"";if(!name.length||typeof value=="undefined")return;if(data[name][property]==value)return;data[name][property]=value;$.cookie("InputfieldImage",data,{secure:window.location.protocol.indexOf("https:")===0});cookieData=data}function getCookieData($inputfield,property){if(cookieData&&typeof property=="undefined")return cookieData;var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"na";var data=cookieData?cookieData:$.cookie("InputfieldImage");var value=null;if(!data)data={};if(typeof data[name]=="undefined")data[name]={};if(typeof data[name].size=="undefined"||!data[name].size){data[name].size=parseInt($inputfield.find(".gridImages").attr("data-size"));if(!data[name].size)data[name].size=130}if(typeof data[name].listSize=="undefined"||!data[name].listSize){data[name].listSize=23}if(typeof data[name].mode=="undefined"||!data[name].mode){data[name].mode=$inputfield.find(".gridImages").attr("data-gridMode");if(!data[name].mode)data[name].mode="list"}if(cookieData==null)cookieData=data;if(typeof property=="undefined"){value=data}else if(property===true){value=data[name]}else if(typeof data[name][property]!="undefined"){value=data[name][property]}return value}function initInputfield($inputfield){if($inputfield.hasClass("InputfieldStateCollapsed"))return;var maxFiles=parseInt($inputfield.find(".InputfieldImageMaxFiles").val());var $gridImages=$inputfield.find(".gridImages");var size=getCookieData($inputfield,"size");var mode=getCookieData($inputfield,"mode");var ragged=mode=="left"?true:false;var renderValueMode=$inputfield.hasClass("InputfieldRenderValueMode");if(!size)size=$gridImages.attr("data-gridsize");size=parseInt(size);if(!renderValueMode&&($inputfield.hasClass("InputfieldImageEditAll")||mode=="list")){var listSize=getCookieData($inputfield,"listSize");setListSize($inputfield,listSize)}else{setGridSize($inputfield,size,ragged)}if(!$inputfield.hasClass("InputfieldImageInit")){$inputfield.addClass("InputfieldImageInit");if(renderValueMode){return setupMagnificForRenderValue($inputfield)}else if(maxFiles==1){$inputfield.addClass("InputfieldImageMax1");setupMagnificForSingle($inputfield)}else{setupSortable($gridImages)}setupImageListToggle($inputfield);setupSizeSlider($inputfield)}checkInputfieldWidth($inputfield);$inputfield.on("change",".InputfieldFileActionSelect",function(){var $note=$(this).next(".InputfieldFileActionNote");if($(this).val().length){$note.fadeIn()}else{$note.hide()}})}function initUploadOldSchool(){$("body").addClass("ie-no-drop");$(".InputfieldImage.InputfieldFileMultiple").each(function(){var $field=$(this),maxFiles=parseInt($field.find(".InputfieldFileMaxFiles").val()),$list=$field.find(".gridImages"),$uploadArea=$field.find(".InputfieldImageUpload");$uploadArea.on("change","input[type=file]",function(){var $t=$(this),$mask=$t.parent(".InputMask");if($t.val().length>1)$mask.addClass("ui-state-disabled");else $mask.removeClass("ui-state-disabled");if($t.next("input.InputfieldFile").length>0)return;var numFiles=$list.children("li").length+$uploadArea.find("input[type=file]").length+1;if(maxFiles>0&&numFiles>=maxFiles)return;$uploadArea.find(".InputMask").not(":last").each(function(){var $m=$(this);if($m.find("input[type=file]").val()<1)$m.remove()});var $i=$mask.clone().removeClass("ui-state-disabled");$i.children("input[type=file]").val("");$i.insertAfter($mask)})})}function initUploadHTML5($inputfield){var $target;if($inputfield.length>0){$target=$inputfield.find(".InputfieldImageUpload")}else{$target=$(".InputfieldImageUpload")}$target.each(function(i){var $this=$(this);var $content=$this.closest(".InputfieldContent");if($this.hasClass("InputfieldImageInitUpload"))return;initHTML5Item($content,i);$this.addClass("InputfieldImageInitUpload")});function initHTML5Item($this,i){var $form=$this.parents("form");var $repeaterItem=$this.closest(".InputfieldRepeaterItem");var postUrl=$repeaterItem.length?$repeaterItem.attr("data-editUrl"):$form.attr("action");postUrl+=(postUrl.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var $postToken=$form.find("input._post_token");var postTokenName=$postToken.attr("name");var postTokenValue=$postToken.val();var $errorParent=$this.find(".InputfieldImageErrors").first();var fieldName=$this.find(".InputfieldImageUpload").data("fieldname");fieldName=fieldName.slice(0,-2);var $inputfield=$this.closest(".Inputfield.InputfieldImage");var extensions=$this.find(".InputfieldImageUpload").data("extensions").toLowerCase();var maxFilesize=$this.find(".InputfieldImageUpload").data("maxfilesize");var filesUpload=$this.find("input[type=file]").get(0);var $fileList=$this.find(".gridImages");var fileList=$fileList.get(0);var gridSize=$fileList.data("gridsize");var doneTimer=null;var maxFiles=parseInt($this.find(".InputfieldImageMaxFiles").val());var resizeSettings=getClientResizeSettings($inputfield);var useClientResize=resizeSettings.maxWidth>0||resizeSettings.maxHeight>0||resizeSettings.maxSize>0;setupDropzone($this);if(maxFiles!=1)setupDropInPlace($fileList);$fileList.children().addClass("InputfieldFileItemExisting");$inputfield.on("pwimageupload",function(event,data){traverseFiles([data.file],data.xhr)});function errorItem(message,filename){if(typeof filename!=="undefined")message=""+filename+": "+message;var icon=" ";return"
  • "+icon+message+"
  • "}function basename(str){var base=new String(str).substring(str.lastIndexOf("/")+1);if(base.lastIndexOf(".")!=-1)base=base.substring(0,base.lastIndexOf("."));return base}function setupDropzone($el){if($el.hasClass("InputfieldImageDropzoneInit"))return;var el=$el.get(0);var $inputfield=$el.closest(".Inputfield");function dragStart(){if($inputfield.hasClass("pw-drag-in-file"))return;$el.addClass("ui-state-hover");$inputfield.addClass("pw-drag-in-file")}function dragStop(){if(!$inputfield.hasClass("pw-drag-in-file"))return;$el.removeClass("ui-state-hover");$inputfield.removeClass("pw-drag-in-file")}el.addEventListener("dragleave",function(){dragStop()},false);el.addEventListener("dragenter",function(evt){evt.preventDefault();dragStart()},false);el.addEventListener("dragover",function(evt){if(!$el.is("ui-state-hover"))dragStart();evt.preventDefault();evt.stopPropagation();return false},false);el.addEventListener("drop",function(evt){traverseFiles(evt.dataTransfer.files);dragStop();evt.preventDefault();evt.stopPropagation();return false},false);$el.addClass("InputfieldImageDropzoneInit")}function setupDropInPlace($gridImages){var $i=null;var haltDrag=false;var timer=null;var $inputfield=$gridImages.closest(".Inputfield");function addInputfieldClass(){$inputfield.addClass("pw-drag-in-file")}function removeInputfieldClass(){$inputfield.removeClass("pw-drag-in-file")}function getCenterCoordinates($el){var offset=$el.offset();var width=$el.width();var height=$el.height();var centerX=offset.left+width/2;var centerY=offset.top+height/2;return{clientX:centerX,clientY:centerY}}function noDropInPlace(){return $gridImages.find(".InputfieldImageEdit--active").length>0}function dragEnter(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null){var gridSize=$gridImages.attr("data-size")+"px";var $o=$("
    ").addClass("gridImage__overflow");if($gridImages.closest(".InputfieldImageEditAll").length){$o.css({width:"100%",height:gridSize})}else{$o.css({width:gridSize,height:gridSize})}$i=$("
  • ").addClass("ImageOuter gridImage gridImagePlaceholder").append($o);$gridImages.append($i)}var coords=getCenterCoordinates($i);$i.simulate("mousedown",coords)}function dragOver(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null)return;var coords={clientX:evt.originalEvent.clientX,clientY:evt.originalEvent.clientY};$i.simulate("mousemove",coords)}function dragEnd(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();if($i==null)return false;haltDrag=true;if(timer)clearTimeout(timer);timer=setTimeout(function(){if(!haltDrag||$i==null)return;$i.remove();$i=null;removeInputfieldClass()},1e3)}function drop(evt){if(noDropInPlace())return;removeInputfieldClass();haltDrag=false;var coords={clientX:evt.clientX,clientY:evt.clientY};$i.simulate("mouseup",coords);$uploadBeforeItem=$i.next(".gridImage");$i.remove();$i=null}if($gridImages.length&&!$gridImages.hasClass("gridImagesInitDropInPlace")){$gridImages.on("dragenter",dragEnter);$gridImages.on("dragover",dragOver);$gridImages.on("dragleave",dragEnd);$gridImages.on("drop",drop);$gridImages.addClass("gridImagesInitDropInPlace")}}function uploadFile(file,extension,xhrsub){var labels=ProcessWire.config.InputfieldImage.labels;var filesizeStr=parseInt(file.size/1024,10)+" kB";var tooltipMarkup=""+'
    '+""+""+'"+""+""+""+""+""+""+"
    "+labels.dimensions+"'+labels.na+"
    "+labels.filesize+""+filesizeStr+"
    "+labels.variations+"0
    "+"
    ";var $progressItem=$('
  • '),$tooltip=$(tooltipMarkup),$imgWrapper=$('
    '),$imageData=$('
    '),$hover=$("
    "),$progressBar=$(""),$edit=$(' '),$spinner=$('
    '),reader,xhr,fileData,fileUrl=URL.createObjectURL(file),$fileList=$inputfield.find(".gridImages"),singleMode=maxFiles==1,size=getCookieData($inputfield,"size"),listSize=getCookieData($inputfield,"listSize"),listMode=$inputfield.hasClass("InputfieldImageEditAll"),$img=$('');$imgWrapper.append($img);$hover.find(".gridImage__inner").append($edit);$hover.find(".gridImage__inner").append($spinner.css("display","none"));$hover.find(".gridImage__inner").append($progressBar);$imageData.append($(""+'

    '+file.name+"

    "+''+filesizeStr+""));if(listMode){$imgWrapper.css("width",listSize+"%");$imageData.css("width",100-listSize+"%")}else{$imgWrapper.css({width:size+"px",height:size+"px"})}$progressItem.append($tooltip).append($imgWrapper).append($hover).append($imageData);$img.attr({src:fileUrl,"data-original":fileUrl});img=new Image;img.addEventListener("load",function(){$tooltip.find(".dimensions").html(this.width+" × "+this.height);var factor=Math.min(this.width,this.height)/size;$img.attr({width:this.width/factor,height:this.height/factor})},false);img.src=fileUrl;if(typeof xhrsub!="undefined"){xhr=xhrsub}else{xhr=new XMLHttpRequest}function updateProgress(evt){if(typeof evt!="undefined"){if(!evt.lengthComputable)return;$progressBar.val(parseInt(evt.loaded/evt.total*100))}$("body").addClass("pw-uploading");$spinner.css("display","block")}xhr.upload.addEventListener("progress",updateProgress,false);xhr.addEventListener("load",function(){xhr.getAllResponseHeaders();var response=$.parseJSON(xhr.responseText);if(typeof response.ajaxResponse!="undefined")response=response.ajaxResponse;var wasZipFile=response.length>1;if(response.error!==undefined)response=[response];for(var n=0;n-1){uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.indexOf("?"))}var uploadReplaceExt=uploadReplaceName.substring(uploadReplaceName.lastIndexOf(".")+1).toLowerCase();uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.lastIndexOf("."));if(uploadReplaceExt==uploadNewExt){$imageEditName.children("span").text(uploadReplaceName).removeAttr("contenteditable")}$markup.find(".gridImage__edit").click()}uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null}if(doneTimer)clearTimeout(doneTimer);$uploadBeforeItem=null;doneTimer=setTimeout(function(){if(maxFiles!=1){setupSortable($fileList)}else{setupMagnificForSingle($inputfield)}$("body").removeClass("pw-uploading");$fileList.trigger("AjaxUploadDone")},500);$inputfield.trigger("change").removeClass("InputfieldFileEmpty")},false);if(uploadReplace.edit){uploadReplace.edit.find(".InputfieldImageEdit__close").click()}else if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}if(uploadReplace.item){uploadReplace.item.replaceWith($progressItem);uploadReplace.item=$progressItem}else if($uploadBeforeItem&&$uploadBeforeItem.length){$uploadBeforeItem.before($progressItem)}else{$fileList.append($progressItem)}function sendUpload(file,imageData){if(typeof xhrsub=="undefined"){xhr.open("POST",postUrl,true)}xhr.setRequestHeader("X-FILENAME",encodeURIComponent(file.name));xhr.setRequestHeader("X-FIELDNAME",fieldName);if(uploadReplace.item)xhr.setRequestHeader("X-REPLACENAME",uploadReplace.file);xhr.setRequestHeader("Content-Type","application/octet-stream");xhr.setRequestHeader("X-"+postTokenName,postTokenValue);xhr.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");if(typeof imageData!="undefined"&&imageData!=false){xhr.send(imageData)}else{xhr.send(file)}updateGrid();$inputfield.trigger("change");var numFiles=$inputfield.find(".InputfieldFileItem").length;if(numFiles==1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else if(numFiles>1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}updateProgress();var ext=file.name.substring(file.name.lastIndexOf(".")+1).toLowerCase();if(useClientResize&&(ext=="jpg"||ext=="jpeg"||ext=="png"||ext=="gif")){var resizer=new PWImageResizer(resizeSettings);$spinner.addClass("pw-resizing");resizer.resize(file,function(imageData){$spinner.removeClass("pw-resizing");sendUpload(file,imageData)})}else{sendUpload(file)}}function traverseFiles(files,xhr){var toKilobyte=function(i){return parseInt(i/1024,10)};if(typeof files==="undefined"){fileList.innerHTML="No support for the File API in this web browser";return}for(var i=0,l=files.length;imaxFilesize&&maxFilesize>2e6){var filesizeKB=toKilobyte(files[i].size),maxFilesizeKB=toKilobyte(maxFilesize);if(typeof ProcessWire.config.InputfieldFile.labels["too-big"]!="undefined"){message=ProcessWire.config.InputfieldFile.labels["too-big"];message=message.replace("MAX_KB",maxFilesizeKB)}else{message="Filesize "+filesizeKB+" kb is too big. Maximum allowed is "+maxFilesizeKB+" kb"}$errorParent.append(errorItem(message,files[i].name))}else if(typeof xhr!="undefined"){uploadFile(files[i],extension,xhr)}else{uploadFile(files[i],extension)}if(maxFiles==1)break}}filesUpload.addEventListener("change",function(evt){traverseFiles(this.files);evt.preventDefault();evt.stopPropagation();this.value=""},false)}function setupEnlargementDropzones(){var sel=".InputfieldImageEdit__imagewrapper img";$(document).on("dragenter",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var src=$this.attr("src");var $edit=$this.closest(".InputfieldImageEdit");var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.addClass("InputfieldImageEdit__replace");uploadReplace.file=new String(src).substring(src.lastIndexOf("/")+1);uploadReplace.item=$("#"+$edit.attr("data-for"));uploadReplace.edit=$edit}).on("dragleave",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.removeClass("InputfieldImageEdit__replace");uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null})}setupEnlargementDropzones()}function getClientResizeSettings($inputfield){var settings={maxWidth:0,maxHeight:0,maxSize:0,quality:1,autoRotate:true,debug:ProcessWire.config.debug};var data=$inputfield.attr("data-resize");if(typeof data!="undefined"&&data.length){data=data.split(";");settings.maxWidth=data[0].length?parseInt(data[0]):0;settings.maxHeight=data[1].length?parseInt(data[1]):0;settings.maxSize=data[2].length?parseFloat(data[2]):0;settings.quality=parseFloat(data[3])}return settings}function init(){$(".InputfieldImage.Inputfield").each(function(){initInputfield($(this))});initGridEvents();if(useAjaxUpload()){initUploadHTML5("")}else{initUploadOldSchool()}$(document).on("reloaded",".InputfieldImage",function(){var $inputfield=$(this);initInputfield($inputfield);initUploadHTML5($inputfield);Inputfields.init($inputfield)}).on("wiretabclick",function(e,$newTab,$oldTab){$newTab.find(".InputfieldImage").each(function(){initInputfield($(this))})}).on("opened",".InputfieldImage",function(){initInputfield($(this))})}init()}jQuery(document).ready(function($){InputfieldImage($)}); \ No newline at end of file +function InputfieldImage($){var $uploadBeforeItem=null;var uploadReplace={file:"",item:null,edit:null};var magnificOptions={type:"image",closeOnContentClick:true,closeBtnInside:true};var cookieData=null;var retryGridItems=[];var gridSliding=false;function useAjaxUpload(){var isFileReaderSupport=window.File&&window.FileList&&window.FileReader;var isAjaxUpload=$(".InputfieldAllowAjaxUpload").length>0;var isPageIDIndicator=$("#PageIDIndicator").length>0;return isFileReaderSupport&&(isPageIDIndicator||isAjaxUpload)}function throttle(fn,threshhold,scope){threshhold||(threshhold=250);var last,deferTimer;return function(){var context=scope||this;var now=+new Date,args=arguments;if(last&&now .gridImage",start:function(e,ui){var size=getCookieData($el.closest(".Inputfield"),"size");ui.placeholder.append($("
    ").css({display:"block",height:size+"px",width:size+"px"}));timer=window.setTimeout(function(){closeEdit($el,null)},100);$el.addClass("InputfieldImageSorting")},stop:function(e,ui){var $this=$(this);if(timer!==null){ui.item.find(".InputfieldImageEdit__edit").click();clearTimeout(timer)}$this.children("li").each(function(n){var $sort=$(this).find(".InputfieldFileSort");if($sort.val()!=n)$sort.val(n).change()});$el.removeClass("InputfieldImageSorting")},cancel:".InputfieldImageEdit,.focusArea,input,textarea,button,select,option"};$el.sortable(sortableOptions)}function setupMagnificForRenderValue($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){var src=$(item.el).attr("data-original");if(typeof src=="undefined"||!src)src=$(item.el).attr("src");item.src=src}};options.gallery={enabled:true};$el.find("img").magnificPopup(options)}function setupMagnificForSingle($el){var options=$.extend(true,{},magnificOptions);options.callbacks={elementParse:function(item){item.src=$(item.el).attr("src")}};options.gallery={enabled:false};$el.find("img").magnificPopup(options)}function findEditedElement($parent){return $parent.find(".InputfieldImageEdit--active")}function findEditMarkup($edit){return $("#"+$edit.find(".InputfieldImageEdit__edit").attr("data-current"))}function setDeleteStateOnAllItems($input){var checked=$input.is(":checked");var $items=$input.parents(".gridImages").find(".gridImage__deletebox");if(checked){$items.prop("checked","checked").change()}else{$items.prop("checked",false).change()}}function updateGrid($inputfield){var $gridImages;if(typeof $inputfield=="undefined"){$gridImages=$(".gridImages")}else{$gridImages=$inputfield.find(".gridImages")}$gridImages.each(function(){var $grid=$(this),$edit=findEditedElement($grid);if($edit.length){moveEdit(findEditMarkup($edit),$edit)}})}function checkInputfieldWidth($inputfield){var narrowItems=[];var mediumItems=[];var wideItems=[];var n=0,ni=0,mi=0,wi=0;var $inputfields;var $item;if(typeof $inputfield=="undefined"){$inputfields=$(".InputfieldImage.Inputfield")}else{$inputfields=$inputfield}$inputfields.removeClass("InputfieldImageNarrow InputfieldImageMedium InputfieldImageWide");$inputfields.each(function(){$item=$(this);var width=$item.width();if(width<1)return;if(width<=500){narrowItems[ni]=$item;ni++}else if(width<=900){mediumItems[mi]=$item;mi++}else{wideItems[wi]=$item;wi++}});for(n=0;n100?100:top,left:left>100?100:left,zoom:zoom>100?0:zoom};return focusData}function getFocusStr(focusObj){if(typeof focusObj=="undefined")focusObj=getFocus();return focusObj.top+" "+focusObj.left+" "+focusObj.zoom}function getFocusProperty(property){var focus=getFocus();return focus[property]}function setFocus(focusObj){focusData=focusObj;var focusStr=focusObj.top+" "+focusObj.left+" "+focusObj.zoom;$thumb.attr("data-focus",focusStr);$input=$edit.find(".InputfieldImageFocus");if(focusStr!=$input.val()){$input.val(focusStr).trigger("change")}}function setFocusProperty(property,value){var focus=getFocus();focus[property]=value;setFocus(focus)}function setFocusDragPosition(){var focus=getFocus();var $overlay=$focusCircle.parent();var w=$overlay.width();var h=$overlay.height();var x=Math.round(focus.left/100*w);var y=Math.round(focus.top/100*h);if(x<0)x=0;if(y<0)y=0;if(x>w)x=w;if(y>h)y=h;$focusCircle.css({top:y+"px",left:x+"px"})}$focusArea=$img.siblings(".focusArea");if(!$focusArea.length){$focusArea=$("
    ").addClass("focusArea");$img.after($focusArea)}$focusArea.css({height:$img.height()+"px",width:$img.width()+"px","background-color":"rgba(0,0,0,0.7)"}).addClass("focusActive");$focusCircle=$focusArea.find(".focusCircle");if(!$focusCircle.length){$focusCircle=$("
    ").addClass("focusCircle");$focusArea.append($focusCircle)}$img.parent().addClass("focusWrap");setFocusDragPosition();var zoomSlide=function(zoomPercent){var zoomBoxSize,focus,faWidth,faHeight;if(typeof zoomPercent=="undefined")zoomPercent=lastZoomPercent;lastZoomPercent=zoomPercent;faWidth=$focusArea.width();faHeight=$focusArea.height();if(faWidth>faHeight){$zoomBox.height(100-zoomPercent+"%");zoomBoxSize=$zoomBox.height();$zoomBox.width(zoomBoxSize)}else{$zoomBox.width(100-zoomPercent+"%");zoomBoxSize=$zoomBox.width();$zoomBox.height(zoomBoxSize)}focus=getFocus();var crop=getFocusZoomCropDimensions(focus.left,focus.top,zoomPercent,faWidth,faHeight,zoomBoxSize);$zoomBox.css({top:crop.top+"px",left:crop.left+"px","background-position":"-"+crop.left+"px -"+crop.top+"px","background-size":faWidth+"px "+faHeight+"px"});focus.zoom=zoomPercent;setFocusProperty("zoom",focus.zoom);if(mode=="grid")setGridSizeItem($thumb.parent(),gridSize,false,focus)};var dragEvent=function(event,ui){var $this=$(this);var circleSize=$this.outerHeight();var w=$this.parent().width();var h=$this.parent().height();var top=ui.position.top>0?ui.position.top:0;var left=ui.position.left>0?ui.position.left:0;top=top>0?top/h*100:0;left=left>0?left/w*100:0;var newFocus={top:top,left:left,zoom:getFocusProperty("zoom")};setFocus(newFocus);if(useZoomFocus){zoomSlide(newFocus.zoom)}else if(mode=="grid"){setGridSizeItem($thumb.parent(),gridSize,false,newFocus)}};$focusCircle.draggable({containment:"parent",drag:dragEvent,stop:dragEvent});if(useZoomFocus){var zoom=getFocusProperty("zoom");$zoomSlider=$("
    ").addClass("focusZoomSlider").css({"margin-top":"5px"});$zoomBox=$("
    ").addClass("focusZoomBox").css({position:"absolute",background:"transparent","background-image":"url("+$img.attr("src")+")"});$focusArea.prepend($zoomBox);$img.after($zoomSlider);$thumb.attr("src",$img.attr("src"));$zoomSlider.slider({min:0,max:50,value:zoom,range:"max",slide:function(event,ui){zoomSlide(ui.value)}});zoomSlide(zoom)}else{$focusArea.css("background-color","rgba(0,0,0,0.5)")}}function stopFocus($edit){$focusCircle=$edit.find(".focusCircle");if($focusCircle.length){var $focusWrap=$focusCircle.closest(".focusWrap");$focusWrap.find(".focusZoomSlider").slider("destroy").remove();$focusWrap.find(".focusZoomBox").remove();$focusWrap.removeClass("focusWrap");$focusCircle.draggable("destroy");$focusCircle.parent().removeClass("focusActive");$focusCircle.remove();var $button=$edit.find(".InputfieldImageButtonFocus");if($button.length){$icon=$button.find("i");$icon.removeClass("focusIconActive").toggleClass($icon.attr("data-toggle"))}}}function getFocusZoomPosition(focusPercent,sourceDimension,cropDimension){var focusPX=parseInt(sourceDimension*focusPercent/100);var position=parseInt(focusPX-cropDimension/2);var maxPosition=parseInt(sourceDimension-cropDimension);if(0>position)position=0;if(maxPosition=percentH?faWidth:faHeight;var cropDimension=maxDimension-maxDimension*zoomPercent/100;var posLeft=getFocusZoomPosition(focusLeft,faWidth,cropDimension);var posTop=getFocusZoomPosition(focusTop,faHeight,cropDimension);return{left:posLeft,top:posTop,width:cropDimension,height:cropDimension}}function getFocusZoomPosition4GridviewSquare(focusPercent,sourceDimPX,gridViewPX,zoomPercent,scale,smallestSidePX){sourceDimPX=sourceDimPX*scale;var gridViewPercent=gridViewPX/sourceDimPX*100;var adjustPercent=gridViewPercent/2;var posPercent=focusPercent-adjustPercent;var posMinVal=0;var posMaxVal=100-gridViewPercent;if(posPercent<=posMinVal)posPercent=0;if(posPercent>=posMaxVal)posPercent=posMaxVal;var posPX=sourceDimPX/100*posPercent/scale;posPX=-1*parseInt(posPX);return posPX}function getFocusZoomCropDimensions4GridviewSquare(focusLeft,focusTop,zoomPercent,w,h,gridViewSize,scale){var smallestSidePX=w>=h?h:w;var posLeft=getFocusZoomPosition4GridviewSquare(focusLeft,w,gridViewSize,zoomPercent,scale,smallestSidePX);var posTop=getFocusZoomPosition4GridviewSquare(focusTop,h,gridViewSize,zoomPercent,scale,smallestSidePX);var transformLeft=parseInt(posLeft);var transformTop=parseInt(posTop);return{transformLeft:transformLeft,transformTop:transformTop,scale:scale}}function tearDownEdit($edit){stopFocus($edit);$edit.off("click",".InputfieldImageButtonFocus");$inputArea=$edit.find(".InputfieldImageEdit__edit");if($inputArea.children().not(".InputfieldFileSort").length){var $items=$inputArea.children();$("#"+$inputArea.attr("data-current")).find(".ImageData").append($items)}}function closeEdit($parent,$not){var $edit;if($parent){$edit=$parent.find(".InputfieldImageEdit--active")}else if($not){$edit=$(".InputfieldImageEdit--active").not($not.find(".InputfieldImageEdit--active"))}else{$edit=$(".InputfieldImageEdit--active")}if($edit.length){tearDownEdit($edit);$edit.removeClass("InputfieldImageEdit--active").removeAttr("id");$("#"+$edit.attr("data-for")).removeClass("gridImageEditing")}$(".InputfieldImageEdit__replace").removeClass("InputfieldImageEdit__replace")}function moveEdit($el,$edit){if(!$el||!$el.length)return;var $children=$el.parent().children().not(".InputfieldImageEdit");var lastTop=0;var found=false;var $insertBeforeItem=null;$children.each(function(){if($insertBeforeItem)return;var $item=$(this);var top=$item.offset().top;if(found&&top!=lastTop){$insertBeforeItem=$item}else if($item.attr("id")==$el.attr("id")){found=true}lastTop=top});if($insertBeforeItem){$edit.insertBefore($insertBeforeItem)}else{$edit.insertAfter($children.eq($children.length-1))}var $arrow=$edit.find(".InputfieldImageEdit__arrow");if($arrow.length)$arrow.css("left",$el.position().left+$el.outerWidth()/2+"px")}function initGridEvents(){$(window).resize(throttle(windowResize,200));$(document).on("click dblclick",".gridImage__trash",function(e){var $input=$(this).find("input");$input.prop("checked",inverseState).change();if(e.type=="dblclick"){setDeleteStateOnAllItems($input);e.preventDefault();e.stopPropagation()}});$(document).on("change",".gridImage__deletebox",function(){updateDeleteClass($(this))});$(document).on("click",".gridImage__edit",function(e){var $el=$(this).closest(".gridImage");if(!$el.length)return;if($el.closest(".InputfieldImageEditAll").length)return false;var $all=$el.closest(".gridImages");var $edit=$all.find(".InputfieldImageEdit");if($el.hasClass("gridImageEditing")){$edit.find(".InputfieldImageEdit__close").click()}else{moveEdit($el,$edit);tearDownEdit($edit);setupEdit($el,$edit);$edit.addClass("InputfieldImageEdit--active").attr("data-for",$el.attr("id"));$all.find(".gridImageEditing").removeClass("gridImageEditing");$el.addClass("gridImageEditing")}}).on("click",".InputfieldImageEditAll img",function(e){e.stopPropagation();e.preventDefault();$.magnificPopup.close();var options=$.extend(true,{},magnificOptions);var $img=$(this);options["items"]={src:$img.attr("data-original"),title:$img.attr("alt")};$.magnificPopup.open(options);return true}).on("click",".InputfieldImageButtonFocus",function(){var $button=$(this);var $icon=$button.find("i");var $edit=$button.closest(".InputfieldImageEdit, .gridImage");var $focusCircle=$edit.find(".focusCircle");if($focusCircle.length){stopFocus($edit)}else{startFocus($edit);$icon.addClass("focusIconActive");$icon.toggleClass($icon.attr("data-toggle"))}});$(document).on("click",function(e){var $el=$(e.target);if(typeof clickLanguageTabActive!="undefined"&&clickLanguageTabActive){return}if($el.closest(".InputfieldImageEdit").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.is("input, textarea")&&$el.closest(".InputfieldImageEditAll").length){$el.focus().one("blur",function(){$el.closest(".gridImages").sortable("enable")});$el.closest(".gridImages").sortable("disable")}else if($el.closest(".gridImage__inner").length){closeEdit(null,$el.parents(".gridImages"))}else if($el.closest(".mfp-container").length){return}else if($el.closest(".ui-dialog").length){return}else if($el.is(".mfp-close")){return}else if($el.is("a.remove")){return}else{closeEdit(null,null)}});$(document).on("click",".InputfieldImageEdit__close",function(e){closeEdit($(this).parents(".gridImages"),null)});$(document).on("change",".InputfieldImage",function(){$(this).find(".InputfieldImageButtonCrop:not(.pw-modal-dblclick)").addClass("pw-modal-dblclick ui-state-disabled")}).on("click",".InputfieldImageButtonCrop.ui-state-disabled",function(e){var $button=$(this);var $list=$button.closest(".gridImages");if(!$list.hasClass("gridImagesAlerted")){ProcessWire.alert(ProcessWire.config.InputfieldImage.labels.changes);$list.addClass("gridImagesAlerted")}setTimeout(function(){$button.removeClass("ui-state-active")},500);return false});$(".ImagesGrid").on("click","button.pw-modal",function(e){e.preventDefault()});setupEditableFilename();checkInputfieldWidth()}function setupEditableFilename(){$(document).on("click",".InputfieldImageEdit__name",function(e){var $span=$(this).children("span");var $input=$span.closest(".gridImage, .InputfieldImageEdit").find(".InputfieldFileRename");var $list=$span.closest(".gridImages");$list.sortable("disable");$input.val($span.text());$span.on("keypress",function(e){if(e.which==13){$span.blur();return false}return true});$span.attr("autocomplete","off").attr("autocorrect","off").attr("autocapitalize","off").attr("spellcheck","false");$span.focus().on("blur",function(){var val=$(this).text();if($.trim(val).length<1){$span.text($input.val())}else if(val!=$input.val()){$input.val(val).change();$list.closest(".Inputfield").trigger("change")}$span.off("keypress");$list.sortable("enable")})})}function setListSize($inputfield,pct){pct=Math.floor(pct);$inputfield.find(".gridImage__overflow").each(function(){var dataPct=100-pct;var $this=$(this);$this.css("width",pct+"%");$this.siblings(".ImageData").css("width",dataPct+"%");$this.find("img").css({top:0,left:0,transform:"none"})});setCookieData($inputfield,"listSize",pct)}function setGridSize($inputfield,gridSize,ragged){if(!gridSize)return;var size=gridSize+"px";var $gridImages=$inputfield.find(".gridImages");if(typeof ragged=="undefined"||ragged==null)ragged=$gridImages.attr("data-ragged")?true:false;if(ragged){$gridImages.attr("data-ragged",1)}else{$gridImages.removeAttr("data-ragged")}$gridImages.find(".gridImage__overflow").each(function(){setGridSizeItem($(this),gridSize,ragged)});$gridImages.find(".gridImage__edit, .gridImage__resize").css("line-height",size);$gridImages.attr("data-size",gridSize);setCookieData($inputfield,"size",gridSize);if(retryGridItems.length)setTimeout(function(){while(retryGridItems.length){var item=retryGridItems.pop();setGridSizeItem(item.item,item.gridSize,ragged)}},150)}function setGridSizeItem($item,gridSize,ragged,focus){var $img;if($item.hasClass("gridImage__overflow")){$img=$item.children("img")}else if($item.is("img")){$img=$item;$item=$img.closest(".gridImage__overflow")}else{return}if(!gridSize){$img.removeAttr("width").removeAttr("height");$item.width("auto").height("auto");return}var zoom=0;var w=$img.width();var h=$img.height();var dataW=parseInt($img.attr("data-w"));var dataH=parseInt($img.attr("data-h"));if(!w)w=dataW;if(!h)h=dataH;if(!ragged&&typeof focus=="undefined"){var focusStr=$img.attr("data-focus");if(typeof focusStr=="undefined")focusStr="50.0 50.0 0";var focusArray=focusStr.split(" ");focus={top:parseFloat(focusArray[0]),left:parseFloat(focusArray[1]),zoom:parseInt(focusArray[2])}}if(!ragged)zoom=focus.zoom;if(ragged){$img.attr("height",gridSize).removeAttr("width");$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"})}else if(zoom>0&&$item.closest(".InputfieldImageFocusZoom").length&&!gridSliding){var maxHeight,maxWidth;if(w>=h){maxHeight="100%";maxWidth="none";if(w==dataW){h=gridSize;w=h/dataH*dataW}}else{maxHeight="none";maxWidth="100%";if(h==dataH){w=gridSize;h=w/dataW*dataH}}var scale=1+zoom/100*2;var crop=getFocusZoomCropDimensions4GridviewSquare(focus.left,focus.top,zoom,w,h,gridSize,scale);$img.css({left:"0px",top:"0px","transform-origin":"0px 0px",transform:"scale("+crop.scale+") translate3d("+crop.transformLeft+"px, "+crop.transformTop+"px, 0)","max-width":maxWidth,"max-height":maxHeight})}else if(w>=h){$img.attr("height",gridSize).removeAttr("width");if(focus.left<1)focus.left=.001;$img.css({"max-height":"100%","max-width":"none",top:"50%",left:focus.left+"%",transform:"translate3d(-"+focus.left+"%, -50%, 0)"})}else if(h>w){$img.attr("width",gridSize).removeAttr("height");if(focus.top<1)focus.top=.001;$img.css({"max-height":"none","max-width":"100%",top:focus.top+"%",left:"50%",transform:"translate3d(-50%, -"+focus.top+"%, 0)"})}else{$img.css({"max-height":"100%","max-width":"none",top:"50%",left:"50%",transform:"translate3d(-50%, -50%, 0)"});$img.removeAttr("width").attr("height",gridSize)}w=$img.width();if(w){$item.css({width:ragged?w+"px":gridSize+"px",height:gridSize+"px"})}else{var tries=$item.attr("data-tries");if(!tries)tries=0;if(typeof tries=="undefined")tries=0;tries=parseInt(tries);if(tries>3){$item.css({width:gridSize+"px",height:gridSize+"px"})}else{retryGridItems.push({item:$item,gridSize:gridSize});$item.attr("data-tries",tries+1)}}}function setupImageListToggle($target){if($target.find(".InputfieldImageListToggle").length)return;var $list=$("").append("");var $left=$("").append("");var $grid=$("").append("");var activeClass="InputfieldImageListToggle--active";var defaultMode="";var toggleClick=function(e){var $a=$(this);var $inputfield=$a.closest(".Inputfield");var href=$a.attr("href");var size;var $aPrev=$a.parent().children("."+activeClass);var hrefPrev=$aPrev.attr("href");$aPrev.removeClass(activeClass);$a.addClass(activeClass);stopFocus($inputfield);if(href=="list"){if(!$inputfield.hasClass("InputfieldImageEditAll")){$inputfield.find(".InputfieldImageEdit--active .InputfieldImageEdit__close").click();$inputfield.addClass("InputfieldImageEditAll")}size=getCookieData($inputfield,"listSize");setListSize($inputfield,size);setCookieData($inputfield,"mode","list")}else if(href=="left"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,true);setCookieData($inputfield,"mode","left");updateGrid()}else if(href=="grid"){$inputfield.removeClass("InputfieldImageEditAll");size=getCookieData($inputfield,"size");setGridSize($inputfield,size,false);setCookieData($inputfield,"mode","grid");if(hrefPrev=="left")setTimeout(function(){setGridSize($inputfield,size,false)},100)}setupSortable($inputfield.find(".gridImages"));$a.blur();return false};$list.click(toggleClick);$left.click(toggleClick);$grid.click(toggleClick);if($target.hasClass("InputfieldImage")){$target.children(".InputfieldHeader").append($list).append($left).append($grid);defaultMode=getCookieData($target,"mode")}else{$(".InputfieldImage > .InputfieldHeader",$target).append($list).append($left).append($grid)}if(defaultMode=="list"){$list.click()}else if(defaultMode=="left"){$left.click()}else{}}function setupSizeSlider($inputfield){var $header=$inputfield.children(".InputfieldHeader");if($header.children(".InputfieldImageSizeSlider").length)return;var $gridImages=$inputfield.find(".gridImages");var gridSize=$gridImages.attr("data-gridsize");var min=gridSize/2;var max=gridSize*2;var $slider=$('');$header.append($slider);var sizeSlide=function(event,ui){var value=ui.value;var minPct=15;var divisor=Math.floor(gridSize/minPct);var v=value-min;var listSize=Math.floor(minPct+v/divisor);if($inputfield.hasClass("InputfieldImageEditAll")){setCookieData($inputfield,"size",value);setListSize($inputfield,listSize)}else{setCookieData($inputfield,"listSize",listSize);setGridSize($inputfield,value)}};$slider.slider({min:min,max:max,value:getCookieData($inputfield,"size"),range:"min",slide:sizeSlide,start:function(event,ui){gridSliding=true;if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}},stop:function(event,ui){gridSliding=false;sizeSlide(event,ui);updateGrid($inputfield)}})}function setCookieData($inputfield,property,value){var data=getCookieData($inputfield);var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"";if(!name.length||typeof value=="undefined")return;if(data[name][property]==value)return;data[name][property]=value;$.cookie("InputfieldImage",data,{secure:window.location.protocol.indexOf("https:")===0});cookieData=data}function getCookieData($inputfield,property){if(cookieData&&typeof property=="undefined")return cookieData;var id=$inputfield.attr("id");var name=id?id.replace("wrap_Inputfield_",""):"na";var data=cookieData?cookieData:$.cookie("InputfieldImage");var value=null;if(!data)data={};if(typeof data[name]=="undefined")data[name]={};if(typeof data[name].size=="undefined"||!data[name].size){data[name].size=parseInt($inputfield.find(".gridImages").attr("data-size"));if(!data[name].size)data[name].size=130}if(typeof data[name].listSize=="undefined"||!data[name].listSize){data[name].listSize=23}if(typeof data[name].mode=="undefined"||!data[name].mode){data[name].mode=$inputfield.find(".gridImages").attr("data-gridMode");if(!data[name].mode)data[name].mode="list"}if(cookieData==null)cookieData=data;if(typeof property=="undefined"){value=data}else if(property===true){value=data[name]}else if(typeof data[name][property]!="undefined"){value=data[name][property]}return value}function initInputfield($inputfield){if($inputfield.hasClass("InputfieldStateCollapsed"))return;var maxFiles=parseInt($inputfield.find(".InputfieldImageMaxFiles").val());var $gridImages=$inputfield.find(".gridImages");var size=getCookieData($inputfield,"size");var mode=getCookieData($inputfield,"mode");var ragged=mode=="left"?true:false;var renderValueMode=$inputfield.hasClass("InputfieldRenderValueMode");if(!size)size=$gridImages.attr("data-gridsize");size=parseInt(size);if(!renderValueMode&&($inputfield.hasClass("InputfieldImageEditAll")||mode=="list")){var listSize=getCookieData($inputfield,"listSize");setListSize($inputfield,listSize)}else{setGridSize($inputfield,size,ragged)}if(!$inputfield.hasClass("InputfieldImageInit")){$inputfield.addClass("InputfieldImageInit");if(renderValueMode){return setupMagnificForRenderValue($inputfield)}else if(maxFiles==1){$inputfield.addClass("InputfieldImageMax1");setupMagnificForSingle($inputfield)}else{setupSortable($gridImages)}setupImageListToggle($inputfield);setupSizeSlider($inputfield)}checkInputfieldWidth($inputfield);$inputfield.on("change",".InputfieldFileActionSelect",function(){var $note=$(this).next(".InputfieldFileActionNote");if($(this).val().length){$note.fadeIn()}else{$note.hide()}})}function initUploadOldSchool(){$("body").addClass("ie-no-drop");$(".InputfieldImage.InputfieldFileMultiple").each(function(){var $field=$(this),maxFiles=parseInt($field.find(".InputfieldFileMaxFiles").val()),$list=$field.find(".gridImages"),$uploadArea=$field.find(".InputfieldImageUpload");$uploadArea.on("change","input[type=file]",function(){var $t=$(this),$mask=$t.parent(".InputMask");if($t.val().length>1)$mask.addClass("ui-state-disabled");else $mask.removeClass("ui-state-disabled");if($t.next("input.InputfieldFile").length>0)return;var numFiles=$list.children("li").length+$uploadArea.find("input[type=file]").length+1;if(maxFiles>0&&numFiles>=maxFiles)return;$uploadArea.find(".InputMask").not(":last").each(function(){var $m=$(this);if($m.find("input[type=file]").val()<1)$m.remove()});var $i=$mask.clone().removeClass("ui-state-disabled");$i.children("input[type=file]").val("");$i.insertAfter($mask)})})}function initUploadHTML5($inputfield){var $target;if($inputfield.length>0){$target=$inputfield.find(".InputfieldImageUpload")}else{$target=$(".InputfieldImageUpload")}$target.each(function(i){var $this=$(this);var $content=$this.closest(".InputfieldContent");if($this.hasClass("InputfieldImageInitUpload"))return;initHTML5Item($content,i);$this.addClass("InputfieldImageInitUpload")});function initHTML5Item($this,i){var $form=$this.parents("form");var $repeaterItem=$this.closest(".InputfieldRepeaterItem");var postUrl=$repeaterItem.length?$repeaterItem.attr("data-editUrl"):$form.attr("action");postUrl+=(postUrl.indexOf("?")>-1?"&":"?")+"InputfieldFileAjax=1";var $postToken=$form.find("input._post_token");var postTokenName=$postToken.attr("name");var postTokenValue=$postToken.val();var $errorParent=$this.find(".InputfieldImageErrors").first();var fieldName=$this.find(".InputfieldImageUpload").data("fieldname");fieldName=fieldName.slice(0,-2);var $inputfield=$this.closest(".Inputfield.InputfieldImage");var extensions=$this.find(".InputfieldImageUpload").data("extensions").toLowerCase();var maxFilesize=$this.find(".InputfieldImageUpload").data("maxfilesize");var filesUpload=$this.find("input[type=file]").get(0);var $fileList=$this.find(".gridImages");var fileList=$fileList.get(0);var gridSize=$fileList.data("gridsize");var doneTimer=null;var maxFiles=parseInt($this.find(".InputfieldImageMaxFiles").val());var resizeSettings=getClientResizeSettings($inputfield);var useClientResize=resizeSettings.maxWidth>0||resizeSettings.maxHeight>0||resizeSettings.maxSize>0;setupDropzone($this);if(maxFiles!=1)setupDropInPlace($fileList);$fileList.children().addClass("InputfieldFileItemExisting");$inputfield.on("pwimageupload",function(event,data){traverseFiles([data.file],data.xhr)});function errorItem(message,filename){if(typeof filename!=="undefined")message=""+filename+": "+message;var icon=" ";return"
  • "+icon+message+"
  • "}function basename(str){var base=new String(str).substring(str.lastIndexOf("/")+1);if(base.lastIndexOf(".")!=-1)base=base.substring(0,base.lastIndexOf("."));return base}function setupDropzone($el){if($el.hasClass("InputfieldImageDropzoneInit"))return;var el=$el.get(0);var $inputfield=$el.closest(".Inputfield");function dragStart(){if($inputfield.hasClass("pw-drag-in-file"))return;$el.addClass("ui-state-hover");$inputfield.addClass("pw-drag-in-file")}function dragStop(){if(!$inputfield.hasClass("pw-drag-in-file"))return;$el.removeClass("ui-state-hover");$inputfield.removeClass("pw-drag-in-file")}el.addEventListener("dragleave",function(){dragStop()},false);el.addEventListener("dragenter",function(evt){evt.preventDefault();dragStart()},false);el.addEventListener("dragover",function(evt){if(!$el.is("ui-state-hover"))dragStart();evt.preventDefault();evt.stopPropagation();return false},false);el.addEventListener("drop",function(evt){traverseFiles(evt.dataTransfer.files);dragStop();evt.preventDefault();evt.stopPropagation();return false},false);$el.addClass("InputfieldImageDropzoneInit")}function setupDropInPlace($gridImages){var $i=null;var haltDrag=false;var timer=null;var $inputfield=$gridImages.closest(".Inputfield");function addInputfieldClass(){$inputfield.addClass("pw-drag-in-file")}function removeInputfieldClass(){$inputfield.removeClass("pw-drag-in-file")}function getCenterCoordinates($el){var offset=$el.offset();var width=$el.width();var height=$el.height();var centerX=offset.left+width/2;var centerY=offset.top+height/2;return{clientX:centerX,clientY:centerY}}function noDropInPlace(){return $gridImages.find(".InputfieldImageEdit--active").length>0}function dragEnter(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null){var gridSize=$gridImages.attr("data-size")+"px";var $o=$("
    ").addClass("gridImage__overflow");if($gridImages.closest(".InputfieldImageEditAll").length){$o.css({width:"100%",height:gridSize})}else{$o.css({width:gridSize,height:gridSize})}$i=$("
  • ").addClass("ImageOuter gridImage gridImagePlaceholder").append($o);$gridImages.append($i)}var coords=getCenterCoordinates($i);$i.simulate("mousedown",coords)}function dragOver(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();addInputfieldClass();haltDrag=false;if($i==null)return;var coords={clientX:evt.originalEvent.clientX,clientY:evt.originalEvent.clientY};$i.simulate("mousemove",coords)}function dragEnd(evt){if(noDropInPlace())return;evt.preventDefault();evt.stopPropagation();if($i==null)return false;haltDrag=true;if(timer)clearTimeout(timer);timer=setTimeout(function(){if(!haltDrag||$i==null)return;$i.remove();$i=null;removeInputfieldClass()},1e3)}function drop(evt){if(noDropInPlace())return;removeInputfieldClass();haltDrag=false;var coords={clientX:evt.clientX,clientY:evt.clientY};$i.simulate("mouseup",coords);$uploadBeforeItem=$i.next(".gridImage");$i.remove();$i=null}if($gridImages.length&&!$gridImages.hasClass("gridImagesInitDropInPlace")){$gridImages.on("dragenter",dragEnter);$gridImages.on("dragover",dragOver);$gridImages.on("dragleave",dragEnd);$gridImages.on("drop",drop);$gridImages.addClass("gridImagesInitDropInPlace")}}function uploadFile(file,extension,xhrsub){var labels=ProcessWire.config.InputfieldImage.labels;var filesizeStr=parseInt(file.size/1024,10)+" kB";var tooltipMarkup=""+'
    '+""+""+'"+""+""+""+""+""+""+"
    "+labels.dimensions+"'+labels.na+"
    "+labels.filesize+""+filesizeStr+"
    "+labels.variations+"0
    "+"
    ";var $progressItem=$('
  • '),$tooltip=$(tooltipMarkup),$imgWrapper=$('
    '),$imageData=$('
    '),$hover=$("
    "),$progressBar=$(""),$edit=$(' '),$spinner=$('
    '),reader,xhr,fileData,fileUrl=URL.createObjectURL(file),$fileList=$inputfield.find(".gridImages"),singleMode=maxFiles==1,size=getCookieData($inputfield,"size"),listSize=getCookieData($inputfield,"listSize"),listMode=$inputfield.hasClass("InputfieldImageEditAll"),$img=$('');$imgWrapper.append($img);$hover.find(".gridImage__inner").append($edit);$hover.find(".gridImage__inner").append($spinner.css("display","none"));$hover.find(".gridImage__inner").append($progressBar);$imageData.append($(""+'

    '+file.name+"

    "+''+filesizeStr+""));if(listMode){$imgWrapper.css("width",listSize+"%");$imageData.css("width",100-listSize+"%")}else{$imgWrapper.css({width:size+"px",height:size+"px"})}$progressItem.append($tooltip).append($imgWrapper).append($hover).append($imageData);$img.attr({src:fileUrl,"data-original":fileUrl});img=new Image;img.addEventListener("load",function(){$tooltip.find(".dimensions").html(this.width+" × "+this.height);var factor=Math.min(this.width,this.height)/size;$img.attr({width:this.width/factor,height:this.height/factor})},false);img.src=fileUrl;if(typeof xhrsub!="undefined"){xhr=xhrsub}else{xhr=new XMLHttpRequest}function updateProgress(evt){if(typeof evt!="undefined"){if(!evt.lengthComputable)return;$progressBar.val(parseInt(evt.loaded/evt.total*100))}$("body").addClass("pw-uploading");$spinner.css("display","block")}xhr.upload.addEventListener("progress",updateProgress,false);xhr.addEventListener("load",function(){xhr.getAllResponseHeaders();var response=$.parseJSON(xhr.responseText);if(typeof response.ajaxResponse!="undefined")response=response.ajaxResponse;var wasZipFile=response.length>1;if(response.error!==undefined)response=[response];for(var n=0;n-1){uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.indexOf("?"))}var uploadReplaceExt=uploadReplaceName.substring(uploadReplaceName.lastIndexOf(".")+1).toLowerCase();uploadReplaceName=uploadReplaceName.substring(0,uploadReplaceName.lastIndexOf("."));if(uploadReplaceExt==uploadNewExt){$imageEditName.children("span").text(uploadReplaceName).removeAttr("contenteditable")}$markup.find(".gridImage__edit").click()}uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null}if(doneTimer)clearTimeout(doneTimer);$uploadBeforeItem=null;doneTimer=setTimeout(function(){if(maxFiles!=1){setupSortable($fileList)}else{setupMagnificForSingle($inputfield)}$("body").removeClass("pw-uploading");$fileList.trigger("AjaxUploadDone")},500);$inputfield.trigger("change").removeClass("InputfieldFileEmpty")},false);if(uploadReplace.edit){uploadReplace.edit.find(".InputfieldImageEdit__close").click()}else if($inputfield.find(".InputfieldImageEdit:visible").length){$inputfield.find(".InputfieldImageEdit__close").click()}if(uploadReplace.item){uploadReplace.item.replaceWith($progressItem);uploadReplace.item=$progressItem}else if($uploadBeforeItem&&$uploadBeforeItem.length){$uploadBeforeItem.before($progressItem)}else{$fileList.append($progressItem)}function sendUpload(file,imageData){if(typeof xhrsub=="undefined"){xhr.open("POST",postUrl,true)}xhr.setRequestHeader("X-FILENAME",encodeURIComponent(file.name));xhr.setRequestHeader("X-FIELDNAME",fieldName);if(uploadReplace.item)xhr.setRequestHeader("X-REPLACENAME",uploadReplace.file);xhr.setRequestHeader("Content-Type","application/octet-stream");xhr.setRequestHeader("X-"+postTokenName,postTokenValue);xhr.setRequestHeader("X-REQUESTED-WITH","XMLHttpRequest");if(typeof imageData!="undefined"&&imageData!=false){xhr.send(imageData)}else{xhr.send(file)}updateGrid();$inputfield.trigger("change");var numFiles=$inputfield.find(".InputfieldFileItem").length;if(numFiles==1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileMultiple").addClass("InputfieldFileSingle")}else if(numFiles>1){$inputfield.removeClass("InputfieldFileEmpty").removeClass("InputfieldFileSingle").addClass("InputfieldFileMultiple")}}updateProgress();var ext=file.name.substring(file.name.lastIndexOf(".")+1).toLowerCase();if(useClientResize&&(ext=="jpg"||ext=="jpeg"||ext=="png"||ext=="gif")){var resizer=new PWImageResizer(resizeSettings);$spinner.addClass("pw-resizing");resizer.resize(file,function(imageData){$spinner.removeClass("pw-resizing");sendUpload(file,imageData)})}else{sendUpload(file)}}function traverseFiles(files,xhr){var toKilobyte=function(i){return parseInt(i/1024,10)};if(typeof files==="undefined"){fileList.innerHTML="No support for the File API in this web browser";return}for(var i=0,l=files.length;imaxFilesize&&maxFilesize>2e6){var filesizeKB=toKilobyte(files[i].size),maxFilesizeKB=toKilobyte(maxFilesize);if(typeof ProcessWire.config.InputfieldFile.labels["too-big"]!="undefined"){message=ProcessWire.config.InputfieldFile.labels["too-big"];message=message.replace("MAX_KB",maxFilesizeKB)}else{message="Filesize "+filesizeKB+" kb is too big. Maximum allowed is "+maxFilesizeKB+" kb"}$errorParent.append(errorItem(message,files[i].name))}else if(typeof xhr!="undefined"){uploadFile(files[i],extension,xhr)}else{uploadFile(files[i],extension)}if(maxFiles==1)break}}filesUpload.addEventListener("change",function(evt){traverseFiles(this.files);evt.preventDefault();evt.stopPropagation();this.value=""},false)}function setupEnlargementDropzones(){var sel=".InputfieldImageEdit__imagewrapper img";$(document).on("dragenter",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var src=$this.attr("src");var $edit=$this.closest(".InputfieldImageEdit");var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.addClass("InputfieldImageEdit__replace");uploadReplace.file=new String(src).substring(src.lastIndexOf("/")+1);uploadReplace.item=$("#"+$edit.attr("data-for"));uploadReplace.edit=$edit}).on("dragleave",sel,function(){var $this=$(this);if($this.closest(".InputfieldImageMax1").length)return;var $parent=$this.closest(".InputfieldImageEdit__imagewrapper");$parent.removeClass("InputfieldImageEdit__replace");uploadReplace.file="";uploadReplace.item=null;uploadReplace.edit=null})}setupEnlargementDropzones()}function getClientResizeSettings($inputfield){var settings={maxWidth:0,maxHeight:0,maxSize:0,quality:1,autoRotate:true,debug:ProcessWire.config.debug};var data=$inputfield.attr("data-resize");if(typeof data!="undefined"&&data.length){data=data.split(";");settings.maxWidth=data[0].length?parseInt(data[0]):0;settings.maxHeight=data[1].length?parseInt(data[1]):0;settings.maxSize=data[2].length?parseFloat(data[2]):0;settings.quality=parseFloat(data[3])}return settings}function init(){$(".InputfieldImage.Inputfield").each(function(){initInputfield($(this))});initGridEvents();if(useAjaxUpload()){initUploadHTML5("")}else{initUploadOldSchool()}$(document).on("reloaded",".InputfieldImage",function(){var $inputfield=$(this);initInputfield($inputfield);initUploadHTML5($inputfield);Inputfields.init($inputfield)}).on("wiretabclick",function(e,$newTab,$oldTab){$newTab.find(".InputfieldImage").each(function(){initInputfield($(this))})}).on("opened",".InputfieldImage",function(){initInputfield($(this))})}init()}jQuery(document).ready(function($){InputfieldImage($)}); \ No newline at end of file diff --git a/wire/modules/Inputfield/InputfieldText.module b/wire/modules/Inputfield/InputfieldText/InputfieldText.module similarity index 100% rename from wire/modules/Inputfield/InputfieldText.module rename to wire/modules/Inputfield/InputfieldText/InputfieldText.module diff --git a/wire/modules/Inputfield/InputfieldTextLength.js b/wire/modules/Inputfield/InputfieldText/InputfieldTextLength.js similarity index 100% rename from wire/modules/Inputfield/InputfieldTextLength.js rename to wire/modules/Inputfield/InputfieldText/InputfieldTextLength.js diff --git a/wire/modules/Inputfield/InputfieldTextLength.min.js b/wire/modules/Inputfield/InputfieldText/InputfieldTextLength.min.js similarity index 100% rename from wire/modules/Inputfield/InputfieldTextLength.min.js rename to wire/modules/Inputfield/InputfieldText/InputfieldTextLength.min.js diff --git a/wire/modules/Process/ProcessForgotPassword.module b/wire/modules/Process/ProcessForgotPassword/ProcessForgotPassword.module similarity index 100% rename from wire/modules/Process/ProcessForgotPassword.module rename to wire/modules/Process/ProcessForgotPassword/ProcessForgotPassword.module