From 799a692ff98a0d100b5588998b684dec1c5ac76f Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Wed, 18 May 2011 18:43:48 +0200 Subject: [PATCH 1/8] Added a modified version of the SMK theme that works with the current version of G3 --- 3.0/themes/smk/css/fix-ie.css | 59 + 3.0/themes/smk/css/screen.css | 1376 +++++++++++++++++ .../images/ui-bg_flat_0_aaaaaa_40x100.png | Bin 0 -> 180 bytes .../images/ui-bg_flat_55_fbec88_40x100.png | Bin 0 -> 182 bytes .../images/ui-bg_glass_75_d0e5f5_1x400.png | Bin 0 -> 124 bytes .../images/ui-bg_glass_85_dfeffc_1x400.png | Bin 0 -> 123 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 119 bytes .../ui-bg_gloss-wave_55_5c9ccc_500x100.png | Bin 0 -> 4033 bytes .../ui-bg_inset-hard_100_f5f8f9_1x100.png | Bin 0 -> 104 bytes .../ui-bg_inset-hard_100_fcfdfd_1x100.png | Bin 0 -> 88 bytes .../images/ui-icons_217bc0_256x240.png | Bin 0 -> 7638 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 7626 bytes .../images/ui-icons_469bdd_256x240.png | Bin 0 -> 5399 bytes .../images/ui-icons_6da8d5_256x240.png | Bin 0 -> 8447 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4379 bytes .../images/ui-icons_d8e7f3_256x240.png | Bin 0 -> 4379 bytes .../images/ui-icons_f9bd01_256x240.png | Bin 0 -> 4379 bytes 3.0/themes/smk/css/themeroller/ui.base.css | 7 + 3.0/themes/smk/css/themeroller/ui.core.css | 37 + .../smk/css/themeroller/ui.datepicker.css | 62 + 3.0/themes/smk/css/themeroller/ui.dialog.css | 13 + .../smk/css/themeroller/ui.progressbar.css | 4 + .../smk/css/themeroller/ui.resizable.css | 13 + 3.0/themes/smk/css/themeroller/ui.tabs.css | 9 + 3.0/themes/smk/css/themeroller/ui.theme.css | 243 +++ 3.0/themes/smk/images/avatar.jpg | Bin 0 -> 1172 bytes 3.0/themes/smk/images/ico-album.png | Bin 0 -> 397 bytes 3.0/themes/smk/images/ico-denied-inactive.png | Bin 0 -> 604 bytes 3.0/themes/smk/images/ico-denied-passive.png | Bin 0 -> 916 bytes 3.0/themes/smk/images/ico-denied.png | Bin 0 -> 715 bytes 3.0/themes/smk/images/ico-error.png | Bin 0 -> 701 bytes 3.0/themes/smk/images/ico-help.png | Bin 0 -> 786 bytes 3.0/themes/smk/images/ico-info.png | Bin 0 -> 778 bytes 3.0/themes/smk/images/ico-lock.png | Bin 0 -> 749 bytes 3.0/themes/smk/images/ico-print.png | Bin 0 -> 989 bytes 3.0/themes/smk/images/ico-separator-rtl.gif | Bin 0 -> 106 bytes 3.0/themes/smk/images/ico-separator.gif | Bin 0 -> 106 bytes .../smk/images/ico-success-inactive.png | Bin 0 -> 476 bytes 3.0/themes/smk/images/ico-success-passive.png | Bin 0 -> 617 bytes 3.0/themes/smk/images/ico-success.png | Bin 0 -> 537 bytes 3.0/themes/smk/images/ico-view-comments.png | Bin 0 -> 768 bytes 3.0/themes/smk/images/ico-view-fullsize.png | Bin 0 -> 1046 bytes .../smk/images/ico-view-slideshow-rtl.png | Bin 0 -> 1137 bytes 3.0/themes/smk/images/ico-view-slideshow.png | Bin 0 -> 960 bytes 3.0/themes/smk/images/ico-warning.png | Bin 0 -> 666 bytes 3.0/themes/smk/images/loading-large.gif | Bin 0 -> 8238 bytes 3.0/themes/smk/images/loading-small.gif | Bin 0 -> 673 bytes 3.0/themes/smk/images/select-photos-backg.png | Bin 0 -> 1154 bytes 3.0/themes/smk/js/ui.init.js | 131 ++ 3.0/themes/smk/theme.info | 6 + 3.0/themes/smk/thumbnail.png | Bin 0 -> 20740 bytes 3.0/themes/smk/views/album.html.php | 44 + 3.0/themes/smk/views/block.html.php | 10 + 3.0/themes/smk/views/dynamic.html.php | 29 + 3.0/themes/smk/views/movie.html.php | 19 + 3.0/themes/smk/views/no_sidebar.html.php | 11 + 3.0/themes/smk/views/page.html.php | 161 ++ 3.0/themes/smk/views/paginator.html.php | 87 ++ 3.0/themes/smk/views/photo.html.php | 51 + 3.0/themes/smk/views/sidebar.html.php | 16 + 60 files changed, 2388 insertions(+) create mode 100644 3.0/themes/smk/css/fix-ie.css create mode 100644 3.0/themes/smk/css/screen.css create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_flat_0_aaaaaa_40x100.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_flat_55_fbec88_40x100.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_glass_75_d0e5f5_1x400.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_glass_85_dfeffc_1x400.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_inset-hard_100_f5f8f9_1x100.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-bg_inset-hard_100_fcfdfd_1x100.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_217bc0_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_2e83ff_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_469bdd_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_6da8d5_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_cd0a0a_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_d8e7f3_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/images/ui-icons_f9bd01_256x240.png create mode 100644 3.0/themes/smk/css/themeroller/ui.base.css create mode 100644 3.0/themes/smk/css/themeroller/ui.core.css create mode 100644 3.0/themes/smk/css/themeroller/ui.datepicker.css create mode 100644 3.0/themes/smk/css/themeroller/ui.dialog.css create mode 100644 3.0/themes/smk/css/themeroller/ui.progressbar.css create mode 100644 3.0/themes/smk/css/themeroller/ui.resizable.css create mode 100644 3.0/themes/smk/css/themeroller/ui.tabs.css create mode 100644 3.0/themes/smk/css/themeroller/ui.theme.css create mode 100644 3.0/themes/smk/images/avatar.jpg create mode 100644 3.0/themes/smk/images/ico-album.png create mode 100644 3.0/themes/smk/images/ico-denied-inactive.png create mode 100644 3.0/themes/smk/images/ico-denied-passive.png create mode 100644 3.0/themes/smk/images/ico-denied.png create mode 100644 3.0/themes/smk/images/ico-error.png create mode 100644 3.0/themes/smk/images/ico-help.png create mode 100644 3.0/themes/smk/images/ico-info.png create mode 100644 3.0/themes/smk/images/ico-lock.png create mode 100644 3.0/themes/smk/images/ico-print.png create mode 100644 3.0/themes/smk/images/ico-separator-rtl.gif create mode 100644 3.0/themes/smk/images/ico-separator.gif create mode 100644 3.0/themes/smk/images/ico-success-inactive.png create mode 100644 3.0/themes/smk/images/ico-success-passive.png create mode 100644 3.0/themes/smk/images/ico-success.png create mode 100644 3.0/themes/smk/images/ico-view-comments.png create mode 100644 3.0/themes/smk/images/ico-view-fullsize.png create mode 100644 3.0/themes/smk/images/ico-view-slideshow-rtl.png create mode 100644 3.0/themes/smk/images/ico-view-slideshow.png create mode 100644 3.0/themes/smk/images/ico-warning.png create mode 100644 3.0/themes/smk/images/loading-large.gif create mode 100644 3.0/themes/smk/images/loading-small.gif create mode 100644 3.0/themes/smk/images/select-photos-backg.png create mode 100644 3.0/themes/smk/js/ui.init.js create mode 100644 3.0/themes/smk/theme.info create mode 100755 3.0/themes/smk/thumbnail.png create mode 100644 3.0/themes/smk/views/album.html.php create mode 100644 3.0/themes/smk/views/block.html.php create mode 100644 3.0/themes/smk/views/dynamic.html.php create mode 100644 3.0/themes/smk/views/movie.html.php create mode 100644 3.0/themes/smk/views/no_sidebar.html.php create mode 100644 3.0/themes/smk/views/page.html.php create mode 100644 3.0/themes/smk/views/paginator.html.php create mode 100644 3.0/themes/smk/views/photo.html.php create mode 100644 3.0/themes/smk/views/sidebar.html.php diff --git a/3.0/themes/smk/css/fix-ie.css b/3.0/themes/smk/css/fix-ie.css new file mode 100644 index 00000000..0633ff07 --- /dev/null +++ b/3.0/themes/smk/css/fix-ie.css @@ -0,0 +1,59 @@ +/** + * Fix display in IE 6, 7, and 8 + */ + +#g-banner { + z-index: 2; + zoom: 1; +} + +#g-sidebar { + overflow: hidden; +} + +#g-photo, +#g-movie { + zoom: 1; +} + +#g-photo .g-context-menu, +#g-movie .g-context-menu { + width: 240px; +} + +input.submit { + clear: none !important; + display: inline !important; +} + +.g-short-form input.text, +.g-short-form input.submit { + font-size: 1em; + line-height: 1em; + padding: .38em .3em; +} + +#g-search-form input#q { + width: 300px; +} + +#g-add-tag-form input.textbox { + width: 110px !important; +} + +#g-add-tag-form input[type='submit'] { + padding: .3em 0 !important; +} + +#g-dialog .g-cancel { + display: inline-block !important; + float: none !important; +} + +.g-paginator .g-text-right { + width: 29%; +} + +.g-paginator .ui-icon-right { + width: 60px; +} diff --git a/3.0/themes/smk/css/screen.css b/3.0/themes/smk/css/screen.css new file mode 100644 index 00000000..1f41d0b8 --- /dev/null +++ b/3.0/themes/smk/css/screen.css @@ -0,0 +1,1376 @@ +/** + * Gallery 3 Wind Theme Screen Styles + * + * @requires YUI reset, font, grids CSS + * + * Sheet organization: + * 1) Font sizes, base HTML elements + * 2) Reusable content blocks + * 3) Page layout containers + * 4) Content blocks in specific layout containers + * 5) States and interactions + * 6) Positioning and order + * 7) Navigation and menus + * 8) jQuery and jQuery UI + * 9) Right-to-left language styles + */ + +/** ******************************************************************* + * 1) Font sizes, base HTML elements + **********************************************************************/ + +body, html { + background-color: #111111; + color: #999999; + font-family: 'Lucida Grande', 'Lucida Sans', Arial, sans-serif; +} + +p { + margin-bottom: 1em; +} + +em { + font-style: oblique; +} + +h1, h2, h3, h4, h5, strong, th { + font-weight: bold; +} + +h1 { + font-size: 1.7em; +} + +#g-dialog h1 { + font-size: 1.1em; +} + +h2 { + font-size: 1.4em; +} + +#g-sidebar .g-block h2 { + font-size: 1.2em; +} + +#g-sidebar .g-block li { + margin-bottom: .6em; +} + +#g-content, +#g-site-menu, +h3 { + font-size: 1.2em; +} + +#g-sidebar, +.g-breadcrumbs { + font-size: .9em; +} + +#g-banner, +#g-footer, +.g-message { + font-size: .8em; +} + +#g-album-grid .g-item, +#g-item #g-photo, +#g-item #g-movie { + font-size: .7em; +} + +/* Links ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +a, +#g-dialog a, +.g-button, +.g-button:hover, +.g-button:active, +a.ui-state-hover, +input.ui-state-hover, +button.ui-state-hover { + color: #999999 !important; + cursor: pointer !important; + text-decoration: none; + -moz-outline-style: none; +} + +.g-menu a { + background-color: #222222; + color: #999999 !important; + border-color: #444444; + cursor: pointer !important; + text-decoration: none; + -moz-outline-style: none; +} + +a:hover, +#g-dialog a:hover { + text-decoration: underline; +} + +.g-menu a:hover { + text-decoration: none; + background-color: #111111; +} + +#g-dialog #g-action-status li { + width: 400px; + white-space: normal; + padding-left: 32px; +} + +/* Forms ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +form { + margin: 0; +} + +fieldset { + border: 1px solid #ccc; + padding: 0 1em .8em 1em; +} + +#g-banner fieldset, +#g-sidebar fieldset { + border: none; + padding: 0; +} + +legend { + font-weight: bold; + margin: 0; + padding: 0 .2em; +} + +#g-banner legend, +#g-sidebar legend, +input[type="hidden"] { + display: none; +} + +input.textbox, +input[type="text"], +input[type="password"], +textarea { + border: 1px solid #e8e8e8; + border-top-color: #ccc; + border-left-color: #ccc; + clear: both; + color: #333; + width: 50%; +} + +textarea { + height: 12em; + width: 97%; +} + +input:focus, +input.textbox:focus, +input[type=text]:focus, +textarea:focus, +option:focus { + background-color: #ffc; + color: #000; +} + +input.checkbox, +input[type=checkbox], +input.radio, +input[type=radio] { + float: left; + margin-right: .4em; +} + +/* Form layout ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +form li { + margin: 0; + padding: 0 0 .2em 0; +} + +form ul { + margin-top: 0; +} + +form ul ul { + clear: both; +} + +form ul ul li { + float: left; +} + +input, +select, +textarea { + display: block; + clear: both; + padding: .2em; +} + +input[type="submit"], +input[type="reset"] { + display: inline; + clear: none; + float: left; +} + +/* Forms in dialogs and panels ~~~~~~~~~ */ + +#g-dialog ul li { + padding-bottom: .8em; +} + +#g-dialog fieldset, +#g-panel fieldset { + border: none; + padding: 0; +} + +#g-panel legend { + display: none; +} + +input[readonly] { + background-color: #F4F4FC; +} + +#g-dialog input.textbox, +#g-dialog input[type=text], +#g-dialog input[type=password], +#g-dialog textarea { + width: 97%; +} + +/* Short forms ~~~~~~~~~~~~~~~~~~~~~~~ */ + +.g-short-form legend, +.g-short-form label { + display: none; +} + +.g-short-form fieldset { + border: none; + padding: 0; +} + +.g-short-form li { + float: left; + margin: 0 !important; + padding: .4em 0; +} + +.g-short-form .textbox, +.g-short-form input[type=text] { + color: #666; + padding: .3em .6em; + width: 100%; +} + +.g-short-form .textbox.g-error { + border: 1px solid #f00; + color: #f00; + padding-left: 24px; +} + +.g-short-form .g-cancel { + display: block; + margin: .3em .8em; +} + +#g-sidebar .g-short-form li { + padding-left: 0; + padding-right: 0; +} + +/* Tables ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +table { + width: 100%; +} + +#g-content table { + margin: 1em 0; +} + +caption, +th { + text-align: left; +} + +th, +td { + border: none; + border-bottom: 1px solid #ccc; + padding: .5em; +} + +td { + vertical-align: top; +} + +/* Text ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +.g-text-small { + font-size: .8em; +} + +.g-text-big { + font-size: 1.2em; +} + +.g-text-right { + text-align: right; +} + +/** ******************************************************************* + * 2) Reusable content blocks + *********************************************************************/ + +.g-block h2 { + background-color: #111111; + padding: .3em .8em; +} + +.g-block-content { + margin-top: 1em; +} + +/** ******************************************************************* + * 3) Page layout containers + *********************************************************************/ + +/* Dimension and scale ~~~~~~~~~~~~~~~~~~~ */ +.g-one-quarter { + width: 25%; +} + +.g-one-third { + width: 33%; +} + +.g-one-half { + width: 50%; +} + +.g-two-thirds { + width: 66%; +} + +.g-three-quarters { + width: 75%; +} + +.g-whole { + width: 100%; +} + +/* View container ~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.g-view { + background-color: #222222; + border: 1px solid #444444; + border-bottom: none; +} + +/* Layout containers ~~~~~~~~~~~~~~~~~~~~~ */ + +#g-header { + margin-bottom: 1em; +} + +#g-banner { + background-color: #333333; + border-bottom: 1px solid #444444; + min-height: 5em; + padding: 1em 20px; + position: relative; +} + +#g-content { + padding-left: 20px; + position: relative; + width: 696px; +} + +#g-sidebar { + padding: 0 20px; + width: 220px; +} + +#g-footer { + background-color: #333333; + border-top: 1px solid #444444; + margin-top: 20px; + padding: 10px 20px; +} + +/** ******************************************************************* + * 4) Content blocks in specific layout containers + *********************************************************************/ + +/* Header ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-banner #g-quick-search-form { + clear: right; + float: right; + margin-top: 1em; +} + +#g-banner #g-quick-search-form input[type='text'] { + width: 17em; + background-color: #444444; + color: #999999; +} + +#g-content .g-block h2 { + background-color: transparent; + padding-left: 0; +} + +/* Sidebar ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-sidebar .g-block-content { + padding-left: 1em; +} + +#g-sidebar #g-image-block { + overflow: hidden; +} + +/* Album content ~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-content #g-album-grid { + margin: 1em 0; + position: relative; + z-index: 1; +} + +#g-content #g-album-grid .g-item { + background-color: #333333; + border: 1px solid #444444; + float: left; + padding: .6em 8px; + position: relative; + text-align: center; + width: 213px; + z-index: 1; +} + +#g-content #g-album-grid .g-item h2 { + margin: 5px 0; +} + +#g-content .g-photo h2, +#g-content .g-item .g-metadata { + display: none; + margin-bottom: .6em; +} + +#g-content #g-album-grid .g-album { + background-color: #333333; +} + +#g-content #g-album-grid .g-album h2 span.g-album { + background: transparent url('../images/ico-album.png') no-repeat top left; + display: inline-block; + height: 16px; + margin-right: 5px; + width: 16px; +} + +#g-content #g-album-grid .g-hover-item { + background-color: #333333; + border: 1px solid #000; + position: absolute !important; + z-index: 1000 !important; +} + +#g-content .g-hover-item h2, +#g-content .g-hover-item .g-metadata { + display: block; +} + +#g-content #g-album-grid #g-place-holder { + position: relative; + visibility: hidden; + z-index: 1; +} + +/* Search results ~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-content #g-search-results { + margin-top: 1em; + padding-top: 1em; +} + +/* Individual photo content ~~~~~~~~~~~~~~ */ + +#g-item { + position: relative; + width: 100%; +} + +#g-item #g-photo, +#g-item #g-movie { + padding: 2.2em 0; + position: relative; +} + +#g-item img.g-resize, +#g-item a.g-movie { + display: block; + margin: 0 auto; +} + +/* Footer content ~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-footer #g-credits li { + padding-right: 1.2em; +} + +/* In-line editing ~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-in-place-edit-message { + background-color: #fff; +} + +/* Permissions ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ +#g-edit-permissions-form td { + background-image: none; +} + +#g-edit-permissions-form fieldset { + border: 1px solid #ccc; +} + +#g-permissions .g-denied { + background-color: #fcc; +} + +#g-permissions .g-allowed { + background-color: #cfc; +} + +#g-permissions .g-breadcrumbs a { + border: 1px solid #fff; +} + +#g-permissions .g-active a { + border: 1px solid #ddd; + background: #eee; +} + +/** ******************************************************************* + * 5) States and interactions + **********************************************************************/ + +.g-active, +.g-enabled, +.g-available, +.g-selected, +.g-highlight { + font-weight: bold; +} + +.g-inactive, +.g-disabled, +.g-unavailable, +.g-uneditable, +.g-locked, +.g-deselected, +.g-understate { + color: #ccc; + font-weight: normal; +} + +.g-editable { + padding: .2em .3em; +} + +.g-editable:hover { + background-color: #ffc; + cursor: text; +} + +.g-error, +.g-info, +.g-success, +.g-warning { + padding-left: 30px; +} + +form li.g-error, +form li.g-info, +form li.g-success, +form li.g-warning { + background-image: none; + padding: .3em .8em .3em 0; +} + +.g-short-form li.g-error { + padding: .3em 0; +} + +form.g-error input[type="text"], +li.g-error input[type="text"], +form.g-error input[type="password"], +li.g-error input[type="password"], +form.g-error input[type="checkbox"], +li.g-error input[type="checkbox"], +form.g-error input[type="radio"], +li.g-error input[type="radio"], +form.g-error textarea, +li.g-error textarea, +form.g-error select, +li.g-error select { + border: 2px solid #f00; + margin-bottom: .2em; +} + +.g-error, +.g-denied, +tr.g-error td.g-error, +#g-add-photos-status .g-error { + background: #f6cbca url('../images/ico-error.png') no-repeat .4em 50%; + color: #f00; +} + +.g-info { + background: #e8e8e8 url('../images/ico-info.png') no-repeat .4em 50%; +} + +.g-success, +.g-allowed, +#g-add-photos-status .g-success { + background: #d9efc2 url('../images/ico-success.png') no-repeat .4em 50%; +} + +tr.g-success { + background-image: none; +} + +tr.g-success td.g-success { + background-image: url('../images/ico-success.png'); +} + +.g-warning, +tr.g-warning td.g-warning { + background: #fcf9ce url('../images/ico-warning.png') no-repeat .4em 50%; +} + +form .g-error { + background-color: #fff; + padding-left: 20px; +} + +.g-open { +} + +.g-closed { +} + +.g-installed { + background-color: #eeeeee; +} + +.g-default { + background-color: #444444; + font-weight: bold; +} + +.g-draggable { + cursor: move; +} + +.g-draggable:hover { + border: 1px dashed #000; +} + +.ui-sortable .g-target, +.ui-state-highlight { + background-color: #fcf9ce; + border: 2px dotted #999; + height: 2em; + margin: 1em 0; +} + +/* Ajax loading indicator ~~~~~~~~~~~~~~~~ */ + +.g-loading-large, +.g-dialog-loading-large { + background: #e8e8e8 url('../images/loading-large.gif') no-repeat center center !important; +} + +.g-loading-small { + background: #e8e8e8 url('../images/loading-small.gif') no-repeat center center !important; +} + +/** ******************************************************************* + * 6) Positioning and order + **********************************************************************/ + +.g-left { + clear: none; + float: left; +} + +.g-right { + clear: none; + float: right; +} + +.g-first { +} + +.g-last { +} + +.g-even { + background-color: #fff; +} + +.g-odd { + background-color: #eee; +} + +/** ******************************************************************* + * 7) Navigation and menus + *********************************************************************/ + +/* Login menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-banner #g-login-menu { + color: #999; + float: right; +} + +#g-banner #g-login-menu li { + padding-left: 1.2em; +} + +/* Site Menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-site-menu { + bottom: 0; + left: 140px; + position: absolute; +} + +#g-site-menu ul { + margin-bottom: 0 !important; +} + +/* Context Menu ~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.g-context-menu { + background-color: #fff; + bottom: 0; + left: 0; + position: absolute; +} + +.g-item .g-context-menu { + display: none; + margin-top: 2em; + width: 100%; +} + +#g-item .g-context-menu ul { + display: none; +} + +.g-context-menu li { + border-left: none; + border-right: none; + border-bottom: none; +} + +.g-context-menu li a { + display: block; + line-height: 1.6em; + background-color: #222222; +} + +.g-hover-item .g-context-menu { + display: block; +} + +.g-hover-item .g-context-menu li { + text-align: left; +} + +.g-hover-item .g-context-menu a:hover { + text-decoration: none; +} + +/* View Menu ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +#g-view-menu { + margin-bottom: 1em; +} + +#g-view-menu a { + background-repeat: no-repeat; + background-position: 50% 50%; + height: 28px !important; + width: 43px !important; +} + +#g-view-menu #g-slideshow-link { + background-image: url('../images/ico-view-slideshow.png'); +} + +#g-view-menu .g-fullsize-link { + background-image: url('../images/ico-view-fullsize.png'); +} + +#g-view-menu #g-comments-link { + background-image: url('../images/ico-view-comments.png'); +} + +#g-view-menu #g-print-digibug-link { + background-image: url('../images/ico-print.png'); +} + +/** ******************************************************************* + * 8) jQuery and jQuery UI + *********************************************************************/ +/* Generic block container ~~~~~~~~~~~~~~~ */ + +.g-block { + clear: both; + margin-bottom: 2.5em; +} + +.g-block-content { +} + +/* Superfish menu overrides ~~~~~~~~~~~~~~ */ +.sf-menu ul { + width: 12em; +} + +ul.sf-menu li li:hover ul, +ul.sf-menu li li.sfHover ul { + left: 12em; +} + +ul.sf-menu li li li:hover ul, +ul.sf-menu li li li.sfHover ul { + left: 12em; +} + +.sf-menu li li, +.sf-menu li li ul li { + background-color: #bdd2ff; +} + +.sf-menu li:hover { + background-color: #dfe9ff; +} + +/* jQuery UI Dialog ~~~~~~~~~~~~~~~~~~~~~~ */ + +.ui-widget-overlay { + background: #000; + opacity: .7; +} + +/* Buttons ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.g-button { + display: inline-block; + margin: 0 4px 0 0; + padding: .2em .4em; +} + +.g-button, +.g-button:hover, +.g-button:active { + cursor: pointer !important; + outline: 0; + text-decoration: none; + -moz-outline-style: none; +} + +button { + padding: 2px 4px 2px 4px; +} + +/* jQuery UI ThemeRoller buttons ~~~~~~~~~ */ + +.g-buttonset { + padding-left: 1px; +} + +.g-buttonset li { + float: left; +} + +.g-buttonset .g-button { + margin: 0; +} + +.ui-icon-left .ui-icon { + float: left; + margin-right: .2em; +} + +.ui-icon-right .ui-icon { + float: right; + margin-left: .2em; +} + +/* Rotate icon, ThemeRoller only provides one of these */ + +.ui-icon-rotate-ccw { + background-position: -192px -64px; +} + +.ui-icon-rotate-cw { + background-position: -208px -64px; +} + +.g-progress-bar { + height: 1em; + width: 100%; + margin-top: .5em; + display: inline-block; +} + +/* Status and validation messages ~~~~ */ + +.g-message-block { + background-position: .4em .3em; + border: 1px solid #ccc; + padding: 0; +} + +#g-action-status { + margin-bottom: 1em; +} + +#g-action-status li, +p#g-action-status, +div#g-action-status { + padding: .3em .3em .3em 30px; +} + +#g-site-status li { + border-bottom: 1px solid #ccc; + padding: .3em .3em .3em 30px; +} + +.g-module-status { + clear: both; + margin-bottom: 1em; +} + +.g-message { + background-position: 0 50%; +} + +/* Breadcrumbs ~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.g-breadcrumbs { + clear: both; + padding: 0 20px; +} + +.g-breadcrumbs li { + background: transparent url('../images/ico-separator.gif') no-repeat scroll left center; + float: left; + padding: 1em 8px 1em 18px; +} + +.g-breadcrumbs .g-first { + background: none; + padding-left: 0; +} + +.g-breadcrumbs li a, +.g-breadcrumbs li span { + display: block; +} + +#g-dialog ul.g-breadcrumbs { + margin-left: 0; + padding-left: 0; +} + +/* Pagination ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.g-paginator { + padding: .2em 0; + width: 100%; +} + +.g-paginator li { + float: left; + width: 30%; +} + +.g-paginator .g-info { + background: none; + padding: .2em 0; + text-align: center; + width: 40%; +} + +/* Dialogs and panels ~~~~~~~~~~~~~~~~~~ */ + +#g-dialog { + text-align: left; +} + +#g-dialog legend { + display: none; +} + +#g-dialog .g-cancel { + margin: .4em 1em; +} + +#g-panel { + display: none; + padding: 1em; +} + +/* Inline layout ~~~~~~~~~~ */ + +.g-inline li { + float: left; + margin-left: 1.8em; + padding-left: 0 !important; +} + +.g-inline li.g-first { + margin-left: 0; +} + +/* Autocomplete ~~~~~~~~~~ */ +.ac_loading { + background: white url('../images/loading-small.gif') right center no-repeat !important; +} + +/** ******************************************************************* + * 9) Right to left language styles + *********************************************************************/ + +.rtl { + direction: rtl; +} + +.rtl #g-header, +.rtl #g-content, +.rtl #g-sidebar, +.rtl #g-footer, +.rtl caption, +.rtl th, +.rtl #g-dialog, +.rtl .g-context-menu li a, +.rtl .g-message-box li, +.rtl #g-site-status li { + text-align: right; +} + +.rtl .g-text-right { + text-align: left; +} + +.rtl .g-error, +.rtl .g-info, +.rtl .g-success, +.rtl .g-warning, +.rtl #g-add-photos-status .g-success, +.rtl #g-add-photos-status .g-error { + background-position: center right; + padding-right: 30px !important; +} + +.rtl form li.g-error, +.rtl form li.g-info, +.rtl form li.g-success, +.rtl form li.g-warning { + padding-right: 0 !important; +} + +.rtl .g-left, +.rtl .g-inline li, +.rtl #g-content #g-album-grid .g-item, +.rtl .sf-menu li, +.rtl .g-breadcrumbs li, +.rtl .g-paginator li, +.rtl .g-buttonset li, +.rtl .ui-icon-left .ui-icon, +.rtl .g-short-form li, +.rtl form ul ul li, +.rtl input[type="submit"], +.rtl input[type="reset"], +.rtl input.checkbox, +.rtl input[type=checkbox], +.rtl input.radio, +.rtl input[type=radio] { + float: right; +} + +.rtl .g-right, +.rtl .ui-icon-right .ui-icon { + float: left; +} + +.rtl .g-inline li { + margin-right: 1em; +} + +.rtl .g-inline li.g-first { + margin-right: 0; +} + +.rtl .g-breadcrumbs li { + background: transparent url('../images/ico-separator-rtl.gif') no-repeat scroll right center; + padding: 1em 18px 1em 8px; +} + +.rtl .g-breadcrumbs .g-first { + background: none; + padding-right: 0; +} + +.rtl input.checkbox { + margin-left: .4em; +} + +.rtl #g-add-comment { + right: inherit; + left: 0; +} + +.rtl .ui-icon-left .ui-icon { + margin-left: .2em; +} + +.rtl .ui-icon-right .ui-icon { + margin-right: .2em; +} + +/* RTL Corner radius ~~~~~~~~~~~~~~~~~~~~~~ */ +.rtl .g-buttonset .ui-corner-tl { + -moz-border-radius-topleft: 0; + -webkit-border-top-left-radius: 0; + border-top-left-radius: 0; + -moz-border-radius-topright: 5px !important; + -webkit-border-top-right-radius: 5px !important; + border-top-right-radius: 5px !important; +} + +.rtl .g-buttonset .ui-corner-tr { + -moz-border-radius-topright: 0; + -webkit-border-top-right-radius: 0; + border-top-right-radius: 0; + -moz-border-radius-topleft: 5px !important; + -webkit-border-top-left-radius: 5px !important; + border-top-left-radius: 5px !important; +} + +.rtl .g-buttonset .ui-corner-bl { + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomright: 5px !important; + -webkit-border-bottom-right-radius: 5px !important; + border-bottom-right-radius: 5px !important; +} + +.rtl .g-buttonset .ui-corner-br { + -moz-border-radius-bottomright: 0; + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomleft: 5px !important; + -webkit-border-bottom-left-radius: 5px !important; + border-bottom-left-radius: 5px !important; +} + +.rtl .g-buttonset .ui-corner-right, +.rtl .ui-progressbar .ui-corner-right { + -moz-border-radius-topright: 0; + -webkit-border-top-right-radius: 0; + border-top-right-radius: 0; + -moz-border-radius-topleft: 5px !important; + -webkit-border-top-left-radius: 5px !important; + border-top-left-radius: 5px !important; + -moz-border-radius-bottomright: 0; + -webkit-border-bottom-right-radius: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomleft: 5px !important; + -webkit-border-bottom-left-radius: 5px !important; + border-bottom-left-radius: 5px !important; +} + +.rtl .g-buttonset .ui-corner-left, +.rtl .ui-progressbar .ui-corner-left { + -moz-border-radius-topleft: 0; + -webkit-border-top-left-radius: 0; + border-top-left-radius: 0; + -moz-border-radius-topright: 5px !important; + -webkit-border-top-right-radius: 5px !important; + border-top-right-radius: 5px !important; + -moz-border-radius-bottomleft: 0; + -webkit-border-bottom-left-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-bottomright: 5px !important; + -webkit-border-bottom-right-radius: 5px !important; + border-bottom-right-radius: 5px !important; +} + +/* RTL Superfish ~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.rtl .sf-menu a { + border-left: none; + border-right:1px solid #fff; +} + +.rtl .sf-menu a.sf-with-ul { + padding-left: 2.25em; + padding-right: 1em; +} + +.rtl .sf-sub-indicator { + left: .75em !important; + right: auto; + background: url('../../../lib/superfish/images/arrows-ffffff-rtl.png') no-repeat -10px -100px; /* 8-bit indexed alpha png. IE6 gets solid image only */ +} +.rtl a > .sf-sub-indicator { /* give all except IE6 the correct values */ + top: .8em; + background-position: -10px -100px; /* use translucent arrow for modern browsers*/ +} +/* apply hovers to modern browsers */ +.rtl a:focus > .sf-sub-indicator, +.rtl a:hover > .sf-sub-indicator, +.rtl a:active > .sf-sub-indicator, +.rtl li:hover > a > .sf-sub-indicator, +.rtl li.sfHover > a > .sf-sub-indicator { + background-position: 0 -100px; /* arrow hovers for modern browsers*/ +} + +/* point right for anchors in subs */ +.rtl .sf-menu ul .sf-sub-indicator { background-position: 0 0; } +.rtl .sf-menu ul a > .sf-sub-indicator { background-position: -10px 0; } +/* apply hovers to modern browsers */ +.rtl .sf-menu ul a:focus > .sf-sub-indicator, +.rtl .sf-menu ul a:hover > .sf-sub-indicator, +.rtl .sf-menu ul a:active > .sf-sub-indicator, +.rtl .sf-menu ul li:hover > a > .sf-sub-indicator, +.rtl .sf-menu ul li.sfHover > a > .sf-sub-indicator { + background-position: 0 0; /* arrow hovers for modern browsers*/ +} + +.rtl .sf-menu li:hover ul, +.rtl .sf-menu li.sfHover ul { + right: 0; + left: auto; +} + +.rtl ul.sf-menu li li:hover ul, +.rtl ul.sf-menu li li.sfHover ul { + right: 12em; /* match ul width */ + left: auto; +} +.rtl ul.sf-menu li li li:hover ul, +.rtl ul.sf-menu li li li.sfHover ul { + right: 12em; /* match ul width */ + left: auto; +} + +/*** shadows for all but IE6 ***/ +.rtl .sf-shadow ul { + background: url('../../../lib/superfish/images/shadow.png') no-repeat bottom left; + padding: 0 0 9px 8px; + border-top-right-radius: 0; + border-bottom-left-radius: 0; + -moz-border-radius-topright: 0; + -moz-border-radius-bottomleft: 0; + -webkit-border-top-right-radius: 0; + -webkit-border-bottom-left-radius: 0; + -moz-border-radius-topleft: 17px; + -moz-border-radius-bottomright: 17px; + -webkit-border-top-left-radius: 17px; + -webkit-border-bottom-right-radius: 17px; + border-top-left-radius: 17px; + border-bottom-right-radius: 17px; +} + +/* RTL ThemeRoller ~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.rtl .ui-dialog .ui-dialog-titlebar { + padding: 0.5em 1em 0.3em 0.3em; +} + +.rtl .ui-dialog .ui-dialog-title { + float: right; +} + +.rtl .ui-dialog .ui-dialog-titlebar-close { + left: 0.3em; + right: auto; +} + + +/* RTL paginator ~~~~~~~~~~~~~~~~~~~~~~~~~~ */ + +.rtl .g-paginator .g-info { + width: 35%; +} + +.rtl .g-paginator .g-text-right { + margin-left: 0; +} + +.rtl .g-paginator .ui-icon-seek-end { + background-position: -80px -160px; +} + +.rtl .g-paginator .ui-icon-seek-next { + background-position: -48px -160px; +} + +.rtl .g-paginator .ui-icon-seek-prev { + background-position: -32px -160px; +} + +.rtl .g-paginator .ui-icon-seek-first { + background-position: -64px -160px; +} + +.rtl #g-header #g-login-menu, +.rtl #g-header #g-quick-search-form { + clear: left; + float: left; +} + +.rtl #g-header #g-login-menu li { + margin-left: 0; + padding-left: 0; + padding-right: 1.2em; +} + +.rtl #g-site-menu { + left: auto; + right: 150px; +} + +.rtl #g-view-menu #g-slideshow-link { + background-image: url('../images/ico-view-slideshow-rtl.png'); +} + +.rtl #g-sidebar .g-block-content { + padding-right: 1em; + padding-left: 0; +} + +.rtl #g-footer #g-credits li { + padding-left: 1.2em !important; + padding-right: 0; +} diff --git a/3.0/themes/smk/css/themeroller/images/ui-bg_flat_0_aaaaaa_40x100.png b/3.0/themes/smk/css/themeroller/images/ui-bg_flat_0_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-bg_flat_55_fbec88_40x100.png b/3.0/themes/smk/css/themeroller/images/ui-bg_flat_55_fbec88_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..47acaadd737478ddb090f47f618810712163317b GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*Fsaj7L$B>N1x91EQ8x$BA993)+ za~~)OO5|O5sDCi_{N8&XlRv*c;OQ6|AR59NN?mFzWBXJVGojypu|S6~c)I$ztaD0e F0syyrGF|`x literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-bg_glass_75_d0e5f5_1x400.png b/3.0/themes/smk/css/themeroller/images/ui-bg_glass_75_d0e5f5_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..9fb564f8d0a117f17aa6b844490309dadbd94821 GIT binary patch literal 124 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq?|on978O6-=0_GYj6;7zWBfT zzjhI`OjAO{6(N>+Em!s|xjZW|^1EO|(5d{JeUmv{p6fa-GJh;t>KCH4`R~7(L8qj} Y_egNRQF(If70@^aPgg&ebxsLQ0Qgob)Bpeg literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-bg_glass_85_dfeffc_1x400.png b/3.0/themes/smk/css/themeroller/images/ui-bg_glass_85_dfeffc_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..014951529c315d6042e72febc310a4d2db5b4a82 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq?|lm978O6-<~(*YA_IRxoBVf zfAX@vsV!R#l$@#*eLnw)_Sv|_?i7P!ORnX)SxaXh+BPpZ!Fw~yjr&#G|Jw^YMHDhV X&EsZx`7bsSXc~j3tDnm{r-UW|&(SK+ literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-bg_glass_95_fef1ec_1x400.png b/3.0/themes/smk/css/themeroller/images/ui-bg_glass_95_fef1ec_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..4443fdc1a156babad4336f004eaf5ca5dfa0f9ab GIT binary patch literal 119 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnour0hIh978O6-<~(*YA|4MzBvER z|7}eQtdCVXoUc2b{PaWeaIKu7gJx>{vDV26o)#~38k_!`W=^oo1w6ixmPC4R1b Tyd6G3lNdZ*{an^LB{Ts5`idse literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png b/3.0/themes/smk/css/themeroller/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png new file mode 100644 index 0000000000000000000000000000000000000000..0cdbda36a554acfdd6b713fcfcbc4fa49100a213 GIT binary patch literal 4033 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 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-icons_217bc0_256x240.png b/3.0/themes/smk/css/themeroller/images/ui-icons_217bc0_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..7719d487b2f69cd257d439736d11a9bda27a3fe2 GIT binary patch literal 7638 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 Du}>6$ literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-icons_2e83ff_256x240.png b/3.0/themes/smk/css/themeroller/images/ui-icons_2e83ff_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..d9897d25718a0057b9e578c6898ddf9a0ec74bf8 GIT binary patch literal 7626 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 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-icons_469bdd_256x240.png b/3.0/themes/smk/css/themeroller/images/ui-icons_469bdd_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..d8161854d341d98d3f7ee09fd78ee8e451b99d4a GIT binary patch literal 5399 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 Q-@^~kR@Z+}i?oaVAJ$Mvy8r+H literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-icons_6da8d5_256x240.png b/3.0/themes/smk/css/themeroller/images/ui-icons_6da8d5_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..b3c7d662704326617cf98236bdcc3de291a56d89 GIT binary patch literal 8447 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 Rc){v`p7vd>8V#qI{{{ZLuxtPT literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-icons_cd0a0a_256x240.png b/3.0/themes/smk/css/themeroller/images/ui-icons_cd0a0a_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2db88b796a36dc0501745c6f90920cf601bfbccd GIT binary patch literal 4379 zcmd^?`8(8o7stP|*oKTPTMP;*OIfmwZ7f4%5K$=x$-eIy%vf)ct&k#XgzVWOGnB0m z*+ygrkz4ki36Ji7<9S`@`keFAIoJ8&eXjQ>-V~#M2F4Eq0N~7Z1Kpbd06Hy!bwK{!(jhEv843;&*|bA|C<-AOjJ|=kn7p4=txRMHF2?K6RwRyJU!9L zc+jQ(tB}}=a3(uM&vu>ubB&^@XB?a=AU-G(`)krRG=OQ9kOp{yuBFJkF>OM-pj1{#IYgXMnC=oHi9!zbnICeB?gHM`)mRbQIHul7u-ij z6N1c=YZRBcmrgEK2Th%5Nr?Pqh7%pEL0uP_eO8TnwUmE=Kk7!^1FMJ z7Zxt;XG;P#{!PdvL|A^KzSFeU{E4do* z?EZLn+G$bx(@SQnwMj^8&sg(=--;JudusHbYPJsWALW$(8!jS}ukX&i-`ulHYB~=}bG+_h@fY@v8ywCr@1vkhK_)Iu5w^@Ck-E*!H*O2J zKr9&rV*;XX3I&4w&sGi+Z)A$u{U{0LU%$e|x-G<6~KZic~%(x}chw!AsbL z_6K%=fwwrf#%bj%Yd%U2-DRT_PqB1PHMxYoVo(I}$?P`VJK`d595j-LQd9n8Js!K| zQF<+ zWy({EFGSnJh;E(W>Nsj9TEF8S_%#x$yBkYWB?v=M$Dg`_zTy(%&XY!E_3T%&LsAUl z)F+fRXNPSis8@CrND9w>h2rvP{wVyQR+;{n18MGyq$)uD{AJz8dL1|PEQNSBtx1z~ zO86=8GI#tm__#&w_gfKO*43nx05w)Li5_Jlh62t(@09Xp*vl)oMtr>nYT~GujaNBo$G98Xf9XIuG@AJEy{S(A{AhseiDmba;WF@o@s)iW>~qt!lWy3Y zzqG)lYI|mZUgr%?$0D_WOkAx+(V{Yj>03QwFXOM?PF*&SVYC}nVlbfpC%!>q{Rntv z`m(}`IZUS)LlAJ@=|S`kT|bgs1|y##cw|YqmDrqmcCBvYJs)( z!@ZmRDanj0A2nnug9AP^9AUkqUS!>1o8UXb5lga}+9na#xcTQSdASY<9{AvH1sR$otYT#*ixXe7Z9!b=Wa{E@0^d6i#^Ia!w> zn=`Wb(e;7Bp94nwyrk|(9p4lFnG$?ZkN%Dy5runPj!LGaH>(!-XuTt-*_5>3Kf#Cy zjn!!Wr_^C>yV+>_okKW1KRmDm-f1eS#2@R5oN`+=Q_X3S5QFUw_MV! zS?G(}K`a;(W)igTVcptU~AfACcl^ z1!FIIBJ!$_DID1E`sVJp{3=ml%xWQ#UWBY~nOZ0ACKAiPGoZXQp;r;p##&vhix=($ zrsZ?dFKns!CxN^R_y%_!z{|u80LgeBEYml^!_!X~c4bp@T*%`T1t|m-GDv}JsR!}B z+xf?L0@+E(Xb0wznfZA!WuCJL(`=Tw!?+f@w^PO>$CyJc#n^-3R=n(SBHR0zZ31PI zry+>M#CsKt4<>z@5E9PwSS_XVYepFXd-&N;1+XiXy9#% zsBj=Nb<>qaYVxx*h;F6Iqw+C?DnANZ0M&G3Uw@4rXy;lT`te;-eCYkpORF{rD)ctJ zVZAz6=ZO82+sRQeG8;=jBdeawReaC=d!@Xo!MjrTUM19ffVX<$H3DIotKlv}=C+FV zIqr=ryG0onSDJ4*`?l7;9T9r2;ke#hTvs6yL^e{KPO^* z|KxJ!8Y>SWD^hc5{K8w){3<`f($jj>81P23)NRKpo03$2RlK%fbArm!i$3}Hoe>JJ zx?BFKYbK@J#j&KBS+JZhL9rzbTJ6s}l8}&DHE?C{omu|Tr1AbI#(m~Lw}@!6)_v87 zau^MNPc^N1^D?YpUrXnmZLq;_`l zbRW()5|c(`K`P`sCFo;V+h|pULhZkB%ABRl^Tf|9N998-kF)XOEpFX_E2cBIBd<`6 zCDxTy+4ceS-M=}M<3N3=7|_dOtBFuQ{uNY@`=$`o`aQU{?rPTki6S%Bq z5e*T6aX?PZh^Xi?NJmZ9LtCYZ;iXTltn}lOVlaVIv)EhIG)Ye0D>K(}y-am& z;s8$9eEGzc-3aTM$FZ-xrX_Y3o(wy^$;+Ni7sLP)a^OHYm`8BWt!uZ2IP%J09PsLr zBqN_VpHKm8XivHLLa#6&y&7fd_ok4QD^6Wy789 zz?hw?k_B6HcL8@szn>soBG~4GYDhi4yrF#@-7>VxNJXp{roX(?{5{->8tfulQiAN* z7E?zeFF-BU>XpZv22bvSFMDLiruqBZZRfNM zXC_l&vRHmqy^l8XA;aXoZI`2}j7g@{N?Gh}DQ@Q5SbDrVed7^Vu&4OL91XPqYmB&O zhhZ}Q&~}v<*c|)wXi9*ZjQY*aE$Dy`UvkBQMHMgLMHo#B}6EP7V$Z#SXT$B#o0^ z7Fo@lHRG4Z8whHcFh2a~Yp3{oB2g)xd9sG;K(#zvIBGlRw?>gA4MrO@N za91@+w<6c_#&JnFh+aycqDZy;n*WV`o( z@J&VU!CY~wCacD`(K|!;bD@juq@uyK>%T1Gm~42>$HE(1otM$Ow1!p8)}@BE!sCrp zi{~q;_}b=avDNG)(^_i;RkhoZ94-V>@!@M3YBlyMKZnRQBe^U7zVa=A9vNoO1CnmL zJK3ApRKu{1WW3ApMnl2DBls6%aNOm9gCTlz#pc+QKM7R2+|K!ELPKlV}2sIvykR7gF-^~nL@;0bD%k&>eG?R$WIG&yP z!Q$AEAa(Jd&tl1MABh9JbkTry#vE*3LP^tr?x~#8W>MKl&UA)Upp2d@`D|?)cIPAa zO>kMQrBi6gyO36}2#{$64z6V^sAZ>ZMXK)R=0TnT$RjgJ7Yh3JulHba?9ZC`Js$SP zgFT4-;v~fKe4Z10F^GjqrtuDLnFCOf&~TUluzQZ-ulhxC-x(v4mfJ3zR7Kie8Jsp2 ze0?uWoAT66Lmx)WSlnWn+pPEn;WBpbAf90FA5g2KPh7xU-*evHSiZsw9NSD`G!%Y% zSBzA>e&3bbU^5VaHqx~H&BB*`W}6sDQ_LPZT1L}fhWEL7=goMSt-U1rS~;uH)lI&_ zc{8wMiTu(?mo{6tT#uYzUaCpom#~vpm&WyLpF+e)kMLdB+GZc#yFJT-;9S2SGuAo& z49EkP2<|?q`13bKv zfNqnmnK72OvUc$}XtAW1DIeH`SN_p)I)O#bKh(b{S>ihyO>5O*q^jaAJ^9UcT-W>0 z*a#+#X3iJ1S)boapBt4wL9&I7coC1#+ww#i%X_v_#R$dcpBGj?*uflPbi>40VB=0u z-5s<36V?#338FfdEBG7rV zIAd3MXsFHDlPK&Q?%%uol_IE`#(>*&Ae9_*{WaC6kQHlNIGJ>VP}()e=<&p(usj`f z@%i_aS^#l6sQ1_-7--zXOqi&XJiQvP_`k(QV3HYV#cc(fM}m;Y^p)8gw-vJvV|R`<0=AY+7@mV?|=d$X^}G~y@VC{}8E`soL* M>tS>&wXu=^1FE+S0{{R3 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/css/themeroller/images/ui-icons_d8e7f3_256x240.png b/3.0/themes/smk/css/themeroller/images/ui-icons_d8e7f3_256x240.png new file mode 100644 index 0000000000000000000000000000000000000000..2c8aac4612416c51f1cefb9e0741232c618e31d8 GIT binary patch literal 4379 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%0D_zCrpuZ5A`ofmiUfD(^_>HsH%8NPkyr<*Y&Sw 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 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-denied-inactive.png b/3.0/themes/smk/images/ico-denied-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..56db3ff52bf02036d2a057f802d813be2bdadfd1 GIT binary patch literal 604 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl;Sc z?%liZ-@kwN?%nR)yLax~xo6Lw{rmUdzkh%4-o59}ox64G){`es-n@Bp>eQ(V7cT7D zwd>KNM+XlcJb(WD>C>lQzI^%M!GnGK_FcJh<@xjHuU@^ndiCn1OP7uvJ9gyAk)ubC z{s)5-xzAdGPBkqF@(YHDkVZ1pY`p*sIYuT=7srr_TS*3v%nXc27?dnpC3tyzzqmT) zG%zr6elULZlH=8<;(|^FO9n<3kq71p52vJ0PrmqIYLclTBZmT;u%BC*AERw zny#U614EL*#bBYy!k5??BYh?1zygVrradz=NH8%lm~b_CvI$t9a%CD@vVlR6$OHp0 zKT#}i2E$~A*_;jxhBG9JxIaosGA*1a$jlEBF<7z5ppfBiYDUHhy>p370uDTCi(-6q z*xcOO4joz(Q`4jdbYF?Y?kN*H>=p|$PdJ~G1XQH3eDf)fPp@9C^ltb8Qt)k#LjMjU mY3X*R4ql)UFYd8(7%<$HP*$`v(60vuCxfS}pUXO@geCwkh%LC`Z}YW#OXu92BcJ7CPPf%wy1VUeb+tdD1LyPM^Eq(%a86ZDc1C1GYyzK-g^!R5CKUhrvxSAM}yA(1{4{Sm@?TT(|yU5xho@UkAC89;S$fg|$tQu$7Op}OX z_cpQM_keP$wazYUck)<)g&EI;KJd%p&}mG)QXECR25rE)>QZzQ(}qP}iwi~F z5}|Fde}UV)CV>27s8fYHxsX%9^Pvd7y1cf$;2!LrV%6Cs67QrQS1AY#@yKC(NN(4T z_%OuX*X!4-J-V^k*7~(}fmICKJ7GtUY!+&8uNaqjpPgJ5F6KIUY!{#H9{S=R=_gi< zK4piK-{x*_o8x>mwl!JA!g;7+S%&XH_VBs9Qk@z_`4KY1kf_2lP zcS5tIfbl+=SpYe-qr}p@S;X;Kt;E#0&tkENMOJR>nzGlc`a*m~TreM3DopH8M8E6@ zr)gctaq(DxHtQ*@R+7(qUY?ts_s{vS2BMW zB*!!a1;1=gJ~+IOyJLIWO&X(dLtki1NjM%maPBp|y8gzNaLS9~x=`%H7TwTW$~I|y zm8FC4}Mrzlg<+1Y8PEBfUp0jJpx4B>@E+cy3`^(Gw`Mf+2&yxZm<$to~Vpgvg&QKNR z_f#1(r6svZt%iF?s+n<8X?B&!h3g9Dbb8_=MX}!;HiQSAh`bp^WMl~Z-44teO7W_Y zV4thSL{h;rJY7!l3%5J4H1!tIzB`Dv+YxO(haWeausGZYkI8^hWj6mzo=L0{%;yxzh{5!Htr?51 zvG|W62MzC8BZ76hRpCyO2zOn<%e)K>NHge!-~)Ap33OdWw6hsLYbCxGNt0%wk_2z7 zfyYvXheSG)5HRK1VB~%mq7Dmurw#bi@hEcOr3&G1ZiF*$M=&9nB#VNf&Q^r$4G5kp zTURh&s)E0%5&hyVD}sp<72~zmAY`Y(9aqO6CXF%=zFHGzO-A&I(pE}v70YQxCPJ{Y z4L+?5-crdLn3ZRPEs!A4ehEY3ZRpL~w9>@aMN+{F4dI@v&>(QDHQum!mG~E^$OS8l z!7?%Uwib*ROP67Hw`ika)gX-(8Ia`-u_IEhxG7U<13kSsMW+$lbb2dUMm5p6pa}cjgA+U$^mJ^AjD?&bdi)8~y+Q002ovPDHLkV1g8IMc@Dc literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-error.png b/3.0/themes/smk/images/ico-error.png new file mode 100644 index 0000000000000000000000000000000000000000..c37bd062e60c3b38fc82e4d1f236a8ac2fae9d8c GIT binary patch literal 701 zcmV;u0z&N#0$9Ug7g~-`rQ^qx~m@y2OU8A z#zh~=7n#Z$Z*fx-GOtDf07cgx0suCz_W(2~Y(0tf@FX@P6EPuM_dgn$vj9LucO)%W zw%HgMW>=#oL>nZ>M&NEf08>)#)k<{$fCT_r>rPi=BV=hFh6WS^qqze>C6Ek}o{M5% za|@JGowu0t{&hgNzySHZxy@LTNh);YzZ2zSp_ zl$^T&Dnc|NLb&RD_!4>pt@VHdP)ZGER%5ZmWEe$lryR&y;2u^3cOkO4#6c%-(EY6a{600000NkvXXu0mjfxS2AI literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-help.png b/3.0/themes/smk/images/ico-help.png new file mode 100644 index 0000000000000000000000000000000000000000..5c870176d4dea68aab9e51166cc3d7a582f326d6 GIT binary patch literal 786 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 LNkvXXu0mjf{7~S; literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-separator-rtl.gif b/3.0/themes/smk/images/ico-separator-rtl.gif new file mode 100644 index 0000000000000000000000000000000000000000..d9061a4641175d60c6a9df3a9fb8cb3ce04abd1c GIT binary patch literal 106 zcmZ?wbhEHb8)b6dA=UB7<)%9Se@FJAor|9=K-K=CIF rBLf2mgAPa%WCjC^xWGxz)pK21f=+U{nF<^ztbDMtF#L6#AcHjkkq0CN literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-separator.gif b/3.0/themes/smk/images/ico-separator.gif new file mode 100644 index 0000000000000000000000000000000000000000..3de2d0d390812600fa5b649e6d5dfa66ba99da58 GIT binary patch literal 106 zcmZ?wbhEHb8)b6dA=UB7<)%9Se@FJAor|9=K-K=CIF rBLf2mgAPa%WCjC^xWGxz)qA(FIIiP#PM2jc42h4(lzA2>$Y2csWjrCL literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-success-inactive.png b/3.0/themes/smk/images/ico-success-inactive.png new file mode 100644 index 0000000000000000000000000000000000000000..74b2032fabd3003d15ff5e5bbbb3366e1c9a5dd6 GIT binary patch literal 476 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLluUxtE z_U+rNSFis0^XLBk`>$WWe)a0rty{Nt@7{g>{Q2wGumAk{^UT5M*VKXl~C!WC

`HUIzs literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-success-passive.png b/3.0/themes/smk/images/ico-success-passive.png new file mode 100644 index 0000000000000000000000000000000000000000..dc8d1ded86b481442c017df192fb7e616f0f7a0d GIT binary patch literal 617 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLlU z1KVzG+;(&0(dYY*Jm0_J^6EoR_Rifu>*wzuKYsr>@MQPh_qW$vSTX;=oZUCJAAYiD z!{s$Uetkdx;`EVc`!?QKv*PTM-S@WcyT1GQi-U`gFIand#hwS-)?ZqE;^mSO`}zCl|NsAc^UoUt{pe8=W?6Y=YVB~!|^~x0^v4kg$5o`hu3fYyZx@!|_ z${QG%b~|5bxXAlVrh%c!!bkjEIXi~}&wVBq35IQU7O&b&Zr=rZhr!d;&t;ucLK6VL CZDI5P literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-success.png b/3.0/themes/smk/images/ico-success.png new file mode 100644 index 0000000000000000000000000000000000000000..a9925a06ab02db30c1e7ead9c701c15bc63145cb GIT binary patch literal 537 zcmV+!0_OdRP)Hs{AQG2a)rMyf zFQK~pm1x3+7!nu%-M`k}``c>^00{o_1pjWJUTfl8mg=3qGEl8H@}^@w`VUx0_$uy4 z2FhRqKX}xI*?Tv1DJd8z#F#0c%*~rM30HE1@2o5m~}ZyoWhqv>ql{V z1ZGE0lgcoK^lx+eqc*rAX1Ky;Xx3U%u#zG!m-;eD1Qsn@kf3|F9qz~|95=&g3(7!X zB}JAT>RU;a%vaNOGnJ%e1=K6eAh43c(QN8RQ6~GP%O}Jju$~Ld*%`mO1pkc2-}g- z5HT`>C~wb}xSb4;06`?y|Ns7iL*&n&KQs>wkR2eq zKz3q;2uK3tJ5Z=3I7-vhAs{VgkE%>5*47O(W6P zVqm-e{r!tQM819d#_;mxO9rqjXb3=daBy(o2oYey0ZFp4u`zgQlN7)>#2N8=2xQkk ztcevEOziCJV298Hfb7B^H9*&a909_sPQE88jd6#nb?Ul_XQZ~OY~`%i8nw0~k^X34^E$kOhdwLt1P(di+- z_bGBTzJB+ap=<7zZy!H>T)uW{RXvf$JS&{I9X&)K5~S1@#uSv}*vY@yV` zhHl1<9|_k0<1WUxWDCLG-P=}{*H)ImX0vf767$SGF~;L@K2IOhS?rCBO*NkAd)UjC z6*+-0;qt|PH=@yKUdK~Z9j7nd!>+9ja2Cjx@>Tvq?t{SR1`;!17zSdoSYAL*^$pv9qHIny&Nl?4Tk-BgM2ncWsb= z&!(I1!vctr6Nt(p)pIp~rf-&VIZZQCOho(iT}`H8W+3@QgbDNTWn4eOeYb}(J`ur< zfhSNj-NbLBD&ME?BsY^j*^VUv$+;t^-K15T$ir@^t%Bs@ih zP?Q9aiK%HUW!>0Hk8G2V6p+$I$dmwCSd61OHT zB8HK;rW9^-ME>t1M8WVoynH>4q30pyT;Y3e7qGUj2AfvbqRj98pvMT6f+;nIuJL?{ zH-$j!a>}?r^bAc64OtD%h3*FaphE^tsiCxtj*go8e|@bV$4*|rAx+O}Z2F%GEbx`i z3J7~vO*))~zi=S*h77%W4v)u!l9Ccr3ob4$Muo2+Ym0AdYeUzO^Eh?z=c?I8W$)3; zTaMgIvf0EOxIs4`{& Q@&Et;07*qoM6N<$f^mKF3jhEB literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-view-slideshow-rtl.png b/3.0/themes/smk/images/ico-view-slideshow-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..5788b3c35f6a5972465b4028578face77ba02c06 GIT binary patch literal 1137 zcmeAS@N?(olHy`uVBq!ia0vp^N>pyM`jBLiu`+b=IoNLuF{p) z`m%2=iq+t_#(SssgJ*z?e9ebQfz|r|*yN9_dXTTd(ZsQ}bahB>4tG}Xu}e`gQmk8r zw)z-YeUFi!H1kg6tYsz(*xOW|pZmG*eckhvyhBT-{E%;&zxU49^`;CATk3Teh$vb! zeqo-Fy6e~H84C|G-eKOL{{N?4!``3YW!tx{Uzd~HH#PM*bLYlsulw(pGpsnbe9xZT zw{tIT(#edRmXrOyM1A|(y}@ZllI6ME!qp~oK3KgcW>Q1$Z3YI;TVB4yPwa&Y0NMc|LYKUp&WV*X^?}cgYCf76~8H0_DUv+MaK-&GAwW*urPHNA27R>$jdHk+-p zmbF^FvvTS(3K9|K^w8|K`t-ZM_ulfw6<>0Ava?ogC@&T+iTylbC!dET&@M|&X3tZ6 z8b?&sTNHTI?ms>^IZ-Ee3&ZXx=|I6=mUo}8|N0mj=a+KWGQT5-^~kxeSIforO8o7( z{qcIjthTedr4bhO@22#v+}g8|Vc)6Ko*hnymPd#hO`GKq9xr6SR%g~LpAh}EbIQt? zoN9h(>8mFu*VNd|4-ny&o;-Q7$I>8%2K{*TiD%Oo8Kkt|b`%vb9xyozGN_Yf(Z!5= zO79IM+a9hvdPXDZnGjF?42SqfviE9MI28ZY(wSkN?xpCb%OKGv2=WG}>ch=`qK{m> zV|iyKX&adQ;_RQtySU0zRVvF@LeOrnfIP@~Hw<``x0uc;Eh~5d z|F3#&#_53FMKhnjUVW|T95c|R)N;NyD&?sZ;IBD&R1H@ z>U?>}e>^wIvy7q0-K(WWLJXdYwxiyDgKK^aH^A7Xb?)9IFJXy{a3+rFq z+{iI&+0N|Ey?5RV>I0oFdHK=t^Km!07-pS&+-hxj(R#*}@|>(0{{*9)zVNACo=~9s z@$;sdeRlt?9^I*Ua^+`o{iglvyfjZMwHQw8bJ6yT+g-HI*>m@vH)obc2aCnq)Gm-q z?J=I7*Xy(O*uUxZRrQQ3&R@`sJHLGuFgL1}xJHzuB$lLFB^RXvDF!1014~^)LtO*o z5JL+qBSR|_Alux^z~HRyF-sH;x%nxXX_dG&>`AC=1!|B4*$|wcR#Ki=l*-_klAn~S e;F+74o*I;zm{M7IGSvpCh{4m<&t;ucLK6Ux(DaS~ literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-view-slideshow.png b/3.0/themes/smk/images/ico-view-slideshow.png new file mode 100644 index 0000000000000000000000000000000000000000..82f61f63c57949bf7dffa91d76c89d3657caf14f GIT binary patch literal 960 zcmV;x13&zUP)nHBM_#-v%)!t`OpU_1U0)Bocuv%jxL>lPLwC=ancCd%%-Yp9-PI zM&H0N&b1sw{$AUrg@~eV zY_uJ%g2x-gjfX>cF*b!@Xhk(wYcVV}KF=%3Tqb0$ADC~{tfFXwv&4@5`Fk)u=f>#g zuV_E!L|sLZ64M)6e4dvyYZ&ajp?*?vI9Atn&Y}#f8HXy0@!RXidm?7!(=1Lkl%u9J zKcz>s_&l#kj@M5~oklSe!fdUPwQDDuj+CRU*p8PqTo7*phSXn}$5SEsfV2K8l&klzp1)t}YXroxI)Qbch=~X zp4&%^GolqzT9}KoCu>oVyVXN)t&EUAX0usW2>tG}7#-c6?OVPE#5OcFKF>=|Us=cx_(@|FL5G literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/ico-warning.png b/3.0/themes/smk/images/ico-warning.png new file mode 100644 index 0000000000000000000000000000000000000000..628cf2dae3d419ae220c8928ac71393b480745a3 GIT binary patch literal 666 zcmV;L0%iS)P)eOSYYtbpBV}~vsBnU!_?2tr-P=|^T zED%wc9ezHgW@NMb!^uT_|SvCpFLJylbx zY%bpaTGI8IYXMN$9w<3j9VkA~NYOKEQXsj?6a9_hcwfU$acAhJhB)zb_w@MVUEy@S zX&I>K-R!bhu3?(6bHWIg$HEl7{9g>>&l_qdd+UYb(1~BCo9LptNq&8>!yoJ3Ui(i5 zRJ|XnYBklL!{@$-7=3mJ>P@1c=7Oc79e-V7yf+%lD2!I;Y&nXBZ>=B!5?CB>LvEx6 znI%n)qqi$#X#wKB(U7XP2P=+4{b@j#r%9-K(8UqtSDk>0UKzf*HM9yqMZ1D!$2MdZ zR=`U>0zhOH1XqN?nY@AQqB7)Fp4{v&dKXvb43hZKvnN8;Po;+jY*}~*Z|W9Q0W%{D z^T}Cc<|r(Su=1K=P5>Z4 zg`et&Va}tdzBS-G-ZcO)zCWpJvGQwrHZ`@wpM420ac@bI5~KkTFfGEM3sPWO8co4^fI6lPnA)Y{ef%@{+SnoUk0+dW+*{8WvF8}}l07*qoM6N<$g7cXs A&j0`b literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/loading-large.gif b/3.0/themes/smk/images/loading-large.gif new file mode 100644 index 0000000000000000000000000000000000000000..cc70a7a8b3d426c30e76686fac70c0dcd4c70125 GIT binary patch literal 8238 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 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/loading-small.gif b/3.0/themes/smk/images/loading-small.gif new file mode 100644 index 0000000000000000000000000000000000000000..d0bce1542342e912da81a2c260562df172f30d73 GIT binary patch literal 673 zcmZ?wbhEHb6krfw_{6~Q|Nnmm28Kh24mmkF0U1e2Nli^nlO|14{Lk&@8WQa67~pE8 zXTZz|lvDgC+Z`3#dv5h=E26FfcG1 zbL_hF&)}42ws10s6^G;;cE1^EoUR)U5A70}d2pLv!jVIT7j&Z~EblI3x0K*v_sV|m z0kj3v921Z^em#l`(k(o@H$3ZdDRc@9NidXDNbqrumReCGv$gd8+e8WW28HVqkJ_9i zH>s*<31KtHjANIPvi2#*6BEu%3Dak5O_t&NBI)H?V$TxT}#l{vOTn5naXTfF^&~Hhq+NX@#Ccc>y7T?;vjI&jdhsDsPJyAw*m0Qz>i}K7# zL9w50Ng{fT}A5JUe8lRK1h7_Y2;BWJDd=c6f&i?Wv5(5q?6|P zQw{>maxZP<537OA37Uk}7@%_$4o$EWe_Zl>&#id|lE-BpDC#+Fn|msJ%_2h{Hg1vP z#N8WAzfWasG}yq|xqE)DrWaOofX=z|?*pgc%{ig5vl!pqDlC|q&~Z0$&Rvsft&VO- z4MZj+%-+Vx%W}v;V76hyp=;+R;x+~t^Q%*xuFTQAF2})fSfTHDAs>sO!OBw`)&)o$ c0!CNZt))x~rAZP^^P&YOFfdqy5)K#u0POD40{{R3 literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/images/select-photos-backg.png b/3.0/themes/smk/images/select-photos-backg.png new file mode 100644 index 0000000000000000000000000000000000000000..81c2d616d6c89392d817da1abb468261c3d65990 GIT binary patch literal 1154 zcmcJPTTIhX7{|}*tr#^V#%x1`f|0}*4H|C=CJY#gS44@ZNGLM#MigBHOwh$kH!lw} zfKKCsF;U}-Mtv|Ci9$dT6hVi|Wn)*?j_%TJEj6~p(^=w+kNVJ__TS%k{@?e{NiP>} z+c0-_(rf_0+=7jHMR4tg*IslQy!YDH4Z>x5m1e63fG1sRW?Z4*yIQX;(eFHdP+yCm z)B#Q9@d_PQP>omVigb8oea(Aa761xm;g((6(Ex9!`L85L#YA6JBx9mG#1HwoelP20 zgg!6pjR?-rPns32K6Ye$!WrZpA;H54->C^#=*KuKij$LqD83sBkWrz}75?N5H+GJ9 z+k=-{sdF#M=1w{g6E3z=4K3t%ihFMl_K$I|h9f?PA7glDfN!%!?eql2@S`+OGQ2Cu zzZ#14I6}Q{ZqU#9B0|q-h>Gw5R(NL%JR4xzZPDhp^bi?y1b9b~e`00MwvaR{v<^ou zzxMaIV`pEIHb2|v<$O`0$IU(d5*{RD?e=Kj7&k((SKj#PnDG27^U=)(Iq~xtI~o$| zU-&wQX>a&Ph!bt}gg+)GcCYIP0AUL9G`s4CDiW37nr@g>uI!w>xuwaNLDkVvsa|q` zSZlVfe7;~7ip|`*=ZgggS;eaWV$$5sJXiwq4;w&**_@nGcD)Ip7-6#DNIF0csp@B7 z2IBhefBa}lOFw2YpazhXU#5U|Xj|OQly<%HFmo=5(8-o-r&rtD{K?sPimYZIghR;W_So;D&dq=v;0osP!r z;{8xgjNTkbiX8rsvw2|u94XNb{e5CGNxAe?W~TI6S=+p0UaBj5Pe#e_#9N!K#rKSB z3u{i-Bua@dU-E#&fu-r10w$in{!9tTRl~x<)#{Y89W~S7d|?tt+7;e$2q7b-WZuJTBMwAI$tY4<5$Pg#hbxUgOCu}UZN!=~Qbc-O;a)h$>&<@wQ_ l=2ZXDQctzDqXQswz?LpEv(NwND*TCn0`0cE$2sNae*q*?26zAf literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/js/ui.init.js b/3.0/themes/smk/js/ui.init.js new file mode 100644 index 00000000..2c67bf3a --- /dev/null +++ b/3.0/themes/smk/js/ui.init.js @@ -0,0 +1,131 @@ +/** + * Initialize jQuery UI and Gallery Plugins + */ + +$(document).ready(function() { + + // Initialize Superfish menus (hidden, then shown to address IE issue) + $("#g-site-menu .g-menu").hide().addClass("sf-menu"); + $("#g-site-menu .g-menu").superfish({ + delay: 500, + animation: { + opacity:'show', + height:'show' + }, + pathClass: "g-selected", + speed: 'fast' + }).show(); + + // Initialize status message effects + $("#g-action-status li").gallery_show_message(); + + // Initialize dialogs + $(".g-dialog-link").gallery_dialog(); + + // Initialize short forms + $(".g-short-form").gallery_short_form(); + + // Apply jQuery UI icon, hover, and rounded corner styles + $("input[type=submit]:not(.g-short-form input)").addClass("ui-state-default ui-corner-all"); + if ($("#g-view-menu").length) { + $("#g-view-menu ul").removeClass("g-menu").removeClass("sf-menu"); + $("#g-view-menu a").addClass("ui-icon"); + } + + // Apply jQuery UI icon and hover styles to context menus + if ($(".g-context-menu").length) { + $(".g-context-menu li").addClass("ui-state-default"); + $(".g-context-menu a").addClass("g-button ui-icon-left"); + $(".g-context-menu a").prepend(""); + $(".g-context-menu a span").each(function() { + var iconClass = $(this).parent().attr("class").match(/ui-icon-.[^\s]+/).toString(); + $(this).addClass(iconClass); + }); + } + + // Remove titles for menu options since we're displaying that text anyway + $(".sf-menu a, .sf-menu li").removeAttr("title"); + + // Album and search results views + if ($("#g-album-grid").length) { + // Set equal height for album items and vertically align thumbnails/metadata + $('.g-item').equal_heights().gallery_valign(); + + // Initialize thumbnail hover effect + $(".g-item").hover( + function() { + // Insert a placeholder to hold the item's position in the grid + var placeHolder = $(this).clone().attr("id", "g-place-holder"); + $(this).after($(placeHolder)); + // Style and position the hover item + var position = $(this).position(); + $(this).css("top", position.top).css("left", position.left); + $(this).addClass("g-hover-item"); + // Initialize the contextual menu + $(this).gallery_context_menu(); + // Set the hover item's height + $(this).height("auto"); + var context_menu = $(this).find(".g-context-menu"); + var adj_height = $(this).height() + context_menu.height(); + if ($(this).next().height() > $(this).height()) { + $(this).height($(this).next().height()); + } else if ($(this).prev().height() > $(this).height()) { + $(this).height($(this).prev().height()); + } else { + $(this).height(adj_height); + } + }, + function() { + // Reset item height and position + if ($(this).next().height()) { + var sib_height = $(this).next().height(); + } else { + var sib_height = $(this).prev().height(); + } + if ($.browser.msie && $.browser.version >= 8) { + sib_height = sib_height + 1; + } + $(this).css("height", sib_height); + $(this).css("position", "relative"); + $(this).css("top", 0).css("left", 0); + // Remove the placeholder and hover class from the item + $(this).removeClass("g-hover-item"); + $(this).gallery_valign(); + $("#g-place-holder").remove(); + } + ); + + // Realign any thumbnails that change so that when we rotate a thumb it stays centered. + $(".g-item").bind("gallery.change", function() { + $(".g-item").each(function() { + $(this).height($(this).find("img").height() + 2); + }); + $(".g-item").equal_heights().gallery_valign(); + }); + } + + // Photo/Item item view + if ($("#g-photo,#g-movie").length) { + // Ensure the resized image fits within its container + $("#g-photo,#g-movie").gallery_fit_photo(); + + // Initialize context menus + $("#g-photo,#g-movie").hover(function(){ + $(this).gallery_context_menu(); + }); + + // Add scroll effect for links to named anchors + $.localScroll({ + queue: true, + duration: 1000, + hash: true + }); + + $(this).find(".g-dialog-link").gallery_dialog(); + $(this).find(".g-ajax-link").gallery_ajax(); + } + + // Initialize button hover effect + $.fn.gallery_hover_init(); + +}); diff --git a/3.0/themes/smk/theme.info b/3.0/themes/smk/theme.info new file mode 100644 index 00000000..06a45f5c --- /dev/null +++ b/3.0/themes/smk/theme.info @@ -0,0 +1,6 @@ +name = "Gallery SMK Theme" +description = "A crisp and distinctive theme that uses large fonts and icons for easy navigation and an enjoyable browsing experience mod with carbon elements." +version = 1 +author = "Thomas E. Horner" +site = 1 +admin = 0 diff --git a/3.0/themes/smk/thumbnail.png b/3.0/themes/smk/thumbnail.png new file mode 100755 index 0000000000000000000000000000000000000000..c8d45ec9d902a9eefda3615b7b0e817b802a35a3 GIT binary patch literal 20740 zcmV)|KzzT6P)Kq7QQBu0IR_4xX} z8|qf=I%l6#Ri{uQk)VEDa=BbA7Na&~L)IYZr-7BtW)($wy$iM>*S2f`YeTMzTt#4s zqLfN!mX;P`@subEopw|2bYAcG-H`PWEf#kyQxHXj5EVs;hX2zcMKNJudlAnuR|{B* zs@?nE4-bv+-2dbwz}RMHP91*bCC9d3?+V$F^^sI2kLgH|Bt;Ubhyq{*zVCXz(QY~c zBl7g60;`M5OMNQ9`4>L?t2=IZGldu)hjiq>_{#p!2+6WS zMIrn%Obd=jVYmvDivx?t=+14)ZG)-f3-xaws@WbWJSwS4_wLF&ek8Kgw+^gS+RnN2 zap7WK@e&U%Ye(-u%$cFrky z4J?{wKE7MHGd%DT8lSL^exIJ~Roro@sj&#RI!$FTsh{pBNj5S}9Ajt{6QZvyX9u#e ztz3yg;Zwq$4;`#d9XsNA-uaKX#Bvjl1I+fN!4XbgU*KNW)6YrNm31t}&sf0Ig2rmK zT5G(|MS(^C`c~zB{n>AeJMZ<5%(F>3Y&E39K-j>x*Gvp18#5gxVVL?-VoQb#di|q+ zJk^ux8T`2RRLzclcWP|D{gbtfx^gMC4^O}Jc48PN2!eI2;wuK$I+o#QFR4`O*s)`l z?Wl@unMMFyyz98p41*ckwjEKFg240rAPfS;FsN(Rc$V{g4-SEc2*<-Hx;V#r^H|Ss zQb%mtVpygYA1KsMx3Iutj`qD)qF1diolb8auYgYSPpAXqZ25o8s)myPZ^=W`P4^F$ zhMe#xi@pl1FbpsDj@Klxu5|%m9X)!~^@2h^hdB%|VKC=9Rv6J3Mb%n8o=j7rFNk8T zTINNCV=>3^u4!RGK*%>O*XpzyZT%9wLXI0vtC8zC6ys4ShAG1jS%!ux_aa0`LCcML zRNk?ysz)V6Tx#3z%2FQ*j(k>6f2o!D>7t(l7L8d&;Gr*sz6%`yvup%t527d}5fSQq zU?DmYkDG>}sH*F_U}T$Z9e!0+74D;K@j(nOGXcUsp3Xekw&bKTRewSsLWm&ic zE_}U#u@1nRnwsk9x+n7STY@XwhgW2d58uo1nA>D z+k_+QA0UOcxpgQbTa715PUk`z5H1Rmf^ z36kgDhQ)E*_U+p%mCC}x!g;_#eM7?%ONS9+IXEBC6VVa!Lw{vy z!F0Srq0raYcktjr$8j#Fs@{kKO%MG9YITkGc^$?If26S(R^nNTVMT!hRpo=trVv2K zbBsnyr_KWw%kdn`iju@)CJZCT(m`WUXPtmmt9lk#NR}nc@d9Wm8h%2Up)3p9JF+cX zQdI$dp(D%nDbOx(iSGe$08i~^!*bl!`@jw1q33`Fu#+Sa${-3n^j**OfpEZsy}-8& z9h5B@&Yx@fP!bb{d_I*dIIaBXI>4C)m31ZbkCnpj~3^+=jX>QEH`gxR#0}CkEU3cB}wXc26FpOO9Kt7dBrqc|K z0^3DAGj;eCBVZ@DjCI;=O^thj69f^!PUHme_C4D;bnuW9Z1CToJGnTpIF3^krCzVY z_e44yS7q?nShk7%oXP5eV^I;S%&doah|0Z)tem(^N zP$=|d@;${;sokhrrg_TAN_CONoo4050|)&e zf^)Wy_3eM@;HL3W%nGe~xl}5#ENeQHs)(va)-(pbfBe`H!*XBmO52c&2$@;QaW~!h z&RgI4D?WuDd+={x{J}#(5L}khx;U^hh5k*$12I*qx2;S<^}~qAsA+m}k!!c=Pd)Q| zNV9j``SzH^6&DvpMMgBUu&^}HUvMq6X-4U|=GeNZD3e7);!LoOl!EJ2cg z?GHa`H1kqIHock8{L!zW&|ha@6$VBpw~U3JwNhzGA}b2K=Xtgp)K(VqgPRsk9BI4s zuE~jVt<{suc&xNgjAs3LHn2dzV|^p9KL%iVp7(~uJru0n zZvQl}BsDSAn`yM|L`?0pYV}r!iYON9nqvdsYc$(^{r#q{!wpi|e5X-yT(90}gy+rZ z+yK_qm1`7O!{ghxj`kKy^>{261de6dt{W(cxPWmOI0s%jFgUhF5jaFsn8B9oFo>Eu za;Vb$QS#yqU|n6gCV_>};P9xxG7Js>u>wce8tqIv(bf&maS@G5%S)+T4-=8dCc_{% z2$L~odg{1o|0oOE2C%NKT$8|B57_|L)s+ok{Yb71SRBV@GbzxWjvwkSM{7MOLM#qd zRa80F4}!q=S&qXz?bsxPkSGEm+=l4|6vfae45A=HVT2eI@GON~w=sVt3NN0EVFOre zk!t{0v6!-V&vsIOf_l8j3R~V0U|D9V{*01W+_XaBazoL0t+&_kDX`R-;}0(zFPy4` zQ7Ezir_grc1yNj~QYvaKE+6=(|L)uRMW4F?thLBB0IXzEyJ_$CR@=mC{P>)m-Eq4a z@8u}AAiCFSR_o+5i?6&iuxYGk#~tG6uBsE2n(lNhpaVC>1%0`6Oy*77U8$O~#3nR) z@x-Zr{?vbP%!_Z4vH`5M$g2U1<#>VTR%54NYW!|~D2Bm2&jsBSqclR~OBm2JrpUr~ z%5{G%fAKm3OL^Pv`)YOb)beu6Ww&qLDrN?<`TV9Bb@b`|3$rKv>RhgnU-VdM@@{SD zy5T|so-v#j3kofg^lPZ;1T!lg%W_jGVR?4`Z~o+WEu($W=WYONE%K^ytXOJns1Qb2 zQ>AvR?fPD$TJn*QPH2KC1)k5bY^PP7UoQ0z4u`(4DN3_dvn`hwWuC{j*;zMW#beT& zZ<=&`{POWr0nP569NV{ZvM--};_+wa(P$uKqL&}qIhs1OQmm_6@BQFMb`Pg86*0&s z$vmT|Zn^Vy2aqpg*09~F=~G|%U%$UbjRjrGvaEBB`Wh3r&;RLi=XbBBw* z%yK~(_?{m{VK;XMNlge$!*jh?+r{YBfQ3b6WFRjJ03()0jO$uU3v-r7r&DoBk}*QQ zA6izYT&<F_JxJ&sntfEUPCY-nGox%EW>h`L4v?zjNuYd6pO`THvu-THOefD@45S3cfRGV@DsdCNCHSyvu%9k z!H1rG=IKHq>Dq=Osfkq5vh8-O1urg$fLG2i4AU^`wc6tR!es#qUXR6?q_e|J7=+zK zm|zeip2b1;{A0KJ+^{k%>zT9lAA_Ew;SHmS_4=g7@GxY%gj%RB`_F z+=Kryu-Bxqpnj*Orr=etyY9MNBALmg6WOdNNpJ+J2icBm*@o+MOrz1!;gjeFxD_IJ z1JtoRm(HXY<`zI7sH!T9(&}x+uGH&wXyBI*9&9ukJv}{ut;+=#RB|qxj>TiLB7=S* zvnj#$UsE|=@IhGkk|6p)sdBq-1e z&py{^HYa!P*tPSzfTW#v`}+Eu&BlQPFN59r{^O4=udG}du%MUs_4i1U2<-|;QdAZ2 z3P?&OlTiQA-k@tcdW&Vb4}a*Fd_UU0eKM2Ipf2bsbOsiu7Z(5Q&;Dl=c$%if;+m$# z4a0`wd5#IDP}j+ZMtVm-Id$S%1(qb?u>oPQKbOqK+;%IZDTbn(C(BmV^bXGtvl^F_ zpRX59TCSMZuk3r%z~-&RiOow=q7%hyI37e2*qrYEWMnS0QJFpU<$oVo>!Pv3eS7xY zwqw_u2S>*G^HeTjf=*XeDV-5CLPcpWXe}&4Q?Z$p>A2NWxmGGQmrE?q9y>lYGdo*v zx3pC1?RURpa9}X%dP&e2fWi|eroZyluP!eyUn#KYzW%(T$U)%o0+vLTLRgfPY%U!J z?#jxF=LU&H67D=XxszqtTsA*AI7pM^yj@@c{KKGSm_K~{u^)W@(OkX&mMKQE;ahsA z9YsDopkA%{QP^s>P948?fh97x?CfDM^}#tOrIyZ79^ z=f?L>Y#rS^=w*|-V_K$dgur+)n@B6ML}zZEVVU^o2x3?;lmG?2)h^D>*N#ptE-sj| zSQs5irBbVVu)}Sk30=>7`st@X_qoqiDwQh+*1$jyn8KyyQ=YF63~Y*Nxp*=yipvb^xsuRh4jF_vZEOxJZm2g|Ay z(x_Rj!JoBSed_3O>Ozj`H2|!bg73R^K#Z}+7FQ?_Yl^nCSW+c<+erV)bJH`AACA%N zjiV#qTA9i7!drVszcYQvO=@@i%7>dW=gX>z3l)CY74tSFfyT0nCyzYv2mX2h3xM*j zd+xn`^S1X*OyoxUTKPQk9mR7z&#&u7-Sws30Zx?KwYq6`e9NxuI)mBX!2t^6XTR}? zQ?2DUjYM&^QEz0^87-A8gFb6C6ir=ODgJ+d{^v`}OIHl6;gO+SHdC#yv|8n%!Ohux zKTxG8Fs7%EAjGL!dSc6#Tt1&nra@83k~A_h2&|mv$cDKsy|Yv*dSTdFDLwSfhX~*z zDxEDvpJP*eDwV`QF}C#%Q)e z9NDGLv48j;Z~KK@wisIdCWRHO52k09Ya@I1rgv?pc-nDsi%M{r5mOt{nYdY;Iry3X z%Qx2tSpVm5{nnkk_YF}|vNzvJ#K3LfEbtcSw%LK^VL(|K_VmJvXBbjMt(dyud4-;y ziCb=*ee(I~Q>VC0qE>H|8nrjyd1pMC1fuoBAN~;e;mXSL51xFYe8n1zp);9yI-Lb; zxU@8rh^P97HnC)PWgo1ZEXvRZ$xKd*B~&%0sz9RTR7ztxK~v*E@JrPS5Qj>ocI1Wq zFCRa|@eCDuoTvevfYxF--t!#GvY`J|N|mFBj$E*K*8;HO;yt$v8%}$!QnOrYY#7*< zA|i2mc42vTiF$t4cKyD1^5)*2mBpo#z7@M;&-8N1i-POla=RQ)Hkzi@HnwiwRKdNa z)b4uOIPflg{_N51A=jX4O zy!Q{lg?XUo;LKwV(=--1k>goK7FdRAH|xCvqiP~2NwUOa!!R~)9!E3{3QUm|Ab;_A ztWm4K@XYhizW7uS>I@2F$sEQKLM$hWa6a4?c-!*A(vd@lsB2VX#bd(lH})nt?1i)w z`Z0+Hw`;ys>3F_ku?s&qT&uM{uxWf3Csu9iv1WZ`q;RrX%H|W>_U)!KKQTy#lMIK`zp<*7X;Z%CJH0Rb7@3zpd8BO#gnr@swl^* zcRE>4-lD|n62omB+04>>Q+F22N9I-@oS8n>tlfS8{hZ_W$x5#zhra)j|Ms5`Pfr)F z)D&*nG8Rw7p!@(G(3>2~Gc-nYD9b!>bEDJYcsbucGCnr$ImW``0+4sWSTd37?dd&w z>}XGKFZ6^{Cr*C(3x8*ub;s6YiA*e>WiZbP5)gcFTtFW$FD)N_<=|xj3*gJK*l~U| z9iAa!5C)v+h(a8PUDt>9Jv(0>$uj8I$aWl_=WN>*1b*FsB}??)-Dyr_jJi27JR-56 zAY23c%bg0{icUUyOf3f=otW&UQPuapTUvRNx0?zxGSZhC94J@oBYgw;WD4^L=x0S9 zU1}=d`|Ce(jdck(1pnbZ@Bh8~?{|8$Es?L=PQ;5)Pw?`hBGW7f&Q*D7xpI0&UtUQ% z{s0z5jwxrf++beuJdB-H z%N!aRft!Q>_|0#8gJo#LY{{|;blxycu#%FbbZ6U#%S$V#Pn^79@m>vBiEQuI(cZbm z6>!oqW;Im-qZ-qcR=W*=i>FeJN`)5%$MrqCJ-1Z5>E@f5&|NCkdh@B-h2qFy@45j? z5U89k>^ zm8E7Xp6=^O0d?kh94qu!8vbJsKLZSVU4ZqU?tkBJ-*Y#uND=1DFalPk7ScEj;qIZV z+P)8pF=9BwGR&2dq+6kF(FwUPE$Py~tu{#oF9+ct;!Frxh+C>4uyr{^vQ zSZK?R-6MVJxw)luCRJ;+M~4Q=#VW=$*jPniO#qbZfkuocQhKxa?2Cu5-@BKI+}XwA z*rwryx%s}qp>>>(MQz)jv?2?!(XP?WrmZ9FcuY9AG?zvx`#UrDvHg=-ZMj@L(rF*_ zt^9qv^d83ZBio89EA6C~5+&M>+?7ftS16dK|MGJrkh31Z3jg>$zwo=a-VP)t;(2O# zAQX72Sx25nsaixaezRQ;eXtx+ObdD3goX`$nF<8o3mpfy&6w_lZNqf@if(@P*efqA z&F>x>`K33%nRc9C{i{Dec>2^8N8Ts4jApZGs9w-fEXN_Rf1yuDz9{hBp#eXnq~Y<& zfblY!ehCXIjv2aneERVB9{<+Ocig+Rn)(6Dv;8;Z9 zc931^q*kjFi)rfyESd@W`#6AynBsfXI2HOGyBdamv+3mgjPU%zz3D#O>CAR&hnvk3 zO(kz1lXm3VV59>om&jTzBb`VT+l|AgPpN7=^6)GBtDbjpQh5n+tl*FCd+)FAxSj)A zn@KX+6q2Q=(?pIRq%%RQ#duy#<1%FTIHtkS4HOM<3A`FxJ-n+HPFRp_}67&TrH1BS<}G(0?} zDsr_|TPo=j1DkV7wq7lM@$dig^!)6NZ+-WTZ@c5rvEy#(1VV-+uwWv<_L-(#tyFva z^Ecmq)6~%u$BqN`78~UYv(;;WyfbW+@25o`QEZgpd07)8CXjidWBK}gh)y}%Q(4Y* z9HX_^Zqx%$7)xaKW*M2`Ii)vU7|Qi?5wlQUo~bN0n{}h&xE0sTe?un*l{;NCRF`3Ez#%KQO(EQvL18eidXn%iS7)C&Z85Y}?AOd#I7x)I|U@Rs@0jr}7BPMce z@L3~ClsQpq8HTNQVv33|CCf=QJ3#p~8_Ko%@`+)old>7QY)_{Qdu>Y;dr4^t{gsiS5*DRo%?o8>1L1egg-Lr-=x$Aodw0zE++?4m+v}MqhX6Qza>DV1T zHkd(v;MDboZo%!qsunHtzdrlKe5*OyH+c8t&j0ccpFg%Ze`VnY_~|WgxwYA>0duDr zvZOokqgX7FFZ5Y%V4GHP?j-VC$$V1g^ZD`XJsSVTCqCI}l<#`m9esl%xuH!FCoL2! zzFrGjB~2#8pJr$PN~2osG@H3XPe>utGVAr`k;B*QkPZvINwfU`r(?0eZqYmj=FSOG zGQ*}?!oS(_%jtmi>UG_+D(!|Osajn5r^?gcGmjLqnelBYbL z;?w3OHliSqSpXCK_`)1w``#KF?Vra{? zmK*ac4J{_;2GgNs*H&8KR)wRcCt#dQ$lv@%}APhEM&)C-hq7x{2}KH{H~~ z?Rw&!`QH4=qkgLtlR1_LPnQCY)vVUQGKh)@&YP+wO2z82BU9030t;~x&C7var4Uw< zIf`Z@rvq9Zun>Vm7zW)>KLU15_Hrj-G8*G3@Zf)liq?-~(LT#`P{@fK!wZy)e4p_I zmEu)2f_i^*;+J{@$!)j6fj@R~YGiOol(;91>8~66JCv)6!dv#-z}sK}E9rCsQC_`m zefn$1&2=(`AG_o2Zy(!ghT;D5(zmCN_oq|ixt`v5Vt2k@+dM*L5-6t1C+4z^mMCIC zPkE(L(d|tm1)(S7n4VQ^Vc+TmF6B70&DLKZJYe`<#NoTPP5!U1J$Up=O(E3ku3bCF z$H&NwiNF`gvLy$z7~DGF^8??ml$LG1B_&cWoegQSDf*L7Js#TTj`2HU znZ~(rs*sS9iFibXuH*B(*sM1UqlqwDDlR2c8P5)1dT#&annE_&Cynm2X7(e`?caGT zxX;e=F^5rQO=Ee{vvp2QcNSi@Jr+uic?F9Kz$7FadxM1Q=M~~`a7fduO$G&yZyT1) zDLf~$N{rdg4t?~x4`e;wZ`Z4O`nzugopRi)o{^WJT}gSBeK zHf=;fyD^`B@VI5KOSmEU&9~iq=gwVq%YJg^bi;E7GwIPn@2I3Gi8#A$RPE`Zn=PtZ zmzK*^r2!?cTDHXV<0E}ce_v3@1jpy>`8gB?pda?HEPw9sLCfNqu=bU=&G_87%mo6L>D>#n3THTE}%Wg&dVkQ@}UV zan;h@<#OGL0&u?Kaq-=oZu{7qeo68Iui1R&_{(2@?$KYo`Hs!WzJp%v3rkNr2@fiN z``8ef8zu5o7}}O)TJ%@GHtRU+5pDpE^`2jN=dK&e?G~tV@B!25G^5B4cn~A~sw5|D z-_YBp?NHT*w@@tAo6tc0lA21ym~2`Y>N95+!g5i;blYE-Qg5OhH?Ck(QyOc54}pIXmmP?sMU%W9>cf>I2J=kf@FKX9v5Ye zRhO!@8hBm0B~WPJ`1SAI_trE``E~uVqc6SOUfh=Jm7Jg{I4iMQVOt`ZkWfIalw0uF zxF(w&+jFF+A8UH<`h**P@1A#kX!~x=GMHzbWFj2uk5q-FA~py_R$v#3K}$Co%5`jH zSVpVeFs&dA(yWwEW?UBek)LHT=leBX|MUINJu!Pa71u@whqq|4PdxPX!;4p{u^6U* zWRoDtWd1!(RzF}ME8PsP@D+NOVHyF6Gt2pbQC^lp*A7Tb64Qtx^Ai~iCJ7-LR7Iy* zua!%lV@l99d7eUN@^S%n^L($j>P^$qL>WB9QbUg+ zZX%mR$VYK8k`bJAE79os_B<%%`YG`XQ6H?Go0rtD%BG*$>L2Cr(`_0Y3WBvBaHD6~=!8N3sm zAUwFT@W~gR1Y0$l&y5caZKCOa|KL9!ywW%pfGIyPC`vLYCjbfNH~<#Q!UrbIy$0SQ ziIieiQep`PlkpldTb~T9fPG-WVj@h=Cc}Y%Alm{W4-UatdK zKYwuk3M21bU=7Kt$`W0A<{v=@Mb#Shzz=wVXBk$MRZ&(zGXcAb$dVX>EE*Ue*&dn9 zh=3Oix)}`U?gAt@2M`88gXj8Wt*PIvlowANzg%FksX=+{Mr-b6#&bmhM_5u4c`T_E zN%&4v0r-Q!`y|ZKf#)E^MPcA{7V0ad)W8;2lGicZfci764CW+=*mw-E)oAH`g-ql{ z&%XT12i|ncSW0~KrRRsXO{8Lcxl?Pqu9OsA%5E7Q!*V&v;RG(JWll_$DBB+!7=7mH zj%BTbR~QE2yKlYij)`qNLo;N!p9%o`z+xCsN}`uZam5NaHW6kl-Drn_?mLVZ2++(? z!~_wB=5xI^6~0nhSuu6M1CGK%K9^$oVT}Lc(MM00i&xCC3WFn}B9nzVEXQ<}6&OL? z&^x*TT9RQHSyqVE!z{sJ6r2GTLx$yo5Rs7qhBOW71i<>Ekm;^T1oHaIqq zxO{r*a)HIDX;#YyRy)ueiQbXGHW*$8h8G4N!wR6Dy4p*^Ja$c;W;o2jLA_nAXt{yF zwbpNyj>PsSLY0psNzf9>xur^@N;hzt+b?c(feQjXP%*;Sjt$VHggyeF$Y&LtrpI&=*Lo!h7+HUUqVoh!Ad!piY%KWHoAv7Q z`~{154FD^pv3FmeVW2885ARiL)&qv_AMC*lJ9TOhmk)G0YXa74wf+q9CNQfG-G$_}b2pq-d}ltW zb4#&*q)#v8zMMPOU0F-L>ieCST;Np-@LJ@ZR~RYgHCH$}Nr#RXM7$CQ|H3kwa5Gj^ zfvr2PgIST|Iip#@f(jn4)viOwpw}@#npWBS_T|CMgLea3sMBhqFwFEM^MzciZB$oU zk&b@&@=+_Ia)op)Di2Sjf{3b?+7#``n2yPDEQqzTNl{pmsL|nFU-{~xcIV=|nQbHm zS&O_Tc^{BB-C)ih;1GiYgA&vE@tqWjvDpq8yr+%QJe%m{cmZJKnkFME0wAnarx+aC z)pY|_CMMp0(~w~_CRn zt;oBUWfMKV(V#sqp2-CfEhvg-n24d^jleUtT6L{|i`!gwp%pP0Dl$(W{8I26804>` zDHLzsoM0%QMj>b{N#dd?1RnxC7{_-apF4fHSgChbd~?UmBl*0bTbAjX)w)w!GDO5? zlHeKfh~*g<3B14Ux|_f9@P6G`lPSEQ(2ThE&A*n(^#fZu^wRfck3Vu%Tkd>d{rICF zojv~TtNQ3mku`EGhUEh9!V?A7G4f6+0;ao^l6b+)DxF018D5F>wh3Mf;7*N+;OGEj zH4Fp%zQ6~^ABiGM{2sVGLYSezTGyNA`FX=%O)eK$46D5VBY(h4z_sb;pZ@05!G~$4 zyEB>Z(wvAwpF&IkJs}LR03I2R;0L1(l<5Q1)eSYDf zq;V0Slt9O7X%gV2S!f2Ud_3g((?bK1=Nh#lg&8rH3thc2d!YF$9@YirCxP|Le|YZE z3oA!^ciiA~8YuD|y+bn$nU^dj9iXmLRRr4jt|K3 z1kDJ6Z$_REnz(rU`PAq>hDD)m1vHD9h{jTA*Om`Iv#PV+=)e-S{(ZOoq9BN_>plPY z14ess-3$6^a=E~Y&N%bv>|bON1@sF}Nr6K0Y^(bV>KcnPfz$5i*-&Y8d2Mh$uzvc{ z-2*=rFj#%!>a)5w?pz4>N5KWcH!!az0g}Gkef={fJa=>I>_PehVTo(S6sCK&zvlxV z(@m0{@w@;0|FjzmnB!fm{S!6DidyJff%oHCP#Km?JN&UjBnTJvE(Sapu1G{hjU?L_4zWdmB9^jH$j64#$ z6=I^yd!~WqRPDr5a(;7Q8*0xOLx+xKQoie&?SSkmg~A}jf=0A|*CT_5;N)28mG4^m zMON8w0BbGsMhDhe^1k|qM@F<5aMXiUqXvI)Qp{Vc z=&mD8b$JgJdTUxt@kWqq6j-@Je>x#AE-d;XSp~~;EJ+X&QKGD36gcooUI50(57Efz zsI51vwZ>{j5ID|u14%!3;f9~FT${i`le=!{Nz3(ShvUFkr9=tqZQZt9NmT>aPG&RB zM$>3kre_wn?cD7d?cRa@My)Q%qH70|NI&=7^Bcgrx^j&IYhY+pZL1!9@?3vku3m5F^O@pOQHv`FUVLE#SXWoBO<~JoF7~f?DPC0o_dlD- zhF2y~ux7LQ#tk>TjA#L zl?pww*@EXVEZ_a)Jd5n8g-C{8KJeFXqTlN!8^BtNyc)2?M1P`hgyqOk3eC`DFHFn8 zEWLc}If@ZegWHs3Ht=k+CM^totIa9N%Jegq-jOpS@xl-gfDK?>UAabq#m9Qm1EUD@ zVL(X|Z<-e6JFZcw&P{_(%52(05?h9p7*CtcYUCLaBbudS?OIhz4<`zJH0Cydb#>)h z1y(#SDT-@Z42uIVU@*gQqG#0gdKu6bFARHDn_)%I>ae0pW)FyxQCkAjDW&>(9((SF zDZI*Z>A;E*4#g}PPF%Kk0-V#B2|O40 zJ|~LK*=@WxfOU1{GBg&a`NQu*oO-VE=`OgKC<=fh(-ccN34i6pXB&XyO&bDR|6KO<%jpYrL}YlivlO5Jfi~ku5$XIkQ~eo zPr&(v(c2bW=IRY#@3r}9F+I{VwzYEV5b+Epbpu#eS1t=!)Ta9ZSm$p^O`t;75Mc}& z&8;?$K4RBTn<0m(08zd&dPi*ZHUu_wwSmq)CM+KgPG8d6vRB>mWMpq5TfjixDbIH! z206BAmZzW92CmNxZjPL`*>19ej0L`S`UoqqrIQCUn{Sm=1*jOJp|Bfcg;!ZFgS>MZ zGyV&R*H-BgI$P%vc=QyOk&}s5p7`g#;Q>?(*RHHci9-L)A7GNB6xl|un>K{8o*Tr3V#XRd}n5Afz33-yTF!I6p)3i=@#in>f`w03}2-=fH zl)z9NqIf#uz<~Ra8zP?~TZ@txAjE>AyDO?4pYlS4(mk}OTsE)*k20&a7m}2Th<2j@ z>JZXr;LQ-H4@p#wYrJ&w_ zv+3CI^_%zIwMxjK*6gK&?ZXeP1z4<{k~Fe|6)(q?L_x32dagmUlAIZE8Vgpv+-a1$ zg=W*klfK#HwG7!njiw`pV>!+>8fyZU*J)adrvVu(sRbYd6u?Qq3;`A(hD=;%LYiv2 z9^ix{15n5#8`YC~15^nJPNPJg1Y=xaiJ(%t>%<8pB8p{DK+zp1GF-~Z4MkGya)E_H zkFhGc8(F^R`9ZWgf34e2q9_QW2z3yIzG*myVOsz+$AP2qgrdb{%(4v4@H|I%(*@Ao zRC&N-7@|N(2Vo-LwM{OxV?s33l-q%}c3^3{KEi;;>LLnCdPZ-Oy?7a@SlXCw9Qkgi zUaeLupmSr1nBxZJVpWZ0Y$3nn=6Co;3$&Ht`AJb|POmB45Fgyd^R%GlIZ=p0mY1c# z*F6`$39e<^#i`}fhe+92xp(Vcvsn|A1h1$x7NOUh?oYo6hsjy1ppI6MUqIOf0pl)ItxM>BZ-A(ix|>$v<>)U=vAK?b@wQ< ze5%+9Dkf?rhl9%p78`kzQz_e_8Tf7xd0yZ;0Bq2!v?R%!#)lO}!8GIfWa~X$HSEGe{s>HneQ3(`@%>)NCzUv174#dab|`6Y)JC z!D8&pQWA6~o&`OVL6H#9oU?rJd!P1goyB-|epXB63Wc%b2cPW8CIc>Q`dEl;h4o9O zJu<$_t({s6uozwy6os?{MXU_~o92b|;I`JnQB&_kuIY4#oS}GPJQw*678GFg49OO0 zhkih)!y19*F3qSMrE-X;Niq+b@&P<5L-t>k1SEo81oA*u?7-=vDnN%1-L3-z)+ixj z09HVGB)tzYh=Gs5P67w=;ZIO4R=}LDI47H^stg5E{BnUMAy0A23r6UKp&L+c5SRvN z83$U77ldR+%jMIOAa)afG9+^`!$KumrriOQ8K&#I6!GdQC=8qd_^=F1z;q(UgOS%; z21f_=c2KvdbT$*y)(R{}N~CZ270_6#`TJIborL@$Mq~6CZ83iN;PX#{@-?7vw#BfD zWk3p0UQ%lWPIi1qAvPFOZeumzFplmvq$3`Q@ENx%h&?%|N%b%jw}pcNr9g2?xgOh-8di);|F#NNeK!L{wC z6M;4pFuBIGsFoGX*3fh#s;GnETX(}qHyq1!RuzJ*Nx6I~lZ<1M zsgYit%-HotA`H4#5O|gie1CCe8F%$3C^m4bI~~glJ(lMhwGP-&Xc9@`GntGcC)Wrp zEG4qH{7cYS=!`8S93GTzfp6zAQVJ9&}U4bd2JlZI?9O5x}tH9D-%kj=k z{*Or<%K&`nt~UrkBI&I;EGvXyVVd@AHzD9S!z}5#DhnBbjVtnOwc4`X>667qOQ)cN zgh*7mL?R=Ji3^tDGJqu~^SAvP?!G2yf8bb5L?!9g_N-%9i;qA4SgBC~o+!&QSZ7Sg zI|cPKJhpk;*yulf`5&i`9vm4+Lno;P+UUfN)~OfQ0xYd>QdT(IFnJ|uH&?*@@g19! z6mllX>(pe#w4{hMr;zO6ya|Z`W06(WdO0GAjUy)v0J4_lk$J-1m^J|xQB`PrKAnpxv(?7E*G(Ll zSvuL#!He`*u!6kSIiBMrN;Kg6m9AGht~wG-tA;cRsRHWB7DgU^R3IeBbf06;f3rT5bn=a^woU zLb6+iQ8O%)1g-#EUZ^`B!BP;Jegxf2;MhVc_VGLS72@h=zW?06x^ZXAaXx!!x~ALj zpX|>oa>$4`Z`u6J>4k5jY&dAPE@IG{{$w1IT7?cbX87Cx$P2o&^&bY z$Oq=YusoSu>NzySf&1Le2)?#Wn#^{qK6hHgk<3y6BZ;9@Ou;7^ibs(OULr*~A$W@s zCWI_NIPm^e;hCv&Wl=fiG2(Y>l zZlJ{+W-#y=Ok)<=RAAb^%(5~aDlFnTWO;!XQBFh!0imoOqAl0A1JtmimP1u-gtEh| za@oKFTr+_gmt;Av&Kx?@ozfIFyr2XACyMUBc}J;jy);|;xA)(CbiN3@w^^)shIO*s z9-rtPO{qKh;9EzR3Wfd`Pc8k++xFmydU9?dV5P?n9Jg&-Qlxx7IXqb4M7}g%U0Nuw z5m>yM-tx}h66Bb#m!}WCv~|n)J9hV*)uq4w`v-Am)5Iqn+XHJniQP}`-L+{hIGE0K)f^^P~0x+f)s zPyLTSueEfC1V}@uGg0Ic*(Ar3)QLNK)3)oy`twJR&o^5(nC!{T{m>=yIC^feF_ca$ z)jA1TO9Zk_fwO)g8{!z+q3GDoO%+>AU{~-fnvG?Y&#Chc;b2 z{KVl$KD`!TsXY@)BI&m3uA`G>6o6hZg@LEn7X9vGJ0UgPKe5vfX{WwO39_PQo6E-# z%hhKNu4bNEtH!F#p62KfyaK=zhk!Ft5+ErG0B15NDmo-NNyq_#5Pt6{9i{M?=dh0$ zpwG7JgU85I0a!@zP)YJ|LAAD~Lw}3YETKN z19*VI`x(pv=ZMD>z%Agpxx6;Md89N~UYakh5m-VjbNzci9#l^}`VXIS9eZ%wp4xJ8 zv_ESzd@WMnbl-;rQK895GZ~$XOUy`~KQTT1+~dz2ed+N`p?7rWn+CVv9I*nFcmCkx zFMsoI*8;5g(BAyWnCC=-#5lG~GoYgQ&^A|&KHjO3JvI4wU*DFSXdDJ^BxkZtvtsE@ zHPbWy{MYqXdp&?PH^b6oWF{tH5|TzC=&c|kpCSfeQQ(b+-R2P(#9**-0fT6d#NH#8 zcvPeh0(S>T5m>(89rT4JC;3}LN)G^DsO>~JJH)G(?G?r}C7lpFCur7duN*t!kq9m^ z(^%rcRb(*Eof#?tpLUoWG_AEc3!RzzMn?MVJj|N&Q0Q*FN#-iQsYV_5CXg4Cn z-}1w@Lkam2UcGFM6_2R`<1EcDc|ovPZbscPKQg0E;$6exL_v}Sf#qD+(^PTGMBj@q zpKu*Aq_|~s|Kf7Zgq})rV?=a!LIfF>#tamk#q8?-%_7OU>P$`!TWzQEejd*t8 zflvQ!XL%YanY(`JH?l)pXcU1?JGK9Z&pfn7j=UGIKNF=sJW*68#7)Ok{`PR-1TSR2YIqW7dAqU78$_{Bb(~UxK4}oJTJtM;9 z0}F7&giftg0&P=n>WGAZVoFSDHJhI0&=@Op5 z766OvJxPXuqw%b|Ih**_bS3ES!X*KfMA)>fi7owfK$jNR3M@IEzWu|$EhvdYk3D$c z`~PUTQ6|@4TwWU5JeeKYe(+Q)kyLKjy=8c4FfQ_u)v7NYpP5}~+hI1L%9*~x$aWeF zs}(-A|A{9a`n$CN3&Fj#WZ)RCWx!YHkG|tDoDc=>Ph`4hr35GNzHNDqPJTi(Cn}!R zSrf2y0M;x47SB)uMm(m0If26B5ZMy|%o!9ITr&;_5}AHNX2o~`*{1fK`#?qp|Nr)` zEXJwx3g3PAwa3?EdpsM=281;W5CuX)AT0?^6D6fd+laQ2+J~-EU;5scKD1Jw^V+Db znxs)n5~)B~LNe?y0|AC*hS_(Iw`=?E_x7CY3971)%#6ufeX@%t<2(b3N{;Qax+`4?~`sH4VV2ADuCDWN8)~vLw@f~vX#<@%bw`J?L zEn6OkD@}NMF+0ac;*uP3Ne(CljX@Q^X`rw7;}8B)53rPEw;-{Ml%NO)7=WNiR;A2| z8tLn%X|XKld2W96iczkl9@;I46fZYA#%#5q1IJeyoAlYSx>MmOkoSPa1%HCaJ!uhG zR9KRPetXXsSW=}4k)lH)_)IPbwGsZ=LHK1b9&-BgA4d&-`HPT8{RQ-<@G4#kTFj!h%_?bYv2s ztprJ6d3G{i&g&M$Dp_C!--lGbHXWNR8rSEFiW-9>wH@0h{lN2^GMXYtv*Yu10!xW$ z`(FEntVZD?Ii@9Y%%$_EjvRV7l1Q6MTXTc#mnP*6^w|3yH;Jsdp0kK#) z6ONnxXHI_j*Sdg}>fw2kZ)oQkw>Y1THm|bvq8!hd`kWL`SF=+=U`<{-?fYbE-BZ3f zMe`|IqyR`E&4GCw_f;&ku1wcV{emSzI|^;}sqJP@#UGSxtq%Bsv| z(pvv`>HO&nkysR-3k-*lz&(nhownwdh3R~~z=~@7zKg&@XB#q8!gq{MkN)e%-V{tFn0RYwqf2#*rB*lucglAVN280f7(*Vo? zz8&NjTrP&?T)S#jaNl8c$6IBJQ{b3snj^78CmcUhC$I`3uyCFopv2J_bl^n8QasRW4L}YkkfoG|q{!8z?^L|%n20NE= zl)!WAc6=k*(q&uv6d-QcDL` zB&t0J$_@fE8Ty>zS_b~e&GQo@H_x8?EU&wK`<5-6Hc5g0iIK-1B=M(Hew1cgD_M9lw2d zgd;pD8f8ebqjS{{4}K>Si3|+ScC=|{kA3vvhezAnQZ&g*BBMykradnyu_R&VbRD#R zsWp>gS?0>MyO%CqVWV+lA!nNgcKCLjLVlqom7oc(ZeYdtzxq>Ijnt~18MLbUdMSJB z+NHVa$;+2-WP=nJZ++^qE{QgF?b-z=UOP!24axYK0HZukm<;q?IPt;T4+dDsZisMm z>w8x<^vrqAJ!=ibGs6GxJ;2}EHDFSNRa^eeClDhrsNsEay({q3R`!U;d z8HN<(D4cb=sp+@Bd1F3XxILcRwz>PzJ8$=0=uai%EC;}16(zdi>2DLP5>zLEag9vP zCE{u{qMSQ_ePnXZ;Z(0u7L2^>yQ5R{W~HLVVu~E86IimM?%RJrQYD&&N0s!9qU%|- zAeoiYwf-{`Qwx397gFoCCl%5tW}kR+$EFRPaB(ec^bOiV2;87z+dNB`O=D#6&Z%Q{ z)fKXG1INpJB!q}c$;$;6P`)i2+ZBnkE$i5+OF+`$9!Rm603t`=UfjQXXn3q>5bJx| zPaZxzH$5YYJTD3?!$?Y`reNJ|(l~>j@%QW@o z@iPwT#MCHU*gAnF@ciCgyIkKQX=ZwACK3@7jT*;NJkNo!7#f+paCJD=n2>0+Ns^rS z^7Ff7kl&8Ma-3PQNuNA?;zak_p6THcE*|ead$}H9MO!z=n>$&C3}2yumcyO2jl5$A zyubqMv5ZngYq8r#SSzkjR z#`4R*LToK|b@%+*F9xz*J7$KVYlR!|9v7l&SU9yrmcTyaw&)RAjvzL;vrnQVQsYeAb~|ON+gy6xehA5lp7_2CAIIW zbF2_pKsdPwg;TYGZIv+hem!Fu97_})-_TRe=DU)O*_pA%Op=PICD)5Ls5friKG}Q8 zW0;xQg$+I3O{v8A;&3 zJ>M%BO9z%3k@xN1Hh6n*`{vC+%25+SwgD~blaq7v!{gI}C>8R$$WWf=s9Jn3TWC<# zR6NQ7OATu^fo!n^aq(iGnrJ$A_2yCz?|#5)Zf?%!^VMo~#V7tCfz`8N&old8uNYpj zSUmFH?*ks9J7JbfAOIP;fnf-{YH&&e;oFv;XB3SNEK@J~SlWTBi=aJf8~5P99qTKL zxNBo&z)H70{L+D+myG}z{lDM)L$#XoT@!aoAp@tXqemok>DXo51D#?;P#xG+d-)sl zEge|Vh;-n&Cn?aSFgTjUDs1eWEr2>k9~Q-iSBXXeS z_OQ&Uz6sL*8LQXr-S@(e7@Ev3WdHHj?|7{>vAVm~Ae2?oPHtd+d?vkq8`5MyphTJW zOrw+|IhEsSOE1t;%qe9(r%Lg0J9}exXkaN{x-wv;S|8c-t)CTj&$7(ZNB$(G+l|6V zqT?}!7f9cpxp_IWc^BNS>g*`USz3s)qTrjwu?vSicje8-zY5~RHI|t5ZXQ4 zE?3Kv9HGMf-8|0)B@t6p+p+S6Vj`Jh(IX5R$+v7*6!`xD=(F;48-;xd00000NkvXX Hu0mjfc>qM` literal 0 HcmV?d00001 diff --git a/3.0/themes/smk/views/album.html.php b/3.0/themes/smk/views/album.html.php new file mode 100644 index 00000000..1a56af67 --- /dev/null +++ b/3.0/themes/smk/views/album.html.php @@ -0,0 +1,44 @@ + + +

+ + +album_bottom() ?> + +paginator() ?> diff --git a/3.0/themes/smk/views/block.html.php b/3.0/themes/smk/views/block.html.php new file mode 100644 index 00000000..699d7c22 --- /dev/null +++ b/3.0/themes/smk/views/block.html.php @@ -0,0 +1,10 @@ + + + + +
+

+
+ +
+
diff --git a/3.0/themes/smk/views/dynamic.html.php b/3.0/themes/smk/views/dynamic.html.php new file mode 100644 index 00000000..a8a4d362 --- /dev/null +++ b/3.0/themes/smk/views/dynamic.html.php @@ -0,0 +1,29 @@ + +
+
+ dynamic_top() ?> +
+

+
+ +
    + $child): ?> +
  • "> + thumb_top($child) ?> + + photo + +

    title) ?>

    + thumb_bottom($child) ?> + +
  • + +
+dynamic_bottom() ?> + +paginator() ?> diff --git a/3.0/themes/smk/views/movie.html.php b/3.0/themes/smk/views/movie.html.php new file mode 100644 index 00000000..158857db --- /dev/null +++ b/3.0/themes/smk/views/movie.html.php @@ -0,0 +1,19 @@ + +
+ photo_top() ?> + + paginator() ?> + +
+ resize_top($item) ?> + movie_img(array("class" => "g-movie", "id" => "g-item-id-{$item->id}")) ?> + resize_bottom($item) ?> +
+ +
+

title) ?>

+
description)) ?>
+
+ + photo_bottom() ?> +
diff --git a/3.0/themes/smk/views/no_sidebar.html.php b/3.0/themes/smk/views/no_sidebar.html.php new file mode 100644 index 00000000..58c57256 --- /dev/null +++ b/3.0/themes/smk/views/no_sidebar.html.php @@ -0,0 +1,11 @@ + +
    +
  • + + + + + + "> +
  • +
diff --git a/3.0/themes/smk/views/page.html.php b/3.0/themes/smk/views/page.html.php new file mode 100644 index 00000000..0e5bdf6b --- /dev/null +++ b/3.0/themes/smk/views/page.html.php @@ -0,0 +1,161 @@ + + +html_attributes() ?> xml:lang="en" lang="en"> + + + start_combining("script,css") ?> + + <? if ($page_title): ?> + <?= $page_title ?> + <? else: ?> + <? if ($theme->item()): ?> + <?= $theme->item()->title ?> + <? elseif ($theme->tag()): ?> + <?= t("Photos tagged with %tag_title", array("tag_title" => $theme->tag()->name)) ?> + <? else: /* Not an item, not a tag, no page_title specified. Help! */ ?> + <?= item::root()->title ?> + <? endif ?> + <? endif ?> + + " + type="image/x-icon" /> + + page_type == "collection"): ?> + + + + + + + + script("json2-min.js") ?> + script("jquery.js") ?> + script("jquery.form.js") ?> + script("jquery-ui.js") ?> + script("gallery.common.js") ?> + + + script("gallery.ajax.js") ?> + script("gallery.dialog.js") ?> + script("superfish/js/superfish.js") ?> + script("jquery.localscroll.js") ?> + + + page_subtype == "photo"): ?> + script("jquery.scrollTo.js") ?> + script("gallery.show_full_size.js") ?> + page_subtype == "movie"): ?> + script("flowplayer.js") ?> + + + head() ?> + + + script("ui.init.js") ?> + css("yui/reset-fonts-grids.css") ?> + css("superfish/css/superfish.css") ?> + css("themeroller/ui.base.css") ?> + css("screen.css") ?> + + + + get_combined("script") ?> + + + get_combined("css") ?> + + + body_attributes() ?>> + page_top() ?> +
+ site_status() ?> +
+
+ + + + + + user_menu() ?> + header_top() ?> + + + + + + header_bottom() ?> +
+ + item() && !empty($parents)): ?> + + +
+
+
+
+
+ messages() ?> + +
+
+
+
+ page_subtype != "login"): ?> + + +
+
+ +
+ page_bottom() ?> + + diff --git a/3.0/themes/smk/views/paginator.html.php b/3.0/themes/smk/views/paginator.html.php new file mode 100644 index 00000000..5034c965 --- /dev/null +++ b/3.0/themes/smk/views/paginator.html.php @@ -0,0 +1,87 @@ + + + +
    +
  • + + + + + + + + + + + + + + + + + +
  • + +
  • + + + $first_visible_position, + "to_number" => $last_visible_position, + "count" => $total)) ?> + + $position, "total" => $total)) ?> + + + + +
  • + +
  • + + + + + + + + + + + + + + + + + +
  • +
diff --git a/3.0/themes/smk/views/photo.html.php b/3.0/themes/smk/views/photo.html.php new file mode 100644 index 00000000..b42ab987 --- /dev/null +++ b/3.0/themes/smk/views/photo.html.php @@ -0,0 +1,51 @@ + + +item())): ?> + + + + +
+ photo_top() ?> + + paginator() ?> + + + +
+

title) ?>

+
description)) ?>
+
+ + photo_bottom() ?> +
diff --git a/3.0/themes/smk/views/sidebar.html.php b/3.0/themes/smk/views/sidebar.html.php new file mode 100644 index 00000000..086d1359 --- /dev/null +++ b/3.0/themes/smk/views/sidebar.html.php @@ -0,0 +1,16 @@ + +sidebar_top() ?> +
+ + album_menu() ?> + + photo_menu() ?> + + movie_menu() ?> + + tag_menu() ?> + +
+ +sidebar_blocks() ?> +sidebar_bottom() ?> From 601c2b58d64b5bf8b384574b95b6fb99248ccc80 Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Wed, 18 May 2011 18:50:44 +0200 Subject: [PATCH 2/8] Added the initial version of the Gallery1 Import module. --- .../g1_import/controllers/admin_g1_import.php | 126 ++ 3.0/modules/g1_import/controllers/g1.php | 93 ++ 3.0/modules/g1_import/data/broken-image.gif | Bin 0 -> 1589 bytes .../g1_import/helpers/Gallery1DataParser.php | 413 +++++++ 3.0/modules/g1_import/helpers/g1_import.php | 1085 +++++++++++++++++ .../g1_import/helpers/g1_import_event.php | 40 + .../g1_import/helpers/g1_import_installer.php | 46 + .../g1_import/helpers/g1_import_task.php | 215 ++++ .../libraries/G1_Import_Exception.php | 39 + 3.0/modules/g1_import/models/g1_map.php | 21 + 3.0/modules/g1_import/module.info | 7 + .../g1_import/views/admin_g1_import.html.php | 180 +++ 12 files changed, 2265 insertions(+) create mode 100644 3.0/modules/g1_import/controllers/admin_g1_import.php create mode 100644 3.0/modules/g1_import/controllers/g1.php create mode 100644 3.0/modules/g1_import/data/broken-image.gif create mode 100644 3.0/modules/g1_import/helpers/Gallery1DataParser.php create mode 100644 3.0/modules/g1_import/helpers/g1_import.php create mode 100644 3.0/modules/g1_import/helpers/g1_import_event.php create mode 100644 3.0/modules/g1_import/helpers/g1_import_installer.php create mode 100644 3.0/modules/g1_import/helpers/g1_import_task.php create mode 100644 3.0/modules/g1_import/libraries/G1_Import_Exception.php create mode 100644 3.0/modules/g1_import/models/g1_map.php create mode 100644 3.0/modules/g1_import/module.info create mode 100644 3.0/modules/g1_import/views/admin_g1_import.html.php diff --git a/3.0/modules/g1_import/controllers/admin_g1_import.php b/3.0/modules/g1_import/controllers/admin_g1_import.php new file mode 100644 index 00000000..40c96c46 --- /dev/null +++ b/3.0/modules/g1_import/controllers/admin_g1_import.php @@ -0,0 +1,126 @@ +page_title = t('Gallery 1 import'); + $view->content = new View('admin_g1_import.html'); + + if (is_dir(g1_import::$album_dir)) { + $view->content->g1_stats = $g1_stats = g1_import::g1_stats(); + $view->content->g3_stats = $g3_stats = g1_import::g3_stats(); + $view->content->g1_sizes = g1_import::common_sizes(); + $view->content->g1_version = g1_import::version(); + + // Don't count tags because we don't track them in g1_map + $view->content->g1_resource_count = + $g1_stats['users'] + $g1_stats['groups'] + $g1_stats['albums'] + + $g1_stats['photos'] + $g1_stats['movies'] + $g1_stats['comments']; + $view->content->g3_resource_count = + $g3_stats['user'] + $g3_stats['group'] + $g3_stats['album'] + + $g3_stats['item'] + $g3_stats['comment'] + $g3_stats['tag']; + } + + $view->content->form = $this->_get_import_form(); + $view->content->version = ''; + $view->content->thumb_size = module::get_var('gallery', 'thumb_size'); + $view->content->resize_size = module::get_var('gallery', 'resize_size'); + + if (g1_import::is_initialized()) { + if ((bool)ini_get('eaccelerator.enable') || (bool)ini_get('xcache.cacher')) { + message::warning(t('The eAccelerator and XCache PHP performance extensions are known to cause issues. If you\'re using either of those and are having problems, please disable them while you do your import. Add the following lines:
%lines
to gallery3/.htaccess and remove them when the import is done.', array('lines' => "\n\n php_value eaccelerator.enable 0\n php_value xcache.cacher off\n php_value xcache.optimizer off\n\n"))); + } + + foreach (array('notification', 'search', 'exif') as $module_id) { + if (module::is_active($module_id)) { + message::warning( + t('Deactivating the %module_id module during your import will make it faster', + array('url' => url::site('admin/modules'), 'module_id' => $module_id))); + } + } + } else if (g1_import::is_configured()) { + $view->content->form->configure_g1_import->albums_path->add_error('invalid', 1); + } + print $view; + } + + public function save() { + access::verify_csrf(); + + $form = $this->_get_import_form(); + if ($form->validate()) { + $albums_path = $form->configure_g1_import->albums_path->value; + if (!is_file($albums_path) && file_exists("$albums_path/albums.php")) { + $albums_path = "$albums_path/albums.php"; + } + + if (($g1_init_error = g1_import::is_valid_albums_path($albums_path)) == 'ok') { + message::success(t('Gallery 1 path saved')); + module::set_var('g1_import', 'albums_path', $albums_path); + url::redirect('admin/g1_import'); + } else { + $form->configure_g1_import->albums_path->add_error($g1_init_error, 1); + } + } + + $view = new Admin_View('admin.html'); + $view->content = new View('admin_g1_import.html'); + $view->content->form = $form; + print $view; + } + + public function autocomplete() { + $directories = array(); + $path_prefix = Input::instance()->get('q'); + foreach (glob('{$path_prefix}*') as $file) { + if (is_dir($file) && !is_link($file)) { + $directories[] = $file; + + // If we find an albums.php, include it as well + if (file_exists("$file/albums.php")) { + $directories[] = "$file/albums.php"; + } + } + } + + print implode("\n", $directories); + } + + private function _get_import_form() { + $albums_path = module::get_var('g1_import', 'albums_path', ''); + $form = new Forge( + 'admin/g1_import/save', '', 'post', array('id' => 'g-admin-configure-g1-import-form')); + $group = $form->group('configure_g1_import')->label(t('Configure Gallery 1 Import')); + $group->input('albums_path')->label(t('Filesystem path to your Gallery 1 albums.php file')) + ->value($albums_path); + $group->albums_path->error_messages( + 'invalid', t('The path you entered is not a Gallery 1 installation.')); + $group->albums_path->error_messages( + 'broken', t('Your Gallery 1 install isn\'t working properly. Please verify it!')); + $group->albums_path->error_messages( + 'missing', t('The path you entered does not exist.')); + $group->submit('')->value(g1_import::$album_dir=='' ? t('Change') : t('Continue')); + return $form; + } +} \ No newline at end of file diff --git a/3.0/modules/g1_import/controllers/g1.php b/3.0/modules/g1_import/controllers/g1.php new file mode 100644 index 00000000..53458baa --- /dev/null +++ b/3.0/modules/g1_import/controllers/g1.php @@ -0,0 +1,93 @@ +get('path'); + $page = $input->get('page'); + if(!is_numeric($page)) $page = ''; + + if($path=='view_album.php' || $path=='slideshow.php') $path = $input->get('set_albumName'); + if($path=='view_photo.php') $path = $input->get('set_albumName').'/'.$input->get('id'); + + if($path=='main.php') { //we do only name based g2 mapping here + $item = item::root(); + access::required('view', $item); + url::redirect($item->abs_url(), '301'); + } + + // Item names come in as FolderX/ItemX + $album = 0; + $pos = strrpos($path, '/'); + if($pos!==false) { + // Get ItemX into g1_item + $g1_item = substr($path,$pos+1); + // Get FolderX into g1_item + $g1_album = substr($path,0,$pos); + } + else { + $album = 1; + $g1_item = ''; + $g1_album = $path; + } + + // Only binary files (the item itself, not the html) may have file extensions + $binary = 0; + $pos = strrpos($g1_item, '.'); + if($pos!==false) { + $binary = 1; + $g1_item = substr($g1_item, 0, $pos); + } + + $mapping = ORM::factory('g1_map')->where('album', '=', $g1_album)->where('item', '=', $g1_item)->where('resource_type', '=', $album ? 'album':'item')->find(); + if(!$mapping->loaded()) { + throw new Kohana_404_Exception(); + } + $item = ORM::factory('item', $mapping->id); + if (!$item->loaded()) { + throw new Kohana_404_Exception(); + } + access::required('view', $item); + + if($binary) { + url::redirect($item->file_url(true), '301'); + } + else { + $url = $item->abs_url(); + if($page!='') { + $url .= (strpos($url,'?')!==false ? '&':'?').'page='.$page; + } + url::redirect($url, '301'); + } + } +} diff --git a/3.0/modules/g1_import/data/broken-image.gif b/3.0/modules/g1_import/data/broken-image.gif new file mode 100644 index 0000000000000000000000000000000000000000..fb9c824092158e38014bd4a041a3924215bb726b GIT binary patch literal 1589 zcmV-52Fm$INk%w1VO#)Q0OkMy`T6-gW`cIA!f~X%+uPfc%;Gndxr@ZwguBvWldRn2 z=v0B5)YR0xyu5p{$Xkk}Gn~Wk@9$}xwe|J&I(L&rag6)>`?Sf?>GkadA-(XnzJxvg*l?gIbnUSuC8&8nYrBQii(O*ewbd4 zsO9D5=J54Oc9E^w>7~@=Mv}9mqoY=Abn^N8gT>x^z}o8S>fq__ozdh~gq}2Sk6W9y zOKW&!b9rQZgj12K(CG0nR&$QX-p|p|FnOGZz}ETv{W*P}ScjoqU0qPB%v7(@{{H@( z&*CgnZ)KOT-|+W~$>9C{{i@gKsHmu2fQ@aSxMHozm#wwF;Os}Az?#9&sI<6El&?C2 zpIdQxF@~!@hp6oB?Vr2G341ejE#k5o5y z698t}gWHZrB5wpr6V~K^=8Rx0YA-P(5dhfa@qZ@&|2_y5m}Cl%A}R>v+n22$iXIEN zJn)eq!I&oyqHI7oqJ)Kaf5LDRR3S)^hYOl;@c{vf3?4bI{FpHAoyb7}GGwSw@}U7g zT{f&x(b1jFk$*_wz!4y4h7%OJ%vjMtp+1lyk-Bg}LMaXkC-lhR@ZyS+t5|Oe>d>J| zm91F+U>JblW=)nMRE}WHI!KIPwr;nQut8zViMb+JAUT64o7z8Y{r&~~maEbXg-<{r zV}>EG$8OnnkSs=YV9QJ)ENSOi*JBb}Lq{fUdMh0e1i*dl^*8{IuCQIm9xa)z4L3RN zMcDlrsm`WLyT+~}`mX^URINe+Lx$DkAUvP@{vBL6bu4{mkX6W>(GUomS3O?P1BJ=( z8K9GQVFSXRsYI1f(;{bl0fQef3}Jy$rabll7fsNIf_?bu2SWuf#iT?Vtr;Rj2rxL& zlmR=G004ueJT^uGKKSrp6Ft-iUIjXBA%|2e+(Cl~Fd)&PAUm)CgAIa_0D%cVEOg5M zV`@lH!-_1vD4|I$N%6!DFl-Tkk>N1N%#fzNb%P2r(X=E|0thgG8cmL|qKgnNKm-K_ z7*K~F;z6K*iQ`a_gaI}XSKM)E1c=QMLufI|V<0%-K$-)r>ExSJKtM!5cAZw$Ks<~#H6~T$AeGtHL0Sypn8C`I)VbKH! zRfWOo5gvR2z==O%^4I|fWRb#Y(%sjGw(5*z>op$50`A0D{T00U=5JP5@w+lz0t7=w_lt^U5LYm6aRpryGdr;J7n zKLFseATcL>@60vd9BIzEN||YeL2EG72ooIrN77tZ%yiTIs>x=@Z%RGkj8$_$RMwu< z+x6QP)4cD-+v;rg67L#-EY@0M;P>Bv2QD}Uc@%Cq5Qrz9!s3fB;rQcAD6pFcdN;s# z+epbm`QB`I@|fn8U+#J4v21R6=bU_Adg!Qc0)z-5#4h{nwAXI??YQ6m#j$IDVu1n| zu%Uw#a~NU#@yI8y{PN5vD@BR1ShcAAT_dKld0?X5P zV#WkYFrY#MIm9pj{Pfpv|NZ#S{{op0x3>ux7GU292*7{>8t{M!OrQc6$iM> $parentName) { + if (!isset($tempAlbums[$myName])) { + $tempAlbums[$myName] = array(); + } + if (empty($parentName) || $parentName == '.root') { + $hierarchy[$myName] = &$tempAlbums[$myName]; + } else { + if (!isset($tempAlbums[$parentName])) { + $tempAlbums[$parentName] = array(); + } + $tempAlbums[$parentName][$myName] = &$tempAlbums[$myName]; + } + } + return array(null, $hierarchy); + } + + /** + * Fetch an array of albums with no parents + * + * @param string $path Path to albums directory + * @return array GalleryStatus a status code, + * array of albumnames + */ + function getRootAlbums($path) { + + list ($ret, $albumOrder) = Gallery1DataParser::loadFile($path . 'albumdb.dat'); + if ($ret) { + return array($ret, null); + } + + foreach ($albumOrder as $albumName) { + list ($ret, $albumFields) = + Gallery1DataParser::loadAlbumFields($path . $albumName . DIRECTORY_SEPARATOR); + if ($ret) { + return array($ret,''); + } + if ($albumFields['parentAlbumName'] == '.root') { + $rootAlbums[] = $albumName; + } + } + return array(null, $rootAlbums); + } + + /** + * Load and return album metadata from given directory + * + * @param string $path Path to album directory + * @return array GalleryStatus a status code, + * object Unserialized album metadata + */ + function loadAlbumFields($path) { + + $tmp = trim($path); + if ($tmp[strlen($tmp)-1] != DIRECTORY_SEPARATOR) { + $tmp .= DIRECTORY_SEPARATOR; + } + $path = trim($tmp); + $albumPath = explode(DIRECTORY_SEPARATOR, $path); + $albumName = $albumPath[count($albumPath)-2]; + list ($ret, $album) = Gallery1DataParser::loadFile($path . 'album.dat'); + if ($ret) { + return array($ret, null); + } + $album->fields['name'] = $albumName; + if (!$album->fields['parentAlbumName']) { + $album->fields['parentAlbumName'] = '.root'; + } + return array(null, $album->fields); + } + + /** + * Count the number of photos in an album dir + * + * @param string $path Path to album directory + * @return array GalleryStatus a status code, + * integer Count of photos + */ + function getPhotoCount($path) { + list ($ret, $photos) = Gallery1DataParser::loadFile($path . 'photos.dat'); + if ($ret) { + return array($ret, null); + } + $photoCount = count($photos); + return array(null, $photoCount); + } + + /** + * Count the photo data from an album dir + * + * @param string $path Path to album directory + * @return array GalleryStatus a status code, + * array Galleryphotos + */ + function getPhotos($path) { + + list ($ret, $photos) = Gallery1DataParser::loadFile($path . DIRECTORY_SEPARATOR . 'photos.dat'); + if ($ret) { + return array($ret, null); + } + return array(null, $photos); + } + + /** + * Load user uids from path + * + * @param string $path Path to album directory + * @return array GalleryStatus a status code, + * array Associative array of uids and usernames + */ + function getUserUids($path) { + static $uids; + if (!isset($uids[$path])) { + if (!isset($uids)) { + $uids = array(); + } + + list ($ret, $userDB) = + Gallery1DataParser::loadFile($path . '.users' . DIRECTORY_SEPARATOR . 'userdb.dat'); + if ($ret) { + return array($ret, null); + } + $uids[$path] = array(); + foreach ($userDB->userMap as $username => $uid) { + if (Gallery1DataParser::isValidUid($path, $uid) + && !Gallery1DataParser::isValidUid($path, $username) + && !preg_match('/nobody|everybody|loggedin/i', $username)) { + $uids[$path][$uid] = $username; + } + } + } + return array(null, $uids[$path]); + } + + /** + * Validate user id string from gallery v1.x.x + * + * @param string $uid Uid to be tested + * @return boolean + */ + function isValidUidString($uid) { + if (preg_match('/^\d{9,}_\d+$/', $uid)) { + return TRUE; + } else { + return FALSE; + } + } + + /** + * Validate user id from gallery v1.x.x + * + * @param string $path + * @param string $uid Uid to be tested + * @return boolean + */ + function isValidUid($path, $uid) { + static $valid; + if (!isset($valid[$path][$uid])) { + if (!isset($valid)) { + $valid = array(); + } + if (!isset($valid[$path])) { + $valid[$path] = array(); + } + if (Gallery1DataParser::isValidUidString($uid)) { + list ($ret, $fields) = Gallery1DataParser::getUserFieldsByUid($path, $uid); + if (!$ret) { + $valid[$path][$uid] = TRUE; + } else { + $valid[$path][$uid] = FALSE; + } + } else { + $valid[$path][$uid] = FALSE; + } + } + return $valid[$path][$uid]; + } + + /** + * Load user metadata given a path and uid + * + * @param string $path Path to album directory + * @param string $uid Uid to import + * @return array GalleryStatus a status code, + * array User metadata + */ + function getUserFieldsByUid($path, $uid) { + static $fields; + + if (!isset($fields[$path][$uid])) { + if (!isset($fields)) { + $fields = array(); + } + if (!isset($fields[$path])) { + $fields[$path] = array(); + } + $fields[$path][$uid] = array(); + if (Gallery1DataParser::isValidUidString($uid)) { + list ($ret, $user) = Gallery1DataParser::loadFile($path . '.users' . DIRECTORY_SEPARATOR . $uid); + if ($ret) { + return array($ret, null); + } + foreach ($user as $key => $value) { + $fields[$path][$uid][$key] = $value; + } + } + } + return array(null, $fields[$path][$uid]); + } + + /** + * Load user metadata given a path and username + * + * @param string $path Path to album directory + * @param string $username Username to import + * @return array GalleryStatus a status code, + * array User metadata + */ + function getUserFieldsByUsername($path, $username) { + list ($ret, $uids) = Gallery1DataParser::getUserUids($path); + if ($ret) { + return array($ret, null); + } + $usernames = array_flip($uids); + $uid = $usernames[$username]; + list ($ret, $fields) = Gallery1DataParser::getUserFieldsByUid($path, $uid); + if ($ret) { + return array($ret, null); + } + return array(null, $fields); + } +} + + +/* Define these classes so that unserialize can use them */ +/** + * A stub class into which various G1 objects can be unserialized. + */ +class G1AlbumDB{ } +/** + * A stub class into which various G1 objects can be unserialized. + */ +class Album { } +/** + * A stub class into which various G1 objects can be unserialized. + */ +class Gallery_UserDB { } +/** + * A stub class into which various G1 objects can be unserialized. + */ +class Gallery_User { } +/** + * A stub class into which various G1 objects can be unserialized. + */ +class AlbumItem { } +/** + * A stub class into which various G1 objects can be unserialized. + */ +class G1Img { } +/** + * A stub class into which various G1 objects can be unserialized. + */ +class Comment { } diff --git a/3.0/modules/g1_import/helpers/g1_import.php b/3.0/modules/g1_import/helpers/g1_import.php new file mode 100644 index 00000000..172506e3 --- /dev/null +++ b/3.0/modules/g1_import/helpers/g1_import.php @@ -0,0 +1,1085 @@ +app->albumDir = "/home/t-horner.com/www/albums"; + if(preg_match('/\$gallery *-> *app *-> *albumDir *= *["\']([^"\']*)["\']/i',$line,$result)==1 && count($result)==2 && $result[1]!='') + $albumDir = $result[1]; + if(preg_match('/\$gallery *-> *app *-> *albumDirURL *= *["\']([^"\']*)["\']/i',$line,$result)==1 && count($result)==2 && $result[1]!='') + $albumUrl = $result[1]; + if(preg_match('/\$gallery *-> *app *-> *photoAlbumURL *= *["\']([^"\']*)["\']/i',$line,$result)==1 && count($result)==2 && $result[1]!='') + $galleryUrl = $result[1]; + if(preg_match('/\$gallery *-> *app *-> *default\[ *["\']thumb_size["\'] *\] *= *["\']([^"\']*)["\']/i',$line,$result)==1 && count($result)==2 && $result[1]!='') + $thumbSize = $result[1]; + if(preg_match('/\$gallery *-> *app *-> *default\[ *["\']resize_size["\'] *\] *= *["\']([^"\']*)["\']/i',$line,$result)==1 && count($result)==2 && $result[1]!='') + $resizeSize = $result[1]; + } + + if ($albumDir=='' || !is_dir($albumDir) || $albumUrl=='' || $galleryUrl=='') { + return 'broken'; + } + + self::$album_dir = $albumDir; + self::$album_url = $albumUrl; + self::$gallery_url = $galleryUrl; + self::$thumb_size = $thumbSize; + self::$resize_size = $resizeSize; + self::$gallery_dir = dirname($albums_path); + + + $version = ''; + $version_path = dirname($albums_path).DIRECTORY_SEPARATOR.'Version.php'; + if (!is_file($version_path)) { + $version_path = dirname($albums_path).DIRECTORY_SEPARATOR.'version.php'; + } + if (is_file($version_path)) { + foreach(file($version_path) as $line) { + //look for a line like: $gallery->version = '1.5.10'; + if(preg_match('/\$gallery *-> *version *= *["\']([^"\']*)["\']/i',$line,$result)==1 && count($result)==2 && $result[1]!='') + $version = $result[1]; + } + } + else { + $version = '1.x'; + } + self::$version = $version; + + + return 'ok'; + } + + /** + * Return the version of Gallery 1 (eg "1.5.10") + */ + static function version() { + if(!self::is_initialized()) + return '1'; + return self::$version; + } + + static function recursiveCountGallery($albumDir, $array, $level) { + $countAlbum = 0; + foreach($array as $key => $value) { + if($key!='') { + $countAlbum++; + self::$albums_flat[] = $level.':'.$key; + + require_once('Gallery1DataParser.php'); + list($result, $items) = Gallery1DataParser::getPhotos($albumDir.$key.DIRECTORY_SEPARATOR); + + if($result==null) + foreach($items as $object) { + + if(isset($object->image) && is_a($object->image, 'G1Img')) { + + $item = $key.DIRECTORY_SEPARATOR.$object->image->name; + self::$queued_items[] = $item; + if(isset($object->comments) && is_array($object->comments) && count($object->comments)) { + + $comments = array(); + foreach ($object->comments as $comment) { + if (is_a($comment, 'Comment')) { + $comments[] = array( 'commentText' => $comment->commentText + ,'name' => $comment->name + ,'UID' => $comment->UID + ,'datePosted' => $comment->datePosted + ,'IPNumber' => $comment->IPNumber + ); + } + } + self::$queued_comments[] = array( $item => $comments ); + } + + if(isset($object->highlight) && $object->highlight==1 && isset($object->highlightImage) && is_a($object->highlightImage, 'G1Img')) { + self::$queued_highlights[] = $level.':'.$key.DIRECTORY_SEPARATOR.$object->highlightImage->name; + } + } + else if(isset($object->isAlbumName) && $object->isAlbumName!='') { + + if(isset($object->highlight) && $object->highlight==1 && isset($object->highlightImage) && is_a($object->highlightImage, 'G1Img')) { + self::$queued_highlights[] = $level.':'.$key.DIRECTORY_SEPARATOR.$object->highlightImage->name; + } + if(isset($object->hidden) && $object->hidden==1) { + self::$albums_hidden[$object->isAlbumName] = 1; + } + } + else { + g1_import::log('Invalid object found: '.print_r($object, true)); + } + + } + } + if(is_array($value) && count($value)>0) { + $countAlbum += g1_import::recursiveCountGallery($albumDir, $value, $level+1); + } + } + return $countAlbum; + } + + /** + * Return a set of statistics about the number of users, groups, albums, photos, movies and + * comments available for import from the Gallery 1 instance. + */ + static function g1_stats() { + $stats['users'] = 0; + $stats['groups'] = 0; + $stats['albums'] = 0; + $stats['photos'] = 0; + $stats['movies'] = 0; + $stats['comments'] = 0; + $stats['tags'] = 0; + + $albumDir = self::$album_dir; + if(substr($albumDir,-1)!=DIRECTORY_SEPARATOR) $albumDir.=DIRECTORY_SEPARATOR; + + require_once('Gallery1DataParser.php'); + if(Gallery1DataParser::isValidAlbumsPath($albumDir)) { + if(count(self::$tree)==0) { + list($result, $tree) = Gallery1DataParser::getAlbumHierarchy($albumDir); + if($result==null) self::$tree = $tree; + } + + list($result, $uids) = Gallery1DataParser::getUserUids($albumDir); + if($result==null) $stats['users'] = count($uids); + + self::$queued_items = array(); + self::$queued_comments = array(); + self::$queued_highlights = array(); + self::$albums_flat = array(); + self::$albums_hidden = array(); + if(count(self::$tree)) $stats['albums'] = 1 /* <= THE ROOT ALBUM!!!*/ + g1_import::recursiveCountGallery($albumDir, self::$tree, 0); + + $stats['photos'] = count(self::$queued_items); + foreach(self::$queued_comments as $element) { + foreach($element as $item => $comments) { + $stats['comments'] += count($comments); + } + } + arsort(self::$queued_highlights); + $stats['highlights'] = count(self::$queued_highlights); + + arsort(self::$albums_flat); + foreach(self::$albums_flat as $key => $value) { + $pos = strpos($value, ':'); + if($pos!==false) self::$albums_flat[$key] = substr($value, $pos+1); + } + } + + return $stats; + } + + /** + * Return a set of statistics about the number of users, groups, albums, photos, movies and + * comments already imported into the Gallery 3 instance. + */ + static function g3_stats() { + $g3_stats = array( + 'album' => 0, 'comment' => 0, 'item' => 0, 'user' => 0, 'group' => 0, 'tag' => 0); + foreach (db::build() + ->select('resource_type') + ->select(array('C' => 'COUNT("*")')) + ->from('g1_maps') + ->where('resource_type', 'IN', array('album', 'comment', 'item', 'user', 'group')) + ->group_by('resource_type') + ->execute() as $row) { + $g3_stats[$row->resource_type] = $row->C; + } + return $g3_stats; + } + + /** + * Import a single album. + */ + static function import_album(&$queue) { + $messages = array(); + + // The queue is a set of nested associative arrays where the key is the album id and the + // value is an array of similar arrays. We'll do a breadth first tree traversal using the + // queue to keep our state. Doing it breadth first means that the parent will be created by + // the time we get to the child. + + // Dequeue the current album and enqueue its children + list($album, $tree) = each($queue); + unset($queue[$album]); + + foreach($tree as $key => $value) { + $queue[$album.'/'.$key] = $value; + } + + // Special handling for the root album + if ($album == '') { + if (!self::map('', '', 'album')) { + $album = item::root(); + self::set_map($album->id, '', '', 'album'); + } + return $messages; + } + + // Album names come in as /Folder1/Folder2/FolderX + $pos = strrpos($album, '/'); + if($pos===false) { + return $messages; + } + + // Get FolderX into g1_album + $parent = substr($album,0,$pos); + $g1_album = substr($album,$pos+1); + + // Reduce parent to Folder2 + $pos = strrpos($parent, '/'); + if($pos!==false) { + $parent = substr($parent,$pos+1); + } + + // Skip already-existing albums + if (self::map($g1_album, '', 'album')) { + $messages[] = t('Skipping already existing album %album.', array('album' => $parent.'/'.$g1_album)); + return $messages; + } + + $album_id = self::map($parent, '', 'album'); + if (!$album_id) { + $messages[] = t('Album %name not found', array('name' => $parent)); + return $messages; + } + + g1_import::debug( t('Now importing album %album.', array('album' => $parent.'/'.$g1_album)) ); + + + $albumDir = self::$album_dir; + if(substr($albumDir,-1)!=DIRECTORY_SEPARATOR) $albumDir.=DIRECTORY_SEPARATOR; + $importDir = $albumDir.$g1_album.DIRECTORY_SEPARATOR; + + + $parent = ORM::factory('item', $album_id); + + $album = ORM::factory('item'); + $album->type = 'album'; + $album->parent_id = $album_id; + g1_import::set_album_values($album, $g1_album); + + try { + $album->validate(); + } catch (ORM_Validation_Exception $e) { + throw new G1_Import_Exception( + t('Failed to validate Gallery 1 album with name %name.', + array('name' => $g1_album)), + $e); + } + + try { + $album->save(); + self::set_map($album->id, $g1_album, '', 'album'); + } catch (Exception $e) { + throw new G1_Import_Exception( + t('Failed to import Gallery 1 album with name %name.', + array('name' => $g1_album)), + $e); + } + + try { + require_once('Gallery1DataParser.php'); + list($result, $items) = Gallery1DataParser::getPhotos($importDir); + if($result==null) + foreach($items as $object) { + if(isset($object->highlight) && $object->highlight==1 && isset($object->highlightImage) && is_a($object->highlightImage, 'G1Img')) { + $g1_path = $importDir.$object->highlightImage->name.'.'.$object->highlightImage->type; + if (is_file($g1_path) && @copy($g1_path, $album->thumb_path())) { + $album->thumb_height = $object->highlightImage->height; + $album->thumb_width = $object->highlightImage->width; + $album->thumb_dirty = false; + $album->save(); + } + } + } + } catch (Exception $e) { + throw new G1_Import_Exception( + t('Failed to copy thumb for album %name.', + array('name' => $g1_album)), + $e); + } + + try { + if(isset(self::$albums_hidden[$g1_album])) { + access::deny(identity::everybody(), 'view', $album); + } + } catch (Exception $e) { + throw new G1_Import_Exception( + t('Failed to set access permission for hidden album %name.', + array('name' => $g1_album)), + $e); + } + + return $messages; + } + + /** + * Transfer over all the values from a G1 album to a G3 album. + */ + static function set_album_values($album, $g1_album) { + $albumDir = self::$album_dir; + if(substr($albumDir,-1)!=DIRECTORY_SEPARATOR) $albumDir.=DIRECTORY_SEPARATOR; + $albumDir .= $g1_album; + if(substr($albumDir,-1)!=DIRECTORY_SEPARATOR) $albumDir.=DIRECTORY_SEPARATOR; + + require_once('Gallery1DataParser.php'); + list($result, $fields) = Gallery1DataParser::loadAlbumFields($albumDir); + + $album->name = $fields['name']; + $album->slug = $fields['name']; // <= verification fails if this property has not been set!!! + $album->title = utf8_encode(self::_decode_html_special_chars(trim($fields['title']))); + $album->title or $album->title = $album->name; + $album->description = utf8_encode(self::_decode_html_special_chars(trim($fields['description']))); + //$album->owner_id = self::map($g1_album->getOwnerId()); + try { + $album->view_count = (int) $fields['clicks']; + } catch (Exception $e) { + // @todo log + $album->view_count = 0; + } + $album->created = $fields['clicks_date']; + $album->sort_column = 'weight'; //G1 was always sorted manually + $album->sort_order = 'ASC'; + } + + /** + * Set the highlight properly for a single album + */ + static function set_album_highlight(&$queue) { + $messages = array(); + if(count($queue)==0) { + $messages[] = t('Empty highlights queue'); + return $messages; + } + + $item = array_shift($queue); + if (substr($item, -10) == '.highlight') { + $item = substr($item, 0, strlen($item)-10); + } + g1_import::debug( t('Now importing highlight %item', array('item' => $item)) ); + + // Item names come in as Level:FolderX/ItemX + $pos = strpos($item, ':'); + if($pos===false) { + $messages[] = t('Invalid item %item', array('item' => $item)); + return $messages; + } + $item = substr($item, $pos+1); + + + // Item names come in as FolderX/ItemX + $pos = strrpos($item, '/'); + if($pos===false) { + $messages[] = t('Invalid item %item', array('item' => $item)); + return $messages; + } + + // Get ItemX into g1_item + $g1_item = substr($item,$pos+1); + // Get FolderX into g1_item + $g1_album = substr($item,0,$pos); + + + if (self::map($g1_album, '', 'highlight')) { + return $messages; + } + + $album_id = self::map($g1_album, '', 'album'); + if (!$album_id) { + $messages[] = t('Album %name not found', array('name' => $g1_album)); + return $messages; + } + + $item_id = self::map($g1_album, $g1_item, 'item'); + if (!$item_id) { + $item_id = self::map($g1_item, '', 'album'); + } + if (!$item_id) { + $messages[] = t('Item/Album %name not found', array('name' => $item)); + return $messages; + } + + $album = ORM::factory('item', $album_id); + $album->album_cover_item_id = $item_id; + $album->thumb_dirty = 1; + try { + $album->save(); + graphics::generate($album); + g1_import::debug( t('Added highlight %item to %album', array('item' => $item, 'album' => $album->name)) ); + } catch (Exception $e) { + $messages[] = (string) new G1_Import_Exception( + t("Failed to generate an album highlight for album '%name'.", + array('name' => $album->name)), + $e); + return $messages; + } + + $album_id = self::map($g1_album, '', 'album'); + self::set_map($album_id, $g1_album, '', 'highlight'); + + g1_import::debug( t('Added highlight %item to %album', array('item' => $item, 'album' => $album->name)) ); + return $messages; + } + + static function hotfix_all() { + $messages = array(); + $messages[] = t('Running Hotfix'); + + /* ON THE LAST RUN WE NEED TO RE-FIX ALL DAMAGED ALBUM THUMBS! */ + + $albumDir = self::$album_dir; + if(substr($albumDir,-1)!=DIRECTORY_SEPARATOR) $albumDir.=DIRECTORY_SEPARATOR; + + foreach(self::$albums_flat as $g1_album) { + $album_id = self::map($g1_album, '', 'album'); + if (!$album_id) { + $messages[] = t('Album %name not found', array('name' => $g1_album)); + continue; + } + + $album = ORM::factory('item', $album_id); + $importDir = $albumDir.$g1_album.DIRECTORY_SEPARATOR; + + try { + require_once('Gallery1DataParser.php'); + list($result, $items) = Gallery1DataParser::getPhotos($importDir); + if($result==null) + foreach($items as $object) { + if(isset($object->highlight) && $object->highlight==1 && isset($object->highlightImage) && is_a($object->highlightImage, 'G1Img')) { + $g1_path = $importDir.$object->highlightImage->name.'.'.$object->highlightImage->type; + if (is_file($g1_path) && @copy($g1_path, $album->thumb_path())) { + $album->thumb_height = $object->highlightImage->height; + $album->thumb_width = $object->highlightImage->width; + $album->thumb_dirty = false; + $album->save(); + } + } + } + } catch (Exception $e) { + $messages[] = (string) new G1_Import_Exception( + t('Failed to copy thumb for album %name.', + array('name' => $g1_album)), + $e); + } + } + + /* ON THE LAST RUN WE NEED TO RE-FIX ALL ALBUM PERMISSIONS */ + + foreach(self::$albums_hidden as $g1_album => $dummy) { + try { + $album_id = self::map($g1_album, '', 'album'); + $album = ORM::factory('item', $album_id); + access::deny(identity::everybody(), 'view', $album); + $messages[] = t('Denying access to %album', array('album' => $g1_album)); + } catch (Exception $e) { + $messages[] = (string) new G1_Import_Exception( + t('Failed to set access permission for hidden album %name.', + array('name' => $g1_album)), + $e); + } + } + + return $messages; + } + + /** + * Import a single photo or movie. + */ + static function import_item(&$queue) { + $messages = array(); + if(count($queue)==0) { + $messages[] = t('Empty item queue'); + return $messages; + } + + $item_id = array_shift($queue); + g1_import::debug( t('Now importing item %item', array('item' => $item_id)) ); + + // Item names come in as FolderX/ItemX + $pos = strrpos($item_id, '/'); + if($pos===false) { + return $messages; + } + + // Get ItemX into g1_item + $g1_item = substr($item_id,$pos+1); + // Get FolderX into g1_item + $g1_album = substr($item_id,0,$pos); + + + if (self::map($g1_album, $g1_item, 'item')) { + return $messages; + } + + $album_id = self::map($g1_album, '', 'album'); + if (!$album_id) { + $messages[] = t('Album %name not found', array('name' => $g1_album)); + return $messages; + } + + + $album_item = null; + + $albumDir = self::$album_dir; + if(substr($albumDir,-1)!=DIRECTORY_SEPARATOR) $albumDir.=DIRECTORY_SEPARATOR; + + require_once('Gallery1DataParser.php'); + list($result, $items) = Gallery1DataParser::getPhotos($albumDir.$g1_album.DIRECTORY_SEPARATOR); + if($result==null) + foreach($items as $object) { + if(isset($object->image) && is_a($object->image, 'G1Img') && isset($object->image->name) && ($object->image->name==$g1_item)) { + $album_item = $object; + } + } + + if ($album_item==null) { + $messages[] = t('Failed to import Gallery 1 item: %item', array('item' => $item_id)); + return $messages; + } + + $corrupt = 0; + self::$current_g1_item = array( $item_id => $album_item ); + $g1_path = $albumDir.$g1_album.DIRECTORY_SEPARATOR.$album_item->image->name.'.'.$album_item->image->type; + + $parent = ORM::factory('item', $album_id); + + switch($album_item->image->type) { + case 'jpg': + case 'jpeg': + case 'gif': + case 'png': + $g1_type = 'GalleryPhotoItem'; break; + case 'wmv': + case '3gp': + case 'avi': + case 'mp4': + case 'flv': + $g1_type = 'GalleryMovieItem'; break; + default: + $g1_type = 'GalleryPhotoItem'; break; + } + + if (!file_exists($g1_path)) { + // If the Gallery 1 source image isn't available, this operation is going to fail. That can + // happen in cases where there's corruption in the source Gallery 1. In that case, fall + // back on using a broken image. It's important that we import *something* otherwise + // anything that refers to this item in Gallery 1 will have a dangling pointer in Gallery 3 + // + // Note that this will change movies to be photos, if there's a broken movie. Hopefully + // this case is rare enough that we don't need to take any heroic action here. + g1_import::log( + t('%path missing in import; replacing it with a placeholder', array('path' => $g1_path))); + $g1_path = MODPATH . 'g1_import/data/broken-image.gif'; + $g1_type = 'GalleryPhotoItem'; + $corrupt = 1; + } + + $item = null; + + switch ($g1_type) { + case 'GalleryPhotoItem': + + if(function_exists('mime_content_type')) + $type = mime_content_type($g1_path); + else + $type = self::get_mime_type($g1_path); + + if ($type!='' && !in_array($type, array('image/jpeg', 'image/gif', 'image/png'))) { + Kohana_Log::add('alert', "$g1_path is an unsupported image type $type; using a placeholder gif"); + $messages[] = t("'%path' is an unsupported image type '%type', using a placeholder", + array('path' => $g1_path, 'type' => $type)); + $g1_path = MODPATH . 'g1_import/data/broken-image.gif'; + $corrupt = 1; + } + + try { + $item = ORM::factory('item'); + $item->type = 'photo'; + $item->parent_id = $album_id; + $item->set_data_file($g1_path); + $item->name = $g1_item.'.'.$album_item->image->type; + $item->slug = $g1_item; + $item->mime_type = $type; + $item->title = utf8_encode(self::_decode_html_special_chars(trim($album_item->caption))); + $item->title or $item->title = ' '; //don't use $item->name as this clutters up the UI + if(isset($album_item->description) && $album_item->description!='') + $item->description = utf8_encode(self::_decode_html_special_chars(trim($album_item->description))); + //$item->owner_id = self::map($g1_item->getOwnerId()); + try { + $item->view_count = (int) $album_item->clicks; + } catch (Exception $e) { + $view_count = 1; + } + } catch (Exception $e) { + $exception_info = (string) new G1_Import_Exception( + t("Corrupt image '%path'", array('path' => $g1_path)), + $e, $messages); + Kohana_Log::add('alert', "Corrupt image $g1_path\n" . $exception_info); + $messages[] = $exception_info; + $corrupt = 1; + $item = null; + return $messages; + } + + try { + $item->validate(); + } catch (ORM_Validation_Exception $e) { + $exception_info = (string) new G1_Import_Exception( + t('Failed to validate Gallery 1 item %item.', + array('item' => $item_id)), + $e, $messages); + Kohana_Log::add('alert', "Failed to validate Gallery 1 item $item_id.\n" . $exception_info); + $messages[] = $exception_info; + $corrupt = 1; + $item = null; + return $messages; + } + + try { + $item->save(); + } catch (Exception $e) { + $exception_info = (string) new G1_Import_Exception( + t('Failed to import Gallery 1 item %item.', + array('item' => $item_id)), + $e, $messages); + Kohana_Log::add('alert', "Failed to import Gallery 1 item $item_id.\n" . $exception_info); + $messages[] = $exception_info; + $corrupt = 1; + $item = null; + } + + break; + + case 'GalleryMovieItem': + // @todo we should transcode other types into FLV + + if(function_exists('mime_content_type')) + $type = mime_content_type($g1_path); + else + $type = self::get_mime_type($g1_path); + + if ($type=='' || in_array($type, array('video/mp4', 'video/x-flv'))) { + try { + $item = ORM::factory('item'); + $item->type = 'movie'; + $item->parent_id = $album_id; + $item->set_data_file($g1_path); + $item->name = $g1_item.'.'.$album_item->image->type; + $item->slug = $g1_item; + $item->mime_type = $type; + $item->title = utf8_encode(self::_decode_html_special_chars(trim($album_item->caption))); + $item->title or $item->title = ' '; //$item->name; + if(isset($album_item->description) && $album_item->description!='') + $item->description = utf8_encode(self::_decode_html_special_chars(trim($album_item->description))); + //$item->owner_id = self::map($g1_item->getOwnerId()); + try { + $item->view_count = (int) $album_item->clicks; + } catch (Exception $e) { + $view_count = 1; + } + } catch (Exception $e) { + $exception_info = (string) new G1_Import_Exception( + t("Corrupt movie '%path'", array("path" => $g1_path)), + $e, $messages); + Kohana_Log::add('alert', "Corrupt movie $g1_path\n" . $exception_info); + $messages[] = $exception_info; + $corrupt = 1; + $item = null; + return $messages; + } + + try { + $item->validate(); + } catch (ORM_Validation_Exception $e) { + $exception_info = (string) new G1_Import_Exception( + t('Failed to validate Gallery 1 item %item.', + array('item' => $item_id)), + $e, $messages); + Kohana_Log::add('alert', "Failed to validate Gallery 1 item $item_id.\n" . $exception_info); + $messages[] = $exception_info; + $corrupt = 1; + $item = null; + return $messages; + } + + try { + $item->save(); + } catch (Exception $e) { + $exception_info = (string) new G1_Import_Exception( + t('Failed to import Gallery 1 item %item.', + array('item' => $item_id)), + $e, $messages); + Kohana_Log::add('alert', "Failed to import Gallery 1 item $item_id.\n" . $exception_info); + $messages[] = $exception_info; + $corrupt = 1; + $item = null; + } + } else { + Kohana_Log::add('alert', "$g1_path is an unsupported movie type $type"); + $messages[] = t("'%path' is an unsupported movie type '%type'", array('path' => $g1_path, 'type' => $type)); + $corrupt = 1; + } + + break; + + default: + // Ignore + break; + } + + if (isset($item)) { + self::set_map($item->id, $g1_album, $g1_item, 'item'); + + if(isset($album_item->keywords) && $album_item->keywords!='') { + $keywords = utf8_encode(self::_decode_html_special_chars(trim($album_item->keywords))); + if($keywords!='') { + self::import_keywords_as_tags($keywords, $item); + } + } + } + + if ($corrupt) { + $title = utf8_encode(self::_decode_html_special_chars(trim($album_item->caption))); + $title or $title = $g1_item; + if (!empty($item)) { + $messages[] = + t('%title from Gallery 1 could not be processed; (imported as %title)', + array('g1_url' => $gallery_url.'/'.$item_id, + 'g3_url' => $item->url(), + 'title' => $title)); + } else { + $messages[] = + t('%title from Gallery 1 could not be processed', + array('g1_url' => $gallery_url.'/'.$item_id, 'title' => $title)); + } + } + + self::$current_g1_item = null; + return $messages; + } + + function get_mime_type($filename, $mimePath = '/etc') { + $fileext = substr(strrchr($filename, '.'), 1); + if (empty($fileext)) return (false); + $regex = "/^([\w\+\-\.\/]+)\s+(\w+\s)*($fileext\s)/i"; + $lines = file("$mimePath/mime.types"); + foreach($lines as $line) { + if (substr($line, 0, 1) == '#') continue; // skip comments + $line = rtrim($line) . ' '; + if (!preg_match($regex, $line, $matches)) continue; // no match to the extension + return ($matches[1]); + } + return (false); // no match at all + } + + /** + * Import a single comment. + */ + static function import_comment(&$queue) { + $messages = array(); + if(count($queue)==0) { + //this case happens if more than one comment is found on one or more items + $messages[] = t('Empty comments queue'); + return $messages; + } + + $element = array_shift($queue); + + list($item, $comments) = each($element); + g1_import::debug( t('Now importing %$comments comment(s) for item %$item', array('album' => $item, 'comments' => count($comments))) ); + + // Item names come in as FolderX/ItemX + $pos = strrpos($item, '/'); + if($pos===false) { + $messages[] = t('Invalid item %item', array('item' => $item)); + return $messages; + } + + // Get ItemX into g1_item + $g1_item = substr($item,$pos+1); + // Get FolderX into g1_item + $g1_album = substr($item,0,$pos); + + + if (self::map($g1_album, $g1_item, 'comment')) { + return $messages; + } + + $item_id = self::map($g1_album, $g1_item, 'item'); + if (empty($item_id)) { + $messages[] = t('Could not find item %item', array('item' => $item)); + return; + } + + foreach ($comments as $g1comment) { + + // Just import the fields we know about. Do this outside of the comment API for now so that + // we don't trigger spam filtering events + $comment = ORM::factory('comment'); + $comment->author_id = identity::guest()->id; + $comment->guest_name = utf8_encode(self::_decode_html_special_chars(trim($g1comment['name']))); + $comment->guest_name or $comment->guest_name = (string) t('Anonymous coward'); + $comment->guest_email = 'unknown@nobody.com'; + $comment->item_id = $item_id; + $comment->text = utf8_encode(self::_decode_html_special_chars(trim($g1comment['commentText']))); + $comment->state = 'published'; + $comment->server_http_host = utf8_encode(self::_decode_html_special_chars(trim($g1comment['IPNumber']))); + + try { + $comment->save(); + } catch (Exception $e) { + $messages[] = (string) new G1_Import_Exception( + t('Failed to import comment for item: %item.', + array('item' => $item)), + $e); + return $messages; + } + + // Backdate the creation date. We can't do this at creation time because + // Comment_Model::save() will override it. + db::update('comments') + ->set('created', utf8_encode(self::_decode_html_special_chars(trim($g1comment['datePosted'])))) + ->set('updated', utf8_encode(self::_decode_html_special_chars(trim($g1comment['datePosted'])))) + ->where('id', '=', $comment->id) + ->execute(); + } + + self::set_map($item_id, $g1_album, $g1_item, 'comment'); + return $messages; + } + + /** + * g1 encoded'&', '"', '<' and '>' as '&', '"', '<' and '>' respectively. + * This function undoes that encoding. + */ + private static function _decode_html_special_chars($value) { + return str_replace(array('&', '"', '<', '>', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'), + array('&', '"', '<', '>', 'ä', 'ö', 'ü', 'Ä', 'Ö', 'Ü', 'ß'), $value); + } + + static function import_keywords_as_tags($keywords, $item) { + // FIXME check if this is true for G1 (copied from G2 import module): + // Keywords in G1 are free form. So we don't know what our user used as a separator. Try to + // be smart about it. If we see a comma or a semicolon, expect the keywords to be separated + // by that delimeter. Otherwise, use space as the delimiter. + if (strpos($keywords, ';')) { + $delim = ';'; + } else if (strpos($keywords, ',')) { + $delim = ','; + } else { + $delim = ' '; + } + + foreach (preg_split("/$delim/", $keywords) as $keyword) { + $keyword = trim($keyword); + if ($keyword) { + tag::add($item, $keyword); + } + } + } + + /** + * If the thumbnails and resizes created for the Gallery 1 photo match the dimensions of the + * ones we expect to create for Gallery 3, then copy the files over instead of recreating them. + */ + static function copy_matching_thumbnails_and_resizes($item) { + + // We only operate on items that are being imported + if (empty(self::$current_g1_item)) { + return; + } + + // Precaution: if the Gallery 1 item was watermarked, or we have the Gallery 3 watermark module + // active then we'd have to do something a lot more sophisticated here. For now, just skip + // this step in those cases. + // @todo we should probably use an API here, eventually. + if (module::is_active('watermark') && module::get_var('watermark', 'name')) { + return; + } + + // For now just do the copy for photos and movies. Albums are tricky because we're may not + // yet be setting their album cover properly. + // @todo implement this for albums also + if (!$item->is_movie() && !$item->is_photo()) { + return; + } + + list( $item_id, $album_item ) = each(self::$current_g1_item); + + // Item names come in as FolderX/ItemX + $pos = strrpos($item_id, '/'); + if($pos===false) { + return; + } + + // Get ItemX into g1_item + $g1_item = substr($item_id,$pos+1); + // Get FolderX into g1_item + $g1_album = substr($item_id,0,$pos); + + + $target_thumb_size = module::get_var('gallery', 'thumb_size'); + $target_resize_size = module::get_var('gallery', 'resize_size'); + if ( isset($album_item->thumbnail) && is_a($album_item->thumbnail, 'G1Img') ) { + + if($item->thumb_dirty && + ($album_item->thumbnail->width == $target_thumb_size || + $album_item->thumbnail->height == $target_thumb_size)) { + + $g1_path = $albumDir.$g1_album.DIRECTORY_SEPARATOR.$album_item->thumbnail->name.'.'.$album_item->thumbnail->type; + if (@copy($g1_path, $item->thumb_path())) { + $item->thumb_height = $album_item->thumbnail->height; + $item->thumb_width = $album_item->thumbnail->width; + $item->thumb_dirty = false; + } + /** + * No use to try to take over the highlight images here as they will be overwritten anyway. + */ + } + } + + try { + $item->save(); + } catch (Exception $e) { + return (string) new G1_Import_Exception( + t("Failed to copy thumbnails and resizes for item '%name' (Gallery 1 id: %id)", + array('name' => $item->name, 'id' => $item_id)), + $e); + } + } + + /** + * Figure out the most common resize and thumb sizes in Gallery 1 so that we can tell the admin + * what theme settings to set to make the import go faster. If we match up the sizes then we + * can just copy over derivatives instead of running graphics toolkit operations. + */ + static function common_sizes() { + return array( 'resize' => array( 'size' => self::$resize_size, 'count' => 1 ) + ,'thumb' => array( 'size' => self::$thumb_size, 'count' => 1 ) + ,'total' => 1 + ); + } + + /** + * Look in our map to find the corresponding Gallery 3 id for the given Gallery 1 id. + */ + static function map($album, $item, $resource_type) { + if (!array_key_exists($resource_type.':'.$album.'/'.$item, self::$map)) { + $mapping = ORM::factory('g1_map')->where('album', '=', $album)->where('item', '=', $item)->where('resource_type', '=', $resource_type)->find(); + self::$map[$resource_type.':'.$album.'/'.$item] = $mapping->loaded() ? $mapping->id : null; + } + + return self::$map[$resource_type.':'.$album.'/'.$item]; + } + + /** + * Associate a Gallery 1 id with a Gallery 3 item id. + */ + static function set_map($id, $album, $item, $resource_type) { + $mapping = ORM::factory('g1_map'); + $mapping->id = $id; + $mapping->album = $album; + $mapping->item = $item; + $mapping->resource_type = $resource_type; + $mapping->save(); + self::$map[$resource_type.':'.$album.'/'.$item] = $id; + } + + static function log($msg) { + message::warning($msg); + Kohana_Log::add('alert', $msg); + } + + static function debug($msg) { + Kohana_Log::add('debug', $msg); + } +} diff --git a/3.0/modules/g1_import/helpers/g1_import_event.php b/3.0/modules/g1_import/helpers/g1_import_event.php new file mode 100644 index 00000000..4204f4d7 --- /dev/null +++ b/3.0/modules/g1_import/helpers/g1_import_event.php @@ -0,0 +1,40 @@ +delete("g1_maps") + ->where("id", "=", $item->id) + ->execute(); + } + + static function item_created($item) { + g1_import::copy_matching_thumbnails_and_resizes($item); + } + + static function admin_menu($menu, $theme) { + $menu + ->get("settings_menu") + ->append(Menu::factory("link") + ->id("g1_import") + ->label(t("Gallery 1 import")) + ->url(url::site("admin/g1_import"))); + } +} diff --git a/3.0/modules/g1_import/helpers/g1_import_installer.php b/3.0/modules/g1_import/helpers/g1_import_installer.php new file mode 100644 index 00000000..fb1ea1f5 --- /dev/null +++ b/3.0/modules/g1_import/helpers/g1_import_installer.php @@ -0,0 +1,46 @@ +query("CREATE TABLE IF NOT EXISTS {g1_maps} ( + `id` int(9) NOT NULL, + `album` varchar(128) NOT NULL, + `item` varchar(128) default NULL, + `resource_type` varchar(64) default NULL, + PRIMARY KEY (`id`, `resource_type`), + KEY `g1_map_index` (`album`, `item`)) + DEFAULT CHARSET=utf8;"); + + module::set_version("g1_import", 1); + } + + static function upgrade($version) { + $db = Database::instance(); + /* reserved for future versions + if ($version == 1) { + module::set_version('g1_import', $version = 2); + } + //*/ + } + + static function uninstall() { + } +} diff --git a/3.0/modules/g1_import/helpers/g1_import_task.php b/3.0/modules/g1_import/helpers/g1_import_task.php new file mode 100644 index 00000000..32edd3cc --- /dev/null +++ b/3.0/modules/g1_import/helpers/g1_import_task.php @@ -0,0 +1,215 @@ +callback('g1_import_task::import') + ->name(t('Import from Gallery 1')) + ->description( + t('Gallery %version detected', array('version' => $version))) + ->severity(log::SUCCESS)); + } + + return array(); + } + + static function import($task) { + $start = microtime(true); + g1_import::init(); + + $stats = $task->get('stats'); + $done = $task->get('done'); + $total = $task->get('total'); + $completed = $task->get('completed'); + $mode = $task->get('mode'); + $queue = $task->get('queue'); + if (!isset($mode)) { + $stats = g1_import::g1_stats(); + $stats['items'] = $stats['photos'] + $stats['movies']; + unset($stats['photos']); + unset($stats['movies']); + $stats['fix'] = 1; + $task->set('stats', $stats); + + $task->set('total', $total = array_sum(array_values($stats))); + $completed = 0; + $mode = 0; + + $done = array(); + foreach (array_keys($stats) as $key) { + $done[$key] = 0; + } + $task->set('done', $done); + } + + $modes = array('users', 'albums', 'items', 'comments', 'highlights', 'fix', 'done'); + while (!$task->done && microtime(true) - $start < 1.5) { + if ($done[$modes[$mode]] >= $stats[$modes[$mode]]) { + // Nothing left to do for this mode. Advance. + $mode++; + $task->set('last_id', 0); + $queue = array(); + + // Start the loop from the beginning again. This way if we get to a mode that requires no + // actions (eg, if the G1 comments module isn't installed) we won't try to do any comments + // queries.. in the next iteration we'll just skip over that mode. + if ($modes[$mode] != 'done') { + continue; + } + } + + switch($modes[$mode]) { + + case 'users': + $done['users'] = $stats['users']-1; + $task->status = t( + 'Ignoring users (%count of %total)', + array('count' => $done['users'], 'total' => $stats['users'])); + break; + + case 'albums': + if (empty($queue)) { + if(count(g1_import::$tree)==0) { + g1_import::g1_stats(); + } + $task->set('queue', $queue = array('' => g1_import::$tree)); + } + $log_message = g1_import::import_album($queue); + if ($log_message) { + $task->log($log_message); + } + $task->status = t( + 'Importing albums (%count of %total)', + array('count' => $done['albums'] + 1, 'total' => $stats['albums'])); + break; + + case 'items': + if (empty($queue)) { + if (count(g1_import::$queued_items)==0) { + g1_import::g1_stats(); + } + + $queuelen = 100; + $thisstart = $task->get('last_id', 0); + $nextstart = $thisstart + $queuelen; + $task->set('last_id', $nextstart); + + $task->set('queue', $queue = array_splice(g1_import::$queued_items, $thisstart, $queuelen)); + } + $log_message = g1_import::import_item($queue); + if ($log_message) { + $task->log($log_message); + } + $task->status = t( + 'Importing photos (%count of %total)', + array('count' => $done['items'] + 1, 'total' => $stats['items'])); + break; + + case 'comments': + if (empty($queue)) { + if (count(g1_import::$queued_comments)==0) { + g1_import::g1_stats(); + } + + $queuelen = 100; + $thisstart = $task->get('last_id', 0); + $nextstart = $thisstart + $queuelen; + $task->set('last_id', $nextstart); + + $task->set('queue', $queue = array_splice(g1_import::$queued_comments, $thisstart, $queuelen)); + } + $log_message = g1_import::import_comment($queue); + if ($log_message) { + $task->log($log_message); + } + $task->status = t( + 'Importing comments (%count of %total)', + array('count' => $done['comments'] + 1, 'total' => $stats['comments'])); + break; + + case 'highlights': + if (empty($queue)) { + if (count(g1_import::$queued_highlights)==0) { + g1_import::g1_stats(); + } + + $queuelen = 100; + $thisstart = $task->get('last_id', 0); + $nextstart = $thisstart + $queuelen; + $task->set('last_id', $nextstart); + + $task->set('queue', $queue = array_splice(g1_import::$queued_highlights, $thisstart, $queuelen)); + } + $log_message = g1_import::set_album_highlight($queue); + if ($log_message) { + $task->log($log_message); + } + $task->status = t( + 'Album highlights (%count of %total)', + array('count' => $done['highlights'] + 1, 'total' => $stats['highlights'])); + break; + + case 'fix': + if (empty($queue)) { + if (count(g1_import::$albums_flat)==0) { + g1_import::g1_stats(); + } + $task->set('queue', $queue = 'dummy'); + } + $log_message = g1_import::hotfix_all(); + if ($log_message) { + $task->log($log_message); + } + $task->status = t( + 'Final Hotfixing (%count of %total)', + array('count' => $done['fix'] + 1, 'total' => $stats['fix'])); + break; + + case 'done': + $task->status = t('Import complete'); + $task->done = true; + $task->state = 'success'; + break; + } + + if (!$task->done) { + $done[$modes[$mode]]++; + $completed++; + } + } + + $task->percent_complete = 100 * ($completed / $total); + $task->set('completed', $completed); + $task->set('mode', $mode); + $task->set('queue', $queue); + $task->set('done', $done); + } +} diff --git a/3.0/modules/g1_import/libraries/G1_Import_Exception.php b/3.0/modules/g1_import/libraries/G1_Import_Exception.php new file mode 100644 index 00000000..cd7e476f --- /dev/null +++ b/3.0/modules/g1_import/libraries/G1_Import_Exception.php @@ -0,0 +1,39 @@ +validation->errors(), true); + } + if ($previous) { + $message .= "\n" . (string) $previous; + } + // The $previous parameter is supported in PHP 5.3.0+. + parent::__construct($message); + } +} \ No newline at end of file diff --git a/3.0/modules/g1_import/models/g1_map.php b/3.0/modules/g1_import/models/g1_map.php new file mode 100644 index 00000000..b783426d --- /dev/null +++ b/3.0/modules/g1_import/models/g1_map.php @@ -0,0 +1,21 @@ + +css("jquery.autocomplete.css") ?> +script("jquery.autocomplete.js") ?> + + +
+

+

+ +

+ + +
+
From 05c322810a73728a1d173d1831d1019725b6265d Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Mon, 20 Jun 2011 10:48:46 +0200 Subject: [PATCH 3/8] converting g1 name before using as slug --- 3.0/modules/g1_import/helpers/g1_import.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/3.0/modules/g1_import/helpers/g1_import.php b/3.0/modules/g1_import/helpers/g1_import.php index 172506e3..72396a68 100644 --- a/3.0/modules/g1_import/helpers/g1_import.php +++ b/3.0/modules/g1_import/helpers/g1_import.php @@ -415,7 +415,7 @@ class g1_import_Core { list($result, $fields) = Gallery1DataParser::loadAlbumFields($albumDir); $album->name = $fields['name']; - $album->slug = $fields['name']; // <= verification fails if this property has not been set!!! + $album->slug = item::convert_filename_to_slug($fields['name']); // <= verification fails if this property has not been set!!! $album->title = utf8_encode(self::_decode_html_special_chars(trim($fields['title']))); $album->title or $album->title = $album->name; $album->description = utf8_encode(self::_decode_html_special_chars(trim($fields['description']))); @@ -687,7 +687,7 @@ class g1_import_Core { $item->parent_id = $album_id; $item->set_data_file($g1_path); $item->name = $g1_item.'.'.$album_item->image->type; - $item->slug = $g1_item; + $item->slug = item::convert_filename_to_slug($g1_item); $item->mime_type = $type; $item->title = utf8_encode(self::_decode_html_special_chars(trim($album_item->caption))); $item->title or $item->title = ' '; //don't use $item->name as this clutters up the UI @@ -697,7 +697,7 @@ class g1_import_Core { try { $item->view_count = (int) $album_item->clicks; } catch (Exception $e) { - $view_count = 1; + $item->view_count = 1; } } catch (Exception $e) { $exception_info = (string) new G1_Import_Exception( @@ -754,7 +754,7 @@ class g1_import_Core { $item->parent_id = $album_id; $item->set_data_file($g1_path); $item->name = $g1_item.'.'.$album_item->image->type; - $item->slug = $g1_item; + $item->slug = item::convert_filename_to_slug($g1_item); $item->mime_type = $type; $item->title = utf8_encode(self::_decode_html_special_chars(trim($album_item->caption))); $item->title or $item->title = ' '; //$item->name; @@ -764,7 +764,7 @@ class g1_import_Core { try { $item->view_count = (int) $album_item->clicks; } catch (Exception $e) { - $view_count = 1; + $item->view_count = 1; } } catch (Exception $e) { $exception_info = (string) new G1_Import_Exception( From 30f3645a3531de22e2406fd05bfba812044a8cc2 Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Thu, 30 Jun 2011 16:14:49 +0200 Subject: [PATCH 4/8] printing a warning in case of nonstandard chars in g1 folder names --- .../g1_import/controllers/admin_g1_import.php | 7 ++++++- 3.0/modules/g1_import/helpers/g1_import.php | 19 ++++++++++++++----- 2 files changed, 20 insertions(+), 6 deletions(-) diff --git a/3.0/modules/g1_import/controllers/admin_g1_import.php b/3.0/modules/g1_import/controllers/admin_g1_import.php index 40c96c46..9f49de24 100644 --- a/3.0/modules/g1_import/controllers/admin_g1_import.php +++ b/3.0/modules/g1_import/controllers/admin_g1_import.php @@ -48,6 +48,11 @@ class Admin_g1_import_Controller extends Admin_Controller { $view->content->resize_size = module::get_var('gallery', 'resize_size'); if (g1_import::is_initialized()) { + + if (count(g1_import::$warn_utf8)>0) { + message::error(t('Your G1 contains %count folder(s) containing nonstandard characters that G3 doesn\'t work with:
%names
Please rename the above folders in G1 before trying to import your data.', array('count' => count(g1_import::$warn_utf8), 'names' => "\n\n ".implode("\n ", g1_import::$warn_utf8)."\n\n"))); + } + if ((bool)ini_get('eaccelerator.enable') || (bool)ini_get('xcache.cacher')) { message::warning(t('The eAccelerator and XCache PHP performance extensions are known to cause issues. If you\'re using either of those and are having problems, please disable them while you do your import. Add the following lines:
%lines
to gallery3/.htaccess and remove them when the import is done.', array('lines' => "\n\n php_value eaccelerator.enable 0\n php_value xcache.cacher off\n php_value xcache.optimizer off\n\n"))); } @@ -123,4 +128,4 @@ class Admin_g1_import_Controller extends Admin_Controller { $group->submit('')->value(g1_import::$album_dir=='' ? t('Change') : t('Continue')); return $form; } -} \ No newline at end of file +} diff --git a/3.0/modules/g1_import/helpers/g1_import.php b/3.0/modules/g1_import/helpers/g1_import.php index 72396a68..6e139f00 100644 --- a/3.0/modules/g1_import/helpers/g1_import.php +++ b/3.0/modules/g1_import/helpers/g1_import.php @@ -30,6 +30,7 @@ class g1_import_Core { public static $thumb_size = null; public static $tree = array(); public static $version = null; + public static $warn_utf8 = array(); public static $queued_items = array(); public static $queued_comments = array(); @@ -146,8 +147,15 @@ class g1_import_Core { return self::$version; } - static function recursiveCountGallery($albumDir, $array, $level) { + static function recursiveCountGallery($albumDir, &$array, $level) { $countAlbum = 0; + + foreach($array as $key => &$value) { + $converted = utf8_encode($key); + if( $converted != $key ) + self::$warn_utf8[] = $converted; + } + foreach($array as $key => $value) { if($key!='') { $countAlbum++; @@ -236,6 +244,7 @@ class g1_import_Core { self::$queued_highlights = array(); self::$albums_flat = array(); self::$albums_hidden = array(); + self::$warn_utf8 = array(); if(count(self::$tree)) $stats['albums'] = 1 /* <= THE ROOT ALBUM!!!*/ + g1_import::recursiveCountGallery($albumDir, self::$tree, 0); $stats['photos'] = count(self::$queued_items); @@ -291,16 +300,16 @@ class g1_import_Core { list($album, $tree) = each($queue); unset($queue[$album]); - foreach($tree as $key => $value) { + foreach($tree as $key => $value) { $queue[$album.'/'.$key] = $value; } // Special handling for the root album if ($album == '') { - if (!self::map('', '', 'album')) { + if (!self::map('', '', 'album')) { $album = item::root(); - self::set_map($album->id, '', '', 'album'); - } + self::set_map($album->id, '', '', 'album'); + } return $messages; } From 0e179ac2adaa38c6402c23a6b5884b7ce1fba25d Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Tue, 9 Aug 2011 08:10:44 +0200 Subject: [PATCH 5/8] fixed a nasty bug when building the albums tree --- 3.0/modules/g1_import/helpers/g1_import.php | 22 ++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/3.0/modules/g1_import/helpers/g1_import.php b/3.0/modules/g1_import/helpers/g1_import.php index 6e139f00..0af42cf4 100644 --- a/3.0/modules/g1_import/helpers/g1_import.php +++ b/3.0/modules/g1_import/helpers/g1_import.php @@ -150,7 +150,7 @@ class g1_import_Core { static function recursiveCountGallery($albumDir, &$array, $level) { $countAlbum = 0; - foreach($array as $key => &$value) { + foreach($array as $key => &$valdummy) { $converted = utf8_encode($key); if( $converted != $key ) self::$warn_utf8[] = $converted; @@ -299,9 +299,11 @@ class g1_import_Core { // Dequeue the current album and enqueue its children list($album, $tree) = each($queue); unset($queue[$album]); + g1_import::debug( t('Dequeued album %album.', array('album' => $album)) ); foreach($tree as $key => $value) { $queue[$album.'/'.$key] = $value; + g1_import::debug( t('Enqueued album %album.', array('album' => $album.'/'.$key)) ); } // Special handling for the root album @@ -429,6 +431,14 @@ class g1_import_Core { $album->title or $album->title = $album->name; $album->description = utf8_encode(self::_decode_html_special_chars(trim($fields['description']))); //$album->owner_id = self::map($g1_album->getOwnerId()); + + if(strlen($album->title)>255) { + if(strlen($album->description)==0) { + $album->description = $album->title; + } + $album->title = substr($album->title, 0, 252).'...'; + } + try { $album->view_count = (int) $fields['clicks']; } catch (Exception $e) { @@ -651,6 +661,7 @@ class g1_import_Core { case '3gp': case 'avi': case 'mp4': + case 'mov': case 'flv': $g1_type = 'GalleryMovieItem'; break; default: @@ -703,11 +714,20 @@ class g1_import_Core { if(isset($album_item->description) && $album_item->description!='') $item->description = utf8_encode(self::_decode_html_special_chars(trim($album_item->description))); //$item->owner_id = self::map($g1_item->getOwnerId()); + try { $item->view_count = (int) $album_item->clicks; } catch (Exception $e) { $item->view_count = 1; } + + if(strlen($item->title)>255) { + if(strlen($item->description)==0) { + $item->description = $item->title; + } + $item->title = substr($item->title, 0, 252).'...'; + } + } catch (Exception $e) { $exception_info = (string) new G1_Import_Exception( t("Corrupt image '%path'", array('path' => $g1_path)), From 5a023f5e0c9f66263d0acdd19d92bc21a5c9ea36 Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Thu, 15 Mar 2012 20:30:57 +0100 Subject: [PATCH 6/8] fixed error handling --- 3.0/modules/g1_import/helpers/Gallery1DataParser.php | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/3.0/modules/g1_import/helpers/Gallery1DataParser.php b/3.0/modules/g1_import/helpers/Gallery1DataParser.php index 2686e27d..6aa6acf6 100644 --- a/3.0/modules/g1_import/helpers/Gallery1DataParser.php +++ b/3.0/modules/g1_import/helpers/Gallery1DataParser.php @@ -52,14 +52,13 @@ class Gallery1DataParser { is_readable($fileName . '.bak')) { $fileName .= '.bak'; } else { - return array(GalleryCoreApi::error(ERROR_BAD_PARAMETER, __FILE__, __LINE__, - "Missing or not readable file: $fileName"), null); + return array('ERROR_BAD_PARAMETER', null); } } $tmp = file($fileName); if (empty($tmp)) { - return array(GalleryCoreApi::error(ERROR_MISSING_VALUE), null); + return array('ERROR_MISSING_VALUE', null); } $tmp = join('', $tmp); From 3a3a26936e61e6c23e2e6659e8a5f8eacaeb2a99 Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Fri, 16 Mar 2012 08:29:06 +0100 Subject: [PATCH 7/8] added warning messages for easier inconsistency detection --- 3.0/modules/g1_import/helpers/Gallery1DataParser.php | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/3.0/modules/g1_import/helpers/Gallery1DataParser.php b/3.0/modules/g1_import/helpers/Gallery1DataParser.php index 6aa6acf6..74b1d826 100644 --- a/3.0/modules/g1_import/helpers/Gallery1DataParser.php +++ b/3.0/modules/g1_import/helpers/Gallery1DataParser.php @@ -47,17 +47,24 @@ class Gallery1DataParser { * object Unserialized user metadata */ function loadFile($fileName) { + $fileName = str_replace('//','/',$fileName); if (!file_exists($fileName) || !is_readable($fileName)) { if (file_exists($fileName . '.bak') && is_readable($fileName . '.bak')) { $fileName .= '.bak'; } else { + message::warning( + t('Gallery1 inconsistency: Missing or not readable file %file', + array('file' => $fileName))); return array('ERROR_BAD_PARAMETER', null); } } $tmp = file($fileName); if (empty($tmp)) { + message::warning( + t('Gallery1 inconsistency: Empty file %file', + array('file' => $fileName))); return array('ERROR_MISSING_VALUE', null); } From bd9a5e38bf21c2c57baad01f8d5f529ad5ca8783 Mon Sep 17 00:00:00 2001 From: "Thomas E. Horner" Date: Sat, 29 Dec 2012 10:34:51 +0100 Subject: [PATCH 8/8] added redirect for sized+thumbs and hotfix for buggy dat files --- 3.0/modules/g1_import/controllers/g1.php | 19 ++++++++++++++++--- .../g1_import/helpers/Gallery1DataParser.php | 8 ++++---- 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/3.0/modules/g1_import/controllers/g1.php b/3.0/modules/g1_import/controllers/g1.php index 53458baa..eb8160ba 100644 --- a/3.0/modules/g1_import/controllers/g1.php +++ b/3.0/modules/g1_import/controllers/g1.php @@ -51,7 +51,7 @@ class G1_Controller extends Controller { $pos = strrpos($path, '/'); if($pos!==false) { // Get ItemX into g1_item - $g1_item = substr($path,$pos+1); + $g1_item = substr($path,$pos+1,strlen($path)); // Get FolderX into g1_item $g1_album = substr($path,0,$pos); } @@ -69,7 +69,12 @@ class G1_Controller extends Controller { $g1_item = substr($g1_item, 0, $pos); } - $mapping = ORM::factory('g1_map')->where('album', '=', $g1_album)->where('item', '=', $g1_item)->where('resource_type', '=', $album ? 'album':'item')->find(); + if(($pos=strrpos($g1_item, '.sized'))!==false||($pos=strrpos($g1_item, '.thumb'))!==false) { + $mapping = ORM::factory('g1_map')->where('album', '=', $g1_album)->where('item', '=', substr($g1_item,0, $pos))->where('resource_type', '=', $album ? 'album':'item')->find(); + } + else { + $mapping = ORM::factory('g1_map')->where('album', '=', $g1_album)->where('item', '=', $g1_item)->where('resource_type', '=', $album ? 'album':'item')->find(); + } if(!$mapping->loaded()) { throw new Kohana_404_Exception(); } @@ -80,7 +85,15 @@ class G1_Controller extends Controller { access::required('view', $item); if($binary) { - url::redirect($item->file_url(true), '301'); + if(strrpos($g1_item, '.sized')!==false) { + url::redirect($item->resize_url(true), '301'); + } + else if(strrpos($g1_item, '.thumb')!==false) { + url::redirect($item->thumb_url(true), '301'); + } + else { + url::redirect($item->file_url(true), '301'); + } } else { $url = $item->abs_url(); diff --git a/3.0/modules/g1_import/helpers/Gallery1DataParser.php b/3.0/modules/g1_import/helpers/Gallery1DataParser.php index 74b1d826..c4ae5ae8 100644 --- a/3.0/modules/g1_import/helpers/Gallery1DataParser.php +++ b/3.0/modules/g1_import/helpers/Gallery1DataParser.php @@ -74,16 +74,16 @@ class Gallery1DataParser { * We renamed User.php to Gallery_User.php in v1.2, so port forward * any saved user objects. */ - if (!strcmp(substr($tmp, 0, 10), 'O:4:"user"')) { - $tmp = str_replace('O:4:"user"', 'O:12:"gallery_user"', $tmp); + if (stripos($tmp, 'O:4:"user"')!==false) { + $tmp = str_ireplace('O:4:"user"', 'O:12:"gallery_user"', $tmp); } /* * Gallery3 already contains a class named Image so * we need to rename the G1 Image class to G1Img here */ - if (strpos($tmp, 'O:5:"Image"')!==false) { - $tmp = str_replace('O:5:"Image"', 'O:5:"G1Img"', $tmp); + if (stripos($tmp, 'O:5:"image"')!==false) { + $tmp = str_ireplace('O:5:"image"', 'O:5:"G1Img"', $tmp); } $object = unserialize($tmp);