Commit f12e3d4f7e9b1810bc35584465c36f849d848630
1 parent
485a8c47
preliminary commit from home of new database upgrade wizard (incomplete)
Story ID:1244695. 3.7 Database Upgrade Script In Progress Committed by: Paul Barrett
Showing
66 changed files
with
11290 additions
and
3 deletions
config/dmsDefaults.php
| ... | ... | @@ -38,6 +38,9 @@ |
| 38 | 38 | * |
| 39 | 39 | */ |
| 40 | 40 | |
| 41 | +// stuff in the new installer section database upgrade fails without this | |
| 42 | +global $default; | |
| 43 | + | |
| 41 | 44 | if (defined('DMS_DEFAULTS_INCLUDED')) |
| 42 | 45 | { |
| 43 | 46 | return; |
| ... | ... | @@ -662,5 +665,4 @@ if (!extension_loaded('mbstring')) |
| 662 | 665 | require_once(KT_LIB_DIR . '/templating/kt3template.inc.php'); |
| 663 | 666 | $GLOBALS['main'] =new KTPage(); |
| 664 | 667 | |
| 665 | - | |
| 666 | 668 | ?> | ... | ... |
setup/upgrade/config/config.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | + | |
| 3 | +<!-- | |
| 4 | + Document : config.xml | |
| 5 | + Created on : 01 July 2009, 9:57 AM | |
| 6 | + Author : KnowledgeTree Team | |
| 7 | + Description: Upgrader steps | |
| 8 | +--> | |
| 9 | + | |
| 10 | +<upgrade version="3.7" type="Commercial Edition"> | |
| 11 | + <steps> | |
| 12 | + <step name="Welcome">welcome</step> | |
| 13 | + <step name="Current Installation">installation</step> | |
| 14 | + <step name="Database Backup">backup</step> | |
| 15 | + <step name="Database Restore">restore</step> | |
| 16 | + <step name="Database Upgrade">database</step> | |
| 17 | + <step name="Complete">complete</step> | |
| 18 | + </steps> | |
| 19 | + </upgrade> | |
| 0 | 20 | \ No newline at end of file | ... | ... |
setup/upgrade/config/databases.xml
0 → 100644
| 1 | +<?xml version="1.0" encoding="UTF-8"?> | |
| 2 | + | |
| 3 | +<!-- | |
| 4 | + Document : database.xml | |
| 5 | + Created on : 01 July 2009, 1:13 PM | |
| 6 | + Author : KnowledgeTree Team | |
| 7 | + Description: Upgrader Default MySql Database Configuration | |
| 8 | +--> | |
| 9 | + | |
| 10 | +<database> | |
| 11 | + <dtypes> | |
| 12 | + <dtype>mysql</dtype> | |
| 13 | + </dtypes> | |
| 14 | + <dhost>localhost</dhost> | |
| 15 | + <dport>3306</dport> | |
| 16 | + <dname>dms</dname> | |
| 17 | + <duname>root</duname> | |
| 18 | + <dmsadminuser>dmsadminuser</dmsadminuser> | |
| 19 | + <dmsaupass>js9281djw</dmsaupass> | |
| 20 | + <dmsuser>dmsuser</dmsuser> | |
| 21 | + <dmsupass>djw9281js</dmsupass> | |
| 22 | +</database> | ... | ... |
setup/upgrade/index.php
| 1 | -<? | |
| 2 | -header('Location: ../upgrade.php'); | |
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrader Index. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +require_once("upgradeWizard.php"); | |
| 3 | 43 | ?> |
| 4 | 44 | \ No newline at end of file | ... | ... |
setup/upgrade/path.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrader Paths. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + // Define installer environment | |
| 43 | + define('DEBUG', 0); | |
| 44 | + define('AJAX', 0); | |
| 45 | + // Define upgrader environment | |
| 46 | + if (substr(php_uname(), 0, 7) == "Windows"){ | |
| 47 | + define('WINDOWS_OS', true); | |
| 48 | + define('UNIX_OS', false); | |
| 49 | + define('OS', 'windows'); | |
| 50 | + } else { | |
| 51 | + define('WINDOWS_OS', false); | |
| 52 | + define('UNIX_OS', true); | |
| 53 | + define('OS', 'unix'); | |
| 54 | + } | |
| 55 | + if(WINDOWS_OS) { | |
| 56 | + define('DS', '\\'); | |
| 57 | + } else { | |
| 58 | + define('DS', '/'); | |
| 59 | + } | |
| 60 | + // Define environment root | |
| 61 | + $wizard = realpath(dirname(__FILE__)); | |
| 62 | + $xdir = explode(DS, $wizard); | |
| 63 | + array_pop($xdir); | |
| 64 | + array_pop($xdir); | |
| 65 | + $sys = ''; | |
| 66 | + foreach ($xdir as $k=>$v) { | |
| 67 | + $sys .= $v.DS; | |
| 68 | + } | |
| 69 | + // Define paths to wizard | |
| 70 | + define('UPGRADE_DIR', $wizard.DS); | |
| 71 | + define('WIZARD_LIB', UPGRADE_DIR."lib".DS); | |
| 72 | + define('SQL_DIR', UPGRADE_DIR."sql".DS); | |
| 73 | + define('SQL_UPGRADE_DIR', SQL_DIR."upgrades".DS); | |
| 74 | + define('CONF_DIR', UPGRADE_DIR."config".DS); | |
| 75 | + define('RES_DIR', UPGRADE_DIR."resources".DS); | |
| 76 | + define('STEP_DIR', UPGRADE_DIR."steps".DS); | |
| 77 | + define('TEMP_DIR', UPGRADE_DIR."templates".DS); | |
| 78 | + define('SHELL_DIR', UPGRADE_DIR."shells".DS); | |
| 79 | + define('OUTPUT_DIR', UPGRADE_DIR."output".DS); | |
| 80 | + // Define paths to system webroot | |
| 81 | + define('SYSTEM_DIR', $sys); | |
| 82 | + define('SYS_VAR_DIR', SYSTEM_DIR."var".DS); | |
| 83 | + define('SYS_BIN_DIR', SYSTEM_DIR."bin".DS); | |
| 84 | + define('SYS_LOG_DIR', SYS_VAR_DIR."log".DS); | |
| 85 | + define('SYS_OUT_DIR', SYS_VAR_DIR); | |
| 86 | + define('VAR_BIN_DIR', SYS_VAR_DIR."bin".DS); | |
| 87 | + // Define paths to system | |
| 88 | + array_pop($xdir); | |
| 89 | + $asys = ''; | |
| 90 | + foreach ($xdir as $k=>$v) { | |
| 91 | + $asys .= $v.DS; | |
| 92 | + } | |
| 93 | + define('SYSTEM_ROOT', $asys); | |
| 94 | + // Upgrade Type | |
| 95 | + preg_match('/Zend/', $sys, $matches); // TODO: Dirty | |
| 96 | + if($matches) { | |
| 97 | + $sysdir = explode(DS, $sys); | |
| 98 | + array_pop($sysdir); | |
| 99 | + array_pop($sysdir); | |
| 100 | + array_pop($sysdir); | |
| 101 | + array_pop($sysdir); | |
| 102 | + $zendsys = ''; | |
| 103 | + foreach ($sysdir as $k=>$v) { | |
| 104 | + $zendsys .= $v.DS; | |
| 105 | + } | |
| 106 | + define('INSTALL_TYPE', 'Zend'); | |
| 107 | + define('PHP_DIR', $zendsys."ZendServer".DS."bin".DS); | |
| 108 | + } else { | |
| 109 | + $modules = get_loaded_extensions(); | |
| 110 | + // TODO: Dirty | |
| 111 | + if(in_array('Zend Download Server', $modules) || in_array('Zend Monitor', $modules) || in_array('Zend Utils', $modules) || in_array('Zend Page Cache', $modules)) { | |
| 112 | + define('INSTALL_TYPE', 'Zend'); | |
| 113 | + define('PHP_DIR', ''); | |
| 114 | + } else { | |
| 115 | + define('INSTALL_TYPE', ''); | |
| 116 | + define('PHP_DIR', ''); | |
| 117 | + } | |
| 118 | + } | |
| 119 | + // Other | |
| 120 | + date_default_timezone_set('Africa/Johannesburg'); | |
| 121 | + if(WINDOWS_OS) { // Mysql bin [Windows] | |
| 122 | + $serverPaths = explode(';',$_SERVER['PATH']); | |
| 123 | + foreach ($serverPaths as $apath) { | |
| 124 | + preg_match('/mysql/i', $apath, $matches); | |
| 125 | + if($matches) { | |
| 126 | + define('MYSQL_BIN', $apath.DS); | |
| 127 | + break; | |
| 128 | + } | |
| 129 | + } | |
| 130 | + } else { | |
| 131 | + define('MYSQL_BIN', ''); // Assume its linux and can be executed from command line | |
| 132 | + } | |
| 133 | + | |
| 134 | +?> | ... | ... |
setup/upgrade/resources/form.js
0 → 100644
| 1 | +$(document).ready(function() { | |
| 2 | + var options = {target: '#content_container', beforeSubmit: w.showRequest, success: w.showResponse}; | |
| 3 | + $.blockUI.defaults.css = {}; | |
| 4 | + var override = $('form').attr('onsubmit'); | |
| 5 | + if(override == undefined) { | |
| 6 | + $('form').ajaxForm(options); | |
| 7 | + w.adjustMenu($('form').attr('id')); | |
| 8 | + } else { | |
| 9 | + var options = {target: '#content_container', beforeSubmit: w.validateRegistration, success: w.adjustMenu($('form').attr('id'))}; | |
| 10 | + $('form').ajaxForm(options); | |
| 11 | + } | |
| 12 | +}); | |
| 13 | + | ... | ... |
setup/upgrade/resources/graphics/active.png
0 → 100644
1.25 KB
setup/upgrade/resources/graphics/background.gif
0 → 100644
914 Bytes
setup/upgrade/resources/graphics/big-ok.png
0 → 100644
3.14 KB
setup/upgrade/resources/graphics/cross.png
0 → 100644
846 Bytes
setup/upgrade/resources/graphics/cross_orange.png
0 → 100644
1.43 KB
setup/upgrade/resources/graphics/dame/dot.png
0 → 100644
3.22 KB
setup/upgrade/resources/graphics/dame/finish.png
0 → 100644
7.22 KB
setup/upgrade/resources/graphics/dame/gradiant.gif
0 → 100644
2.11 KB
setup/upgrade/resources/graphics/dame/kt_gradient.jpg
0 → 100644
13.2 KB
setup/upgrade/resources/graphics/dame/loginbg.png
0 → 100644
769 Bytes
setup/upgrade/resources/graphics/dame/navbar.png
0 → 100644
1.57 KB
setup/upgrade/resources/graphics/dame/powered-by-kt.png
0 → 100644
7.34 KB
setup/upgrade/resources/graphics/dame/tick1.png
0 → 100644
3.43 KB
setup/upgrade/resources/graphics/dame/tick2.png
0 → 100644
3.41 KB
setup/upgrade/resources/graphics/dame/upgrader-header_logo.png
0 → 100644
2.85 KB
setup/upgrade/resources/graphics/dame/upgrader_head.png
0 → 100644
2.78 KB
setup/upgrade/resources/graphics/dropbox.png
0 → 100644
182 KB
setup/upgrade/resources/graphics/dropbox_old.png
0 → 100644
13.6 KB
setup/upgrade/resources/graphics/footer.png
0 → 100644
1.04 KB
setup/upgrade/resources/graphics/gradient.png
0 → 100644
1.82 KB
setup/upgrade/resources/graphics/inactive.png
0 → 100644
1.2 KB
setup/upgrade/resources/graphics/indicator.png
0 → 100644
1.22 KB
setup/upgrade/resources/graphics/kt_browse.png
0 → 100644
34.1 KB
setup/upgrade/resources/graphics/left.png
0 → 100644
1.08 KB
setup/upgrade/resources/graphics/logo.png
0 → 100644
1.36 KB
setup/upgrade/resources/graphics/powered-by-kt.png
0 → 100644
8.27 KB
setup/upgrade/resources/graphics/question.gif
0 → 100644
1.03 KB
setup/upgrade/resources/graphics/tick.png
0 → 100644
917 Bytes
setup/upgrade/resources/graphics/tree.jpg
0 → 100644
2.2 KB
setup/upgrade/resources/jquery.blockUI.js
0 → 100644
| 1 | +/*! | |
| 2 | + * jQuery blockUI plugin | |
| 3 | + * Version 2.26 (09-SEP-2009) | |
| 4 | + * @requires jQuery v1.2.3 or later | |
| 5 | + * | |
| 6 | + * Examples at: http://malsup.com/jquery/block/ | |
| 7 | + * Copyright (c) 2007-2008 M. Alsup | |
| 8 | + * Dual licensed under the MIT and GPL licenses: | |
| 9 | + * http://www.opensource.org/licenses/mit-license.php | |
| 10 | + * http://www.gnu.org/licenses/gpl.html | |
| 11 | + * | |
| 12 | + * Thanks to Amir-Hossein Sobhi for some excellent contributions! | |
| 13 | + */ | |
| 14 | + | |
| 15 | +;(function($) { | |
| 16 | + | |
| 17 | +if (/1\.(0|1|2)\.(0|1|2)/.test($.fn.jquery) || /^1.1/.test($.fn.jquery)) { | |
| 18 | + alert('blockUI requires jQuery v1.2.3 or later! You are using v' + $.fn.jquery); | |
| 19 | + return; | |
| 20 | +} | |
| 21 | + | |
| 22 | +$.fn._fadeIn = $.fn.fadeIn; | |
| 23 | + | |
| 24 | +// this bit is to ensure we don't call setExpression when we shouldn't (with extra muscle to handle | |
| 25 | +// retarded userAgent strings on Vista) | |
| 26 | +var mode = document.documentMode || 0; | |
| 27 | +var setExpr = $.browser.msie && (($.browser.version < 8 && !mode) || mode < 8); | |
| 28 | +var ie6 = $.browser.msie && /MSIE 6.0/.test(navigator.userAgent) && !mode; | |
| 29 | + | |
| 30 | +// global $ methods for blocking/unblocking the entire page | |
| 31 | +$.blockUI = function(opts) { install(window, opts); }; | |
| 32 | +$.unblockUI = function(opts) { remove(window, opts); }; | |
| 33 | + | |
| 34 | +// convenience method for quick growl-like notifications (http://www.google.com/search?q=growl) | |
| 35 | +$.growlUI = function(title, message, timeout, onClose) { | |
| 36 | + var $m = $('<div class="growlUI"></div>'); | |
| 37 | + if (title) $m.append('<h1>'+title+'</h1>'); | |
| 38 | + if (message) $m.append('<h2>'+message+'</h2>'); | |
| 39 | + if (timeout == undefined) timeout = 3000; | |
| 40 | + $.blockUI({ | |
| 41 | + message: $m, fadeIn: 700, fadeOut: 1000, centerY: false, | |
| 42 | + timeout: timeout, showOverlay: false, | |
| 43 | + onUnblock: onClose, | |
| 44 | + css: $.blockUI.defaults.growlCSS | |
| 45 | + }); | |
| 46 | +}; | |
| 47 | + | |
| 48 | +// plugin method for blocking element content | |
| 49 | +$.fn.block = function(opts) { | |
| 50 | + return this.unblock({ fadeOut: 0 }).each(function() { | |
| 51 | + if ($.css(this,'position') == 'static') | |
| 52 | + this.style.position = 'relative'; | |
| 53 | + if ($.browser.msie) | |
| 54 | + this.style.zoom = 1; // force 'hasLayout' | |
| 55 | + install(this, opts); | |
| 56 | + }); | |
| 57 | +}; | |
| 58 | + | |
| 59 | +// plugin method for unblocking element content | |
| 60 | +$.fn.unblock = function(opts) { | |
| 61 | + return this.each(function() { | |
| 62 | + remove(this, opts); | |
| 63 | + }); | |
| 64 | +}; | |
| 65 | + | |
| 66 | +$.blockUI.version = 2.26; // 2nd generation blocking at no extra cost! | |
| 67 | + | |
| 68 | +// override these in your code to change the default behavior and style | |
| 69 | +$.blockUI.defaults = { | |
| 70 | + // message displayed when blocking (use null for no message) | |
| 71 | + message: '<h1>Please wait...</h1>', | |
| 72 | + | |
| 73 | + title: null, // title string; only used when theme == true | |
| 74 | + draggable: true, // only used when theme == true (requires jquery-ui.js to be loaded) | |
| 75 | + | |
| 76 | + theme: false, // set to true to use with jQuery UI themes | |
| 77 | + | |
| 78 | + // styles for the message when blocking; if you wish to disable | |
| 79 | + // these and use an external stylesheet then do this in your code: | |
| 80 | + // $.blockUI.defaults.css = {}; | |
| 81 | + css: { | |
| 82 | + padding: 0, | |
| 83 | + margin: 0, | |
| 84 | + width: '30%', | |
| 85 | + top: '40%', | |
| 86 | + left: '35%', | |
| 87 | + textAlign: 'center', | |
| 88 | + color: '#000', | |
| 89 | + border: '3px solid #aaa', | |
| 90 | + backgroundColor:'#fff', | |
| 91 | + cursor: 'wait' | |
| 92 | + }, | |
| 93 | + | |
| 94 | + // minimal style set used when themes are used | |
| 95 | + themedCSS: { | |
| 96 | + width: '30%', | |
| 97 | + top: '40%', | |
| 98 | + left: '35%' | |
| 99 | + }, | |
| 100 | + | |
| 101 | + // styles for the overlay | |
| 102 | + overlayCSS: { | |
| 103 | + backgroundColor: '#000', | |
| 104 | + opacity: 0.6, | |
| 105 | + cursor: 'wait' | |
| 106 | + }, | |
| 107 | + | |
| 108 | + // styles applied when using $.growlUI | |
| 109 | + growlCSS: { | |
| 110 | + width: '350px', | |
| 111 | + top: '10px', | |
| 112 | + left: '', | |
| 113 | + right: '10px', | |
| 114 | + border: 'none', | |
| 115 | + padding: '5px', | |
| 116 | + opacity: 0.6, | |
| 117 | + cursor: 'default', | |
| 118 | + color: '#fff', | |
| 119 | + backgroundColor: '#000', | |
| 120 | + '-webkit-border-radius': '10px', | |
| 121 | + '-moz-border-radius': '10px' | |
| 122 | + }, | |
| 123 | + | |
| 124 | + // IE issues: 'about:blank' fails on HTTPS and javascript:false is s-l-o-w | |
| 125 | + // (hat tip to Jorge H. N. de Vasconcelos) | |
| 126 | + iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank', | |
| 127 | + | |
| 128 | + // force usage of iframe in non-IE browsers (handy for blocking applets) | |
| 129 | + forceIframe: false, | |
| 130 | + | |
| 131 | + // z-index for the blocking overlay | |
| 132 | + baseZ: 1000, | |
| 133 | + | |
| 134 | + // set these to true to have the message automatically centered | |
| 135 | + centerX: true, // <-- only effects element blocking (page block controlled via css above) | |
| 136 | + centerY: true, | |
| 137 | + | |
| 138 | + // allow body element to be stetched in ie6; this makes blocking look better | |
| 139 | + // on "short" pages. disable if you wish to prevent changes to the body height | |
| 140 | + allowBodyStretch: true, | |
| 141 | + | |
| 142 | + // enable if you want key and mouse events to be disabled for content that is blocked | |
| 143 | + bindEvents: true, | |
| 144 | + | |
| 145 | + // be default blockUI will supress tab navigation from leaving blocking content | |
| 146 | + // (if bindEvents is true) | |
| 147 | + constrainTabKey: true, | |
| 148 | + | |
| 149 | + // fadeIn time in millis; set to 0 to disable fadeIn on block | |
| 150 | + fadeIn: 200, | |
| 151 | + | |
| 152 | + // fadeOut time in millis; set to 0 to disable fadeOut on unblock | |
| 153 | + fadeOut: 400, | |
| 154 | + | |
| 155 | + // time in millis to wait before auto-unblocking; set to 0 to disable auto-unblock | |
| 156 | + timeout: 0, | |
| 157 | + | |
| 158 | + // disable if you don't want to show the overlay | |
| 159 | + showOverlay: true, | |
| 160 | + | |
| 161 | + // if true, focus will be placed in the first available input field when | |
| 162 | + // page blocking | |
| 163 | + focusInput: true, | |
| 164 | + | |
| 165 | + // suppresses the use of overlay styles on FF/Linux (due to performance issues with opacity) | |
| 166 | + applyPlatformOpacityRules: true, | |
| 167 | + | |
| 168 | + // callback method invoked when unblocking has completed; the callback is | |
| 169 | + // passed the element that has been unblocked (which is the window object for page | |
| 170 | + // blocks) and the options that were passed to the unblock call: | |
| 171 | + // onUnblock(element, options) | |
| 172 | + onUnblock: null, | |
| 173 | + | |
| 174 | + // don't ask; if you really must know: http://groups.google.com/group/jquery-en/browse_thread/thread/36640a8730503595/2f6a79a77a78e493#2f6a79a77a78e493 | |
| 175 | + quirksmodeOffsetHack: 4 | |
| 176 | +}; | |
| 177 | + | |
| 178 | +// private data and functions follow... | |
| 179 | + | |
| 180 | +var pageBlock = null; | |
| 181 | +var pageBlockEls = []; | |
| 182 | + | |
| 183 | +function install(el, opts) { | |
| 184 | + var full = (el == window); | |
| 185 | + var msg = opts && opts.message !== undefined ? opts.message : undefined; | |
| 186 | + opts = $.extend({}, $.blockUI.defaults, opts || {}); | |
| 187 | + opts.overlayCSS = $.extend({}, $.blockUI.defaults.overlayCSS, opts.overlayCSS || {}); | |
| 188 | + var css = $.extend({}, $.blockUI.defaults.css, opts.css || {}); | |
| 189 | + var themedCSS = $.extend({}, $.blockUI.defaults.themedCSS, opts.themedCSS || {}); | |
| 190 | + msg = msg === undefined ? opts.message : msg; | |
| 191 | + | |
| 192 | + // remove the current block (if there is one) | |
| 193 | + if (full && pageBlock) | |
| 194 | + remove(window, {fadeOut:0}); | |
| 195 | + | |
| 196 | + // if an existing element is being used as the blocking content then we capture | |
| 197 | + // its current place in the DOM (and current display style) so we can restore | |
| 198 | + // it when we unblock | |
| 199 | + if (msg && typeof msg != 'string' && (msg.parentNode || msg.jquery)) { | |
| 200 | + var node = msg.jquery ? msg[0] : msg; | |
| 201 | + var data = {}; | |
| 202 | + $(el).data('blockUI.history', data); | |
| 203 | + data.el = node; | |
| 204 | + data.parent = node.parentNode; | |
| 205 | + data.display = node.style.display; | |
| 206 | + data.position = node.style.position; | |
| 207 | + if (data.parent) | |
| 208 | + data.parent.removeChild(node); | |
| 209 | + } | |
| 210 | + | |
| 211 | + var z = opts.baseZ; | |
| 212 | + | |
| 213 | + // blockUI uses 3 layers for blocking, for simplicity they are all used on every platform; | |
| 214 | + // layer1 is the iframe layer which is used to supress bleed through of underlying content | |
| 215 | + // layer2 is the overlay layer which has opacity and a wait cursor (by default) | |
| 216 | + // layer3 is the message content that is displayed while blocking | |
| 217 | + | |
| 218 | + var lyr1 = ($.browser.msie || opts.forceIframe) | |
| 219 | + ? $('<iframe class="blockUI" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;position:absolute;width:100%;height:100%;top:0;left:0" src="'+opts.iframeSrc+'"></iframe>') | |
| 220 | + : $('<div class="blockUI" style="display:none"></div>'); | |
| 221 | + var lyr2 = $('<div class="blockUI blockOverlay" style="z-index:'+ (z++) +';display:none;border:none;margin:0;padding:0;width:100%;height:100%;top:0;left:0"></div>'); | |
| 222 | + | |
| 223 | + var lyr3; | |
| 224 | + if (opts.theme && full) { | |
| 225 | + var s = '<div class="blockUI blockMsg blockPage ui-dialog ui-widget ui-corner-all" style="z-index:'+z+';display:none;position:fixed">' + | |
| 226 | + '<div class="ui-widget-header ui-dialog-titlebar blockTitle">'+(opts.title || ' ')+'</div>' + | |
| 227 | + '<div class="ui-widget-content ui-dialog-content"></div>' + | |
| 228 | + '</div>'; | |
| 229 | + lyr3 = $(s); | |
| 230 | + } | |
| 231 | + else { | |
| 232 | + lyr3 = full ? $('<div class="blockUI blockMsg blockPage" style="z-index:'+z+';display:none;position:fixed"></div>') | |
| 233 | + : $('<div class="blockUI blockMsg blockElement" style="z-index:'+z+';display:none;position:absolute"></div>'); | |
| 234 | + } | |
| 235 | + | |
| 236 | + // if we have a message, style it | |
| 237 | + if (msg) { | |
| 238 | + if (opts.theme) { | |
| 239 | + lyr3.css(themedCSS); | |
| 240 | + lyr3.addClass('ui-widget-content'); | |
| 241 | + } | |
| 242 | + else | |
| 243 | + lyr3.css(css); | |
| 244 | + } | |
| 245 | + | |
| 246 | + // style the overlay | |
| 247 | + if (!opts.applyPlatformOpacityRules || !($.browser.mozilla && /Linux/.test(navigator.platform))) | |
| 248 | + lyr2.css(opts.overlayCSS); | |
| 249 | + lyr2.css('position', full ? 'fixed' : 'absolute'); | |
| 250 | + | |
| 251 | + // make iframe layer transparent in IE | |
| 252 | + if ($.browser.msie || opts.forceIframe) | |
| 253 | + lyr1.css('opacity',0.0); | |
| 254 | + | |
| 255 | + $([lyr1[0],lyr2[0],lyr3[0]]).appendTo(full ? 'body' : el); | |
| 256 | + | |
| 257 | + if (opts.theme && opts.draggable && $.fn.draggable) { | |
| 258 | + lyr3.draggable({ | |
| 259 | + handle: '.ui-dialog-titlebar', | |
| 260 | + cancel: 'li' | |
| 261 | + }); | |
| 262 | + } | |
| 263 | + | |
| 264 | + // ie7 must use absolute positioning in quirks mode and to account for activex issues (when scrolling) | |
| 265 | + var expr = setExpr && (!$.boxModel || $('object,embed', full ? null : el).length > 0); | |
| 266 | + if (ie6 || expr) { | |
| 267 | + // give body 100% height | |
| 268 | + if (full && opts.allowBodyStretch && $.boxModel) | |
| 269 | + $('html,body').css('height','100%'); | |
| 270 | + | |
| 271 | + // fix ie6 issue when blocked element has a border width | |
| 272 | + if ((ie6 || !$.boxModel) && !full) { | |
| 273 | + var t = sz(el,'borderTopWidth'), l = sz(el,'borderLeftWidth'); | |
| 274 | + var fixT = t ? '(0 - '+t+')' : 0; | |
| 275 | + var fixL = l ? '(0 - '+l+')' : 0; | |
| 276 | + } | |
| 277 | + | |
| 278 | + // simulate fixed position | |
| 279 | + $.each([lyr1,lyr2,lyr3], function(i,o) { | |
| 280 | + var s = o[0].style; | |
| 281 | + s.position = 'absolute'; | |
| 282 | + if (i < 2) { | |
| 283 | + full ? s.setExpression('height','Math.max(document.body.scrollHeight, document.body.offsetHeight) - (jQuery.boxModel?0:'+opts.quirksmodeOffsetHack+') + "px"') | |
| 284 | + : s.setExpression('height','this.parentNode.offsetHeight + "px"'); | |
| 285 | + full ? s.setExpression('width','jQuery.boxModel && document.documentElement.clientWidth || document.body.clientWidth + "px"') | |
| 286 | + : s.setExpression('width','this.parentNode.offsetWidth + "px"'); | |
| 287 | + if (fixL) s.setExpression('left', fixL); | |
| 288 | + if (fixT) s.setExpression('top', fixT); | |
| 289 | + } | |
| 290 | + else if (opts.centerY) { | |
| 291 | + if (full) s.setExpression('top','(document.documentElement.clientHeight || document.body.clientHeight) / 2 - (this.offsetHeight / 2) + (blah = document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + "px"'); | |
| 292 | + s.marginTop = 0; | |
| 293 | + } | |
| 294 | + else if (!opts.centerY && full) { | |
| 295 | + var top = (opts.css && opts.css.top) ? parseInt(opts.css.top) : 0; | |
| 296 | + var expression = '((document.documentElement.scrollTop ? document.documentElement.scrollTop : document.body.scrollTop) + '+top+') + "px"'; | |
| 297 | + s.setExpression('top',expression); | |
| 298 | + } | |
| 299 | + }); | |
| 300 | + } | |
| 301 | + | |
| 302 | + // show the message | |
| 303 | + if (msg) { | |
| 304 | + if (opts.theme) | |
| 305 | + lyr3.find('.ui-widget-content').append(msg); | |
| 306 | + else | |
| 307 | + lyr3.append(msg); | |
| 308 | + if (msg.jquery || msg.nodeType) | |
| 309 | + $(msg).show(); | |
| 310 | + } | |
| 311 | + | |
| 312 | + if (($.browser.msie || opts.forceIframe) && opts.showOverlay) | |
| 313 | + lyr1.show(); // opacity is zero | |
| 314 | + if (opts.fadeIn) { | |
| 315 | + if (opts.showOverlay) | |
| 316 | + lyr2._fadeIn(opts.fadeIn); | |
| 317 | + if (msg) | |
| 318 | + lyr3.fadeIn(opts.fadeIn); | |
| 319 | + } | |
| 320 | + else { | |
| 321 | + if (opts.showOverlay) | |
| 322 | + lyr2.show(); | |
| 323 | + if (msg) | |
| 324 | + lyr3.show(); | |
| 325 | + } | |
| 326 | + | |
| 327 | + // bind key and mouse events | |
| 328 | + bind(1, el, opts); | |
| 329 | + | |
| 330 | + if (full) { | |
| 331 | + pageBlock = lyr3[0]; | |
| 332 | + pageBlockEls = $(':input:enabled:visible',pageBlock); | |
| 333 | + if (opts.focusInput) | |
| 334 | + setTimeout(focus, 20); | |
| 335 | + } | |
| 336 | + else | |
| 337 | + center(lyr3[0], opts.centerX, opts.centerY); | |
| 338 | + | |
| 339 | + if (opts.timeout) { | |
| 340 | + // auto-unblock | |
| 341 | + var to = setTimeout(function() { | |
| 342 | + full ? $.unblockUI(opts) : $(el).unblock(opts); | |
| 343 | + }, opts.timeout); | |
| 344 | + $(el).data('blockUI.timeout', to); | |
| 345 | + } | |
| 346 | +}; | |
| 347 | + | |
| 348 | +// remove the block | |
| 349 | +function remove(el, opts) { | |
| 350 | + var full = (el == window); | |
| 351 | + var $el = $(el); | |
| 352 | + var data = $el.data('blockUI.history'); | |
| 353 | + var to = $el.data('blockUI.timeout'); | |
| 354 | + if (to) { | |
| 355 | + clearTimeout(to); | |
| 356 | + $el.removeData('blockUI.timeout'); | |
| 357 | + } | |
| 358 | + opts = $.extend({}, $.blockUI.defaults, opts || {}); | |
| 359 | + bind(0, el, opts); // unbind events | |
| 360 | + | |
| 361 | + var els; | |
| 362 | + if (full) // crazy selector to handle odd field errors in ie6/7 | |
| 363 | + els = $('body').children().filter('.blockUI').add('body > .blockUI'); | |
| 364 | + else | |
| 365 | + els = $('.blockUI', el); | |
| 366 | + | |
| 367 | + if (full) | |
| 368 | + pageBlock = pageBlockEls = null; | |
| 369 | + | |
| 370 | + if (opts.fadeOut) { | |
| 371 | + els.fadeOut(opts.fadeOut); | |
| 372 | + setTimeout(function() { reset(els,data,opts,el); }, opts.fadeOut); | |
| 373 | + } | |
| 374 | + else | |
| 375 | + reset(els, data, opts, el); | |
| 376 | +}; | |
| 377 | + | |
| 378 | +// move blocking element back into the DOM where it started | |
| 379 | +function reset(els,data,opts,el) { | |
| 380 | + els.each(function(i,o) { | |
| 381 | + // remove via DOM calls so we don't lose event handlers | |
| 382 | + if (this.parentNode) | |
| 383 | + this.parentNode.removeChild(this); | |
| 384 | + }); | |
| 385 | + | |
| 386 | + if (data && data.el) { | |
| 387 | + data.el.style.display = data.display; | |
| 388 | + data.el.style.position = data.position; | |
| 389 | + if (data.parent) | |
| 390 | + data.parent.appendChild(data.el); | |
| 391 | + $(data.el).removeData('blockUI.history'); | |
| 392 | + } | |
| 393 | + | |
| 394 | + if (typeof opts.onUnblock == 'function') | |
| 395 | + opts.onUnblock(el,opts); | |
| 396 | +}; | |
| 397 | + | |
| 398 | +// bind/unbind the handler | |
| 399 | +function bind(b, el, opts) { | |
| 400 | + var full = el == window, $el = $(el); | |
| 401 | + | |
| 402 | + // don't bother unbinding if there is nothing to unbind | |
| 403 | + if (!b && (full && !pageBlock || !full && !$el.data('blockUI.isBlocked'))) | |
| 404 | + return; | |
| 405 | + if (!full) | |
| 406 | + $el.data('blockUI.isBlocked', b); | |
| 407 | + | |
| 408 | + // don't bind events when overlay is not in use or if bindEvents is false | |
| 409 | + if (!opts.bindEvents || (b && !opts.showOverlay)) | |
| 410 | + return; | |
| 411 | + | |
| 412 | + // bind anchors and inputs for mouse and key events | |
| 413 | + var events = 'mousedown mouseup keydown keypress'; | |
| 414 | + b ? $(document).bind(events, opts, handler) : $(document).unbind(events, handler); | |
| 415 | + | |
| 416 | +// former impl... | |
| 417 | +// var $e = $('a,:input'); | |
| 418 | +// b ? $e.bind(events, opts, handler) : $e.unbind(events, handler); | |
| 419 | +}; | |
| 420 | + | |
| 421 | +// event handler to suppress keyboard/mouse events when blocking | |
| 422 | +function handler(e) { | |
| 423 | + // allow tab navigation (conditionally) | |
| 424 | + if (e.keyCode && e.keyCode == 9) { | |
| 425 | + if (pageBlock && e.data.constrainTabKey) { | |
| 426 | + var els = pageBlockEls; | |
| 427 | + var fwd = !e.shiftKey && e.target == els[els.length-1]; | |
| 428 | + var back = e.shiftKey && e.target == els[0]; | |
| 429 | + if (fwd || back) { | |
| 430 | + setTimeout(function(){focus(back)},10); | |
| 431 | + return false; | |
| 432 | + } | |
| 433 | + } | |
| 434 | + } | |
| 435 | + // allow events within the message content | |
| 436 | + if ($(e.target).parents('div.blockMsg').length > 0) | |
| 437 | + return true; | |
| 438 | + | |
| 439 | + // allow events for content that is not being blocked | |
| 440 | + return $(e.target).parents().children().filter('div.blockUI').length == 0; | |
| 441 | +}; | |
| 442 | + | |
| 443 | +function focus(back) { | |
| 444 | + if (!pageBlockEls) | |
| 445 | + return; | |
| 446 | + var e = pageBlockEls[back===true ? pageBlockEls.length-1 : 0]; | |
| 447 | + if (e) | |
| 448 | + e.focus(); | |
| 449 | +}; | |
| 450 | + | |
| 451 | +function center(el, x, y) { | |
| 452 | + var p = el.parentNode, s = el.style; | |
| 453 | + var l = ((p.offsetWidth - el.offsetWidth)/2) - sz(p,'borderLeftWidth'); | |
| 454 | + var t = ((p.offsetHeight - el.offsetHeight)/2) - sz(p,'borderTopWidth'); | |
| 455 | + if (x) s.left = l > 0 ? (l+'px') : '0'; | |
| 456 | + if (y) s.top = t > 0 ? (t+'px') : '0'; | |
| 457 | +}; | |
| 458 | + | |
| 459 | +function sz(el, p) { | |
| 460 | + return parseInt($.css(el,p))||0; | |
| 461 | +}; | |
| 462 | + | |
| 463 | +})(jQuery); | ... | ... |
setup/upgrade/resources/jquery.form.js
0 → 100644
| 1 | +// $Id: jquery.form.js,v 1.2 2007/11/19 10:05:48 goba Exp $ | |
| 2 | + | |
| 3 | +/* | |
| 4 | + * jQuery Form Plugin | |
| 5 | + * version: 2.01 (10/31/2007) | |
| 6 | + * @requires jQuery v1.1 or later | |
| 7 | + * | |
| 8 | + * Examples at: http://malsup.com/jquery/form/ | |
| 9 | + * Dual licensed under the MIT and GPL licenses: | |
| 10 | + * http://www.opensource.org/licenses/mit-license.php | |
| 11 | + * http://www.gnu.org/licenses/gpl.html | |
| 12 | + */ | |
| 13 | +eval(function(p,a,c,k,e,r){e=function(c){return(c<a?'':e(parseInt(c/a)))+((c=c%a)>35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--)r[e(c)]=k[c]||e(c);k=[function(e){return r[e]}];e=function(){return'\\w+'};c=1};while(c--)if(k[c])p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c]);return p}('(5($){$.7.1j=5(o){2(P o==\'5\')o={L:o};o=$.2h({1h:4.X(\'2i\')||1E.2u.3D(),I:4.X(\'2g\')||\'29\'},o||{});3 p={};$.M.N(\'R.2P.2L\',[4,o,p]);2(p.1Q)6 4;3 a=4.1z(o.2r);2(o.V){H(3 n 3u o.V)a.C({z:n,A:o.V[n]})}2(o.28&&o.28(a,4,o)===E)6 4;$.M.N(\'R.K.36\',[a,4,o,p]);2(p.1Q)6 4;3 q=$.1x(a);2(o.I.31()==\'29\'){o.1h+=(o.1h.2Z(\'?\')>=0?\'&\':\'?\')+q;o.V=B}8 o.V=q;3 r=4,U=[];2(o.1r)U.C(5(){r.1r()});2(o.1o)U.C(5(){r.1o()});2(!o.18&&o.14){3 u=o.L||5(){};U.C(5(a){2(4.1N)$(o.14).X("1M",a).1N().D(u,1L);8 $(o.14).2t(a).D(u,1L)})}8 2(o.L)U.C(o.L);o.L=5(a,b){H(3 i=0,F=U.G;i<F;i++)U[i](a,b,r)};3 v=$(\'19:3v\',4).15();3 w=E;H(3 j=0;j<v.G;j++)2(v[j])w=T;2(o.2f||w){2($.1i.3o&&o.2a)$.3l(o.2a,1l);8 1l()}8 $.3h(o);$.M.N(\'R.K.3f\',[4,o]);6 4;5 1l(){3 d=r[0];3 f=$.2h({},$.39,o);3 h=\'35\'+$.7.1j.1a++;3 i=$(\'<2f 33="\'+h+\'" z="\'+h+\'" />\');3 j=i[0];3 k=$.1i.20&&1E.20.30()<9;2($.1i.1X||k)j.2Y=\'2W:E;1w.2U("");\';i.2S({2R:\'2Q\',23:\'-24\',1R:\'-24\'});3 l={Z:B,1b:B,2K:0,2J:\'n/a\',2H:5(){},2F:5(){},2E:5(){}};3 g=f.2B;2(g&&!$.1O++)$.M.N("2x");2(g)$.M.N("2w",[l,f]);3 m=0;3 n=0;1f(5(){i.2v(\'1n\');j.1K?j.1K(\'1J\',12):j.2s(\'1I\',12,E);3 a=d.1H?\'1H\':\'2q\';3 t=r.X(\'14\');r.X({14:h,2g:\'3C\',2i:f.1h});d[a]=\'3B/R-V\';2(f.1G)1f(5(){n=T;12()},f.1G);d.K();r.X(\'14\',t)},10);5 12(){2(m++)6;j.2o?j.2o(\'1J\',12):j.3A(\'1I\',12,E);3 a=T;3z{2(n)3x\'1G\';3 b,O;O=j.2n?j.2n.1w:j.2l?j.2l:j.1w;l.Z=O.1n?O.1n.1M:B;l.1b=O.2k?O.2k:O;2(f.18==\'2j\'||f.18==\'3s\'){3 c=O.1D(\'1C\')[0];b=c?c.A:l.Z;2(f.18==\'2j\')3r("V = "+b);8 $.3q(b)}8 2(f.18==\'2m\'){b=l.1b;2(!b&&l.Z!=B)b=2d(l.Z)}8{b=l.Z}}3p(e){a=E;$.3n(f,l,\'2b\',e)}2(a){f.L(b,\'L\');2(g)$.M.N("3m",[l,f])}2(g)$.M.N("3k",[l,f]);2(g&&!--$.1O)$.M.N("3j");2(f.27)f.27(l,a?\'L\':\'2b\');1f(5(){i.3i();l.1b=B},3g)};5 2d(s,a){2(1E.26){a=25 26(\'3d.3c\');a.3b=\'E\';a.3a(s)}8 a=(25 38()).37(s,\'1A/2m\');6(a&&a.22&&a.22.1e!=\'34\')?a:B}}};$.7.1j.1a=0;$.7.W=5(a){6 4.21().K(1m).D(5(){4.1u=$.7.W.1a++;$.7.W.1t[4.1u]=a;$(":K,19:Y",4).1Z(1s)})};$.7.W.1a=1;$.7.W.1t={};5 1s(e){3 a=4.R;a.Q=4;2(4.I==\'Y\'){2(e.1Y!=S){a.11=e.1Y;a.16=e.2X}8 2(P $.7.1U==\'5\'){3 b=$(4).1U();a.11=e.1V-b.1R;a.16=e.1W-b.23}8{a.11=e.1V-4.2V;a.16=e.1W-4.32}}1f(5(){a.Q=a.11=a.16=B},10)};5 1m(){3 a=4.1u;3 b=$.7.W.1t[a];$(4).1j(b);6 E};$.7.21=5(){4.1T(\'K\',1m);6 4.D(5(){$(":K,19:Y",4).1T(\'1Z\',1s)})};$.7.1z=5(b){3 a=[];2(4.G==0)6 a;3 c=4[0];3 d=b?c.1D(\'*\'):c.2T;2(!d)6 a;H(3 i=0,F=d.G;i<F;i++){3 e=d[i];3 n=e.z;2(!n)1v;2(b&&c.Q&&e.I=="Y"){2(!e.1d&&c.Q==e)a.C({z:n+\'.x\',A:c.11},{z:n+\'.y\',A:c.16});1v}3 v=$.15(e,T);2(v&&v.1c==1g){H(3 j=0,1S=v.G;j<1S;j++)a.C({z:n,A:v[j]})}8 2(v!==B&&P v!=\'S\')a.C({z:n,A:v})}2(!b&&c.Q){3 f=c.1D("19");H(3 i=0,F=f.G;i<F;i++){3 g=f[i];3 n=g.z;2(n&&!g.1d&&g.I=="Y"&&c.Q==g)a.C({z:n+\'.x\',A:c.11},{z:n+\'.y\',A:c.16})}}6 a};$.7.2O=5(a){6 $.1x(4.1z(a))};$.7.2N=5(b){3 a=[];4.D(5(){3 n=4.z;2(!n)6;3 v=$.15(4,b);2(v&&v.1c==1g){H(3 i=0,F=v.G;i<F;i++)a.C({z:n,A:v[i]})}8 2(v!==B&&P v!=\'S\')a.C({z:4.z,A:v})});6 $.1x(a)};$.7.15=5(a){H(3 b=[],i=0,F=4.G;i<F;i++){3 c=4[i];3 v=$.15(c,a);2(v===B||P v==\'S\'||(v.1c==1g&&!v.G))1v;v.1c==1g?$.3e(b,v):b.C(v)}6 b};$.15=5(b,c){3 n=b.z,t=b.I,13=b.1e.1F();2(P c==\'S\')c=T;2(c&&(!n||b.1d||t==\'17\'||t==\'2M\'||(t==\'1q\'||t==\'1B\')&&!b.1p||(t==\'K\'||t==\'Y\')&&b.R&&b.R.Q!=b||13==\'J\'&&b.1y==-1))6 B;2(13==\'J\'){3 d=b.1y;2(d<0)6 B;3 a=[],1k=b.2I;3 e=(t==\'J-2e\');3 f=(e?d+1:1k.G);H(3 i=(e?d:0);i<f;i++){3 g=1k[i];2(g.2c){3 v=$.1i.1X&&!(g.2G[\'A\'].3t)?g.1A:g.A;2(e)6 v;a.C(v)}}6 a}6 b.A};$.7.1o=5(){6 4.D(5(){$(\'19,J,1C\',4).2p()})};$.7.2p=$.7.2D=5(){6 4.D(5(){3 t=4.I,13=4.1e.1F();2(t==\'1A\'||t==\'3w\'||13==\'1C\')4.A=\'\';8 2(t==\'1q\'||t==\'1B\')4.1p=E;8 2(13==\'J\')4.1y=-1})};$.7.1r=5(){6 4.D(5(){2(P 4.17==\'5\'||(P 4.17==\'2C\'&&!4.17.3y))4.17()})};$.7.2A=5(b){2(b==S)b=T;6 4.D(5(){4.1d=!b})};$.7.J=5(b){2(b==S)b=T;6 4.D(5(){3 t=4.I;2(t==\'1q\'||t==\'1B\')4.1p=b;8 2(4.1e.1F()==\'1P\'){3 a=$(4).2z(\'J\');2(b&&a[0]&&a[0].I==\'J-2e\'){a.2y(\'1P\').J(E)}4.2c=b}})}})(3E);',62,227,'||if|var|this|function|return|fn|else|||||||||||||||||||||||||||name|value|null|push|each|false|max|length|for|type|select|submit|success|event|trigger|doc|typeof|clk|form|undefined|true|callbacks|data|ajaxForm|attr|image|responseText||clk_x|cb|tag|target|fieldValue|clk_y|reset|dataType|input|counter|responseXML|constructor|disabled|tagName|setTimeout|Array|url|browser|ajaxSubmit|ops|fileUpload|submitHandler|body|clearForm|checked|checkbox|resetForm|clickHandler|optionHash|formPluginId|continue|document|param|selectedIndex|formToArray|text|radio|textarea|getElementsByTagName|window|toLowerCase|timeout|encoding|load|onload|attachEvent|arguments|innerHTML|evalScripts|active|option|veto|left|jmax|unbind|offset|pageX|pageY|msie|offsetX|click|opera|ajaxFormUnbind|documentElement|top|1000px|new|ActiveXObject|complete|beforeSubmit|GET|closeKeepAlive|error|selected|toXml|one|iframe|method|extend|action|json|XMLDocument|contentDocument|xml|contentWindow|detachEvent|clearFields|enctype|semantic|addEventListener|html|location|appendTo|ajaxSend|ajaxStart|find|parent|enable|global|object|clearInputs|setRequestHeader|getResponseHeader|attributes|getAllResponseHeaders|options|statusText|status|serialize|button|fieldSerialize|formSerialize|pre|absolute|position|css|elements|write|offsetLeft|javascript|offsetY|src|indexOf|version|toUpperCase|offsetTop|id|parsererror|jqFormIO|validate|parseFromString|DOMParser|ajaxSettings|loadXML|async|XMLDOM|Microsoft|merge|notify|100|ajax|remove|ajaxStop|ajaxComplete|get|ajaxSuccess|handleError|safari|catch|globalEval|eval|script|specified|in|file|password|throw|nodeType|try|removeEventListener|multipart|POST|toString|jQuery'.split('|'),0,{})) | ... | ... |
setup/upgrade/resources/jquery.js
0 → 100644
| 1 | +/*! | |
| 2 | + * jQuery JavaScript Library v1.3.2 | |
| 3 | + * http://jquery.com/ | |
| 4 | + * | |
| 5 | + * Copyright (c) 2009 John Resig | |
| 6 | + * Dual licensed under the MIT and GPL licenses. | |
| 7 | + * http://docs.jquery.com/License | |
| 8 | + * | |
| 9 | + * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009) | |
| 10 | + * Revision: 6246 | |
| 11 | + */ | |
| 12 | +(function(){ | |
| 13 | + | |
| 14 | +var | |
| 15 | + // Will speed up references to window, and allows munging its name. | |
| 16 | + window = this, | |
| 17 | + // Will speed up references to undefined, and allows munging its name. | |
| 18 | + undefined, | |
| 19 | + // Map over jQuery in case of overwrite | |
| 20 | + _jQuery = window.jQuery, | |
| 21 | + // Map over the $ in case of overwrite | |
| 22 | + _$ = window.$, | |
| 23 | + | |
| 24 | + jQuery = window.jQuery = window.$ = function( selector, context ) { | |
| 25 | + // The jQuery object is actually just the init constructor 'enhanced' | |
| 26 | + return new jQuery.fn.init( selector, context ); | |
| 27 | + }, | |
| 28 | + | |
| 29 | + // A simple way to check for HTML strings or ID strings | |
| 30 | + // (both of which we optimize for) | |
| 31 | + quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/, | |
| 32 | + // Is it a simple selector | |
| 33 | + isSimple = /^.[^:#\[\.,]*$/; | |
| 34 | + | |
| 35 | +jQuery.fn = jQuery.prototype = { | |
| 36 | + init: function( selector, context ) { | |
| 37 | + // Make sure that a selection was provided | |
| 38 | + selector = selector || document; | |
| 39 | + | |
| 40 | + // Handle $(DOMElement) | |
| 41 | + if ( selector.nodeType ) { | |
| 42 | + this[0] = selector; | |
| 43 | + this.length = 1; | |
| 44 | + this.context = selector; | |
| 45 | + return this; | |
| 46 | + } | |
| 47 | + // Handle HTML strings | |
| 48 | + if ( typeof selector === "string" ) { | |
| 49 | + // Are we dealing with HTML string or an ID? | |
| 50 | + var match = quickExpr.exec( selector ); | |
| 51 | + | |
| 52 | + // Verify a match, and that no context was specified for #id | |
| 53 | + if ( match && (match[1] || !context) ) { | |
| 54 | + | |
| 55 | + // HANDLE: $(html) -> $(array) | |
| 56 | + if ( match[1] ) | |
| 57 | + selector = jQuery.clean( [ match[1] ], context ); | |
| 58 | + | |
| 59 | + // HANDLE: $("#id") | |
| 60 | + else { | |
| 61 | + var elem = document.getElementById( match[3] ); | |
| 62 | + | |
| 63 | + // Handle the case where IE and Opera return items | |
| 64 | + // by name instead of ID | |
| 65 | + if ( elem && elem.id != match[3] ) | |
| 66 | + return jQuery().find( selector ); | |
| 67 | + | |
| 68 | + // Otherwise, we inject the element directly into the jQuery object | |
| 69 | + var ret = jQuery( elem || [] ); | |
| 70 | + ret.context = document; | |
| 71 | + ret.selector = selector; | |
| 72 | + return ret; | |
| 73 | + } | |
| 74 | + | |
| 75 | + // HANDLE: $(expr, [context]) | |
| 76 | + // (which is just equivalent to: $(content).find(expr) | |
| 77 | + } else | |
| 78 | + return jQuery( context ).find( selector ); | |
| 79 | + | |
| 80 | + // HANDLE: $(function) | |
| 81 | + // Shortcut for document ready | |
| 82 | + } else if ( jQuery.isFunction( selector ) ) | |
| 83 | + return jQuery( document ).ready( selector ); | |
| 84 | + | |
| 85 | + // Make sure that old selector state is passed along | |
| 86 | + if ( selector.selector && selector.context ) { | |
| 87 | + this.selector = selector.selector; | |
| 88 | + this.context = selector.context; | |
| 89 | + } | |
| 90 | + | |
| 91 | + return this.setArray(jQuery.isArray( selector ) ? | |
| 92 | + selector : | |
| 93 | + jQuery.makeArray(selector)); | |
| 94 | + }, | |
| 95 | + | |
| 96 | + // Start with an empty selector | |
| 97 | + selector: "", | |
| 98 | + | |
| 99 | + // The current version of jQuery being used | |
| 100 | + jquery: "1.3.2", | |
| 101 | + | |
| 102 | + // The number of elements contained in the matched element set | |
| 103 | + size: function() { | |
| 104 | + return this.length; | |
| 105 | + }, | |
| 106 | + | |
| 107 | + // Get the Nth element in the matched element set OR | |
| 108 | + // Get the whole matched element set as a clean array | |
| 109 | + get: function( num ) { | |
| 110 | + return num === undefined ? | |
| 111 | + | |
| 112 | + // Return a 'clean' array | |
| 113 | + Array.prototype.slice.call( this ) : | |
| 114 | + | |
| 115 | + // Return just the object | |
| 116 | + this[ num ]; | |
| 117 | + }, | |
| 118 | + | |
| 119 | + // Take an array of elements and push it onto the stack | |
| 120 | + // (returning the new matched element set) | |
| 121 | + pushStack: function( elems, name, selector ) { | |
| 122 | + // Build a new jQuery matched element set | |
| 123 | + var ret = jQuery( elems ); | |
| 124 | + | |
| 125 | + // Add the old object onto the stack (as a reference) | |
| 126 | + ret.prevObject = this; | |
| 127 | + | |
| 128 | + ret.context = this.context; | |
| 129 | + | |
| 130 | + if ( name === "find" ) | |
| 131 | + ret.selector = this.selector + (this.selector ? " " : "") + selector; | |
| 132 | + else if ( name ) | |
| 133 | + ret.selector = this.selector + "." + name + "(" + selector + ")"; | |
| 134 | + | |
| 135 | + // Return the newly-formed element set | |
| 136 | + return ret; | |
| 137 | + }, | |
| 138 | + | |
| 139 | + // Force the current matched set of elements to become | |
| 140 | + // the specified array of elements (destroying the stack in the process) | |
| 141 | + // You should use pushStack() in order to do this, but maintain the stack | |
| 142 | + setArray: function( elems ) { | |
| 143 | + // Resetting the length to 0, then using the native Array push | |
| 144 | + // is a super-fast way to populate an object with array-like properties | |
| 145 | + this.length = 0; | |
| 146 | + Array.prototype.push.apply( this, elems ); | |
| 147 | + | |
| 148 | + return this; | |
| 149 | + }, | |
| 150 | + | |
| 151 | + // Execute a callback for every element in the matched set. | |
| 152 | + // (You can seed the arguments with an array of args, but this is | |
| 153 | + // only used internally.) | |
| 154 | + each: function( callback, args ) { | |
| 155 | + return jQuery.each( this, callback, args ); | |
| 156 | + }, | |
| 157 | + | |
| 158 | + // Determine the position of an element within | |
| 159 | + // the matched set of elements | |
| 160 | + index: function( elem ) { | |
| 161 | + // Locate the position of the desired element | |
| 162 | + return jQuery.inArray( | |
| 163 | + // If it receives a jQuery object, the first element is used | |
| 164 | + elem && elem.jquery ? elem[0] : elem | |
| 165 | + , this ); | |
| 166 | + }, | |
| 167 | + | |
| 168 | + attr: function( name, value, type ) { | |
| 169 | + var options = name; | |
| 170 | + | |
| 171 | + // Look for the case where we're accessing a style value | |
| 172 | + if ( typeof name === "string" ) | |
| 173 | + if ( value === undefined ) | |
| 174 | + return this[0] && jQuery[ type || "attr" ]( this[0], name ); | |
| 175 | + | |
| 176 | + else { | |
| 177 | + options = {}; | |
| 178 | + options[ name ] = value; | |
| 179 | + } | |
| 180 | + | |
| 181 | + // Check to see if we're setting style values | |
| 182 | + return this.each(function(i){ | |
| 183 | + // Set all the styles | |
| 184 | + for ( name in options ) | |
| 185 | + jQuery.attr( | |
| 186 | + type ? | |
| 187 | + this.style : | |
| 188 | + this, | |
| 189 | + name, jQuery.prop( this, options[ name ], type, i, name ) | |
| 190 | + ); | |
| 191 | + }); | |
| 192 | + }, | |
| 193 | + | |
| 194 | + css: function( key, value ) { | |
| 195 | + // ignore negative width and height values | |
| 196 | + if ( (key == 'width' || key == 'height') && parseFloat(value) < 0 ) | |
| 197 | + value = undefined; | |
| 198 | + return this.attr( key, value, "curCSS" ); | |
| 199 | + }, | |
| 200 | + | |
| 201 | + text: function( text ) { | |
| 202 | + if ( typeof text !== "object" && text != null ) | |
| 203 | + return this.empty().append( (this[0] && this[0].ownerDocument || document).createTextNode( text ) ); | |
| 204 | + | |
| 205 | + var ret = ""; | |
| 206 | + | |
| 207 | + jQuery.each( text || this, function(){ | |
| 208 | + jQuery.each( this.childNodes, function(){ | |
| 209 | + if ( this.nodeType != 8 ) | |
| 210 | + ret += this.nodeType != 1 ? | |
| 211 | + this.nodeValue : | |
| 212 | + jQuery.fn.text( [ this ] ); | |
| 213 | + }); | |
| 214 | + }); | |
| 215 | + | |
| 216 | + return ret; | |
| 217 | + }, | |
| 218 | + | |
| 219 | + wrapAll: function( html ) { | |
| 220 | + if ( this[0] ) { | |
| 221 | + // The elements to wrap the target around | |
| 222 | + var wrap = jQuery( html, this[0].ownerDocument ).clone(); | |
| 223 | + | |
| 224 | + if ( this[0].parentNode ) | |
| 225 | + wrap.insertBefore( this[0] ); | |
| 226 | + | |
| 227 | + wrap.map(function(){ | |
| 228 | + var elem = this; | |
| 229 | + | |
| 230 | + while ( elem.firstChild ) | |
| 231 | + elem = elem.firstChild; | |
| 232 | + | |
| 233 | + return elem; | |
| 234 | + }).append(this); | |
| 235 | + } | |
| 236 | + | |
| 237 | + return this; | |
| 238 | + }, | |
| 239 | + | |
| 240 | + wrapInner: function( html ) { | |
| 241 | + return this.each(function(){ | |
| 242 | + jQuery( this ).contents().wrapAll( html ); | |
| 243 | + }); | |
| 244 | + }, | |
| 245 | + | |
| 246 | + wrap: function( html ) { | |
| 247 | + return this.each(function(){ | |
| 248 | + jQuery( this ).wrapAll( html ); | |
| 249 | + }); | |
| 250 | + }, | |
| 251 | + | |
| 252 | + append: function() { | |
| 253 | + return this.domManip(arguments, true, function(elem){ | |
| 254 | + if (this.nodeType == 1) | |
| 255 | + this.appendChild( elem ); | |
| 256 | + }); | |
| 257 | + }, | |
| 258 | + | |
| 259 | + prepend: function() { | |
| 260 | + return this.domManip(arguments, true, function(elem){ | |
| 261 | + if (this.nodeType == 1) | |
| 262 | + this.insertBefore( elem, this.firstChild ); | |
| 263 | + }); | |
| 264 | + }, | |
| 265 | + | |
| 266 | + before: function() { | |
| 267 | + return this.domManip(arguments, false, function(elem){ | |
| 268 | + this.parentNode.insertBefore( elem, this ); | |
| 269 | + }); | |
| 270 | + }, | |
| 271 | + | |
| 272 | + after: function() { | |
| 273 | + return this.domManip(arguments, false, function(elem){ | |
| 274 | + this.parentNode.insertBefore( elem, this.nextSibling ); | |
| 275 | + }); | |
| 276 | + }, | |
| 277 | + | |
| 278 | + end: function() { | |
| 279 | + return this.prevObject || jQuery( [] ); | |
| 280 | + }, | |
| 281 | + | |
| 282 | + // For internal use only. | |
| 283 | + // Behaves like an Array's method, not like a jQuery method. | |
| 284 | + push: [].push, | |
| 285 | + sort: [].sort, | |
| 286 | + splice: [].splice, | |
| 287 | + | |
| 288 | + find: function( selector ) { | |
| 289 | + if ( this.length === 1 ) { | |
| 290 | + var ret = this.pushStack( [], "find", selector ); | |
| 291 | + ret.length = 0; | |
| 292 | + jQuery.find( selector, this[0], ret ); | |
| 293 | + return ret; | |
| 294 | + } else { | |
| 295 | + return this.pushStack( jQuery.unique(jQuery.map(this, function(elem){ | |
| 296 | + return jQuery.find( selector, elem ); | |
| 297 | + })), "find", selector ); | |
| 298 | + } | |
| 299 | + }, | |
| 300 | + | |
| 301 | + clone: function( events ) { | |
| 302 | + // Do the clone | |
| 303 | + var ret = this.map(function(){ | |
| 304 | + if ( !jQuery.support.noCloneEvent && !jQuery.isXMLDoc(this) ) { | |
| 305 | + // IE copies events bound via attachEvent when | |
| 306 | + // using cloneNode. Calling detachEvent on the | |
| 307 | + // clone will also remove the events from the orignal | |
| 308 | + // In order to get around this, we use innerHTML. | |
| 309 | + // Unfortunately, this means some modifications to | |
| 310 | + // attributes in IE that are actually only stored | |
| 311 | + // as properties will not be copied (such as the | |
| 312 | + // the name attribute on an input). | |
| 313 | + var html = this.outerHTML; | |
| 314 | + if ( !html ) { | |
| 315 | + var div = this.ownerDocument.createElement("div"); | |
| 316 | + div.appendChild( this.cloneNode(true) ); | |
| 317 | + html = div.innerHTML; | |
| 318 | + } | |
| 319 | + | |
| 320 | + return jQuery.clean([html.replace(/ jQuery\d+="(?:\d+|null)"/g, "").replace(/^\s*/, "")])[0]; | |
| 321 | + } else | |
| 322 | + return this.cloneNode(true); | |
| 323 | + }); | |
| 324 | + | |
| 325 | + // Copy the events from the original to the clone | |
| 326 | + if ( events === true ) { | |
| 327 | + var orig = this.find("*").andSelf(), i = 0; | |
| 328 | + | |
| 329 | + ret.find("*").andSelf().each(function(){ | |
| 330 | + if ( this.nodeName !== orig[i].nodeName ) | |
| 331 | + return; | |
| 332 | + | |
| 333 | + var events = jQuery.data( orig[i], "events" ); | |
| 334 | + | |
| 335 | + for ( var type in events ) { | |
| 336 | + for ( var handler in events[ type ] ) { | |
| 337 | + jQuery.event.add( this, type, events[ type ][ handler ], events[ type ][ handler ].data ); | |
| 338 | + } | |
| 339 | + } | |
| 340 | + | |
| 341 | + i++; | |
| 342 | + }); | |
| 343 | + } | |
| 344 | + | |
| 345 | + // Return the cloned set | |
| 346 | + return ret; | |
| 347 | + }, | |
| 348 | + | |
| 349 | + filter: function( selector ) { | |
| 350 | + return this.pushStack( | |
| 351 | + jQuery.isFunction( selector ) && | |
| 352 | + jQuery.grep(this, function(elem, i){ | |
| 353 | + return selector.call( elem, i ); | |
| 354 | + }) || | |
| 355 | + | |
| 356 | + jQuery.multiFilter( selector, jQuery.grep(this, function(elem){ | |
| 357 | + return elem.nodeType === 1; | |
| 358 | + }) ), "filter", selector ); | |
| 359 | + }, | |
| 360 | + | |
| 361 | + closest: function( selector ) { | |
| 362 | + var pos = jQuery.expr.match.POS.test( selector ) ? jQuery(selector) : null, | |
| 363 | + closer = 0; | |
| 364 | + | |
| 365 | + return this.map(function(){ | |
| 366 | + var cur = this; | |
| 367 | + while ( cur && cur.ownerDocument ) { | |
| 368 | + if ( pos ? pos.index(cur) > -1 : jQuery(cur).is(selector) ) { | |
| 369 | + jQuery.data(cur, "closest", closer); | |
| 370 | + return cur; | |
| 371 | + } | |
| 372 | + cur = cur.parentNode; | |
| 373 | + closer++; | |
| 374 | + } | |
| 375 | + }); | |
| 376 | + }, | |
| 377 | + | |
| 378 | + not: function( selector ) { | |
| 379 | + if ( typeof selector === "string" ) | |
| 380 | + // test special case where just one selector is passed in | |
| 381 | + if ( isSimple.test( selector ) ) | |
| 382 | + return this.pushStack( jQuery.multiFilter( selector, this, true ), "not", selector ); | |
| 383 | + else | |
| 384 | + selector = jQuery.multiFilter( selector, this ); | |
| 385 | + | |
| 386 | + var isArrayLike = selector.length && selector[selector.length - 1] !== undefined && !selector.nodeType; | |
| 387 | + return this.filter(function() { | |
| 388 | + return isArrayLike ? jQuery.inArray( this, selector ) < 0 : this != selector; | |
| 389 | + }); | |
| 390 | + }, | |
| 391 | + | |
| 392 | + add: function( selector ) { | |
| 393 | + return this.pushStack( jQuery.unique( jQuery.merge( | |
| 394 | + this.get(), | |
| 395 | + typeof selector === "string" ? | |
| 396 | + jQuery( selector ) : | |
| 397 | + jQuery.makeArray( selector ) | |
| 398 | + ))); | |
| 399 | + }, | |
| 400 | + | |
| 401 | + is: function( selector ) { | |
| 402 | + return !!selector && jQuery.multiFilter( selector, this ).length > 0; | |
| 403 | + }, | |
| 404 | + | |
| 405 | + hasClass: function( selector ) { | |
| 406 | + return !!selector && this.is( "." + selector ); | |
| 407 | + }, | |
| 408 | + | |
| 409 | + val: function( value ) { | |
| 410 | + if ( value === undefined ) { | |
| 411 | + var elem = this[0]; | |
| 412 | + | |
| 413 | + if ( elem ) { | |
| 414 | + if( jQuery.nodeName( elem, 'option' ) ) | |
| 415 | + return (elem.attributes.value || {}).specified ? elem.value : elem.text; | |
| 416 | + | |
| 417 | + // We need to handle select boxes special | |
| 418 | + if ( jQuery.nodeName( elem, "select" ) ) { | |
| 419 | + var index = elem.selectedIndex, | |
| 420 | + values = [], | |
| 421 | + options = elem.options, | |
| 422 | + one = elem.type == "select-one"; | |
| 423 | + | |
| 424 | + // Nothing was selected | |
| 425 | + if ( index < 0 ) | |
| 426 | + return null; | |
| 427 | + | |
| 428 | + // Loop through all the selected options | |
| 429 | + for ( var i = one ? index : 0, max = one ? index + 1 : options.length; i < max; i++ ) { | |
| 430 | + var option = options[ i ]; | |
| 431 | + | |
| 432 | + if ( option.selected ) { | |
| 433 | + // Get the specifc value for the option | |
| 434 | + value = jQuery(option).val(); | |
| 435 | + | |
| 436 | + // We don't need an array for one selects | |
| 437 | + if ( one ) | |
| 438 | + return value; | |
| 439 | + | |
| 440 | + // Multi-Selects return an array | |
| 441 | + values.push( value ); | |
| 442 | + } | |
| 443 | + } | |
| 444 | + | |
| 445 | + return values; | |
| 446 | + } | |
| 447 | + | |
| 448 | + // Everything else, we just grab the value | |
| 449 | + return (elem.value || "").replace(/\r/g, ""); | |
| 450 | + | |
| 451 | + } | |
| 452 | + | |
| 453 | + return undefined; | |
| 454 | + } | |
| 455 | + | |
| 456 | + if ( typeof value === "number" ) | |
| 457 | + value += ''; | |
| 458 | + | |
| 459 | + return this.each(function(){ | |
| 460 | + if ( this.nodeType != 1 ) | |
| 461 | + return; | |
| 462 | + | |
| 463 | + if ( jQuery.isArray(value) && /radio|checkbox/.test( this.type ) ) | |
| 464 | + this.checked = (jQuery.inArray(this.value, value) >= 0 || | |
| 465 | + jQuery.inArray(this.name, value) >= 0); | |
| 466 | + | |
| 467 | + else if ( jQuery.nodeName( this, "select" ) ) { | |
| 468 | + var values = jQuery.makeArray(value); | |
| 469 | + | |
| 470 | + jQuery( "option", this ).each(function(){ | |
| 471 | + this.selected = (jQuery.inArray( this.value, values ) >= 0 || | |
| 472 | + jQuery.inArray( this.text, values ) >= 0); | |
| 473 | + }); | |
| 474 | + | |
| 475 | + if ( !values.length ) | |
| 476 | + this.selectedIndex = -1; | |
| 477 | + | |
| 478 | + } else | |
| 479 | + this.value = value; | |
| 480 | + }); | |
| 481 | + }, | |
| 482 | + | |
| 483 | + html: function( value ) { | |
| 484 | + return value === undefined ? | |
| 485 | + (this[0] ? | |
| 486 | + this[0].innerHTML.replace(/ jQuery\d+="(?:\d+|null)"/g, "") : | |
| 487 | + null) : | |
| 488 | + this.empty().append( value ); | |
| 489 | + }, | |
| 490 | + | |
| 491 | + replaceWith: function( value ) { | |
| 492 | + return this.after( value ).remove(); | |
| 493 | + }, | |
| 494 | + | |
| 495 | + eq: function( i ) { | |
| 496 | + return this.slice( i, +i + 1 ); | |
| 497 | + }, | |
| 498 | + | |
| 499 | + slice: function() { | |
| 500 | + return this.pushStack( Array.prototype.slice.apply( this, arguments ), | |
| 501 | + "slice", Array.prototype.slice.call(arguments).join(",") ); | |
| 502 | + }, | |
| 503 | + | |
| 504 | + map: function( callback ) { | |
| 505 | + return this.pushStack( jQuery.map(this, function(elem, i){ | |
| 506 | + return callback.call( elem, i, elem ); | |
| 507 | + })); | |
| 508 | + }, | |
| 509 | + | |
| 510 | + andSelf: function() { | |
| 511 | + return this.add( this.prevObject ); | |
| 512 | + }, | |
| 513 | + | |
| 514 | + domManip: function( args, table, callback ) { | |
| 515 | + if ( this[0] ) { | |
| 516 | + var fragment = (this[0].ownerDocument || this[0]).createDocumentFragment(), | |
| 517 | + scripts = jQuery.clean( args, (this[0].ownerDocument || this[0]), fragment ), | |
| 518 | + first = fragment.firstChild; | |
| 519 | + | |
| 520 | + if ( first ) | |
| 521 | + for ( var i = 0, l = this.length; i < l; i++ ) | |
| 522 | + callback.call( root(this[i], first), this.length > 1 || i > 0 ? | |
| 523 | + fragment.cloneNode(true) : fragment ); | |
| 524 | + | |
| 525 | + if ( scripts ) | |
| 526 | + jQuery.each( scripts, evalScript ); | |
| 527 | + } | |
| 528 | + | |
| 529 | + return this; | |
| 530 | + | |
| 531 | + function root( elem, cur ) { | |
| 532 | + return table && jQuery.nodeName(elem, "table") && jQuery.nodeName(cur, "tr") ? | |
| 533 | + (elem.getElementsByTagName("tbody")[0] || | |
| 534 | + elem.appendChild(elem.ownerDocument.createElement("tbody"))) : | |
| 535 | + elem; | |
| 536 | + } | |
| 537 | + } | |
| 538 | +}; | |
| 539 | + | |
| 540 | +// Give the init function the jQuery prototype for later instantiation | |
| 541 | +jQuery.fn.init.prototype = jQuery.fn; | |
| 542 | + | |
| 543 | +function evalScript( i, elem ) { | |
| 544 | + if ( elem.src ) | |
| 545 | + jQuery.ajax({ | |
| 546 | + url: elem.src, | |
| 547 | + async: false, | |
| 548 | + dataType: "script" | |
| 549 | + }); | |
| 550 | + | |
| 551 | + else | |
| 552 | + jQuery.globalEval( elem.text || elem.textContent || elem.innerHTML || "" ); | |
| 553 | + | |
| 554 | + if ( elem.parentNode ) | |
| 555 | + elem.parentNode.removeChild( elem ); | |
| 556 | +} | |
| 557 | + | |
| 558 | +function now(){ | |
| 559 | + return +new Date; | |
| 560 | +} | |
| 561 | + | |
| 562 | +jQuery.extend = jQuery.fn.extend = function() { | |
| 563 | + // copy reference to target object | |
| 564 | + var target = arguments[0] || {}, i = 1, length = arguments.length, deep = false, options; | |
| 565 | + | |
| 566 | + // Handle a deep copy situation | |
| 567 | + if ( typeof target === "boolean" ) { | |
| 568 | + deep = target; | |
| 569 | + target = arguments[1] || {}; | |
| 570 | + // skip the boolean and the target | |
| 571 | + i = 2; | |
| 572 | + } | |
| 573 | + | |
| 574 | + // Handle case when target is a string or something (possible in deep copy) | |
| 575 | + if ( typeof target !== "object" && !jQuery.isFunction(target) ) | |
| 576 | + target = {}; | |
| 577 | + | |
| 578 | + // extend jQuery itself if only one argument is passed | |
| 579 | + if ( length == i ) { | |
| 580 | + target = this; | |
| 581 | + --i; | |
| 582 | + } | |
| 583 | + | |
| 584 | + for ( ; i < length; i++ ) | |
| 585 | + // Only deal with non-null/undefined values | |
| 586 | + if ( (options = arguments[ i ]) != null ) | |
| 587 | + // Extend the base object | |
| 588 | + for ( var name in options ) { | |
| 589 | + var src = target[ name ], copy = options[ name ]; | |
| 590 | + | |
| 591 | + // Prevent never-ending loop | |
| 592 | + if ( target === copy ) | |
| 593 | + continue; | |
| 594 | + | |
| 595 | + // Recurse if we're merging object values | |
| 596 | + if ( deep && copy && typeof copy === "object" && !copy.nodeType ) | |
| 597 | + target[ name ] = jQuery.extend( deep, | |
| 598 | + // Never move original objects, clone them | |
| 599 | + src || ( copy.length != null ? [ ] : { } ) | |
| 600 | + , copy ); | |
| 601 | + | |
| 602 | + // Don't bring in undefined values | |
| 603 | + else if ( copy !== undefined ) | |
| 604 | + target[ name ] = copy; | |
| 605 | + | |
| 606 | + } | |
| 607 | + | |
| 608 | + // Return the modified object | |
| 609 | + return target; | |
| 610 | +}; | |
| 611 | + | |
| 612 | +// exclude the following css properties to add px | |
| 613 | +var exclude = /z-?index|font-?weight|opacity|zoom|line-?height/i, | |
| 614 | + // cache defaultView | |
| 615 | + defaultView = document.defaultView || {}, | |
| 616 | + toString = Object.prototype.toString; | |
| 617 | + | |
| 618 | +jQuery.extend({ | |
| 619 | + noConflict: function( deep ) { | |
| 620 | + window.$ = _$; | |
| 621 | + | |
| 622 | + if ( deep ) | |
| 623 | + window.jQuery = _jQuery; | |
| 624 | + | |
| 625 | + return jQuery; | |
| 626 | + }, | |
| 627 | + | |
| 628 | + // See test/unit/core.js for details concerning isFunction. | |
| 629 | + // Since version 1.3, DOM methods and functions like alert | |
| 630 | + // aren't supported. They return false on IE (#2968). | |
| 631 | + isFunction: function( obj ) { | |
| 632 | + return toString.call(obj) === "[object Function]"; | |
| 633 | + }, | |
| 634 | + | |
| 635 | + isArray: function( obj ) { | |
| 636 | + return toString.call(obj) === "[object Array]"; | |
| 637 | + }, | |
| 638 | + | |
| 639 | + // check if an element is in a (or is an) XML document | |
| 640 | + isXMLDoc: function( elem ) { | |
| 641 | + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || | |
| 642 | + !!elem.ownerDocument && jQuery.isXMLDoc( elem.ownerDocument ); | |
| 643 | + }, | |
| 644 | + | |
| 645 | + // Evalulates a script in a global context | |
| 646 | + globalEval: function( data ) { | |
| 647 | + if ( data && /\S/.test(data) ) { | |
| 648 | + // Inspired by code by Andrea Giammarchi | |
| 649 | + // http://webreflection.blogspot.com/2007/08/global-scope-evaluation-and-dom.html | |
| 650 | + var head = document.getElementsByTagName("head")[0] || document.documentElement, | |
| 651 | + script = document.createElement("script"); | |
| 652 | + | |
| 653 | + script.type = "text/javascript"; | |
| 654 | + if ( jQuery.support.scriptEval ) | |
| 655 | + script.appendChild( document.createTextNode( data ) ); | |
| 656 | + else | |
| 657 | + script.text = data; | |
| 658 | + | |
| 659 | + // Use insertBefore instead of appendChild to circumvent an IE6 bug. | |
| 660 | + // This arises when a base node is used (#2709). | |
| 661 | + head.insertBefore( script, head.firstChild ); | |
| 662 | + head.removeChild( script ); | |
| 663 | + } | |
| 664 | + }, | |
| 665 | + | |
| 666 | + nodeName: function( elem, name ) { | |
| 667 | + return elem.nodeName && elem.nodeName.toUpperCase() == name.toUpperCase(); | |
| 668 | + }, | |
| 669 | + | |
| 670 | + // args is for internal usage only | |
| 671 | + each: function( object, callback, args ) { | |
| 672 | + var name, i = 0, length = object.length; | |
| 673 | + | |
| 674 | + if ( args ) { | |
| 675 | + if ( length === undefined ) { | |
| 676 | + for ( name in object ) | |
| 677 | + if ( callback.apply( object[ name ], args ) === false ) | |
| 678 | + break; | |
| 679 | + } else | |
| 680 | + for ( ; i < length; ) | |
| 681 | + if ( callback.apply( object[ i++ ], args ) === false ) | |
| 682 | + break; | |
| 683 | + | |
| 684 | + // A special, fast, case for the most common use of each | |
| 685 | + } else { | |
| 686 | + if ( length === undefined ) { | |
| 687 | + for ( name in object ) | |
| 688 | + if ( callback.call( object[ name ], name, object[ name ] ) === false ) | |
| 689 | + break; | |
| 690 | + } else | |
| 691 | + for ( var value = object[0]; | |
| 692 | + i < length && callback.call( value, i, value ) !== false; value = object[++i] ){} | |
| 693 | + } | |
| 694 | + | |
| 695 | + return object; | |
| 696 | + }, | |
| 697 | + | |
| 698 | + prop: function( elem, value, type, i, name ) { | |
| 699 | + // Handle executable functions | |
| 700 | + if ( jQuery.isFunction( value ) ) | |
| 701 | + value = value.call( elem, i ); | |
| 702 | + | |
| 703 | + // Handle passing in a number to a CSS property | |
| 704 | + return typeof value === "number" && type == "curCSS" && !exclude.test( name ) ? | |
| 705 | + value + "px" : | |
| 706 | + value; | |
| 707 | + }, | |
| 708 | + | |
| 709 | + className: { | |
| 710 | + // internal only, use addClass("class") | |
| 711 | + add: function( elem, classNames ) { | |
| 712 | + jQuery.each((classNames || "").split(/\s+/), function(i, className){ | |
| 713 | + if ( elem.nodeType == 1 && !jQuery.className.has( elem.className, className ) ) | |
| 714 | + elem.className += (elem.className ? " " : "") + className; | |
| 715 | + }); | |
| 716 | + }, | |
| 717 | + | |
| 718 | + // internal only, use removeClass("class") | |
| 719 | + remove: function( elem, classNames ) { | |
| 720 | + if (elem.nodeType == 1) | |
| 721 | + elem.className = classNames !== undefined ? | |
| 722 | + jQuery.grep(elem.className.split(/\s+/), function(className){ | |
| 723 | + return !jQuery.className.has( classNames, className ); | |
| 724 | + }).join(" ") : | |
| 725 | + ""; | |
| 726 | + }, | |
| 727 | + | |
| 728 | + // internal only, use hasClass("class") | |
| 729 | + has: function( elem, className ) { | |
| 730 | + return elem && jQuery.inArray( className, (elem.className || elem).toString().split(/\s+/) ) > -1; | |
| 731 | + } | |
| 732 | + }, | |
| 733 | + | |
| 734 | + // A method for quickly swapping in/out CSS properties to get correct calculations | |
| 735 | + swap: function( elem, options, callback ) { | |
| 736 | + var old = {}; | |
| 737 | + // Remember the old values, and insert the new ones | |
| 738 | + for ( var name in options ) { | |
| 739 | + old[ name ] = elem.style[ name ]; | |
| 740 | + elem.style[ name ] = options[ name ]; | |
| 741 | + } | |
| 742 | + | |
| 743 | + callback.call( elem ); | |
| 744 | + | |
| 745 | + // Revert the old values | |
| 746 | + for ( var name in options ) | |
| 747 | + elem.style[ name ] = old[ name ]; | |
| 748 | + }, | |
| 749 | + | |
| 750 | + css: function( elem, name, force, extra ) { | |
| 751 | + if ( name == "width" || name == "height" ) { | |
| 752 | + var val, props = { position: "absolute", visibility: "hidden", display:"block" }, which = name == "width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ]; | |
| 753 | + | |
| 754 | + function getWH() { | |
| 755 | + val = name == "width" ? elem.offsetWidth : elem.offsetHeight; | |
| 756 | + | |
| 757 | + if ( extra === "border" ) | |
| 758 | + return; | |
| 759 | + | |
| 760 | + jQuery.each( which, function() { | |
| 761 | + if ( !extra ) | |
| 762 | + val -= parseFloat(jQuery.curCSS( elem, "padding" + this, true)) || 0; | |
| 763 | + if ( extra === "margin" ) | |
| 764 | + val += parseFloat(jQuery.curCSS( elem, "margin" + this, true)) || 0; | |
| 765 | + else | |
| 766 | + val -= parseFloat(jQuery.curCSS( elem, "border" + this + "Width", true)) || 0; | |
| 767 | + }); | |
| 768 | + } | |
| 769 | + | |
| 770 | + if ( elem.offsetWidth !== 0 ) | |
| 771 | + getWH(); | |
| 772 | + else | |
| 773 | + jQuery.swap( elem, props, getWH ); | |
| 774 | + | |
| 775 | + return Math.max(0, Math.round(val)); | |
| 776 | + } | |
| 777 | + | |
| 778 | + return jQuery.curCSS( elem, name, force ); | |
| 779 | + }, | |
| 780 | + | |
| 781 | + curCSS: function( elem, name, force ) { | |
| 782 | + var ret, style = elem.style; | |
| 783 | + | |
| 784 | + // We need to handle opacity special in IE | |
| 785 | + if ( name == "opacity" && !jQuery.support.opacity ) { | |
| 786 | + ret = jQuery.attr( style, "opacity" ); | |
| 787 | + | |
| 788 | + return ret == "" ? | |
| 789 | + "1" : | |
| 790 | + ret; | |
| 791 | + } | |
| 792 | + | |
| 793 | + // Make sure we're using the right name for getting the float value | |
| 794 | + if ( name.match( /float/i ) ) | |
| 795 | + name = styleFloat; | |
| 796 | + | |
| 797 | + if ( !force && style && style[ name ] ) | |
| 798 | + ret = style[ name ]; | |
| 799 | + | |
| 800 | + else if ( defaultView.getComputedStyle ) { | |
| 801 | + | |
| 802 | + // Only "float" is needed here | |
| 803 | + if ( name.match( /float/i ) ) | |
| 804 | + name = "float"; | |
| 805 | + | |
| 806 | + name = name.replace( /([A-Z])/g, "-$1" ).toLowerCase(); | |
| 807 | + | |
| 808 | + var computedStyle = defaultView.getComputedStyle( elem, null ); | |
| 809 | + | |
| 810 | + if ( computedStyle ) | |
| 811 | + ret = computedStyle.getPropertyValue( name ); | |
| 812 | + | |
| 813 | + // We should always get a number back from opacity | |
| 814 | + if ( name == "opacity" && ret == "" ) | |
| 815 | + ret = "1"; | |
| 816 | + | |
| 817 | + } else if ( elem.currentStyle ) { | |
| 818 | + var camelCase = name.replace(/\-(\w)/g, function(all, letter){ | |
| 819 | + return letter.toUpperCase(); | |
| 820 | + }); | |
| 821 | + | |
| 822 | + ret = elem.currentStyle[ name ] || elem.currentStyle[ camelCase ]; | |
| 823 | + | |
| 824 | + // From the awesome hack by Dean Edwards | |
| 825 | + // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291 | |
| 826 | + | |
| 827 | + // If we're not dealing with a regular pixel number | |
| 828 | + // but a number that has a weird ending, we need to convert it to pixels | |
| 829 | + if ( !/^\d+(px)?$/i.test( ret ) && /^\d/.test( ret ) ) { | |
| 830 | + // Remember the original values | |
| 831 | + var left = style.left, rsLeft = elem.runtimeStyle.left; | |
| 832 | + | |
| 833 | + // Put in the new values to get a computed value out | |
| 834 | + elem.runtimeStyle.left = elem.currentStyle.left; | |
| 835 | + style.left = ret || 0; | |
| 836 | + ret = style.pixelLeft + "px"; | |
| 837 | + | |
| 838 | + // Revert the changed values | |
| 839 | + style.left = left; | |
| 840 | + elem.runtimeStyle.left = rsLeft; | |
| 841 | + } | |
| 842 | + } | |
| 843 | + | |
| 844 | + return ret; | |
| 845 | + }, | |
| 846 | + | |
| 847 | + clean: function( elems, context, fragment ) { | |
| 848 | + context = context || document; | |
| 849 | + | |
| 850 | + // !context.createElement fails in IE with an error but returns typeof 'object' | |
| 851 | + if ( typeof context.createElement === "undefined" ) | |
| 852 | + context = context.ownerDocument || context[0] && context[0].ownerDocument || document; | |
| 853 | + | |
| 854 | + // If a single string is passed in and it's a single tag | |
| 855 | + // just do a createElement and skip the rest | |
| 856 | + if ( !fragment && elems.length === 1 && typeof elems[0] === "string" ) { | |
| 857 | + var match = /^<(\w+)\s*\/?>$/.exec(elems[0]); | |
| 858 | + if ( match ) | |
| 859 | + return [ context.createElement( match[1] ) ]; | |
| 860 | + } | |
| 861 | + | |
| 862 | + var ret = [], scripts = [], div = context.createElement("div"); | |
| 863 | + | |
| 864 | + jQuery.each(elems, function(i, elem){ | |
| 865 | + if ( typeof elem === "number" ) | |
| 866 | + elem += ''; | |
| 867 | + | |
| 868 | + if ( !elem ) | |
| 869 | + return; | |
| 870 | + | |
| 871 | + // Convert html string into DOM nodes | |
| 872 | + if ( typeof elem === "string" ) { | |
| 873 | + // Fix "XHTML"-style tags in all browsers | |
| 874 | + elem = elem.replace(/(<(\w+)[^>]*?)\/>/g, function(all, front, tag){ | |
| 875 | + return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i) ? | |
| 876 | + all : | |
| 877 | + front + "></" + tag + ">"; | |
| 878 | + }); | |
| 879 | + | |
| 880 | + // Trim whitespace, otherwise indexOf won't work as expected | |
| 881 | + var tags = elem.replace(/^\s+/, "").substring(0, 10).toLowerCase(); | |
| 882 | + | |
| 883 | + var wrap = | |
| 884 | + // option or optgroup | |
| 885 | + !tags.indexOf("<opt") && | |
| 886 | + [ 1, "<select multiple='multiple'>", "</select>" ] || | |
| 887 | + | |
| 888 | + !tags.indexOf("<leg") && | |
| 889 | + [ 1, "<fieldset>", "</fieldset>" ] || | |
| 890 | + | |
| 891 | + tags.match(/^<(thead|tbody|tfoot|colg|cap)/) && | |
| 892 | + [ 1, "<table>", "</table>" ] || | |
| 893 | + | |
| 894 | + !tags.indexOf("<tr") && | |
| 895 | + [ 2, "<table><tbody>", "</tbody></table>" ] || | |
| 896 | + | |
| 897 | + // <thead> matched above | |
| 898 | + (!tags.indexOf("<td") || !tags.indexOf("<th")) && | |
| 899 | + [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ] || | |
| 900 | + | |
| 901 | + !tags.indexOf("<col") && | |
| 902 | + [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ] || | |
| 903 | + | |
| 904 | + // IE can't serialize <link> and <script> tags normally | |
| 905 | + !jQuery.support.htmlSerialize && | |
| 906 | + [ 1, "div<div>", "</div>" ] || | |
| 907 | + | |
| 908 | + [ 0, "", "" ]; | |
| 909 | + | |
| 910 | + // Go to html and back, then peel off extra wrappers | |
| 911 | + div.innerHTML = wrap[1] + elem + wrap[2]; | |
| 912 | + | |
| 913 | + // Move to the right depth | |
| 914 | + while ( wrap[0]-- ) | |
| 915 | + div = div.lastChild; | |
| 916 | + | |
| 917 | + // Remove IE's autoinserted <tbody> from table fragments | |
| 918 | + if ( !jQuery.support.tbody ) { | |
| 919 | + | |
| 920 | + // String was a <table>, *may* have spurious <tbody> | |
| 921 | + var hasBody = /<tbody/i.test(elem), | |
| 922 | + tbody = !tags.indexOf("<table") && !hasBody ? | |
| 923 | + div.firstChild && div.firstChild.childNodes : | |
| 924 | + | |
| 925 | + // String was a bare <thead> or <tfoot> | |
| 926 | + wrap[1] == "<table>" && !hasBody ? | |
| 927 | + div.childNodes : | |
| 928 | + []; | |
| 929 | + | |
| 930 | + for ( var j = tbody.length - 1; j >= 0 ; --j ) | |
| 931 | + if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) | |
| 932 | + tbody[ j ].parentNode.removeChild( tbody[ j ] ); | |
| 933 | + | |
| 934 | + } | |
| 935 | + | |
| 936 | + // IE completely kills leading whitespace when innerHTML is used | |
| 937 | + if ( !jQuery.support.leadingWhitespace && /^\s/.test( elem ) ) | |
| 938 | + div.insertBefore( context.createTextNode( elem.match(/^\s*/)[0] ), div.firstChild ); | |
| 939 | + | |
| 940 | + elem = jQuery.makeArray( div.childNodes ); | |
| 941 | + } | |
| 942 | + | |
| 943 | + if ( elem.nodeType ) | |
| 944 | + ret.push( elem ); | |
| 945 | + else | |
| 946 | + ret = jQuery.merge( ret, elem ); | |
| 947 | + | |
| 948 | + }); | |
| 949 | + | |
| 950 | + if ( fragment ) { | |
| 951 | + for ( var i = 0; ret[i]; i++ ) { | |
| 952 | + if ( jQuery.nodeName( ret[i], "script" ) && (!ret[i].type || ret[i].type.toLowerCase() === "text/javascript") ) { | |
| 953 | + scripts.push( ret[i].parentNode ? ret[i].parentNode.removeChild( ret[i] ) : ret[i] ); | |
| 954 | + } else { | |
| 955 | + if ( ret[i].nodeType === 1 ) | |
| 956 | + ret.splice.apply( ret, [i + 1, 0].concat(jQuery.makeArray(ret[i].getElementsByTagName("script"))) ); | |
| 957 | + fragment.appendChild( ret[i] ); | |
| 958 | + } | |
| 959 | + } | |
| 960 | + | |
| 961 | + return scripts; | |
| 962 | + } | |
| 963 | + | |
| 964 | + return ret; | |
| 965 | + }, | |
| 966 | + | |
| 967 | + attr: function( elem, name, value ) { | |
| 968 | + // don't set attributes on text and comment nodes | |
| 969 | + if (!elem || elem.nodeType == 3 || elem.nodeType == 8) | |
| 970 | + return undefined; | |
| 971 | + | |
| 972 | + var notxml = !jQuery.isXMLDoc( elem ), | |
| 973 | + // Whether we are setting (or getting) | |
| 974 | + set = value !== undefined; | |
| 975 | + | |
| 976 | + // Try to normalize/fix the name | |
| 977 | + name = notxml && jQuery.props[ name ] || name; | |
| 978 | + | |
| 979 | + // Only do all the following if this is a node (faster for style) | |
| 980 | + // IE elem.getAttribute passes even for style | |
| 981 | + if ( elem.tagName ) { | |
| 982 | + | |
| 983 | + // These attributes require special treatment | |
| 984 | + var special = /href|src|style/.test( name ); | |
| 985 | + | |
| 986 | + // Safari mis-reports the default selected property of a hidden option | |
| 987 | + // Accessing the parent's selectedIndex property fixes it | |
| 988 | + if ( name == "selected" && elem.parentNode ) | |
| 989 | + elem.parentNode.selectedIndex; | |
| 990 | + | |
| 991 | + // If applicable, access the attribute via the DOM 0 way | |
| 992 | + if ( name in elem && notxml && !special ) { | |
| 993 | + if ( set ){ | |
| 994 | + // We can't allow the type property to be changed (since it causes problems in IE) | |
| 995 | + if ( name == "type" && jQuery.nodeName( elem, "input" ) && elem.parentNode ) | |
| 996 | + throw "type property can't be changed"; | |
| 997 | + | |
| 998 | + elem[ name ] = value; | |
| 999 | + } | |
| 1000 | + | |
| 1001 | + // browsers index elements by id/name on forms, give priority to attributes. | |
| 1002 | + if( jQuery.nodeName( elem, "form" ) && elem.getAttributeNode(name) ) | |
| 1003 | + return elem.getAttributeNode( name ).nodeValue; | |
| 1004 | + | |
| 1005 | + // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set | |
| 1006 | + // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/ | |
| 1007 | + if ( name == "tabIndex" ) { | |
| 1008 | + var attributeNode = elem.getAttributeNode( "tabIndex" ); | |
| 1009 | + return attributeNode && attributeNode.specified | |
| 1010 | + ? attributeNode.value | |
| 1011 | + : elem.nodeName.match(/(button|input|object|select|textarea)/i) | |
| 1012 | + ? 0 | |
| 1013 | + : elem.nodeName.match(/^(a|area)$/i) && elem.href | |
| 1014 | + ? 0 | |
| 1015 | + : undefined; | |
| 1016 | + } | |
| 1017 | + | |
| 1018 | + return elem[ name ]; | |
| 1019 | + } | |
| 1020 | + | |
| 1021 | + if ( !jQuery.support.style && notxml && name == "style" ) | |
| 1022 | + return jQuery.attr( elem.style, "cssText", value ); | |
| 1023 | + | |
| 1024 | + if ( set ) | |
| 1025 | + // convert the value to a string (all browsers do this but IE) see #1070 | |
| 1026 | + elem.setAttribute( name, "" + value ); | |
| 1027 | + | |
| 1028 | + var attr = !jQuery.support.hrefNormalized && notxml && special | |
| 1029 | + // Some attributes require a special call on IE | |
| 1030 | + ? elem.getAttribute( name, 2 ) | |
| 1031 | + : elem.getAttribute( name ); | |
| 1032 | + | |
| 1033 | + // Non-existent attributes return null, we normalize to undefined | |
| 1034 | + return attr === null ? undefined : attr; | |
| 1035 | + } | |
| 1036 | + | |
| 1037 | + // elem is actually elem.style ... set the style | |
| 1038 | + | |
| 1039 | + // IE uses filters for opacity | |
| 1040 | + if ( !jQuery.support.opacity && name == "opacity" ) { | |
| 1041 | + if ( set ) { | |
| 1042 | + // IE has trouble with opacity if it does not have layout | |
| 1043 | + // Force it by setting the zoom level | |
| 1044 | + elem.zoom = 1; | |
| 1045 | + | |
| 1046 | + // Set the alpha filter to set the opacity | |
| 1047 | + elem.filter = (elem.filter || "").replace( /alpha\([^)]*\)/, "" ) + | |
| 1048 | + (parseInt( value ) + '' == "NaN" ? "" : "alpha(opacity=" + value * 100 + ")"); | |
| 1049 | + } | |
| 1050 | + | |
| 1051 | + return elem.filter && elem.filter.indexOf("opacity=") >= 0 ? | |
| 1052 | + (parseFloat( elem.filter.match(/opacity=([^)]*)/)[1] ) / 100) + '': | |
| 1053 | + ""; | |
| 1054 | + } | |
| 1055 | + | |
| 1056 | + name = name.replace(/-([a-z])/ig, function(all, letter){ | |
| 1057 | + return letter.toUpperCase(); | |
| 1058 | + }); | |
| 1059 | + | |
| 1060 | + if ( set ) | |
| 1061 | + elem[ name ] = value; | |
| 1062 | + | |
| 1063 | + return elem[ name ]; | |
| 1064 | + }, | |
| 1065 | + | |
| 1066 | + trim: function( text ) { | |
| 1067 | + return (text || "").replace( /^\s+|\s+$/g, "" ); | |
| 1068 | + }, | |
| 1069 | + | |
| 1070 | + makeArray: function( array ) { | |
| 1071 | + var ret = []; | |
| 1072 | + | |
| 1073 | + if( array != null ){ | |
| 1074 | + var i = array.length; | |
| 1075 | + // The window, strings (and functions) also have 'length' | |
| 1076 | + if( i == null || typeof array === "string" || jQuery.isFunction(array) || array.setInterval ) | |
| 1077 | + ret[0] = array; | |
| 1078 | + else | |
| 1079 | + while( i ) | |
| 1080 | + ret[--i] = array[i]; | |
| 1081 | + } | |
| 1082 | + | |
| 1083 | + return ret; | |
| 1084 | + }, | |
| 1085 | + | |
| 1086 | + inArray: function( elem, array ) { | |
| 1087 | + for ( var i = 0, length = array.length; i < length; i++ ) | |
| 1088 | + // Use === because on IE, window == document | |
| 1089 | + if ( array[ i ] === elem ) | |
| 1090 | + return i; | |
| 1091 | + | |
| 1092 | + return -1; | |
| 1093 | + }, | |
| 1094 | + | |
| 1095 | + merge: function( first, second ) { | |
| 1096 | + // We have to loop this way because IE & Opera overwrite the length | |
| 1097 | + // expando of getElementsByTagName | |
| 1098 | + var i = 0, elem, pos = first.length; | |
| 1099 | + // Also, we need to make sure that the correct elements are being returned | |
| 1100 | + // (IE returns comment nodes in a '*' query) | |
| 1101 | + if ( !jQuery.support.getAll ) { | |
| 1102 | + while ( (elem = second[ i++ ]) != null ) | |
| 1103 | + if ( elem.nodeType != 8 ) | |
| 1104 | + first[ pos++ ] = elem; | |
| 1105 | + | |
| 1106 | + } else | |
| 1107 | + while ( (elem = second[ i++ ]) != null ) | |
| 1108 | + first[ pos++ ] = elem; | |
| 1109 | + | |
| 1110 | + return first; | |
| 1111 | + }, | |
| 1112 | + | |
| 1113 | + unique: function( array ) { | |
| 1114 | + var ret = [], done = {}; | |
| 1115 | + | |
| 1116 | + try { | |
| 1117 | + | |
| 1118 | + for ( var i = 0, length = array.length; i < length; i++ ) { | |
| 1119 | + var id = jQuery.data( array[ i ] ); | |
| 1120 | + | |
| 1121 | + if ( !done[ id ] ) { | |
| 1122 | + done[ id ] = true; | |
| 1123 | + ret.push( array[ i ] ); | |
| 1124 | + } | |
| 1125 | + } | |
| 1126 | + | |
| 1127 | + } catch( e ) { | |
| 1128 | + ret = array; | |
| 1129 | + } | |
| 1130 | + | |
| 1131 | + return ret; | |
| 1132 | + }, | |
| 1133 | + | |
| 1134 | + grep: function( elems, callback, inv ) { | |
| 1135 | + var ret = []; | |
| 1136 | + | |
| 1137 | + // Go through the array, only saving the items | |
| 1138 | + // that pass the validator function | |
| 1139 | + for ( var i = 0, length = elems.length; i < length; i++ ) | |
| 1140 | + if ( !inv != !callback( elems[ i ], i ) ) | |
| 1141 | + ret.push( elems[ i ] ); | |
| 1142 | + | |
| 1143 | + return ret; | |
| 1144 | + }, | |
| 1145 | + | |
| 1146 | + map: function( elems, callback ) { | |
| 1147 | + var ret = []; | |
| 1148 | + | |
| 1149 | + // Go through the array, translating each of the items to their | |
| 1150 | + // new value (or values). | |
| 1151 | + for ( var i = 0, length = elems.length; i < length; i++ ) { | |
| 1152 | + var value = callback( elems[ i ], i ); | |
| 1153 | + | |
| 1154 | + if ( value != null ) | |
| 1155 | + ret[ ret.length ] = value; | |
| 1156 | + } | |
| 1157 | + | |
| 1158 | + return ret.concat.apply( [], ret ); | |
| 1159 | + } | |
| 1160 | +}); | |
| 1161 | + | |
| 1162 | +// Use of jQuery.browser is deprecated. | |
| 1163 | +// It's included for backwards compatibility and plugins, | |
| 1164 | +// although they should work to upgrade away. | |
| 1165 | + | |
| 1166 | +var userAgent = navigator.userAgent.toLowerCase(); | |
| 1167 | + | |
| 1168 | +// Figure out what browser is being used | |
| 1169 | +jQuery.browser = { | |
| 1170 | + version: (userAgent.match( /.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/ ) || [0,'0'])[1], | |
| 1171 | + safari: /webkit/.test( userAgent ), | |
| 1172 | + opera: /opera/.test( userAgent ), | |
| 1173 | + msie: /msie/.test( userAgent ) && !/opera/.test( userAgent ), | |
| 1174 | + mozilla: /mozilla/.test( userAgent ) && !/(compatible|webkit)/.test( userAgent ) | |
| 1175 | +}; | |
| 1176 | + | |
| 1177 | +jQuery.each({ | |
| 1178 | + parent: function(elem){return elem.parentNode;}, | |
| 1179 | + parents: function(elem){return jQuery.dir(elem,"parentNode");}, | |
| 1180 | + next: function(elem){return jQuery.nth(elem,2,"nextSibling");}, | |
| 1181 | + prev: function(elem){return jQuery.nth(elem,2,"previousSibling");}, | |
| 1182 | + nextAll: function(elem){return jQuery.dir(elem,"nextSibling");}, | |
| 1183 | + prevAll: function(elem){return jQuery.dir(elem,"previousSibling");}, | |
| 1184 | + siblings: function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);}, | |
| 1185 | + children: function(elem){return jQuery.sibling(elem.firstChild);}, | |
| 1186 | + contents: function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);} | |
| 1187 | +}, function(name, fn){ | |
| 1188 | + jQuery.fn[ name ] = function( selector ) { | |
| 1189 | + var ret = jQuery.map( this, fn ); | |
| 1190 | + | |
| 1191 | + if ( selector && typeof selector == "string" ) | |
| 1192 | + ret = jQuery.multiFilter( selector, ret ); | |
| 1193 | + | |
| 1194 | + return this.pushStack( jQuery.unique( ret ), name, selector ); | |
| 1195 | + }; | |
| 1196 | +}); | |
| 1197 | + | |
| 1198 | +jQuery.each({ | |
| 1199 | + appendTo: "append", | |
| 1200 | + prependTo: "prepend", | |
| 1201 | + insertBefore: "before", | |
| 1202 | + insertAfter: "after", | |
| 1203 | + replaceAll: "replaceWith" | |
| 1204 | +}, function(name, original){ | |
| 1205 | + jQuery.fn[ name ] = function( selector ) { | |
| 1206 | + var ret = [], insert = jQuery( selector ); | |
| 1207 | + | |
| 1208 | + for ( var i = 0, l = insert.length; i < l; i++ ) { | |
| 1209 | + var elems = (i > 0 ? this.clone(true) : this).get(); | |
| 1210 | + jQuery.fn[ original ].apply( jQuery(insert[i]), elems ); | |
| 1211 | + ret = ret.concat( elems ); | |
| 1212 | + } | |
| 1213 | + | |
| 1214 | + return this.pushStack( ret, name, selector ); | |
| 1215 | + }; | |
| 1216 | +}); | |
| 1217 | + | |
| 1218 | +jQuery.each({ | |
| 1219 | + removeAttr: function( name ) { | |
| 1220 | + jQuery.attr( this, name, "" ); | |
| 1221 | + if (this.nodeType == 1) | |
| 1222 | + this.removeAttribute( name ); | |
| 1223 | + }, | |
| 1224 | + | |
| 1225 | + addClass: function( classNames ) { | |
| 1226 | + jQuery.className.add( this, classNames ); | |
| 1227 | + }, | |
| 1228 | + | |
| 1229 | + removeClass: function( classNames ) { | |
| 1230 | + jQuery.className.remove( this, classNames ); | |
| 1231 | + }, | |
| 1232 | + | |
| 1233 | + toggleClass: function( classNames, state ) { | |
| 1234 | + if( typeof state !== "boolean" ) | |
| 1235 | + state = !jQuery.className.has( this, classNames ); | |
| 1236 | + jQuery.className[ state ? "add" : "remove" ]( this, classNames ); | |
| 1237 | + }, | |
| 1238 | + | |
| 1239 | + remove: function( selector ) { | |
| 1240 | + if ( !selector || jQuery.filter( selector, [ this ] ).length ) { | |
| 1241 | + // Prevent memory leaks | |
| 1242 | + jQuery( "*", this ).add([this]).each(function(){ | |
| 1243 | + jQuery.event.remove(this); | |
| 1244 | + jQuery.removeData(this); | |
| 1245 | + }); | |
| 1246 | + if (this.parentNode) | |
| 1247 | + this.parentNode.removeChild( this ); | |
| 1248 | + } | |
| 1249 | + }, | |
| 1250 | + | |
| 1251 | + empty: function() { | |
| 1252 | + // Remove element nodes and prevent memory leaks | |
| 1253 | + jQuery(this).children().remove(); | |
| 1254 | + | |
| 1255 | + // Remove any remaining nodes | |
| 1256 | + while ( this.firstChild ) | |
| 1257 | + this.removeChild( this.firstChild ); | |
| 1258 | + } | |
| 1259 | +}, function(name, fn){ | |
| 1260 | + jQuery.fn[ name ] = function(){ | |
| 1261 | + return this.each( fn, arguments ); | |
| 1262 | + }; | |
| 1263 | +}); | |
| 1264 | + | |
| 1265 | +// Helper function used by the dimensions and offset modules | |
| 1266 | +function num(elem, prop) { | |
| 1267 | + return elem[0] && parseInt( jQuery.curCSS(elem[0], prop, true), 10 ) || 0; | |
| 1268 | +} | |
| 1269 | +var expando = "jQuery" + now(), uuid = 0, windowData = {}; | |
| 1270 | + | |
| 1271 | +jQuery.extend({ | |
| 1272 | + cache: {}, | |
| 1273 | + | |
| 1274 | + data: function( elem, name, data ) { | |
| 1275 | + elem = elem == window ? | |
| 1276 | + windowData : | |
| 1277 | + elem; | |
| 1278 | + | |
| 1279 | + var id = elem[ expando ]; | |
| 1280 | + | |
| 1281 | + // Compute a unique ID for the element | |
| 1282 | + if ( !id ) | |
| 1283 | + id = elem[ expando ] = ++uuid; | |
| 1284 | + | |
| 1285 | + // Only generate the data cache if we're | |
| 1286 | + // trying to access or manipulate it | |
| 1287 | + if ( name && !jQuery.cache[ id ] ) | |
| 1288 | + jQuery.cache[ id ] = {}; | |
| 1289 | + | |
| 1290 | + // Prevent overriding the named cache with undefined values | |
| 1291 | + if ( data !== undefined ) | |
| 1292 | + jQuery.cache[ id ][ name ] = data; | |
| 1293 | + | |
| 1294 | + // Return the named cache data, or the ID for the element | |
| 1295 | + return name ? | |
| 1296 | + jQuery.cache[ id ][ name ] : | |
| 1297 | + id; | |
| 1298 | + }, | |
| 1299 | + | |
| 1300 | + removeData: function( elem, name ) { | |
| 1301 | + elem = elem == window ? | |
| 1302 | + windowData : | |
| 1303 | + elem; | |
| 1304 | + | |
| 1305 | + var id = elem[ expando ]; | |
| 1306 | + | |
| 1307 | + // If we want to remove a specific section of the element's data | |
| 1308 | + if ( name ) { | |
| 1309 | + if ( jQuery.cache[ id ] ) { | |
| 1310 | + // Remove the section of cache data | |
| 1311 | + delete jQuery.cache[ id ][ name ]; | |
| 1312 | + | |
| 1313 | + // If we've removed all the data, remove the element's cache | |
| 1314 | + name = ""; | |
| 1315 | + | |
| 1316 | + for ( name in jQuery.cache[ id ] ) | |
| 1317 | + break; | |
| 1318 | + | |
| 1319 | + if ( !name ) | |
| 1320 | + jQuery.removeData( elem ); | |
| 1321 | + } | |
| 1322 | + | |
| 1323 | + // Otherwise, we want to remove all of the element's data | |
| 1324 | + } else { | |
| 1325 | + // Clean up the element expando | |
| 1326 | + try { | |
| 1327 | + delete elem[ expando ]; | |
| 1328 | + } catch(e){ | |
| 1329 | + // IE has trouble directly removing the expando | |
| 1330 | + // but it's ok with using removeAttribute | |
| 1331 | + if ( elem.removeAttribute ) | |
| 1332 | + elem.removeAttribute( expando ); | |
| 1333 | + } | |
| 1334 | + | |
| 1335 | + // Completely remove the data cache | |
| 1336 | + delete jQuery.cache[ id ]; | |
| 1337 | + } | |
| 1338 | + }, | |
| 1339 | + queue: function( elem, type, data ) { | |
| 1340 | + if ( elem ){ | |
| 1341 | + | |
| 1342 | + type = (type || "fx") + "queue"; | |
| 1343 | + | |
| 1344 | + var q = jQuery.data( elem, type ); | |
| 1345 | + | |
| 1346 | + if ( !q || jQuery.isArray(data) ) | |
| 1347 | + q = jQuery.data( elem, type, jQuery.makeArray(data) ); | |
| 1348 | + else if( data ) | |
| 1349 | + q.push( data ); | |
| 1350 | + | |
| 1351 | + } | |
| 1352 | + return q; | |
| 1353 | + }, | |
| 1354 | + | |
| 1355 | + dequeue: function( elem, type ){ | |
| 1356 | + var queue = jQuery.queue( elem, type ), | |
| 1357 | + fn = queue.shift(); | |
| 1358 | + | |
| 1359 | + if( !type || type === "fx" ) | |
| 1360 | + fn = queue[0]; | |
| 1361 | + | |
| 1362 | + if( fn !== undefined ) | |
| 1363 | + fn.call(elem); | |
| 1364 | + } | |
| 1365 | +}); | |
| 1366 | + | |
| 1367 | +jQuery.fn.extend({ | |
| 1368 | + data: function( key, value ){ | |
| 1369 | + var parts = key.split("."); | |
| 1370 | + parts[1] = parts[1] ? "." + parts[1] : ""; | |
| 1371 | + | |
| 1372 | + if ( value === undefined ) { | |
| 1373 | + var data = this.triggerHandler("getData" + parts[1] + "!", [parts[0]]); | |
| 1374 | + | |
| 1375 | + if ( data === undefined && this.length ) | |
| 1376 | + data = jQuery.data( this[0], key ); | |
| 1377 | + | |
| 1378 | + return data === undefined && parts[1] ? | |
| 1379 | + this.data( parts[0] ) : | |
| 1380 | + data; | |
| 1381 | + } else | |
| 1382 | + return this.trigger("setData" + parts[1] + "!", [parts[0], value]).each(function(){ | |
| 1383 | + jQuery.data( this, key, value ); | |
| 1384 | + }); | |
| 1385 | + }, | |
| 1386 | + | |
| 1387 | + removeData: function( key ){ | |
| 1388 | + return this.each(function(){ | |
| 1389 | + jQuery.removeData( this, key ); | |
| 1390 | + }); | |
| 1391 | + }, | |
| 1392 | + queue: function(type, data){ | |
| 1393 | + if ( typeof type !== "string" ) { | |
| 1394 | + data = type; | |
| 1395 | + type = "fx"; | |
| 1396 | + } | |
| 1397 | + | |
| 1398 | + if ( data === undefined ) | |
| 1399 | + return jQuery.queue( this[0], type ); | |
| 1400 | + | |
| 1401 | + return this.each(function(){ | |
| 1402 | + var queue = jQuery.queue( this, type, data ); | |
| 1403 | + | |
| 1404 | + if( type == "fx" && queue.length == 1 ) | |
| 1405 | + queue[0].call(this); | |
| 1406 | + }); | |
| 1407 | + }, | |
| 1408 | + dequeue: function(type){ | |
| 1409 | + return this.each(function(){ | |
| 1410 | + jQuery.dequeue( this, type ); | |
| 1411 | + }); | |
| 1412 | + } | |
| 1413 | +});/*! | |
| 1414 | + * Sizzle CSS Selector Engine - v0.9.3 | |
| 1415 | + * Copyright 2009, The Dojo Foundation | |
| 1416 | + * Released under the MIT, BSD, and GPL Licenses. | |
| 1417 | + * More information: http://sizzlejs.com/ | |
| 1418 | + */ | |
| 1419 | +(function(){ | |
| 1420 | + | |
| 1421 | +var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?/g, | |
| 1422 | + done = 0, | |
| 1423 | + toString = Object.prototype.toString; | |
| 1424 | + | |
| 1425 | +var Sizzle = function(selector, context, results, seed) { | |
| 1426 | + results = results || []; | |
| 1427 | + context = context || document; | |
| 1428 | + | |
| 1429 | + if ( context.nodeType !== 1 && context.nodeType !== 9 ) | |
| 1430 | + return []; | |
| 1431 | + | |
| 1432 | + if ( !selector || typeof selector !== "string" ) { | |
| 1433 | + return results; | |
| 1434 | + } | |
| 1435 | + | |
| 1436 | + var parts = [], m, set, checkSet, check, mode, extra, prune = true; | |
| 1437 | + | |
| 1438 | + // Reset the position of the chunker regexp (start from head) | |
| 1439 | + chunker.lastIndex = 0; | |
| 1440 | + | |
| 1441 | + while ( (m = chunker.exec(selector)) !== null ) { | |
| 1442 | + parts.push( m[1] ); | |
| 1443 | + | |
| 1444 | + if ( m[2] ) { | |
| 1445 | + extra = RegExp.rightContext; | |
| 1446 | + break; | |
| 1447 | + } | |
| 1448 | + } | |
| 1449 | + | |
| 1450 | + if ( parts.length > 1 && origPOS.exec( selector ) ) { | |
| 1451 | + if ( parts.length === 2 && Expr.relative[ parts[0] ] ) { | |
| 1452 | + set = posProcess( parts[0] + parts[1], context ); | |
| 1453 | + } else { | |
| 1454 | + set = Expr.relative[ parts[0] ] ? | |
| 1455 | + [ context ] : | |
| 1456 | + Sizzle( parts.shift(), context ); | |
| 1457 | + | |
| 1458 | + while ( parts.length ) { | |
| 1459 | + selector = parts.shift(); | |
| 1460 | + | |
| 1461 | + if ( Expr.relative[ selector ] ) | |
| 1462 | + selector += parts.shift(); | |
| 1463 | + | |
| 1464 | + set = posProcess( selector, set ); | |
| 1465 | + } | |
| 1466 | + } | |
| 1467 | + } else { | |
| 1468 | + var ret = seed ? | |
| 1469 | + { expr: parts.pop(), set: makeArray(seed) } : | |
| 1470 | + Sizzle.find( parts.pop(), parts.length === 1 && context.parentNode ? context.parentNode : context, isXML(context) ); | |
| 1471 | + set = Sizzle.filter( ret.expr, ret.set ); | |
| 1472 | + | |
| 1473 | + if ( parts.length > 0 ) { | |
| 1474 | + checkSet = makeArray(set); | |
| 1475 | + } else { | |
| 1476 | + prune = false; | |
| 1477 | + } | |
| 1478 | + | |
| 1479 | + while ( parts.length ) { | |
| 1480 | + var cur = parts.pop(), pop = cur; | |
| 1481 | + | |
| 1482 | + if ( !Expr.relative[ cur ] ) { | |
| 1483 | + cur = ""; | |
| 1484 | + } else { | |
| 1485 | + pop = parts.pop(); | |
| 1486 | + } | |
| 1487 | + | |
| 1488 | + if ( pop == null ) { | |
| 1489 | + pop = context; | |
| 1490 | + } | |
| 1491 | + | |
| 1492 | + Expr.relative[ cur ]( checkSet, pop, isXML(context) ); | |
| 1493 | + } | |
| 1494 | + } | |
| 1495 | + | |
| 1496 | + if ( !checkSet ) { | |
| 1497 | + checkSet = set; | |
| 1498 | + } | |
| 1499 | + | |
| 1500 | + if ( !checkSet ) { | |
| 1501 | + throw "Syntax error, unrecognized expression: " + (cur || selector); | |
| 1502 | + } | |
| 1503 | + | |
| 1504 | + if ( toString.call(checkSet) === "[object Array]" ) { | |
| 1505 | + if ( !prune ) { | |
| 1506 | + results.push.apply( results, checkSet ); | |
| 1507 | + } else if ( context.nodeType === 1 ) { | |
| 1508 | + for ( var i = 0; checkSet[i] != null; i++ ) { | |
| 1509 | + if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && contains(context, checkSet[i])) ) { | |
| 1510 | + results.push( set[i] ); | |
| 1511 | + } | |
| 1512 | + } | |
| 1513 | + } else { | |
| 1514 | + for ( var i = 0; checkSet[i] != null; i++ ) { | |
| 1515 | + if ( checkSet[i] && checkSet[i].nodeType === 1 ) { | |
| 1516 | + results.push( set[i] ); | |
| 1517 | + } | |
| 1518 | + } | |
| 1519 | + } | |
| 1520 | + } else { | |
| 1521 | + makeArray( checkSet, results ); | |
| 1522 | + } | |
| 1523 | + | |
| 1524 | + if ( extra ) { | |
| 1525 | + Sizzle( extra, context, results, seed ); | |
| 1526 | + | |
| 1527 | + if ( sortOrder ) { | |
| 1528 | + hasDuplicate = false; | |
| 1529 | + results.sort(sortOrder); | |
| 1530 | + | |
| 1531 | + if ( hasDuplicate ) { | |
| 1532 | + for ( var i = 1; i < results.length; i++ ) { | |
| 1533 | + if ( results[i] === results[i-1] ) { | |
| 1534 | + results.splice(i--, 1); | |
| 1535 | + } | |
| 1536 | + } | |
| 1537 | + } | |
| 1538 | + } | |
| 1539 | + } | |
| 1540 | + | |
| 1541 | + return results; | |
| 1542 | +}; | |
| 1543 | + | |
| 1544 | +Sizzle.matches = function(expr, set){ | |
| 1545 | + return Sizzle(expr, null, null, set); | |
| 1546 | +}; | |
| 1547 | + | |
| 1548 | +Sizzle.find = function(expr, context, isXML){ | |
| 1549 | + var set, match; | |
| 1550 | + | |
| 1551 | + if ( !expr ) { | |
| 1552 | + return []; | |
| 1553 | + } | |
| 1554 | + | |
| 1555 | + for ( var i = 0, l = Expr.order.length; i < l; i++ ) { | |
| 1556 | + var type = Expr.order[i], match; | |
| 1557 | + | |
| 1558 | + if ( (match = Expr.match[ type ].exec( expr )) ) { | |
| 1559 | + var left = RegExp.leftContext; | |
| 1560 | + | |
| 1561 | + if ( left.substr( left.length - 1 ) !== "\\" ) { | |
| 1562 | + match[1] = (match[1] || "").replace(/\\/g, ""); | |
| 1563 | + set = Expr.find[ type ]( match, context, isXML ); | |
| 1564 | + if ( set != null ) { | |
| 1565 | + expr = expr.replace( Expr.match[ type ], "" ); | |
| 1566 | + break; | |
| 1567 | + } | |
| 1568 | + } | |
| 1569 | + } | |
| 1570 | + } | |
| 1571 | + | |
| 1572 | + if ( !set ) { | |
| 1573 | + set = context.getElementsByTagName("*"); | |
| 1574 | + } | |
| 1575 | + | |
| 1576 | + return {set: set, expr: expr}; | |
| 1577 | +}; | |
| 1578 | + | |
| 1579 | +Sizzle.filter = function(expr, set, inplace, not){ | |
| 1580 | + var old = expr, result = [], curLoop = set, match, anyFound, | |
| 1581 | + isXMLFilter = set && set[0] && isXML(set[0]); | |
| 1582 | + | |
| 1583 | + while ( expr && set.length ) { | |
| 1584 | + for ( var type in Expr.filter ) { | |
| 1585 | + if ( (match = Expr.match[ type ].exec( expr )) != null ) { | |
| 1586 | + var filter = Expr.filter[ type ], found, item; | |
| 1587 | + anyFound = false; | |
| 1588 | + | |
| 1589 | + if ( curLoop == result ) { | |
| 1590 | + result = []; | |
| 1591 | + } | |
| 1592 | + | |
| 1593 | + if ( Expr.preFilter[ type ] ) { | |
| 1594 | + match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter ); | |
| 1595 | + | |
| 1596 | + if ( !match ) { | |
| 1597 | + anyFound = found = true; | |
| 1598 | + } else if ( match === true ) { | |
| 1599 | + continue; | |
| 1600 | + } | |
| 1601 | + } | |
| 1602 | + | |
| 1603 | + if ( match ) { | |
| 1604 | + for ( var i = 0; (item = curLoop[i]) != null; i++ ) { | |
| 1605 | + if ( item ) { | |
| 1606 | + found = filter( item, match, i, curLoop ); | |
| 1607 | + var pass = not ^ !!found; | |
| 1608 | + | |
| 1609 | + if ( inplace && found != null ) { | |
| 1610 | + if ( pass ) { | |
| 1611 | + anyFound = true; | |
| 1612 | + } else { | |
| 1613 | + curLoop[i] = false; | |
| 1614 | + } | |
| 1615 | + } else if ( pass ) { | |
| 1616 | + result.push( item ); | |
| 1617 | + anyFound = true; | |
| 1618 | + } | |
| 1619 | + } | |
| 1620 | + } | |
| 1621 | + } | |
| 1622 | + | |
| 1623 | + if ( found !== undefined ) { | |
| 1624 | + if ( !inplace ) { | |
| 1625 | + curLoop = result; | |
| 1626 | + } | |
| 1627 | + | |
| 1628 | + expr = expr.replace( Expr.match[ type ], "" ); | |
| 1629 | + | |
| 1630 | + if ( !anyFound ) { | |
| 1631 | + return []; | |
| 1632 | + } | |
| 1633 | + | |
| 1634 | + break; | |
| 1635 | + } | |
| 1636 | + } | |
| 1637 | + } | |
| 1638 | + | |
| 1639 | + // Improper expression | |
| 1640 | + if ( expr == old ) { | |
| 1641 | + if ( anyFound == null ) { | |
| 1642 | + throw "Syntax error, unrecognized expression: " + expr; | |
| 1643 | + } else { | |
| 1644 | + break; | |
| 1645 | + } | |
| 1646 | + } | |
| 1647 | + | |
| 1648 | + old = expr; | |
| 1649 | + } | |
| 1650 | + | |
| 1651 | + return curLoop; | |
| 1652 | +}; | |
| 1653 | + | |
| 1654 | +var Expr = Sizzle.selectors = { | |
| 1655 | + order: [ "ID", "NAME", "TAG" ], | |
| 1656 | + match: { | |
| 1657 | + ID: /#((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, | |
| 1658 | + CLASS: /\.((?:[\w\u00c0-\uFFFF_-]|\\.)+)/, | |
| 1659 | + NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF_-]|\\.)+)['"]*\]/, | |
| 1660 | + ATTR: /\[\s*((?:[\w\u00c0-\uFFFF_-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/, | |
| 1661 | + TAG: /^((?:[\w\u00c0-\uFFFF\*_-]|\\.)+)/, | |
| 1662 | + CHILD: /:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/, | |
| 1663 | + POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/, | |
| 1664 | + PSEUDO: /:((?:[\w\u00c0-\uFFFF_-]|\\.)+)(?:\((['"]*)((?:\([^\)]+\)|[^\2\(\)]*)+)\2\))?/ | |
| 1665 | + }, | |
| 1666 | + attrMap: { | |
| 1667 | + "class": "className", | |
| 1668 | + "for": "htmlFor" | |
| 1669 | + }, | |
| 1670 | + attrHandle: { | |
| 1671 | + href: function(elem){ | |
| 1672 | + return elem.getAttribute("href"); | |
| 1673 | + } | |
| 1674 | + }, | |
| 1675 | + relative: { | |
| 1676 | + "+": function(checkSet, part, isXML){ | |
| 1677 | + var isPartStr = typeof part === "string", | |
| 1678 | + isTag = isPartStr && !/\W/.test(part), | |
| 1679 | + isPartStrNotTag = isPartStr && !isTag; | |
| 1680 | + | |
| 1681 | + if ( isTag && !isXML ) { | |
| 1682 | + part = part.toUpperCase(); | |
| 1683 | + } | |
| 1684 | + | |
| 1685 | + for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) { | |
| 1686 | + if ( (elem = checkSet[i]) ) { | |
| 1687 | + while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {} | |
| 1688 | + | |
| 1689 | + checkSet[i] = isPartStrNotTag || elem && elem.nodeName === part ? | |
| 1690 | + elem || false : | |
| 1691 | + elem === part; | |
| 1692 | + } | |
| 1693 | + } | |
| 1694 | + | |
| 1695 | + if ( isPartStrNotTag ) { | |
| 1696 | + Sizzle.filter( part, checkSet, true ); | |
| 1697 | + } | |
| 1698 | + }, | |
| 1699 | + ">": function(checkSet, part, isXML){ | |
| 1700 | + var isPartStr = typeof part === "string"; | |
| 1701 | + | |
| 1702 | + if ( isPartStr && !/\W/.test(part) ) { | |
| 1703 | + part = isXML ? part : part.toUpperCase(); | |
| 1704 | + | |
| 1705 | + for ( var i = 0, l = checkSet.length; i < l; i++ ) { | |
| 1706 | + var elem = checkSet[i]; | |
| 1707 | + if ( elem ) { | |
| 1708 | + var parent = elem.parentNode; | |
| 1709 | + checkSet[i] = parent.nodeName === part ? parent : false; | |
| 1710 | + } | |
| 1711 | + } | |
| 1712 | + } else { | |
| 1713 | + for ( var i = 0, l = checkSet.length; i < l; i++ ) { | |
| 1714 | + var elem = checkSet[i]; | |
| 1715 | + if ( elem ) { | |
| 1716 | + checkSet[i] = isPartStr ? | |
| 1717 | + elem.parentNode : | |
| 1718 | + elem.parentNode === part; | |
| 1719 | + } | |
| 1720 | + } | |
| 1721 | + | |
| 1722 | + if ( isPartStr ) { | |
| 1723 | + Sizzle.filter( part, checkSet, true ); | |
| 1724 | + } | |
| 1725 | + } | |
| 1726 | + }, | |
| 1727 | + "": function(checkSet, part, isXML){ | |
| 1728 | + var doneName = done++, checkFn = dirCheck; | |
| 1729 | + | |
| 1730 | + if ( !part.match(/\W/) ) { | |
| 1731 | + var nodeCheck = part = isXML ? part : part.toUpperCase(); | |
| 1732 | + checkFn = dirNodeCheck; | |
| 1733 | + } | |
| 1734 | + | |
| 1735 | + checkFn("parentNode", part, doneName, checkSet, nodeCheck, isXML); | |
| 1736 | + }, | |
| 1737 | + "~": function(checkSet, part, isXML){ | |
| 1738 | + var doneName = done++, checkFn = dirCheck; | |
| 1739 | + | |
| 1740 | + if ( typeof part === "string" && !part.match(/\W/) ) { | |
| 1741 | + var nodeCheck = part = isXML ? part : part.toUpperCase(); | |
| 1742 | + checkFn = dirNodeCheck; | |
| 1743 | + } | |
| 1744 | + | |
| 1745 | + checkFn("previousSibling", part, doneName, checkSet, nodeCheck, isXML); | |
| 1746 | + } | |
| 1747 | + }, | |
| 1748 | + find: { | |
| 1749 | + ID: function(match, context, isXML){ | |
| 1750 | + if ( typeof context.getElementById !== "undefined" && !isXML ) { | |
| 1751 | + var m = context.getElementById(match[1]); | |
| 1752 | + return m ? [m] : []; | |
| 1753 | + } | |
| 1754 | + }, | |
| 1755 | + NAME: function(match, context, isXML){ | |
| 1756 | + if ( typeof context.getElementsByName !== "undefined" ) { | |
| 1757 | + var ret = [], results = context.getElementsByName(match[1]); | |
| 1758 | + | |
| 1759 | + for ( var i = 0, l = results.length; i < l; i++ ) { | |
| 1760 | + if ( results[i].getAttribute("name") === match[1] ) { | |
| 1761 | + ret.push( results[i] ); | |
| 1762 | + } | |
| 1763 | + } | |
| 1764 | + | |
| 1765 | + return ret.length === 0 ? null : ret; | |
| 1766 | + } | |
| 1767 | + }, | |
| 1768 | + TAG: function(match, context){ | |
| 1769 | + return context.getElementsByTagName(match[1]); | |
| 1770 | + } | |
| 1771 | + }, | |
| 1772 | + preFilter: { | |
| 1773 | + CLASS: function(match, curLoop, inplace, result, not, isXML){ | |
| 1774 | + match = " " + match[1].replace(/\\/g, "") + " "; | |
| 1775 | + | |
| 1776 | + if ( isXML ) { | |
| 1777 | + return match; | |
| 1778 | + } | |
| 1779 | + | |
| 1780 | + for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) { | |
| 1781 | + if ( elem ) { | |
| 1782 | + if ( not ^ (elem.className && (" " + elem.className + " ").indexOf(match) >= 0) ) { | |
| 1783 | + if ( !inplace ) | |
| 1784 | + result.push( elem ); | |
| 1785 | + } else if ( inplace ) { | |
| 1786 | + curLoop[i] = false; | |
| 1787 | + } | |
| 1788 | + } | |
| 1789 | + } | |
| 1790 | + | |
| 1791 | + return false; | |
| 1792 | + }, | |
| 1793 | + ID: function(match){ | |
| 1794 | + return match[1].replace(/\\/g, ""); | |
| 1795 | + }, | |
| 1796 | + TAG: function(match, curLoop){ | |
| 1797 | + for ( var i = 0; curLoop[i] === false; i++ ){} | |
| 1798 | + return curLoop[i] && isXML(curLoop[i]) ? match[1] : match[1].toUpperCase(); | |
| 1799 | + }, | |
| 1800 | + CHILD: function(match){ | |
| 1801 | + if ( match[1] == "nth" ) { | |
| 1802 | + // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6' | |
| 1803 | + var test = /(-?)(\d*)n((?:\+|-)?\d*)/.exec( | |
| 1804 | + match[2] == "even" && "2n" || match[2] == "odd" && "2n+1" || | |
| 1805 | + !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]); | |
| 1806 | + | |
| 1807 | + // calculate the numbers (first)n+(last) including if they are negative | |
| 1808 | + match[2] = (test[1] + (test[2] || 1)) - 0; | |
| 1809 | + match[3] = test[3] - 0; | |
| 1810 | + } | |
| 1811 | + | |
| 1812 | + // TODO: Move to normal caching system | |
| 1813 | + match[0] = done++; | |
| 1814 | + | |
| 1815 | + return match; | |
| 1816 | + }, | |
| 1817 | + ATTR: function(match, curLoop, inplace, result, not, isXML){ | |
| 1818 | + var name = match[1].replace(/\\/g, ""); | |
| 1819 | + | |
| 1820 | + if ( !isXML && Expr.attrMap[name] ) { | |
| 1821 | + match[1] = Expr.attrMap[name]; | |
| 1822 | + } | |
| 1823 | + | |
| 1824 | + if ( match[2] === "~=" ) { | |
| 1825 | + match[4] = " " + match[4] + " "; | |
| 1826 | + } | |
| 1827 | + | |
| 1828 | + return match; | |
| 1829 | + }, | |
| 1830 | + PSEUDO: function(match, curLoop, inplace, result, not){ | |
| 1831 | + if ( match[1] === "not" ) { | |
| 1832 | + // If we're dealing with a complex expression, or a simple one | |
| 1833 | + if ( match[3].match(chunker).length > 1 || /^\w/.test(match[3]) ) { | |
| 1834 | + match[3] = Sizzle(match[3], null, null, curLoop); | |
| 1835 | + } else { | |
| 1836 | + var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not); | |
| 1837 | + if ( !inplace ) { | |
| 1838 | + result.push.apply( result, ret ); | |
| 1839 | + } | |
| 1840 | + return false; | |
| 1841 | + } | |
| 1842 | + } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) { | |
| 1843 | + return true; | |
| 1844 | + } | |
| 1845 | + | |
| 1846 | + return match; | |
| 1847 | + }, | |
| 1848 | + POS: function(match){ | |
| 1849 | + match.unshift( true ); | |
| 1850 | + return match; | |
| 1851 | + } | |
| 1852 | + }, | |
| 1853 | + filters: { | |
| 1854 | + enabled: function(elem){ | |
| 1855 | + return elem.disabled === false && elem.type !== "hidden"; | |
| 1856 | + }, | |
| 1857 | + disabled: function(elem){ | |
| 1858 | + return elem.disabled === true; | |
| 1859 | + }, | |
| 1860 | + checked: function(elem){ | |
| 1861 | + return elem.checked === true; | |
| 1862 | + }, | |
| 1863 | + selected: function(elem){ | |
| 1864 | + // Accessing this property makes selected-by-default | |
| 1865 | + // options in Safari work properly | |
| 1866 | + elem.parentNode.selectedIndex; | |
| 1867 | + return elem.selected === true; | |
| 1868 | + }, | |
| 1869 | + parent: function(elem){ | |
| 1870 | + return !!elem.firstChild; | |
| 1871 | + }, | |
| 1872 | + empty: function(elem){ | |
| 1873 | + return !elem.firstChild; | |
| 1874 | + }, | |
| 1875 | + has: function(elem, i, match){ | |
| 1876 | + return !!Sizzle( match[3], elem ).length; | |
| 1877 | + }, | |
| 1878 | + header: function(elem){ | |
| 1879 | + return /h\d/i.test( elem.nodeName ); | |
| 1880 | + }, | |
| 1881 | + text: function(elem){ | |
| 1882 | + return "text" === elem.type; | |
| 1883 | + }, | |
| 1884 | + radio: function(elem){ | |
| 1885 | + return "radio" === elem.type; | |
| 1886 | + }, | |
| 1887 | + checkbox: function(elem){ | |
| 1888 | + return "checkbox" === elem.type; | |
| 1889 | + }, | |
| 1890 | + file: function(elem){ | |
| 1891 | + return "file" === elem.type; | |
| 1892 | + }, | |
| 1893 | + password: function(elem){ | |
| 1894 | + return "password" === elem.type; | |
| 1895 | + }, | |
| 1896 | + submit: function(elem){ | |
| 1897 | + return "submit" === elem.type; | |
| 1898 | + }, | |
| 1899 | + image: function(elem){ | |
| 1900 | + return "image" === elem.type; | |
| 1901 | + }, | |
| 1902 | + reset: function(elem){ | |
| 1903 | + return "reset" === elem.type; | |
| 1904 | + }, | |
| 1905 | + button: function(elem){ | |
| 1906 | + return "button" === elem.type || elem.nodeName.toUpperCase() === "BUTTON"; | |
| 1907 | + }, | |
| 1908 | + input: function(elem){ | |
| 1909 | + return /input|select|textarea|button/i.test(elem.nodeName); | |
| 1910 | + } | |
| 1911 | + }, | |
| 1912 | + setFilters: { | |
| 1913 | + first: function(elem, i){ | |
| 1914 | + return i === 0; | |
| 1915 | + }, | |
| 1916 | + last: function(elem, i, match, array){ | |
| 1917 | + return i === array.length - 1; | |
| 1918 | + }, | |
| 1919 | + even: function(elem, i){ | |
| 1920 | + return i % 2 === 0; | |
| 1921 | + }, | |
| 1922 | + odd: function(elem, i){ | |
| 1923 | + return i % 2 === 1; | |
| 1924 | + }, | |
| 1925 | + lt: function(elem, i, match){ | |
| 1926 | + return i < match[3] - 0; | |
| 1927 | + }, | |
| 1928 | + gt: function(elem, i, match){ | |
| 1929 | + return i > match[3] - 0; | |
| 1930 | + }, | |
| 1931 | + nth: function(elem, i, match){ | |
| 1932 | + return match[3] - 0 == i; | |
| 1933 | + }, | |
| 1934 | + eq: function(elem, i, match){ | |
| 1935 | + return match[3] - 0 == i; | |
| 1936 | + } | |
| 1937 | + }, | |
| 1938 | + filter: { | |
| 1939 | + PSEUDO: function(elem, match, i, array){ | |
| 1940 | + var name = match[1], filter = Expr.filters[ name ]; | |
| 1941 | + | |
| 1942 | + if ( filter ) { | |
| 1943 | + return filter( elem, i, match, array ); | |
| 1944 | + } else if ( name === "contains" ) { | |
| 1945 | + return (elem.textContent || elem.innerText || "").indexOf(match[3]) >= 0; | |
| 1946 | + } else if ( name === "not" ) { | |
| 1947 | + var not = match[3]; | |
| 1948 | + | |
| 1949 | + for ( var i = 0, l = not.length; i < l; i++ ) { | |
| 1950 | + if ( not[i] === elem ) { | |
| 1951 | + return false; | |
| 1952 | + } | |
| 1953 | + } | |
| 1954 | + | |
| 1955 | + return true; | |
| 1956 | + } | |
| 1957 | + }, | |
| 1958 | + CHILD: function(elem, match){ | |
| 1959 | + var type = match[1], node = elem; | |
| 1960 | + switch (type) { | |
| 1961 | + case 'only': | |
| 1962 | + case 'first': | |
| 1963 | + while (node = node.previousSibling) { | |
| 1964 | + if ( node.nodeType === 1 ) return false; | |
| 1965 | + } | |
| 1966 | + if ( type == 'first') return true; | |
| 1967 | + node = elem; | |
| 1968 | + case 'last': | |
| 1969 | + while (node = node.nextSibling) { | |
| 1970 | + if ( node.nodeType === 1 ) return false; | |
| 1971 | + } | |
| 1972 | + return true; | |
| 1973 | + case 'nth': | |
| 1974 | + var first = match[2], last = match[3]; | |
| 1975 | + | |
| 1976 | + if ( first == 1 && last == 0 ) { | |
| 1977 | + return true; | |
| 1978 | + } | |
| 1979 | + | |
| 1980 | + var doneName = match[0], | |
| 1981 | + parent = elem.parentNode; | |
| 1982 | + | |
| 1983 | + if ( parent && (parent.sizcache !== doneName || !elem.nodeIndex) ) { | |
| 1984 | + var count = 0; | |
| 1985 | + for ( node = parent.firstChild; node; node = node.nextSibling ) { | |
| 1986 | + if ( node.nodeType === 1 ) { | |
| 1987 | + node.nodeIndex = ++count; | |
| 1988 | + } | |
| 1989 | + } | |
| 1990 | + parent.sizcache = doneName; | |
| 1991 | + } | |
| 1992 | + | |
| 1993 | + var diff = elem.nodeIndex - last; | |
| 1994 | + if ( first == 0 ) { | |
| 1995 | + return diff == 0; | |
| 1996 | + } else { | |
| 1997 | + return ( diff % first == 0 && diff / first >= 0 ); | |
| 1998 | + } | |
| 1999 | + } | |
| 2000 | + }, | |
| 2001 | + ID: function(elem, match){ | |
| 2002 | + return elem.nodeType === 1 && elem.getAttribute("id") === match; | |
| 2003 | + }, | |
| 2004 | + TAG: function(elem, match){ | |
| 2005 | + return (match === "*" && elem.nodeType === 1) || elem.nodeName === match; | |
| 2006 | + }, | |
| 2007 | + CLASS: function(elem, match){ | |
| 2008 | + return (" " + (elem.className || elem.getAttribute("class")) + " ") | |
| 2009 | + .indexOf( match ) > -1; | |
| 2010 | + }, | |
| 2011 | + ATTR: function(elem, match){ | |
| 2012 | + var name = match[1], | |
| 2013 | + result = Expr.attrHandle[ name ] ? | |
| 2014 | + Expr.attrHandle[ name ]( elem ) : | |
| 2015 | + elem[ name ] != null ? | |
| 2016 | + elem[ name ] : | |
| 2017 | + elem.getAttribute( name ), | |
| 2018 | + value = result + "", | |
| 2019 | + type = match[2], | |
| 2020 | + check = match[4]; | |
| 2021 | + | |
| 2022 | + return result == null ? | |
| 2023 | + type === "!=" : | |
| 2024 | + type === "=" ? | |
| 2025 | + value === check : | |
| 2026 | + type === "*=" ? | |
| 2027 | + value.indexOf(check) >= 0 : | |
| 2028 | + type === "~=" ? | |
| 2029 | + (" " + value + " ").indexOf(check) >= 0 : | |
| 2030 | + !check ? | |
| 2031 | + value && result !== false : | |
| 2032 | + type === "!=" ? | |
| 2033 | + value != check : | |
| 2034 | + type === "^=" ? | |
| 2035 | + value.indexOf(check) === 0 : | |
| 2036 | + type === "$=" ? | |
| 2037 | + value.substr(value.length - check.length) === check : | |
| 2038 | + type === "|=" ? | |
| 2039 | + value === check || value.substr(0, check.length + 1) === check + "-" : | |
| 2040 | + false; | |
| 2041 | + }, | |
| 2042 | + POS: function(elem, match, i, array){ | |
| 2043 | + var name = match[2], filter = Expr.setFilters[ name ]; | |
| 2044 | + | |
| 2045 | + if ( filter ) { | |
| 2046 | + return filter( elem, i, match, array ); | |
| 2047 | + } | |
| 2048 | + } | |
| 2049 | + } | |
| 2050 | +}; | |
| 2051 | + | |
| 2052 | +var origPOS = Expr.match.POS; | |
| 2053 | + | |
| 2054 | +for ( var type in Expr.match ) { | |
| 2055 | + Expr.match[ type ] = RegExp( Expr.match[ type ].source + /(?![^\[]*\])(?![^\(]*\))/.source ); | |
| 2056 | +} | |
| 2057 | + | |
| 2058 | +var makeArray = function(array, results) { | |
| 2059 | + array = Array.prototype.slice.call( array ); | |
| 2060 | + | |
| 2061 | + if ( results ) { | |
| 2062 | + results.push.apply( results, array ); | |
| 2063 | + return results; | |
| 2064 | + } | |
| 2065 | + | |
| 2066 | + return array; | |
| 2067 | +}; | |
| 2068 | + | |
| 2069 | +// Perform a simple check to determine if the browser is capable of | |
| 2070 | +// converting a NodeList to an array using builtin methods. | |
| 2071 | +try { | |
| 2072 | + Array.prototype.slice.call( document.documentElement.childNodes ); | |
| 2073 | + | |
| 2074 | +// Provide a fallback method if it does not work | |
| 2075 | +} catch(e){ | |
| 2076 | + makeArray = function(array, results) { | |
| 2077 | + var ret = results || []; | |
| 2078 | + | |
| 2079 | + if ( toString.call(array) === "[object Array]" ) { | |
| 2080 | + Array.prototype.push.apply( ret, array ); | |
| 2081 | + } else { | |
| 2082 | + if ( typeof array.length === "number" ) { | |
| 2083 | + for ( var i = 0, l = array.length; i < l; i++ ) { | |
| 2084 | + ret.push( array[i] ); | |
| 2085 | + } | |
| 2086 | + } else { | |
| 2087 | + for ( var i = 0; array[i]; i++ ) { | |
| 2088 | + ret.push( array[i] ); | |
| 2089 | + } | |
| 2090 | + } | |
| 2091 | + } | |
| 2092 | + | |
| 2093 | + return ret; | |
| 2094 | + }; | |
| 2095 | +} | |
| 2096 | + | |
| 2097 | +var sortOrder; | |
| 2098 | + | |
| 2099 | +if ( document.documentElement.compareDocumentPosition ) { | |
| 2100 | + sortOrder = function( a, b ) { | |
| 2101 | + var ret = a.compareDocumentPosition(b) & 4 ? -1 : a === b ? 0 : 1; | |
| 2102 | + if ( ret === 0 ) { | |
| 2103 | + hasDuplicate = true; | |
| 2104 | + } | |
| 2105 | + return ret; | |
| 2106 | + }; | |
| 2107 | +} else if ( "sourceIndex" in document.documentElement ) { | |
| 2108 | + sortOrder = function( a, b ) { | |
| 2109 | + var ret = a.sourceIndex - b.sourceIndex; | |
| 2110 | + if ( ret === 0 ) { | |
| 2111 | + hasDuplicate = true; | |
| 2112 | + } | |
| 2113 | + return ret; | |
| 2114 | + }; | |
| 2115 | +} else if ( document.createRange ) { | |
| 2116 | + sortOrder = function( a, b ) { | |
| 2117 | + var aRange = a.ownerDocument.createRange(), bRange = b.ownerDocument.createRange(); | |
| 2118 | + aRange.selectNode(a); | |
| 2119 | + aRange.collapse(true); | |
| 2120 | + bRange.selectNode(b); | |
| 2121 | + bRange.collapse(true); | |
| 2122 | + var ret = aRange.compareBoundaryPoints(Range.START_TO_END, bRange); | |
| 2123 | + if ( ret === 0 ) { | |
| 2124 | + hasDuplicate = true; | |
| 2125 | + } | |
| 2126 | + return ret; | |
| 2127 | + }; | |
| 2128 | +} | |
| 2129 | + | |
| 2130 | +// Check to see if the browser returns elements by name when | |
| 2131 | +// querying by getElementById (and provide a workaround) | |
| 2132 | +(function(){ | |
| 2133 | + // We're going to inject a fake input element with a specified name | |
| 2134 | + var form = document.createElement("form"), | |
| 2135 | + id = "script" + (new Date).getTime(); | |
| 2136 | + form.innerHTML = "<input name='" + id + "'/>"; | |
| 2137 | + | |
| 2138 | + // Inject it into the root element, check its status, and remove it quickly | |
| 2139 | + var root = document.documentElement; | |
| 2140 | + root.insertBefore( form, root.firstChild ); | |
| 2141 | + | |
| 2142 | + // The workaround has to do additional checks after a getElementById | |
| 2143 | + // Which slows things down for other browsers (hence the branching) | |
| 2144 | + if ( !!document.getElementById( id ) ) { | |
| 2145 | + Expr.find.ID = function(match, context, isXML){ | |
| 2146 | + if ( typeof context.getElementById !== "undefined" && !isXML ) { | |
| 2147 | + var m = context.getElementById(match[1]); | |
| 2148 | + return m ? m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ? [m] : undefined : []; | |
| 2149 | + } | |
| 2150 | + }; | |
| 2151 | + | |
| 2152 | + Expr.filter.ID = function(elem, match){ | |
| 2153 | + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); | |
| 2154 | + return elem.nodeType === 1 && node && node.nodeValue === match; | |
| 2155 | + }; | |
| 2156 | + } | |
| 2157 | + | |
| 2158 | + root.removeChild( form ); | |
| 2159 | +})(); | |
| 2160 | + | |
| 2161 | +(function(){ | |
| 2162 | + // Check to see if the browser returns only elements | |
| 2163 | + // when doing getElementsByTagName("*") | |
| 2164 | + | |
| 2165 | + // Create a fake element | |
| 2166 | + var div = document.createElement("div"); | |
| 2167 | + div.appendChild( document.createComment("") ); | |
| 2168 | + | |
| 2169 | + // Make sure no comments are found | |
| 2170 | + if ( div.getElementsByTagName("*").length > 0 ) { | |
| 2171 | + Expr.find.TAG = function(match, context){ | |
| 2172 | + var results = context.getElementsByTagName(match[1]); | |
| 2173 | + | |
| 2174 | + // Filter out possible comments | |
| 2175 | + if ( match[1] === "*" ) { | |
| 2176 | + var tmp = []; | |
| 2177 | + | |
| 2178 | + for ( var i = 0; results[i]; i++ ) { | |
| 2179 | + if ( results[i].nodeType === 1 ) { | |
| 2180 | + tmp.push( results[i] ); | |
| 2181 | + } | |
| 2182 | + } | |
| 2183 | + | |
| 2184 | + results = tmp; | |
| 2185 | + } | |
| 2186 | + | |
| 2187 | + return results; | |
| 2188 | + }; | |
| 2189 | + } | |
| 2190 | + | |
| 2191 | + // Check to see if an attribute returns normalized href attributes | |
| 2192 | + div.innerHTML = "<a href='#'></a>"; | |
| 2193 | + if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" && | |
| 2194 | + div.firstChild.getAttribute("href") !== "#" ) { | |
| 2195 | + Expr.attrHandle.href = function(elem){ | |
| 2196 | + return elem.getAttribute("href", 2); | |
| 2197 | + }; | |
| 2198 | + } | |
| 2199 | +})(); | |
| 2200 | + | |
| 2201 | +if ( document.querySelectorAll ) (function(){ | |
| 2202 | + var oldSizzle = Sizzle, div = document.createElement("div"); | |
| 2203 | + div.innerHTML = "<p class='TEST'></p>"; | |
| 2204 | + | |
| 2205 | + // Safari can't handle uppercase or unicode characters when | |
| 2206 | + // in quirks mode. | |
| 2207 | + if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) { | |
| 2208 | + return; | |
| 2209 | + } | |
| 2210 | + | |
| 2211 | + Sizzle = function(query, context, extra, seed){ | |
| 2212 | + context = context || document; | |
| 2213 | + | |
| 2214 | + // Only use querySelectorAll on non-XML documents | |
| 2215 | + // (ID selectors don't work in non-HTML documents) | |
| 2216 | + if ( !seed && context.nodeType === 9 && !isXML(context) ) { | |
| 2217 | + try { | |
| 2218 | + return makeArray( context.querySelectorAll(query), extra ); | |
| 2219 | + } catch(e){} | |
| 2220 | + } | |
| 2221 | + | |
| 2222 | + return oldSizzle(query, context, extra, seed); | |
| 2223 | + }; | |
| 2224 | + | |
| 2225 | + Sizzle.find = oldSizzle.find; | |
| 2226 | + Sizzle.filter = oldSizzle.filter; | |
| 2227 | + Sizzle.selectors = oldSizzle.selectors; | |
| 2228 | + Sizzle.matches = oldSizzle.matches; | |
| 2229 | +})(); | |
| 2230 | + | |
| 2231 | +if ( document.getElementsByClassName && document.documentElement.getElementsByClassName ) (function(){ | |
| 2232 | + var div = document.createElement("div"); | |
| 2233 | + div.innerHTML = "<div class='test e'></div><div class='test'></div>"; | |
| 2234 | + | |
| 2235 | + // Opera can't find a second classname (in 9.6) | |
| 2236 | + if ( div.getElementsByClassName("e").length === 0 ) | |
| 2237 | + return; | |
| 2238 | + | |
| 2239 | + // Safari caches class attributes, doesn't catch changes (in 3.2) | |
| 2240 | + div.lastChild.className = "e"; | |
| 2241 | + | |
| 2242 | + if ( div.getElementsByClassName("e").length === 1 ) | |
| 2243 | + return; | |
| 2244 | + | |
| 2245 | + Expr.order.splice(1, 0, "CLASS"); | |
| 2246 | + Expr.find.CLASS = function(match, context, isXML) { | |
| 2247 | + if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) { | |
| 2248 | + return context.getElementsByClassName(match[1]); | |
| 2249 | + } | |
| 2250 | + }; | |
| 2251 | +})(); | |
| 2252 | + | |
| 2253 | +function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | |
| 2254 | + var sibDir = dir == "previousSibling" && !isXML; | |
| 2255 | + for ( var i = 0, l = checkSet.length; i < l; i++ ) { | |
| 2256 | + var elem = checkSet[i]; | |
| 2257 | + if ( elem ) { | |
| 2258 | + if ( sibDir && elem.nodeType === 1 ){ | |
| 2259 | + elem.sizcache = doneName; | |
| 2260 | + elem.sizset = i; | |
| 2261 | + } | |
| 2262 | + elem = elem[dir]; | |
| 2263 | + var match = false; | |
| 2264 | + | |
| 2265 | + while ( elem ) { | |
| 2266 | + if ( elem.sizcache === doneName ) { | |
| 2267 | + match = checkSet[elem.sizset]; | |
| 2268 | + break; | |
| 2269 | + } | |
| 2270 | + | |
| 2271 | + if ( elem.nodeType === 1 && !isXML ){ | |
| 2272 | + elem.sizcache = doneName; | |
| 2273 | + elem.sizset = i; | |
| 2274 | + } | |
| 2275 | + | |
| 2276 | + if ( elem.nodeName === cur ) { | |
| 2277 | + match = elem; | |
| 2278 | + break; | |
| 2279 | + } | |
| 2280 | + | |
| 2281 | + elem = elem[dir]; | |
| 2282 | + } | |
| 2283 | + | |
| 2284 | + checkSet[i] = match; | |
| 2285 | + } | |
| 2286 | + } | |
| 2287 | +} | |
| 2288 | + | |
| 2289 | +function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) { | |
| 2290 | + var sibDir = dir == "previousSibling" && !isXML; | |
| 2291 | + for ( var i = 0, l = checkSet.length; i < l; i++ ) { | |
| 2292 | + var elem = checkSet[i]; | |
| 2293 | + if ( elem ) { | |
| 2294 | + if ( sibDir && elem.nodeType === 1 ) { | |
| 2295 | + elem.sizcache = doneName; | |
| 2296 | + elem.sizset = i; | |
| 2297 | + } | |
| 2298 | + elem = elem[dir]; | |
| 2299 | + var match = false; | |
| 2300 | + | |
| 2301 | + while ( elem ) { | |
| 2302 | + if ( elem.sizcache === doneName ) { | |
| 2303 | + match = checkSet[elem.sizset]; | |
| 2304 | + break; | |
| 2305 | + } | |
| 2306 | + | |
| 2307 | + if ( elem.nodeType === 1 ) { | |
| 2308 | + if ( !isXML ) { | |
| 2309 | + elem.sizcache = doneName; | |
| 2310 | + elem.sizset = i; | |
| 2311 | + } | |
| 2312 | + if ( typeof cur !== "string" ) { | |
| 2313 | + if ( elem === cur ) { | |
| 2314 | + match = true; | |
| 2315 | + break; | |
| 2316 | + } | |
| 2317 | + | |
| 2318 | + } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) { | |
| 2319 | + match = elem; | |
| 2320 | + break; | |
| 2321 | + } | |
| 2322 | + } | |
| 2323 | + | |
| 2324 | + elem = elem[dir]; | |
| 2325 | + } | |
| 2326 | + | |
| 2327 | + checkSet[i] = match; | |
| 2328 | + } | |
| 2329 | + } | |
| 2330 | +} | |
| 2331 | + | |
| 2332 | +var contains = document.compareDocumentPosition ? function(a, b){ | |
| 2333 | + return a.compareDocumentPosition(b) & 16; | |
| 2334 | +} : function(a, b){ | |
| 2335 | + return a !== b && (a.contains ? a.contains(b) : true); | |
| 2336 | +}; | |
| 2337 | + | |
| 2338 | +var isXML = function(elem){ | |
| 2339 | + return elem.nodeType === 9 && elem.documentElement.nodeName !== "HTML" || | |
| 2340 | + !!elem.ownerDocument && isXML( elem.ownerDocument ); | |
| 2341 | +}; | |
| 2342 | + | |
| 2343 | +var posProcess = function(selector, context){ | |
| 2344 | + var tmpSet = [], later = "", match, | |
| 2345 | + root = context.nodeType ? [context] : context; | |
| 2346 | + | |
| 2347 | + // Position selectors must be done after the filter | |
| 2348 | + // And so must :not(positional) so we move all PSEUDOs to the end | |
| 2349 | + while ( (match = Expr.match.PSEUDO.exec( selector )) ) { | |
| 2350 | + later += match[0]; | |
| 2351 | + selector = selector.replace( Expr.match.PSEUDO, "" ); | |
| 2352 | + } | |
| 2353 | + | |
| 2354 | + selector = Expr.relative[selector] ? selector + "*" : selector; | |
| 2355 | + | |
| 2356 | + for ( var i = 0, l = root.length; i < l; i++ ) { | |
| 2357 | + Sizzle( selector, root[i], tmpSet ); | |
| 2358 | + } | |
| 2359 | + | |
| 2360 | + return Sizzle.filter( later, tmpSet ); | |
| 2361 | +}; | |
| 2362 | + | |
| 2363 | +// EXPOSE | |
| 2364 | +jQuery.find = Sizzle; | |
| 2365 | +jQuery.filter = Sizzle.filter; | |
| 2366 | +jQuery.expr = Sizzle.selectors; | |
| 2367 | +jQuery.expr[":"] = jQuery.expr.filters; | |
| 2368 | + | |
| 2369 | +Sizzle.selectors.filters.hidden = function(elem){ | |
| 2370 | + return elem.offsetWidth === 0 || elem.offsetHeight === 0; | |
| 2371 | +}; | |
| 2372 | + | |
| 2373 | +Sizzle.selectors.filters.visible = function(elem){ | |
| 2374 | + return elem.offsetWidth > 0 || elem.offsetHeight > 0; | |
| 2375 | +}; | |
| 2376 | + | |
| 2377 | +Sizzle.selectors.filters.animated = function(elem){ | |
| 2378 | + return jQuery.grep(jQuery.timers, function(fn){ | |
| 2379 | + return elem === fn.elem; | |
| 2380 | + }).length; | |
| 2381 | +}; | |
| 2382 | + | |
| 2383 | +jQuery.multiFilter = function( expr, elems, not ) { | |
| 2384 | + if ( not ) { | |
| 2385 | + expr = ":not(" + expr + ")"; | |
| 2386 | + } | |
| 2387 | + | |
| 2388 | + return Sizzle.matches(expr, elems); | |
| 2389 | +}; | |
| 2390 | + | |
| 2391 | +jQuery.dir = function( elem, dir ){ | |
| 2392 | + var matched = [], cur = elem[dir]; | |
| 2393 | + while ( cur && cur != document ) { | |
| 2394 | + if ( cur.nodeType == 1 ) | |
| 2395 | + matched.push( cur ); | |
| 2396 | + cur = cur[dir]; | |
| 2397 | + } | |
| 2398 | + return matched; | |
| 2399 | +}; | |
| 2400 | + | |
| 2401 | +jQuery.nth = function(cur, result, dir, elem){ | |
| 2402 | + result = result || 1; | |
| 2403 | + var num = 0; | |
| 2404 | + | |
| 2405 | + for ( ; cur; cur = cur[dir] ) | |
| 2406 | + if ( cur.nodeType == 1 && ++num == result ) | |
| 2407 | + break; | |
| 2408 | + | |
| 2409 | + return cur; | |
| 2410 | +}; | |
| 2411 | + | |
| 2412 | +jQuery.sibling = function(n, elem){ | |
| 2413 | + var r = []; | |
| 2414 | + | |
| 2415 | + for ( ; n; n = n.nextSibling ) { | |
| 2416 | + if ( n.nodeType == 1 && n != elem ) | |
| 2417 | + r.push( n ); | |
| 2418 | + } | |
| 2419 | + | |
| 2420 | + return r; | |
| 2421 | +}; | |
| 2422 | + | |
| 2423 | +return; | |
| 2424 | + | |
| 2425 | +window.Sizzle = Sizzle; | |
| 2426 | + | |
| 2427 | +})(); | |
| 2428 | +/* | |
| 2429 | + * A number of helper functions used for managing events. | |
| 2430 | + * Many of the ideas behind this code originated from | |
| 2431 | + * Dean Edwards' addEvent library. | |
| 2432 | + */ | |
| 2433 | +jQuery.event = { | |
| 2434 | + | |
| 2435 | + // Bind an event to an element | |
| 2436 | + // Original by Dean Edwards | |
| 2437 | + add: function(elem, types, handler, data) { | |
| 2438 | + if ( elem.nodeType == 3 || elem.nodeType == 8 ) | |
| 2439 | + return; | |
| 2440 | + | |
| 2441 | + // For whatever reason, IE has trouble passing the window object | |
| 2442 | + // around, causing it to be cloned in the process | |
| 2443 | + if ( elem.setInterval && elem != window ) | |
| 2444 | + elem = window; | |
| 2445 | + | |
| 2446 | + // Make sure that the function being executed has a unique ID | |
| 2447 | + if ( !handler.guid ) | |
| 2448 | + handler.guid = this.guid++; | |
| 2449 | + | |
| 2450 | + // if data is passed, bind to handler | |
| 2451 | + if ( data !== undefined ) { | |
| 2452 | + // Create temporary function pointer to original handler | |
| 2453 | + var fn = handler; | |
| 2454 | + | |
| 2455 | + // Create unique handler function, wrapped around original handler | |
| 2456 | + handler = this.proxy( fn ); | |
| 2457 | + | |
| 2458 | + // Store data in unique handler | |
| 2459 | + handler.data = data; | |
| 2460 | + } | |
| 2461 | + | |
| 2462 | + // Init the element's event structure | |
| 2463 | + var events = jQuery.data(elem, "events") || jQuery.data(elem, "events", {}), | |
| 2464 | + handle = jQuery.data(elem, "handle") || jQuery.data(elem, "handle", function(){ | |
| 2465 | + // Handle the second event of a trigger and when | |
| 2466 | + // an event is called after a page has unloaded | |
| 2467 | + return typeof jQuery !== "undefined" && !jQuery.event.triggered ? | |
| 2468 | + jQuery.event.handle.apply(arguments.callee.elem, arguments) : | |
| 2469 | + undefined; | |
| 2470 | + }); | |
| 2471 | + // Add elem as a property of the handle function | |
| 2472 | + // This is to prevent a memory leak with non-native | |
| 2473 | + // event in IE. | |
| 2474 | + handle.elem = elem; | |
| 2475 | + | |
| 2476 | + // Handle multiple events separated by a space | |
| 2477 | + // jQuery(...).bind("mouseover mouseout", fn); | |
| 2478 | + jQuery.each(types.split(/\s+/), function(index, type) { | |
| 2479 | + // Namespaced event handlers | |
| 2480 | + var namespaces = type.split("."); | |
| 2481 | + type = namespaces.shift(); | |
| 2482 | + handler.type = namespaces.slice().sort().join("."); | |
| 2483 | + | |
| 2484 | + // Get the current list of functions bound to this event | |
| 2485 | + var handlers = events[type]; | |
| 2486 | + | |
| 2487 | + if ( jQuery.event.specialAll[type] ) | |
| 2488 | + jQuery.event.specialAll[type].setup.call(elem, data, namespaces); | |
| 2489 | + | |
| 2490 | + // Init the event handler queue | |
| 2491 | + if (!handlers) { | |
| 2492 | + handlers = events[type] = {}; | |
| 2493 | + | |
| 2494 | + // Check for a special event handler | |
| 2495 | + // Only use addEventListener/attachEvent if the special | |
| 2496 | + // events handler returns false | |
| 2497 | + if ( !jQuery.event.special[type] || jQuery.event.special[type].setup.call(elem, data, namespaces) === false ) { | |
| 2498 | + // Bind the global event handler to the element | |
| 2499 | + if (elem.addEventListener) | |
| 2500 | + elem.addEventListener(type, handle, false); | |
| 2501 | + else if (elem.attachEvent) | |
| 2502 | + elem.attachEvent("on" + type, handle); | |
| 2503 | + } | |
| 2504 | + } | |
| 2505 | + | |
| 2506 | + // Add the function to the element's handler list | |
| 2507 | + handlers[handler.guid] = handler; | |
| 2508 | + | |
| 2509 | + // Keep track of which events have been used, for global triggering | |
| 2510 | + jQuery.event.global[type] = true; | |
| 2511 | + }); | |
| 2512 | + | |
| 2513 | + // Nullify elem to prevent memory leaks in IE | |
| 2514 | + elem = null; | |
| 2515 | + }, | |
| 2516 | + | |
| 2517 | + guid: 1, | |
| 2518 | + global: {}, | |
| 2519 | + | |
| 2520 | + // Detach an event or set of events from an element | |
| 2521 | + remove: function(elem, types, handler) { | |
| 2522 | + // don't do events on text and comment nodes | |
| 2523 | + if ( elem.nodeType == 3 || elem.nodeType == 8 ) | |
| 2524 | + return; | |
| 2525 | + | |
| 2526 | + var events = jQuery.data(elem, "events"), ret, index; | |
| 2527 | + | |
| 2528 | + if ( events ) { | |
| 2529 | + // Unbind all events for the element | |
| 2530 | + if ( types === undefined || (typeof types === "string" && types.charAt(0) == ".") ) | |
| 2531 | + for ( var type in events ) | |
| 2532 | + this.remove( elem, type + (types || "") ); | |
| 2533 | + else { | |
| 2534 | + // types is actually an event object here | |
| 2535 | + if ( types.type ) { | |
| 2536 | + handler = types.handler; | |
| 2537 | + types = types.type; | |
| 2538 | + } | |
| 2539 | + | |
| 2540 | + // Handle multiple events seperated by a space | |
| 2541 | + // jQuery(...).unbind("mouseover mouseout", fn); | |
| 2542 | + jQuery.each(types.split(/\s+/), function(index, type){ | |
| 2543 | + // Namespaced event handlers | |
| 2544 | + var namespaces = type.split("."); | |
| 2545 | + type = namespaces.shift(); | |
| 2546 | + var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); | |
| 2547 | + | |
| 2548 | + if ( events[type] ) { | |
| 2549 | + // remove the given handler for the given type | |
| 2550 | + if ( handler ) | |
| 2551 | + delete events[type][handler.guid]; | |
| 2552 | + | |
| 2553 | + // remove all handlers for the given type | |
| 2554 | + else | |
| 2555 | + for ( var handle in events[type] ) | |
| 2556 | + // Handle the removal of namespaced events | |
| 2557 | + if ( namespace.test(events[type][handle].type) ) | |
| 2558 | + delete events[type][handle]; | |
| 2559 | + | |
| 2560 | + if ( jQuery.event.specialAll[type] ) | |
| 2561 | + jQuery.event.specialAll[type].teardown.call(elem, namespaces); | |
| 2562 | + | |
| 2563 | + // remove generic event handler if no more handlers exist | |
| 2564 | + for ( ret in events[type] ) break; | |
| 2565 | + if ( !ret ) { | |
| 2566 | + if ( !jQuery.event.special[type] || jQuery.event.special[type].teardown.call(elem, namespaces) === false ) { | |
| 2567 | + if (elem.removeEventListener) | |
| 2568 | + elem.removeEventListener(type, jQuery.data(elem, "handle"), false); | |
| 2569 | + else if (elem.detachEvent) | |
| 2570 | + elem.detachEvent("on" + type, jQuery.data(elem, "handle")); | |
| 2571 | + } | |
| 2572 | + ret = null; | |
| 2573 | + delete events[type]; | |
| 2574 | + } | |
| 2575 | + } | |
| 2576 | + }); | |
| 2577 | + } | |
| 2578 | + | |
| 2579 | + // Remove the expando if it's no longer used | |
| 2580 | + for ( ret in events ) break; | |
| 2581 | + if ( !ret ) { | |
| 2582 | + var handle = jQuery.data( elem, "handle" ); | |
| 2583 | + if ( handle ) handle.elem = null; | |
| 2584 | + jQuery.removeData( elem, "events" ); | |
| 2585 | + jQuery.removeData( elem, "handle" ); | |
| 2586 | + } | |
| 2587 | + } | |
| 2588 | + }, | |
| 2589 | + | |
| 2590 | + // bubbling is internal | |
| 2591 | + trigger: function( event, data, elem, bubbling ) { | |
| 2592 | + // Event object or event type | |
| 2593 | + var type = event.type || event; | |
| 2594 | + | |
| 2595 | + if( !bubbling ){ | |
| 2596 | + event = typeof event === "object" ? | |
| 2597 | + // jQuery.Event object | |
| 2598 | + event[expando] ? event : | |
| 2599 | + // Object literal | |
| 2600 | + jQuery.extend( jQuery.Event(type), event ) : | |
| 2601 | + // Just the event type (string) | |
| 2602 | + jQuery.Event(type); | |
| 2603 | + | |
| 2604 | + if ( type.indexOf("!") >= 0 ) { | |
| 2605 | + event.type = type = type.slice(0, -1); | |
| 2606 | + event.exclusive = true; | |
| 2607 | + } | |
| 2608 | + | |
| 2609 | + // Handle a global trigger | |
| 2610 | + if ( !elem ) { | |
| 2611 | + // Don't bubble custom events when global (to avoid too much overhead) | |
| 2612 | + event.stopPropagation(); | |
| 2613 | + // Only trigger if we've ever bound an event for it | |
| 2614 | + if ( this.global[type] ) | |
| 2615 | + jQuery.each( jQuery.cache, function(){ | |
| 2616 | + if ( this.events && this.events[type] ) | |
| 2617 | + jQuery.event.trigger( event, data, this.handle.elem ); | |
| 2618 | + }); | |
| 2619 | + } | |
| 2620 | + | |
| 2621 | + // Handle triggering a single element | |
| 2622 | + | |
| 2623 | + // don't do events on text and comment nodes | |
| 2624 | + if ( !elem || elem.nodeType == 3 || elem.nodeType == 8 ) | |
| 2625 | + return undefined; | |
| 2626 | + | |
| 2627 | + // Clean up in case it is reused | |
| 2628 | + event.result = undefined; | |
| 2629 | + event.target = elem; | |
| 2630 | + | |
| 2631 | + // Clone the incoming data, if any | |
| 2632 | + data = jQuery.makeArray(data); | |
| 2633 | + data.unshift( event ); | |
| 2634 | + } | |
| 2635 | + | |
| 2636 | + event.currentTarget = elem; | |
| 2637 | + | |
| 2638 | + // Trigger the event, it is assumed that "handle" is a function | |
| 2639 | + var handle = jQuery.data(elem, "handle"); | |
| 2640 | + if ( handle ) | |
| 2641 | + handle.apply( elem, data ); | |
| 2642 | + | |
| 2643 | + // Handle triggering native .onfoo handlers (and on links since we don't call .click() for links) | |
| 2644 | + if ( (!elem[type] || (jQuery.nodeName(elem, 'a') && type == "click")) && elem["on"+type] && elem["on"+type].apply( elem, data ) === false ) | |
| 2645 | + event.result = false; | |
| 2646 | + | |
| 2647 | + // Trigger the native events (except for clicks on links) | |
| 2648 | + if ( !bubbling && elem[type] && !event.isDefaultPrevented() && !(jQuery.nodeName(elem, 'a') && type == "click") ) { | |
| 2649 | + this.triggered = true; | |
| 2650 | + try { | |
| 2651 | + elem[ type ](); | |
| 2652 | + // prevent IE from throwing an error for some hidden elements | |
| 2653 | + } catch (e) {} | |
| 2654 | + } | |
| 2655 | + | |
| 2656 | + this.triggered = false; | |
| 2657 | + | |
| 2658 | + if ( !event.isPropagationStopped() ) { | |
| 2659 | + var parent = elem.parentNode || elem.ownerDocument; | |
| 2660 | + if ( parent ) | |
| 2661 | + jQuery.event.trigger(event, data, parent, true); | |
| 2662 | + } | |
| 2663 | + }, | |
| 2664 | + | |
| 2665 | + handle: function(event) { | |
| 2666 | + // returned undefined or false | |
| 2667 | + var all, handlers; | |
| 2668 | + | |
| 2669 | + event = arguments[0] = jQuery.event.fix( event || window.event ); | |
| 2670 | + event.currentTarget = this; | |
| 2671 | + | |
| 2672 | + // Namespaced event handlers | |
| 2673 | + var namespaces = event.type.split("."); | |
| 2674 | + event.type = namespaces.shift(); | |
| 2675 | + | |
| 2676 | + // Cache this now, all = true means, any handler | |
| 2677 | + all = !namespaces.length && !event.exclusive; | |
| 2678 | + | |
| 2679 | + var namespace = RegExp("(^|\\.)" + namespaces.slice().sort().join(".*\\.") + "(\\.|$)"); | |
| 2680 | + | |
| 2681 | + handlers = ( jQuery.data(this, "events") || {} )[event.type]; | |
| 2682 | + | |
| 2683 | + for ( var j in handlers ) { | |
| 2684 | + var handler = handlers[j]; | |
| 2685 | + | |
| 2686 | + // Filter the functions by class | |
| 2687 | + if ( all || namespace.test(handler.type) ) { | |
| 2688 | + // Pass in a reference to the handler function itself | |
| 2689 | + // So that we can later remove it | |
| 2690 | + event.handler = handler; | |
| 2691 | + event.data = handler.data; | |
| 2692 | + | |
| 2693 | + var ret = handler.apply(this, arguments); | |
| 2694 | + | |
| 2695 | + if( ret !== undefined ){ | |
| 2696 | + event.result = ret; | |
| 2697 | + if ( ret === false ) { | |
| 2698 | + event.preventDefault(); | |
| 2699 | + event.stopPropagation(); | |
| 2700 | + } | |
| 2701 | + } | |
| 2702 | + | |
| 2703 | + if( event.isImmediatePropagationStopped() ) | |
| 2704 | + break; | |
| 2705 | + | |
| 2706 | + } | |
| 2707 | + } | |
| 2708 | + }, | |
| 2709 | + | |
| 2710 | + props: "altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), | |
| 2711 | + | |
| 2712 | + fix: function(event) { | |
| 2713 | + if ( event[expando] ) | |
| 2714 | + return event; | |
| 2715 | + | |
| 2716 | + // store a copy of the original event object | |
| 2717 | + // and "clone" to set read-only properties | |
| 2718 | + var originalEvent = event; | |
| 2719 | + event = jQuery.Event( originalEvent ); | |
| 2720 | + | |
| 2721 | + for ( var i = this.props.length, prop; i; ){ | |
| 2722 | + prop = this.props[ --i ]; | |
| 2723 | + event[ prop ] = originalEvent[ prop ]; | |
| 2724 | + } | |
| 2725 | + | |
| 2726 | + // Fix target property, if necessary | |
| 2727 | + if ( !event.target ) | |
| 2728 | + event.target = event.srcElement || document; // Fixes #1925 where srcElement might not be defined either | |
| 2729 | + | |
| 2730 | + // check if target is a textnode (safari) | |
| 2731 | + if ( event.target.nodeType == 3 ) | |
| 2732 | + event.target = event.target.parentNode; | |
| 2733 | + | |
| 2734 | + // Add relatedTarget, if necessary | |
| 2735 | + if ( !event.relatedTarget && event.fromElement ) | |
| 2736 | + event.relatedTarget = event.fromElement == event.target ? event.toElement : event.fromElement; | |
| 2737 | + | |
| 2738 | + // Calculate pageX/Y if missing and clientX/Y available | |
| 2739 | + if ( event.pageX == null && event.clientX != null ) { | |
| 2740 | + var doc = document.documentElement, body = document.body; | |
| 2741 | + event.pageX = event.clientX + (doc && doc.scrollLeft || body && body.scrollLeft || 0) - (doc.clientLeft || 0); | |
| 2742 | + event.pageY = event.clientY + (doc && doc.scrollTop || body && body.scrollTop || 0) - (doc.clientTop || 0); | |
| 2743 | + } | |
| 2744 | + | |
| 2745 | + // Add which for key events | |
| 2746 | + if ( !event.which && ((event.charCode || event.charCode === 0) ? event.charCode : event.keyCode) ) | |
| 2747 | + event.which = event.charCode || event.keyCode; | |
| 2748 | + | |
| 2749 | + // Add metaKey to non-Mac browsers (use ctrl for PC's and Meta for Macs) | |
| 2750 | + if ( !event.metaKey && event.ctrlKey ) | |
| 2751 | + event.metaKey = event.ctrlKey; | |
| 2752 | + | |
| 2753 | + // Add which for click: 1 == left; 2 == middle; 3 == right | |
| 2754 | + // Note: button is not normalized, so don't use it | |
| 2755 | + if ( !event.which && event.button ) | |
| 2756 | + event.which = (event.button & 1 ? 1 : ( event.button & 2 ? 3 : ( event.button & 4 ? 2 : 0 ) )); | |
| 2757 | + | |
| 2758 | + return event; | |
| 2759 | + }, | |
| 2760 | + | |
| 2761 | + proxy: function( fn, proxy ){ | |
| 2762 | + proxy = proxy || function(){ return fn.apply(this, arguments); }; | |
| 2763 | + // Set the guid of unique handler to the same of original handler, so it can be removed | |
| 2764 | + proxy.guid = fn.guid = fn.guid || proxy.guid || this.guid++; | |
| 2765 | + // So proxy can be declared as an argument | |
| 2766 | + return proxy; | |
| 2767 | + }, | |
| 2768 | + | |
| 2769 | + special: { | |
| 2770 | + ready: { | |
| 2771 | + // Make sure the ready event is setup | |
| 2772 | + setup: bindReady, | |
| 2773 | + teardown: function() {} | |
| 2774 | + } | |
| 2775 | + }, | |
| 2776 | + | |
| 2777 | + specialAll: { | |
| 2778 | + live: { | |
| 2779 | + setup: function( selector, namespaces ){ | |
| 2780 | + jQuery.event.add( this, namespaces[0], liveHandler ); | |
| 2781 | + }, | |
| 2782 | + teardown: function( namespaces ){ | |
| 2783 | + if ( namespaces.length ) { | |
| 2784 | + var remove = 0, name = RegExp("(^|\\.)" + namespaces[0] + "(\\.|$)"); | |
| 2785 | + | |
| 2786 | + jQuery.each( (jQuery.data(this, "events").live || {}), function(){ | |
| 2787 | + if ( name.test(this.type) ) | |
| 2788 | + remove++; | |
| 2789 | + }); | |
| 2790 | + | |
| 2791 | + if ( remove < 1 ) | |
| 2792 | + jQuery.event.remove( this, namespaces[0], liveHandler ); | |
| 2793 | + } | |
| 2794 | + } | |
| 2795 | + } | |
| 2796 | + } | |
| 2797 | +}; | |
| 2798 | + | |
| 2799 | +jQuery.Event = function( src ){ | |
| 2800 | + // Allow instantiation without the 'new' keyword | |
| 2801 | + if( !this.preventDefault ) | |
| 2802 | + return new jQuery.Event(src); | |
| 2803 | + | |
| 2804 | + // Event object | |
| 2805 | + if( src && src.type ){ | |
| 2806 | + this.originalEvent = src; | |
| 2807 | + this.type = src.type; | |
| 2808 | + // Event type | |
| 2809 | + }else | |
| 2810 | + this.type = src; | |
| 2811 | + | |
| 2812 | + // timeStamp is buggy for some events on Firefox(#3843) | |
| 2813 | + // So we won't rely on the native value | |
| 2814 | + this.timeStamp = now(); | |
| 2815 | + | |
| 2816 | + // Mark it as fixed | |
| 2817 | + this[expando] = true; | |
| 2818 | +}; | |
| 2819 | + | |
| 2820 | +function returnFalse(){ | |
| 2821 | + return false; | |
| 2822 | +} | |
| 2823 | +function returnTrue(){ | |
| 2824 | + return true; | |
| 2825 | +} | |
| 2826 | + | |
| 2827 | +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding | |
| 2828 | +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html | |
| 2829 | +jQuery.Event.prototype = { | |
| 2830 | + preventDefault: function() { | |
| 2831 | + this.isDefaultPrevented = returnTrue; | |
| 2832 | + | |
| 2833 | + var e = this.originalEvent; | |
| 2834 | + if( !e ) | |
| 2835 | + return; | |
| 2836 | + // if preventDefault exists run it on the original event | |
| 2837 | + if (e.preventDefault) | |
| 2838 | + e.preventDefault(); | |
| 2839 | + // otherwise set the returnValue property of the original event to false (IE) | |
| 2840 | + e.returnValue = false; | |
| 2841 | + }, | |
| 2842 | + stopPropagation: function() { | |
| 2843 | + this.isPropagationStopped = returnTrue; | |
| 2844 | + | |
| 2845 | + var e = this.originalEvent; | |
| 2846 | + if( !e ) | |
| 2847 | + return; | |
| 2848 | + // if stopPropagation exists run it on the original event | |
| 2849 | + if (e.stopPropagation) | |
| 2850 | + e.stopPropagation(); | |
| 2851 | + // otherwise set the cancelBubble property of the original event to true (IE) | |
| 2852 | + e.cancelBubble = true; | |
| 2853 | + }, | |
| 2854 | + stopImmediatePropagation:function(){ | |
| 2855 | + this.isImmediatePropagationStopped = returnTrue; | |
| 2856 | + this.stopPropagation(); | |
| 2857 | + }, | |
| 2858 | + isDefaultPrevented: returnFalse, | |
| 2859 | + isPropagationStopped: returnFalse, | |
| 2860 | + isImmediatePropagationStopped: returnFalse | |
| 2861 | +}; | |
| 2862 | +// Checks if an event happened on an element within another element | |
| 2863 | +// Used in jQuery.event.special.mouseenter and mouseleave handlers | |
| 2864 | +var withinElement = function(event) { | |
| 2865 | + // Check if mouse(over|out) are still within the same parent element | |
| 2866 | + var parent = event.relatedTarget; | |
| 2867 | + // Traverse up the tree | |
| 2868 | + while ( parent && parent != this ) | |
| 2869 | + try { parent = parent.parentNode; } | |
| 2870 | + catch(e) { parent = this; } | |
| 2871 | + | |
| 2872 | + if( parent != this ){ | |
| 2873 | + // set the correct event type | |
| 2874 | + event.type = event.data; | |
| 2875 | + // handle event if we actually just moused on to a non sub-element | |
| 2876 | + jQuery.event.handle.apply( this, arguments ); | |
| 2877 | + } | |
| 2878 | +}; | |
| 2879 | + | |
| 2880 | +jQuery.each({ | |
| 2881 | + mouseover: 'mouseenter', | |
| 2882 | + mouseout: 'mouseleave' | |
| 2883 | +}, function( orig, fix ){ | |
| 2884 | + jQuery.event.special[ fix ] = { | |
| 2885 | + setup: function(){ | |
| 2886 | + jQuery.event.add( this, orig, withinElement, fix ); | |
| 2887 | + }, | |
| 2888 | + teardown: function(){ | |
| 2889 | + jQuery.event.remove( this, orig, withinElement ); | |
| 2890 | + } | |
| 2891 | + }; | |
| 2892 | +}); | |
| 2893 | + | |
| 2894 | +jQuery.fn.extend({ | |
| 2895 | + bind: function( type, data, fn ) { | |
| 2896 | + return type == "unload" ? this.one(type, data, fn) : this.each(function(){ | |
| 2897 | + jQuery.event.add( this, type, fn || data, fn && data ); | |
| 2898 | + }); | |
| 2899 | + }, | |
| 2900 | + | |
| 2901 | + one: function( type, data, fn ) { | |
| 2902 | + var one = jQuery.event.proxy( fn || data, function(event) { | |
| 2903 | + jQuery(this).unbind(event, one); | |
| 2904 | + return (fn || data).apply( this, arguments ); | |
| 2905 | + }); | |
| 2906 | + return this.each(function(){ | |
| 2907 | + jQuery.event.add( this, type, one, fn && data); | |
| 2908 | + }); | |
| 2909 | + }, | |
| 2910 | + | |
| 2911 | + unbind: function( type, fn ) { | |
| 2912 | + return this.each(function(){ | |
| 2913 | + jQuery.event.remove( this, type, fn ); | |
| 2914 | + }); | |
| 2915 | + }, | |
| 2916 | + | |
| 2917 | + trigger: function( type, data ) { | |
| 2918 | + return this.each(function(){ | |
| 2919 | + jQuery.event.trigger( type, data, this ); | |
| 2920 | + }); | |
| 2921 | + }, | |
| 2922 | + | |
| 2923 | + triggerHandler: function( type, data ) { | |
| 2924 | + if( this[0] ){ | |
| 2925 | + var event = jQuery.Event(type); | |
| 2926 | + event.preventDefault(); | |
| 2927 | + event.stopPropagation(); | |
| 2928 | + jQuery.event.trigger( event, data, this[0] ); | |
| 2929 | + return event.result; | |
| 2930 | + } | |
| 2931 | + }, | |
| 2932 | + | |
| 2933 | + toggle: function( fn ) { | |
| 2934 | + // Save reference to arguments for access in closure | |
| 2935 | + var args = arguments, i = 1; | |
| 2936 | + | |
| 2937 | + // link all the functions, so any of them can unbind this click handler | |
| 2938 | + while( i < args.length ) | |
| 2939 | + jQuery.event.proxy( fn, args[i++] ); | |
| 2940 | + | |
| 2941 | + return this.click( jQuery.event.proxy( fn, function(event) { | |
| 2942 | + // Figure out which function to execute | |
| 2943 | + this.lastToggle = ( this.lastToggle || 0 ) % i; | |
| 2944 | + | |
| 2945 | + // Make sure that clicks stop | |
| 2946 | + event.preventDefault(); | |
| 2947 | + | |
| 2948 | + // and execute the function | |
| 2949 | + return args[ this.lastToggle++ ].apply( this, arguments ) || false; | |
| 2950 | + })); | |
| 2951 | + }, | |
| 2952 | + | |
| 2953 | + hover: function(fnOver, fnOut) { | |
| 2954 | + return this.mouseenter(fnOver).mouseleave(fnOut); | |
| 2955 | + }, | |
| 2956 | + | |
| 2957 | + ready: function(fn) { | |
| 2958 | + // Attach the listeners | |
| 2959 | + bindReady(); | |
| 2960 | + | |
| 2961 | + // If the DOM is already ready | |
| 2962 | + if ( jQuery.isReady ) | |
| 2963 | + // Execute the function immediately | |
| 2964 | + fn.call( document, jQuery ); | |
| 2965 | + | |
| 2966 | + // Otherwise, remember the function for later | |
| 2967 | + else | |
| 2968 | + // Add the function to the wait list | |
| 2969 | + jQuery.readyList.push( fn ); | |
| 2970 | + | |
| 2971 | + return this; | |
| 2972 | + }, | |
| 2973 | + | |
| 2974 | + live: function( type, fn ){ | |
| 2975 | + var proxy = jQuery.event.proxy( fn ); | |
| 2976 | + proxy.guid += this.selector + type; | |
| 2977 | + | |
| 2978 | + jQuery(document).bind( liveConvert(type, this.selector), this.selector, proxy ); | |
| 2979 | + | |
| 2980 | + return this; | |
| 2981 | + }, | |
| 2982 | + | |
| 2983 | + die: function( type, fn ){ | |
| 2984 | + jQuery(document).unbind( liveConvert(type, this.selector), fn ? { guid: fn.guid + this.selector + type } : null ); | |
| 2985 | + return this; | |
| 2986 | + } | |
| 2987 | +}); | |
| 2988 | + | |
| 2989 | +function liveHandler( event ){ | |
| 2990 | + var check = RegExp("(^|\\.)" + event.type + "(\\.|$)"), | |
| 2991 | + stop = true, | |
| 2992 | + elems = []; | |
| 2993 | + | |
| 2994 | + jQuery.each(jQuery.data(this, "events").live || [], function(i, fn){ | |
| 2995 | + if ( check.test(fn.type) ) { | |
| 2996 | + var elem = jQuery(event.target).closest(fn.data)[0]; | |
| 2997 | + if ( elem ) | |
| 2998 | + elems.push({ elem: elem, fn: fn }); | |
| 2999 | + } | |
| 3000 | + }); | |
| 3001 | + | |
| 3002 | + elems.sort(function(a,b) { | |
| 3003 | + return jQuery.data(a.elem, "closest") - jQuery.data(b.elem, "closest"); | |
| 3004 | + }); | |
| 3005 | + | |
| 3006 | + jQuery.each(elems, function(){ | |
| 3007 | + if ( this.fn.call(this.elem, event, this.fn.data) === false ) | |
| 3008 | + return (stop = false); | |
| 3009 | + }); | |
| 3010 | + | |
| 3011 | + return stop; | |
| 3012 | +} | |
| 3013 | + | |
| 3014 | +function liveConvert(type, selector){ | |
| 3015 | + return ["live", type, selector.replace(/\./g, "`").replace(/ /g, "|")].join("."); | |
| 3016 | +} | |
| 3017 | + | |
| 3018 | +jQuery.extend({ | |
| 3019 | + isReady: false, | |
| 3020 | + readyList: [], | |
| 3021 | + // Handle when the DOM is ready | |
| 3022 | + ready: function() { | |
| 3023 | + // Make sure that the DOM is not already loaded | |
| 3024 | + if ( !jQuery.isReady ) { | |
| 3025 | + // Remember that the DOM is ready | |
| 3026 | + jQuery.isReady = true; | |
| 3027 | + | |
| 3028 | + // If there are functions bound, to execute | |
| 3029 | + if ( jQuery.readyList ) { | |
| 3030 | + // Execute all of them | |
| 3031 | + jQuery.each( jQuery.readyList, function(){ | |
| 3032 | + this.call( document, jQuery ); | |
| 3033 | + }); | |
| 3034 | + | |
| 3035 | + // Reset the list of functions | |
| 3036 | + jQuery.readyList = null; | |
| 3037 | + } | |
| 3038 | + | |
| 3039 | + // Trigger any bound ready events | |
| 3040 | + jQuery(document).triggerHandler("ready"); | |
| 3041 | + } | |
| 3042 | + } | |
| 3043 | +}); | |
| 3044 | + | |
| 3045 | +var readyBound = false; | |
| 3046 | + | |
| 3047 | +function bindReady(){ | |
| 3048 | + if ( readyBound ) return; | |
| 3049 | + readyBound = true; | |
| 3050 | + | |
| 3051 | + // Mozilla, Opera and webkit nightlies currently support this event | |
| 3052 | + if ( document.addEventListener ) { | |
| 3053 | + // Use the handy event callback | |
| 3054 | + document.addEventListener( "DOMContentLoaded", function(){ | |
| 3055 | + document.removeEventListener( "DOMContentLoaded", arguments.callee, false ); | |
| 3056 | + jQuery.ready(); | |
| 3057 | + }, false ); | |
| 3058 | + | |
| 3059 | + // If IE event model is used | |
| 3060 | + } else if ( document.attachEvent ) { | |
| 3061 | + // ensure firing before onload, | |
| 3062 | + // maybe late but safe also for iframes | |
| 3063 | + document.attachEvent("onreadystatechange", function(){ | |
| 3064 | + if ( document.readyState === "complete" ) { | |
| 3065 | + document.detachEvent( "onreadystatechange", arguments.callee ); | |
| 3066 | + jQuery.ready(); | |
| 3067 | + } | |
| 3068 | + }); | |
| 3069 | + | |
| 3070 | + // If IE and not an iframe | |
| 3071 | + // continually check to see if the document is ready | |
| 3072 | + if ( document.documentElement.doScroll && window == window.top ) (function(){ | |
| 3073 | + if ( jQuery.isReady ) return; | |
| 3074 | + | |
| 3075 | + try { | |
| 3076 | + // If IE is used, use the trick by Diego Perini | |
| 3077 | + // http://javascript.nwbox.com/IEContentLoaded/ | |
| 3078 | + document.documentElement.doScroll("left"); | |
| 3079 | + } catch( error ) { | |
| 3080 | + setTimeout( arguments.callee, 0 ); | |
| 3081 | + return; | |
| 3082 | + } | |
| 3083 | + | |
| 3084 | + // and execute any waiting functions | |
| 3085 | + jQuery.ready(); | |
| 3086 | + })(); | |
| 3087 | + } | |
| 3088 | + | |
| 3089 | + // A fallback to window.onload, that will always work | |
| 3090 | + jQuery.event.add( window, "load", jQuery.ready ); | |
| 3091 | +} | |
| 3092 | + | |
| 3093 | +jQuery.each( ("blur,focus,load,resize,scroll,unload,click,dblclick," + | |
| 3094 | + "mousedown,mouseup,mousemove,mouseover,mouseout,mouseenter,mouseleave," + | |
| 3095 | + "change,select,submit,keydown,keypress,keyup,error").split(","), function(i, name){ | |
| 3096 | + | |
| 3097 | + // Handle event binding | |
| 3098 | + jQuery.fn[name] = function(fn){ | |
| 3099 | + return fn ? this.bind(name, fn) : this.trigger(name); | |
| 3100 | + }; | |
| 3101 | +}); | |
| 3102 | + | |
| 3103 | +// Prevent memory leaks in IE | |
| 3104 | +// And prevent errors on refresh with events like mouseover in other browsers | |
| 3105 | +// Window isn't included so as not to unbind existing unload events | |
| 3106 | +jQuery( window ).bind( 'unload', function(){ | |
| 3107 | + for ( var id in jQuery.cache ) | |
| 3108 | + // Skip the window | |
| 3109 | + if ( id != 1 && jQuery.cache[ id ].handle ) | |
| 3110 | + jQuery.event.remove( jQuery.cache[ id ].handle.elem ); | |
| 3111 | +}); | |
| 3112 | +(function(){ | |
| 3113 | + | |
| 3114 | + jQuery.support = {}; | |
| 3115 | + | |
| 3116 | + var root = document.documentElement, | |
| 3117 | + script = document.createElement("script"), | |
| 3118 | + div = document.createElement("div"), | |
| 3119 | + id = "script" + (new Date).getTime(); | |
| 3120 | + | |
| 3121 | + div.style.display = "none"; | |
| 3122 | + div.innerHTML = ' <link/><table></table><a href="/a" style="color:red;float:left;opacity:.5;">a</a><select><option>text</option></select><object><param/></object>'; | |
| 3123 | + | |
| 3124 | + var all = div.getElementsByTagName("*"), | |
| 3125 | + a = div.getElementsByTagName("a")[0]; | |
| 3126 | + | |
| 3127 | + // Can't get basic test support | |
| 3128 | + if ( !all || !all.length || !a ) { | |
| 3129 | + return; | |
| 3130 | + } | |
| 3131 | + | |
| 3132 | + jQuery.support = { | |
| 3133 | + // IE strips leading whitespace when .innerHTML is used | |
| 3134 | + leadingWhitespace: div.firstChild.nodeType == 3, | |
| 3135 | + | |
| 3136 | + // Make sure that tbody elements aren't automatically inserted | |
| 3137 | + // IE will insert them into empty tables | |
| 3138 | + tbody: !div.getElementsByTagName("tbody").length, | |
| 3139 | + | |
| 3140 | + // Make sure that you can get all elements in an <object> element | |
| 3141 | + // IE 7 always returns no results | |
| 3142 | + objectAll: !!div.getElementsByTagName("object")[0] | |
| 3143 | + .getElementsByTagName("*").length, | |
| 3144 | + | |
| 3145 | + // Make sure that link elements get serialized correctly by innerHTML | |
| 3146 | + // This requires a wrapper element in IE | |
| 3147 | + htmlSerialize: !!div.getElementsByTagName("link").length, | |
| 3148 | + | |
| 3149 | + // Get the style information from getAttribute | |
| 3150 | + // (IE uses .cssText insted) | |
| 3151 | + style: /red/.test( a.getAttribute("style") ), | |
| 3152 | + | |
| 3153 | + // Make sure that URLs aren't manipulated | |
| 3154 | + // (IE normalizes it by default) | |
| 3155 | + hrefNormalized: a.getAttribute("href") === "/a", | |
| 3156 | + | |
| 3157 | + // Make sure that element opacity exists | |
| 3158 | + // (IE uses filter instead) | |
| 3159 | + opacity: a.style.opacity === "0.5", | |
| 3160 | + | |
| 3161 | + // Verify style float existence | |
| 3162 | + // (IE uses styleFloat instead of cssFloat) | |
| 3163 | + cssFloat: !!a.style.cssFloat, | |
| 3164 | + | |
| 3165 | + // Will be defined later | |
| 3166 | + scriptEval: false, | |
| 3167 | + noCloneEvent: true, | |
| 3168 | + boxModel: null | |
| 3169 | + }; | |
| 3170 | + | |
| 3171 | + script.type = "text/javascript"; | |
| 3172 | + try { | |
| 3173 | + script.appendChild( document.createTextNode( "window." + id + "=1;" ) ); | |
| 3174 | + } catch(e){} | |
| 3175 | + | |
| 3176 | + root.insertBefore( script, root.firstChild ); | |
| 3177 | + | |
| 3178 | + // Make sure that the execution of code works by injecting a script | |
| 3179 | + // tag with appendChild/createTextNode | |
| 3180 | + // (IE doesn't support this, fails, and uses .text instead) | |
| 3181 | + if ( window[ id ] ) { | |
| 3182 | + jQuery.support.scriptEval = true; | |
| 3183 | + delete window[ id ]; | |
| 3184 | + } | |
| 3185 | + | |
| 3186 | + root.removeChild( script ); | |
| 3187 | + | |
| 3188 | + if ( div.attachEvent && div.fireEvent ) { | |
| 3189 | + div.attachEvent("onclick", function(){ | |
| 3190 | + // Cloning a node shouldn't copy over any | |
| 3191 | + // bound event handlers (IE does this) | |
| 3192 | + jQuery.support.noCloneEvent = false; | |
| 3193 | + div.detachEvent("onclick", arguments.callee); | |
| 3194 | + }); | |
| 3195 | + div.cloneNode(true).fireEvent("onclick"); | |
| 3196 | + } | |
| 3197 | + | |
| 3198 | + // Figure out if the W3C box model works as expected | |
| 3199 | + // document.body must exist before we can do this | |
| 3200 | + jQuery(function(){ | |
| 3201 | + var div = document.createElement("div"); | |
| 3202 | + div.style.width = div.style.paddingLeft = "1px"; | |
| 3203 | + | |
| 3204 | + document.body.appendChild( div ); | |
| 3205 | + jQuery.boxModel = jQuery.support.boxModel = div.offsetWidth === 2; | |
| 3206 | + document.body.removeChild( div ).style.display = 'none'; | |
| 3207 | + }); | |
| 3208 | +})(); | |
| 3209 | + | |
| 3210 | +var styleFloat = jQuery.support.cssFloat ? "cssFloat" : "styleFloat"; | |
| 3211 | + | |
| 3212 | +jQuery.props = { | |
| 3213 | + "for": "htmlFor", | |
| 3214 | + "class": "className", | |
| 3215 | + "float": styleFloat, | |
| 3216 | + cssFloat: styleFloat, | |
| 3217 | + styleFloat: styleFloat, | |
| 3218 | + readonly: "readOnly", | |
| 3219 | + maxlength: "maxLength", | |
| 3220 | + cellspacing: "cellSpacing", | |
| 3221 | + rowspan: "rowSpan", | |
| 3222 | + tabindex: "tabIndex" | |
| 3223 | +}; | |
| 3224 | +jQuery.fn.extend({ | |
| 3225 | + // Keep a copy of the old load | |
| 3226 | + _load: jQuery.fn.load, | |
| 3227 | + | |
| 3228 | + load: function( url, params, callback ) { | |
| 3229 | + if ( typeof url !== "string" ) | |
| 3230 | + return this._load( url ); | |
| 3231 | + | |
| 3232 | + var off = url.indexOf(" "); | |
| 3233 | + if ( off >= 0 ) { | |
| 3234 | + var selector = url.slice(off, url.length); | |
| 3235 | + url = url.slice(0, off); | |
| 3236 | + } | |
| 3237 | + | |
| 3238 | + // Default to a GET request | |
| 3239 | + var type = "GET"; | |
| 3240 | + | |
| 3241 | + // If the second parameter was provided | |
| 3242 | + if ( params ) | |
| 3243 | + // If it's a function | |
| 3244 | + if ( jQuery.isFunction( params ) ) { | |
| 3245 | + // We assume that it's the callback | |
| 3246 | + callback = params; | |
| 3247 | + params = null; | |
| 3248 | + | |
| 3249 | + // Otherwise, build a param string | |
| 3250 | + } else if( typeof params === "object" ) { | |
| 3251 | + params = jQuery.param( params ); | |
| 3252 | + type = "POST"; | |
| 3253 | + } | |
| 3254 | + | |
| 3255 | + var self = this; | |
| 3256 | + | |
| 3257 | + // Request the remote document | |
| 3258 | + jQuery.ajax({ | |
| 3259 | + url: url, | |
| 3260 | + type: type, | |
| 3261 | + dataType: "html", | |
| 3262 | + data: params, | |
| 3263 | + complete: function(res, status){ | |
| 3264 | + // If successful, inject the HTML into all the matched elements | |
| 3265 | + if ( status == "success" || status == "notmodified" ) | |
| 3266 | + // See if a selector was specified | |
| 3267 | + self.html( selector ? | |
| 3268 | + // Create a dummy div to hold the results | |
| 3269 | + jQuery("<div/>") | |
| 3270 | + // inject the contents of the document in, removing the scripts | |
| 3271 | + // to avoid any 'Permission Denied' errors in IE | |
| 3272 | + .append(res.responseText.replace(/<script(.|\s)*?\/script>/g, "")) | |
| 3273 | + | |
| 3274 | + // Locate the specified elements | |
| 3275 | + .find(selector) : | |
| 3276 | + | |
| 3277 | + // If not, just inject the full result | |
| 3278 | + res.responseText ); | |
| 3279 | + | |
| 3280 | + if( callback ) | |
| 3281 | + self.each( callback, [res.responseText, status, res] ); | |
| 3282 | + } | |
| 3283 | + }); | |
| 3284 | + return this; | |
| 3285 | + }, | |
| 3286 | + | |
| 3287 | + serialize: function() { | |
| 3288 | + return jQuery.param(this.serializeArray()); | |
| 3289 | + }, | |
| 3290 | + serializeArray: function() { | |
| 3291 | + return this.map(function(){ | |
| 3292 | + return this.elements ? jQuery.makeArray(this.elements) : this; | |
| 3293 | + }) | |
| 3294 | + .filter(function(){ | |
| 3295 | + return this.name && !this.disabled && | |
| 3296 | + (this.checked || /select|textarea/i.test(this.nodeName) || | |
| 3297 | + /text|hidden|password|search/i.test(this.type)); | |
| 3298 | + }) | |
| 3299 | + .map(function(i, elem){ | |
| 3300 | + var val = jQuery(this).val(); | |
| 3301 | + return val == null ? null : | |
| 3302 | + jQuery.isArray(val) ? | |
| 3303 | + jQuery.map( val, function(val, i){ | |
| 3304 | + return {name: elem.name, value: val}; | |
| 3305 | + }) : | |
| 3306 | + {name: elem.name, value: val}; | |
| 3307 | + }).get(); | |
| 3308 | + } | |
| 3309 | +}); | |
| 3310 | + | |
| 3311 | +// Attach a bunch of functions for handling common AJAX events | |
| 3312 | +jQuery.each( "ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","), function(i,o){ | |
| 3313 | + jQuery.fn[o] = function(f){ | |
| 3314 | + return this.bind(o, f); | |
| 3315 | + }; | |
| 3316 | +}); | |
| 3317 | + | |
| 3318 | +var jsc = now(); | |
| 3319 | + | |
| 3320 | +jQuery.extend({ | |
| 3321 | + | |
| 3322 | + get: function( url, data, callback, type ) { | |
| 3323 | + // shift arguments if data argument was ommited | |
| 3324 | + if ( jQuery.isFunction( data ) ) { | |
| 3325 | + callback = data; | |
| 3326 | + data = null; | |
| 3327 | + } | |
| 3328 | + | |
| 3329 | + return jQuery.ajax({ | |
| 3330 | + type: "GET", | |
| 3331 | + url: url, | |
| 3332 | + data: data, | |
| 3333 | + success: callback, | |
| 3334 | + dataType: type | |
| 3335 | + }); | |
| 3336 | + }, | |
| 3337 | + | |
| 3338 | + getScript: function( url, callback ) { | |
| 3339 | + return jQuery.get(url, null, callback, "script"); | |
| 3340 | + }, | |
| 3341 | + | |
| 3342 | + getJSON: function( url, data, callback ) { | |
| 3343 | + return jQuery.get(url, data, callback, "json"); | |
| 3344 | + }, | |
| 3345 | + | |
| 3346 | + post: function( url, data, callback, type ) { | |
| 3347 | + if ( jQuery.isFunction( data ) ) { | |
| 3348 | + callback = data; | |
| 3349 | + data = {}; | |
| 3350 | + } | |
| 3351 | + | |
| 3352 | + return jQuery.ajax({ | |
| 3353 | + type: "POST", | |
| 3354 | + url: url, | |
| 3355 | + data: data, | |
| 3356 | + success: callback, | |
| 3357 | + dataType: type | |
| 3358 | + }); | |
| 3359 | + }, | |
| 3360 | + | |
| 3361 | + ajaxSetup: function( settings ) { | |
| 3362 | + jQuery.extend( jQuery.ajaxSettings, settings ); | |
| 3363 | + }, | |
| 3364 | + | |
| 3365 | + ajaxSettings: { | |
| 3366 | + url: location.href, | |
| 3367 | + global: true, | |
| 3368 | + type: "GET", | |
| 3369 | + contentType: "application/x-www-form-urlencoded", | |
| 3370 | + processData: true, | |
| 3371 | + async: true, | |
| 3372 | + /* | |
| 3373 | + timeout: 0, | |
| 3374 | + data: null, | |
| 3375 | + username: null, | |
| 3376 | + password: null, | |
| 3377 | + */ | |
| 3378 | + // Create the request object; Microsoft failed to properly | |
| 3379 | + // implement the XMLHttpRequest in IE7, so we use the ActiveXObject when it is available | |
| 3380 | + // This function can be overriden by calling jQuery.ajaxSetup | |
| 3381 | + xhr:function(){ | |
| 3382 | + return window.ActiveXObject ? new ActiveXObject("Microsoft.XMLHTTP") : new XMLHttpRequest(); | |
| 3383 | + }, | |
| 3384 | + accepts: { | |
| 3385 | + xml: "application/xml, text/xml", | |
| 3386 | + html: "text/html", | |
| 3387 | + script: "text/javascript, application/javascript", | |
| 3388 | + json: "application/json, text/javascript", | |
| 3389 | + text: "text/plain", | |
| 3390 | + _default: "*/*" | |
| 3391 | + } | |
| 3392 | + }, | |
| 3393 | + | |
| 3394 | + // Last-Modified header cache for next request | |
| 3395 | + lastModified: {}, | |
| 3396 | + | |
| 3397 | + ajax: function( s ) { | |
| 3398 | + // Extend the settings, but re-extend 's' so that it can be | |
| 3399 | + // checked again later (in the test suite, specifically) | |
| 3400 | + s = jQuery.extend(true, s, jQuery.extend(true, {}, jQuery.ajaxSettings, s)); | |
| 3401 | + | |
| 3402 | + var jsonp, jsre = /=\?(&|$)/g, status, data, | |
| 3403 | + type = s.type.toUpperCase(); | |
| 3404 | + | |
| 3405 | + // convert data if not already a string | |
| 3406 | + if ( s.data && s.processData && typeof s.data !== "string" ) | |
| 3407 | + s.data = jQuery.param(s.data); | |
| 3408 | + | |
| 3409 | + // Handle JSONP Parameter Callbacks | |
| 3410 | + if ( s.dataType == "jsonp" ) { | |
| 3411 | + if ( type == "GET" ) { | |
| 3412 | + if ( !s.url.match(jsre) ) | |
| 3413 | + s.url += (s.url.match(/\?/) ? "&" : "?") + (s.jsonp || "callback") + "=?"; | |
| 3414 | + } else if ( !s.data || !s.data.match(jsre) ) | |
| 3415 | + s.data = (s.data ? s.data + "&" : "") + (s.jsonp || "callback") + "=?"; | |
| 3416 | + s.dataType = "json"; | |
| 3417 | + } | |
| 3418 | + | |
| 3419 | + // Build temporary JSONP function | |
| 3420 | + if ( s.dataType == "json" && (s.data && s.data.match(jsre) || s.url.match(jsre)) ) { | |
| 3421 | + jsonp = "jsonp" + jsc++; | |
| 3422 | + | |
| 3423 | + // Replace the =? sequence both in the query string and the data | |
| 3424 | + if ( s.data ) | |
| 3425 | + s.data = (s.data + "").replace(jsre, "=" + jsonp + "$1"); | |
| 3426 | + s.url = s.url.replace(jsre, "=" + jsonp + "$1"); | |
| 3427 | + | |
| 3428 | + // We need to make sure | |
| 3429 | + // that a JSONP style response is executed properly | |
| 3430 | + s.dataType = "script"; | |
| 3431 | + | |
| 3432 | + // Handle JSONP-style loading | |
| 3433 | + window[ jsonp ] = function(tmp){ | |
| 3434 | + data = tmp; | |
| 3435 | + success(); | |
| 3436 | + complete(); | |
| 3437 | + // Garbage collect | |
| 3438 | + window[ jsonp ] = undefined; | |
| 3439 | + try{ delete window[ jsonp ]; } catch(e){} | |
| 3440 | + if ( head ) | |
| 3441 | + head.removeChild( script ); | |
| 3442 | + }; | |
| 3443 | + } | |
| 3444 | + | |
| 3445 | + if ( s.dataType == "script" && s.cache == null ) | |
| 3446 | + s.cache = false; | |
| 3447 | + | |
| 3448 | + if ( s.cache === false && type == "GET" ) { | |
| 3449 | + var ts = now(); | |
| 3450 | + // try replacing _= if it is there | |
| 3451 | + var ret = s.url.replace(/(\?|&)_=.*?(&|$)/, "$1_=" + ts + "$2"); | |
| 3452 | + // if nothing was replaced, add timestamp to the end | |
| 3453 | + s.url = ret + ((ret == s.url) ? (s.url.match(/\?/) ? "&" : "?") + "_=" + ts : ""); | |
| 3454 | + } | |
| 3455 | + | |
| 3456 | + // If data is available, append data to url for get requests | |
| 3457 | + if ( s.data && type == "GET" ) { | |
| 3458 | + s.url += (s.url.match(/\?/) ? "&" : "?") + s.data; | |
| 3459 | + | |
| 3460 | + // IE likes to send both get and post data, prevent this | |
| 3461 | + s.data = null; | |
| 3462 | + } | |
| 3463 | + | |
| 3464 | + // Watch for a new set of requests | |
| 3465 | + if ( s.global && ! jQuery.active++ ) | |
| 3466 | + jQuery.event.trigger( "ajaxStart" ); | |
| 3467 | + | |
| 3468 | + // Matches an absolute URL, and saves the domain | |
| 3469 | + var parts = /^(\w+:)?\/\/([^\/?#]+)/.exec( s.url ); | |
| 3470 | + | |
| 3471 | + // If we're requesting a remote document | |
| 3472 | + // and trying to load JSON or Script with a GET | |
| 3473 | + if ( s.dataType == "script" && type == "GET" && parts | |
| 3474 | + && ( parts[1] && parts[1] != location.protocol || parts[2] != location.host )){ | |
| 3475 | + | |
| 3476 | + var head = document.getElementsByTagName("head")[0]; | |
| 3477 | + var script = document.createElement("script"); | |
| 3478 | + script.src = s.url; | |
| 3479 | + if (s.scriptCharset) | |
| 3480 | + script.charset = s.scriptCharset; | |
| 3481 | + | |
| 3482 | + // Handle Script loading | |
| 3483 | + if ( !jsonp ) { | |
| 3484 | + var done = false; | |
| 3485 | + | |
| 3486 | + // Attach handlers for all browsers | |
| 3487 | + script.onload = script.onreadystatechange = function(){ | |
| 3488 | + if ( !done && (!this.readyState || | |
| 3489 | + this.readyState == "loaded" || this.readyState == "complete") ) { | |
| 3490 | + done = true; | |
| 3491 | + success(); | |
| 3492 | + complete(); | |
| 3493 | + | |
| 3494 | + // Handle memory leak in IE | |
| 3495 | + script.onload = script.onreadystatechange = null; | |
| 3496 | + head.removeChild( script ); | |
| 3497 | + } | |
| 3498 | + }; | |
| 3499 | + } | |
| 3500 | + | |
| 3501 | + head.appendChild(script); | |
| 3502 | + | |
| 3503 | + // We handle everything using the script element injection | |
| 3504 | + return undefined; | |
| 3505 | + } | |
| 3506 | + | |
| 3507 | + var requestDone = false; | |
| 3508 | + | |
| 3509 | + // Create the request object | |
| 3510 | + var xhr = s.xhr(); | |
| 3511 | + | |
| 3512 | + // Open the socket | |
| 3513 | + // Passing null username, generates a login popup on Opera (#2865) | |
| 3514 | + if( s.username ) | |
| 3515 | + xhr.open(type, s.url, s.async, s.username, s.password); | |
| 3516 | + else | |
| 3517 | + xhr.open(type, s.url, s.async); | |
| 3518 | + | |
| 3519 | + // Need an extra try/catch for cross domain requests in Firefox 3 | |
| 3520 | + try { | |
| 3521 | + // Set the correct header, if data is being sent | |
| 3522 | + if ( s.data ) | |
| 3523 | + xhr.setRequestHeader("Content-Type", s.contentType); | |
| 3524 | + | |
| 3525 | + // Set the If-Modified-Since header, if ifModified mode. | |
| 3526 | + if ( s.ifModified ) | |
| 3527 | + xhr.setRequestHeader("If-Modified-Since", | |
| 3528 | + jQuery.lastModified[s.url] || "Thu, 01 Jan 1970 00:00:00 GMT" ); | |
| 3529 | + | |
| 3530 | + // Set header so the called script knows that it's an XMLHttpRequest | |
| 3531 | + xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); | |
| 3532 | + | |
| 3533 | + // Set the Accepts header for the server, depending on the dataType | |
| 3534 | + xhr.setRequestHeader("Accept", s.dataType && s.accepts[ s.dataType ] ? | |
| 3535 | + s.accepts[ s.dataType ] + ", */*" : | |
| 3536 | + s.accepts._default ); | |
| 3537 | + } catch(e){} | |
| 3538 | + | |
| 3539 | + // Allow custom headers/mimetypes and early abort | |
| 3540 | + if ( s.beforeSend && s.beforeSend(xhr, s) === false ) { | |
| 3541 | + // Handle the global AJAX counter | |
| 3542 | + if ( s.global && ! --jQuery.active ) | |
| 3543 | + jQuery.event.trigger( "ajaxStop" ); | |
| 3544 | + // close opended socket | |
| 3545 | + xhr.abort(); | |
| 3546 | + return false; | |
| 3547 | + } | |
| 3548 | + | |
| 3549 | + if ( s.global ) | |
| 3550 | + jQuery.event.trigger("ajaxSend", [xhr, s]); | |
| 3551 | + | |
| 3552 | + // Wait for a response to come back | |
| 3553 | + var onreadystatechange = function(isTimeout){ | |
| 3554 | + // The request was aborted, clear the interval and decrement jQuery.active | |
| 3555 | + if (xhr.readyState == 0) { | |
| 3556 | + if (ival) { | |
| 3557 | + // clear poll interval | |
| 3558 | + clearInterval(ival); | |
| 3559 | + ival = null; | |
| 3560 | + // Handle the global AJAX counter | |
| 3561 | + if ( s.global && ! --jQuery.active ) | |
| 3562 | + jQuery.event.trigger( "ajaxStop" ); | |
| 3563 | + } | |
| 3564 | + // The transfer is complete and the data is available, or the request timed out | |
| 3565 | + } else if ( !requestDone && xhr && (xhr.readyState == 4 || isTimeout == "timeout") ) { | |
| 3566 | + requestDone = true; | |
| 3567 | + | |
| 3568 | + // clear poll interval | |
| 3569 | + if (ival) { | |
| 3570 | + clearInterval(ival); | |
| 3571 | + ival = null; | |
| 3572 | + } | |
| 3573 | + | |
| 3574 | + status = isTimeout == "timeout" ? "timeout" : | |
| 3575 | + !jQuery.httpSuccess( xhr ) ? "error" : | |
| 3576 | + s.ifModified && jQuery.httpNotModified( xhr, s.url ) ? "notmodified" : | |
| 3577 | + "success"; | |
| 3578 | + | |
| 3579 | + if ( status == "success" ) { | |
| 3580 | + // Watch for, and catch, XML document parse errors | |
| 3581 | + try { | |
| 3582 | + // process the data (runs the xml through httpData regardless of callback) | |
| 3583 | + data = jQuery.httpData( xhr, s.dataType, s ); | |
| 3584 | + } catch(e) { | |
| 3585 | + status = "parsererror"; | |
| 3586 | + } | |
| 3587 | + } | |
| 3588 | + | |
| 3589 | + // Make sure that the request was successful or notmodified | |
| 3590 | + if ( status == "success" ) { | |
| 3591 | + // Cache Last-Modified header, if ifModified mode. | |
| 3592 | + var modRes; | |
| 3593 | + try { | |
| 3594 | + modRes = xhr.getResponseHeader("Last-Modified"); | |
| 3595 | + } catch(e) {} // swallow exception thrown by FF if header is not available | |
| 3596 | + | |
| 3597 | + if ( s.ifModified && modRes ) | |
| 3598 | + jQuery.lastModified[s.url] = modRes; | |
| 3599 | + | |
| 3600 | + // JSONP handles its own success callback | |
| 3601 | + if ( !jsonp ) | |
| 3602 | + success(); | |
| 3603 | + } else | |
| 3604 | + jQuery.handleError(s, xhr, status); | |
| 3605 | + | |
| 3606 | + // Fire the complete handlers | |
| 3607 | + complete(); | |
| 3608 | + | |
| 3609 | + if ( isTimeout ) | |
| 3610 | + xhr.abort(); | |
| 3611 | + | |
| 3612 | + // Stop memory leaks | |
| 3613 | + if ( s.async ) | |
| 3614 | + xhr = null; | |
| 3615 | + } | |
| 3616 | + }; | |
| 3617 | + | |
| 3618 | + if ( s.async ) { | |
| 3619 | + // don't attach the handler to the request, just poll it instead | |
| 3620 | + var ival = setInterval(onreadystatechange, 13); | |
| 3621 | + | |
| 3622 | + // Timeout checker | |
| 3623 | + if ( s.timeout > 0 ) | |
| 3624 | + setTimeout(function(){ | |
| 3625 | + // Check to see if the request is still happening | |
| 3626 | + if ( xhr && !requestDone ) | |
| 3627 | + onreadystatechange( "timeout" ); | |
| 3628 | + }, s.timeout); | |
| 3629 | + } | |
| 3630 | + | |
| 3631 | + // Send the data | |
| 3632 | + try { | |
| 3633 | + xhr.send(s.data); | |
| 3634 | + } catch(e) { | |
| 3635 | + jQuery.handleError(s, xhr, null, e); | |
| 3636 | + } | |
| 3637 | + | |
| 3638 | + // firefox 1.5 doesn't fire statechange for sync requests | |
| 3639 | + if ( !s.async ) | |
| 3640 | + onreadystatechange(); | |
| 3641 | + | |
| 3642 | + function success(){ | |
| 3643 | + // If a local callback was specified, fire it and pass it the data | |
| 3644 | + if ( s.success ) | |
| 3645 | + s.success( data, status ); | |
| 3646 | + | |
| 3647 | + // Fire the global callback | |
| 3648 | + if ( s.global ) | |
| 3649 | + jQuery.event.trigger( "ajaxSuccess", [xhr, s] ); | |
| 3650 | + } | |
| 3651 | + | |
| 3652 | + function complete(){ | |
| 3653 | + // Process result | |
| 3654 | + if ( s.complete ) | |
| 3655 | + s.complete(xhr, status); | |
| 3656 | + | |
| 3657 | + // The request was completed | |
| 3658 | + if ( s.global ) | |
| 3659 | + jQuery.event.trigger( "ajaxComplete", [xhr, s] ); | |
| 3660 | + | |
| 3661 | + // Handle the global AJAX counter | |
| 3662 | + if ( s.global && ! --jQuery.active ) | |
| 3663 | + jQuery.event.trigger( "ajaxStop" ); | |
| 3664 | + } | |
| 3665 | + | |
| 3666 | + // return XMLHttpRequest to allow aborting the request etc. | |
| 3667 | + return xhr; | |
| 3668 | + }, | |
| 3669 | + | |
| 3670 | + handleError: function( s, xhr, status, e ) { | |
| 3671 | + // If a local callback was specified, fire it | |
| 3672 | + if ( s.error ) s.error( xhr, status, e ); | |
| 3673 | + | |
| 3674 | + // Fire the global callback | |
| 3675 | + if ( s.global ) | |
| 3676 | + jQuery.event.trigger( "ajaxError", [xhr, s, e] ); | |
| 3677 | + }, | |
| 3678 | + | |
| 3679 | + // Counter for holding the number of active queries | |
| 3680 | + active: 0, | |
| 3681 | + | |
| 3682 | + // Determines if an XMLHttpRequest was successful or not | |
| 3683 | + httpSuccess: function( xhr ) { | |
| 3684 | + try { | |
| 3685 | + // IE error sometimes returns 1223 when it should be 204 so treat it as success, see #1450 | |
| 3686 | + return !xhr.status && location.protocol == "file:" || | |
| 3687 | + ( xhr.status >= 200 && xhr.status < 300 ) || xhr.status == 304 || xhr.status == 1223; | |
| 3688 | + } catch(e){} | |
| 3689 | + return false; | |
| 3690 | + }, | |
| 3691 | + | |
| 3692 | + // Determines if an XMLHttpRequest returns NotModified | |
| 3693 | + httpNotModified: function( xhr, url ) { | |
| 3694 | + try { | |
| 3695 | + var xhrRes = xhr.getResponseHeader("Last-Modified"); | |
| 3696 | + | |
| 3697 | + // Firefox always returns 200. check Last-Modified date | |
| 3698 | + return xhr.status == 304 || xhrRes == jQuery.lastModified[url]; | |
| 3699 | + } catch(e){} | |
| 3700 | + return false; | |
| 3701 | + }, | |
| 3702 | + | |
| 3703 | + httpData: function( xhr, type, s ) { | |
| 3704 | + var ct = xhr.getResponseHeader("content-type"), | |
| 3705 | + xml = type == "xml" || !type && ct && ct.indexOf("xml") >= 0, | |
| 3706 | + data = xml ? xhr.responseXML : xhr.responseText; | |
| 3707 | + | |
| 3708 | + if ( xml && data.documentElement.tagName == "parsererror" ) | |
| 3709 | + throw "parsererror"; | |
| 3710 | + | |
| 3711 | + // Allow a pre-filtering function to sanitize the response | |
| 3712 | + // s != null is checked to keep backwards compatibility | |
| 3713 | + if( s && s.dataFilter ) | |
| 3714 | + data = s.dataFilter( data, type ); | |
| 3715 | + | |
| 3716 | + // The filter can actually parse the response | |
| 3717 | + if( typeof data === "string" ){ | |
| 3718 | + | |
| 3719 | + // If the type is "script", eval it in global context | |
| 3720 | + if ( type == "script" ) | |
| 3721 | + jQuery.globalEval( data ); | |
| 3722 | + | |
| 3723 | + // Get the JavaScript object, if JSON is used. | |
| 3724 | + if ( type == "json" ) | |
| 3725 | + data = window["eval"]("(" + data + ")"); | |
| 3726 | + } | |
| 3727 | + | |
| 3728 | + return data; | |
| 3729 | + }, | |
| 3730 | + | |
| 3731 | + // Serialize an array of form elements or a set of | |
| 3732 | + // key/values into a query string | |
| 3733 | + param: function( a ) { | |
| 3734 | + var s = [ ]; | |
| 3735 | + | |
| 3736 | + function add( key, value ){ | |
| 3737 | + s[ s.length ] = encodeURIComponent(key) + '=' + encodeURIComponent(value); | |
| 3738 | + }; | |
| 3739 | + | |
| 3740 | + // If an array was passed in, assume that it is an array | |
| 3741 | + // of form elements | |
| 3742 | + if ( jQuery.isArray(a) || a.jquery ) | |
| 3743 | + // Serialize the form elements | |
| 3744 | + jQuery.each( a, function(){ | |
| 3745 | + add( this.name, this.value ); | |
| 3746 | + }); | |
| 3747 | + | |
| 3748 | + // Otherwise, assume that it's an object of key/value pairs | |
| 3749 | + else | |
| 3750 | + // Serialize the key/values | |
| 3751 | + for ( var j in a ) | |
| 3752 | + // If the value is an array then the key names need to be repeated | |
| 3753 | + if ( jQuery.isArray(a[j]) ) | |
| 3754 | + jQuery.each( a[j], function(){ | |
| 3755 | + add( j, this ); | |
| 3756 | + }); | |
| 3757 | + else | |
| 3758 | + add( j, jQuery.isFunction(a[j]) ? a[j]() : a[j] ); | |
| 3759 | + | |
| 3760 | + // Return the resulting serialization | |
| 3761 | + return s.join("&").replace(/%20/g, "+"); | |
| 3762 | + } | |
| 3763 | + | |
| 3764 | +}); | |
| 3765 | +var elemdisplay = {}, | |
| 3766 | + timerId, | |
| 3767 | + fxAttrs = [ | |
| 3768 | + // height animations | |
| 3769 | + [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ], | |
| 3770 | + // width animations | |
| 3771 | + [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ], | |
| 3772 | + // opacity animations | |
| 3773 | + [ "opacity" ] | |
| 3774 | + ]; | |
| 3775 | + | |
| 3776 | +function genFx( type, num ){ | |
| 3777 | + var obj = {}; | |
| 3778 | + jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice(0,num)), function(){ | |
| 3779 | + obj[ this ] = type; | |
| 3780 | + }); | |
| 3781 | + return obj; | |
| 3782 | +} | |
| 3783 | + | |
| 3784 | +jQuery.fn.extend({ | |
| 3785 | + show: function(speed,callback){ | |
| 3786 | + if ( speed ) { | |
| 3787 | + return this.animate( genFx("show", 3), speed, callback); | |
| 3788 | + } else { | |
| 3789 | + for ( var i = 0, l = this.length; i < l; i++ ){ | |
| 3790 | + var old = jQuery.data(this[i], "olddisplay"); | |
| 3791 | + | |
| 3792 | + this[i].style.display = old || ""; | |
| 3793 | + | |
| 3794 | + if ( jQuery.css(this[i], "display") === "none" ) { | |
| 3795 | + var tagName = this[i].tagName, display; | |
| 3796 | + | |
| 3797 | + if ( elemdisplay[ tagName ] ) { | |
| 3798 | + display = elemdisplay[ tagName ]; | |
| 3799 | + } else { | |
| 3800 | + var elem = jQuery("<" + tagName + " />").appendTo("body"); | |
| 3801 | + | |
| 3802 | + display = elem.css("display"); | |
| 3803 | + if ( display === "none" ) | |
| 3804 | + display = "block"; | |
| 3805 | + | |
| 3806 | + elem.remove(); | |
| 3807 | + | |
| 3808 | + elemdisplay[ tagName ] = display; | |
| 3809 | + } | |
| 3810 | + | |
| 3811 | + jQuery.data(this[i], "olddisplay", display); | |
| 3812 | + } | |
| 3813 | + } | |
| 3814 | + | |
| 3815 | + // Set the display of the elements in a second loop | |
| 3816 | + // to avoid the constant reflow | |
| 3817 | + for ( var i = 0, l = this.length; i < l; i++ ){ | |
| 3818 | + this[i].style.display = jQuery.data(this[i], "olddisplay") || ""; | |
| 3819 | + } | |
| 3820 | + | |
| 3821 | + return this; | |
| 3822 | + } | |
| 3823 | + }, | |
| 3824 | + | |
| 3825 | + hide: function(speed,callback){ | |
| 3826 | + if ( speed ) { | |
| 3827 | + return this.animate( genFx("hide", 3), speed, callback); | |
| 3828 | + } else { | |
| 3829 | + for ( var i = 0, l = this.length; i < l; i++ ){ | |
| 3830 | + var old = jQuery.data(this[i], "olddisplay"); | |
| 3831 | + if ( !old && old !== "none" ) | |
| 3832 | + jQuery.data(this[i], "olddisplay", jQuery.css(this[i], "display")); | |
| 3833 | + } | |
| 3834 | + | |
| 3835 | + // Set the display of the elements in a second loop | |
| 3836 | + // to avoid the constant reflow | |
| 3837 | + for ( var i = 0, l = this.length; i < l; i++ ){ | |
| 3838 | + this[i].style.display = "none"; | |
| 3839 | + } | |
| 3840 | + | |
| 3841 | + return this; | |
| 3842 | + } | |
| 3843 | + }, | |
| 3844 | + | |
| 3845 | + // Save the old toggle function | |
| 3846 | + _toggle: jQuery.fn.toggle, | |
| 3847 | + | |
| 3848 | + toggle: function( fn, fn2 ){ | |
| 3849 | + var bool = typeof fn === "boolean"; | |
| 3850 | + | |
| 3851 | + return jQuery.isFunction(fn) && jQuery.isFunction(fn2) ? | |
| 3852 | + this._toggle.apply( this, arguments ) : | |
| 3853 | + fn == null || bool ? | |
| 3854 | + this.each(function(){ | |
| 3855 | + var state = bool ? fn : jQuery(this).is(":hidden"); | |
| 3856 | + jQuery(this)[ state ? "show" : "hide" ](); | |
| 3857 | + }) : | |
| 3858 | + this.animate(genFx("toggle", 3), fn, fn2); | |
| 3859 | + }, | |
| 3860 | + | |
| 3861 | + fadeTo: function(speed,to,callback){ | |
| 3862 | + return this.animate({opacity: to}, speed, callback); | |
| 3863 | + }, | |
| 3864 | + | |
| 3865 | + animate: function( prop, speed, easing, callback ) { | |
| 3866 | + var optall = jQuery.speed(speed, easing, callback); | |
| 3867 | + | |
| 3868 | + return this[ optall.queue === false ? "each" : "queue" ](function(){ | |
| 3869 | + | |
| 3870 | + var opt = jQuery.extend({}, optall), p, | |
| 3871 | + hidden = this.nodeType == 1 && jQuery(this).is(":hidden"), | |
| 3872 | + self = this; | |
| 3873 | + | |
| 3874 | + for ( p in prop ) { | |
| 3875 | + if ( prop[p] == "hide" && hidden || prop[p] == "show" && !hidden ) | |
| 3876 | + return opt.complete.call(this); | |
| 3877 | + | |
| 3878 | + if ( ( p == "height" || p == "width" ) && this.style ) { | |
| 3879 | + // Store display property | |
| 3880 | + opt.display = jQuery.css(this, "display"); | |
| 3881 | + | |
| 3882 | + // Make sure that nothing sneaks out | |
| 3883 | + opt.overflow = this.style.overflow; | |
| 3884 | + } | |
| 3885 | + } | |
| 3886 | + | |
| 3887 | + if ( opt.overflow != null ) | |
| 3888 | + this.style.overflow = "hidden"; | |
| 3889 | + | |
| 3890 | + opt.curAnim = jQuery.extend({}, prop); | |
| 3891 | + | |
| 3892 | + jQuery.each( prop, function(name, val){ | |
| 3893 | + var e = new jQuery.fx( self, opt, name ); | |
| 3894 | + | |
| 3895 | + if ( /toggle|show|hide/.test(val) ) | |
| 3896 | + e[ val == "toggle" ? hidden ? "show" : "hide" : val ]( prop ); | |
| 3897 | + else { | |
| 3898 | + var parts = val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/), | |
| 3899 | + start = e.cur(true) || 0; | |
| 3900 | + | |
| 3901 | + if ( parts ) { | |
| 3902 | + var end = parseFloat(parts[2]), | |
| 3903 | + unit = parts[3] || "px"; | |
| 3904 | + | |
| 3905 | + // We need to compute starting value | |
| 3906 | + if ( unit != "px" ) { | |
| 3907 | + self.style[ name ] = (end || 1) + unit; | |
| 3908 | + start = ((end || 1) / e.cur(true)) * start; | |
| 3909 | + self.style[ name ] = start + unit; | |
| 3910 | + } | |
| 3911 | + | |
| 3912 | + // If a +=/-= token was provided, we're doing a relative animation | |
| 3913 | + if ( parts[1] ) | |
| 3914 | + end = ((parts[1] == "-=" ? -1 : 1) * end) + start; | |
| 3915 | + | |
| 3916 | + e.custom( start, end, unit ); | |
| 3917 | + } else | |
| 3918 | + e.custom( start, val, "" ); | |
| 3919 | + } | |
| 3920 | + }); | |
| 3921 | + | |
| 3922 | + // For JS strict compliance | |
| 3923 | + return true; | |
| 3924 | + }); | |
| 3925 | + }, | |
| 3926 | + | |
| 3927 | + stop: function(clearQueue, gotoEnd){ | |
| 3928 | + var timers = jQuery.timers; | |
| 3929 | + | |
| 3930 | + if (clearQueue) | |
| 3931 | + this.queue([]); | |
| 3932 | + | |
| 3933 | + this.each(function(){ | |
| 3934 | + // go in reverse order so anything added to the queue during the loop is ignored | |
| 3935 | + for ( var i = timers.length - 1; i >= 0; i-- ) | |
| 3936 | + if ( timers[i].elem == this ) { | |
| 3937 | + if (gotoEnd) | |
| 3938 | + // force the next step to be the last | |
| 3939 | + timers[i](true); | |
| 3940 | + timers.splice(i, 1); | |
| 3941 | + } | |
| 3942 | + }); | |
| 3943 | + | |
| 3944 | + // start the next in the queue if the last step wasn't forced | |
| 3945 | + if (!gotoEnd) | |
| 3946 | + this.dequeue(); | |
| 3947 | + | |
| 3948 | + return this; | |
| 3949 | + } | |
| 3950 | + | |
| 3951 | +}); | |
| 3952 | + | |
| 3953 | +// Generate shortcuts for custom animations | |
| 3954 | +jQuery.each({ | |
| 3955 | + slideDown: genFx("show", 1), | |
| 3956 | + slideUp: genFx("hide", 1), | |
| 3957 | + slideToggle: genFx("toggle", 1), | |
| 3958 | + fadeIn: { opacity: "show" }, | |
| 3959 | + fadeOut: { opacity: "hide" } | |
| 3960 | +}, function( name, props ){ | |
| 3961 | + jQuery.fn[ name ] = function( speed, callback ){ | |
| 3962 | + return this.animate( props, speed, callback ); | |
| 3963 | + }; | |
| 3964 | +}); | |
| 3965 | + | |
| 3966 | +jQuery.extend({ | |
| 3967 | + | |
| 3968 | + speed: function(speed, easing, fn) { | |
| 3969 | + var opt = typeof speed === "object" ? speed : { | |
| 3970 | + complete: fn || !fn && easing || | |
| 3971 | + jQuery.isFunction( speed ) && speed, | |
| 3972 | + duration: speed, | |
| 3973 | + easing: fn && easing || easing && !jQuery.isFunction(easing) && easing | |
| 3974 | + }; | |
| 3975 | + | |
| 3976 | + opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration : | |
| 3977 | + jQuery.fx.speeds[opt.duration] || jQuery.fx.speeds._default; | |
| 3978 | + | |
| 3979 | + // Queueing | |
| 3980 | + opt.old = opt.complete; | |
| 3981 | + opt.complete = function(){ | |
| 3982 | + if ( opt.queue !== false ) | |
| 3983 | + jQuery(this).dequeue(); | |
| 3984 | + if ( jQuery.isFunction( opt.old ) ) | |
| 3985 | + opt.old.call( this ); | |
| 3986 | + }; | |
| 3987 | + | |
| 3988 | + return opt; | |
| 3989 | + }, | |
| 3990 | + | |
| 3991 | + easing: { | |
| 3992 | + linear: function( p, n, firstNum, diff ) { | |
| 3993 | + return firstNum + diff * p; | |
| 3994 | + }, | |
| 3995 | + swing: function( p, n, firstNum, diff ) { | |
| 3996 | + return ((-Math.cos(p*Math.PI)/2) + 0.5) * diff + firstNum; | |
| 3997 | + } | |
| 3998 | + }, | |
| 3999 | + | |
| 4000 | + timers: [], | |
| 4001 | + | |
| 4002 | + fx: function( elem, options, prop ){ | |
| 4003 | + this.options = options; | |
| 4004 | + this.elem = elem; | |
| 4005 | + this.prop = prop; | |
| 4006 | + | |
| 4007 | + if ( !options.orig ) | |
| 4008 | + options.orig = {}; | |
| 4009 | + } | |
| 4010 | + | |
| 4011 | +}); | |
| 4012 | + | |
| 4013 | +jQuery.fx.prototype = { | |
| 4014 | + | |
| 4015 | + // Simple function for setting a style value | |
| 4016 | + update: function(){ | |
| 4017 | + if ( this.options.step ) | |
| 4018 | + this.options.step.call( this.elem, this.now, this ); | |
| 4019 | + | |
| 4020 | + (jQuery.fx.step[this.prop] || jQuery.fx.step._default)( this ); | |
| 4021 | + | |
| 4022 | + // Set display property to block for height/width animations | |
| 4023 | + if ( ( this.prop == "height" || this.prop == "width" ) && this.elem.style ) | |
| 4024 | + this.elem.style.display = "block"; | |
| 4025 | + }, | |
| 4026 | + | |
| 4027 | + // Get the current size | |
| 4028 | + cur: function(force){ | |
| 4029 | + if ( this.elem[this.prop] != null && (!this.elem.style || this.elem.style[this.prop] == null) ) | |
| 4030 | + return this.elem[ this.prop ]; | |
| 4031 | + | |
| 4032 | + var r = parseFloat(jQuery.css(this.elem, this.prop, force)); | |
| 4033 | + return r && r > -10000 ? r : parseFloat(jQuery.curCSS(this.elem, this.prop)) || 0; | |
| 4034 | + }, | |
| 4035 | + | |
| 4036 | + // Start an animation from one number to another | |
| 4037 | + custom: function(from, to, unit){ | |
| 4038 | + this.startTime = now(); | |
| 4039 | + this.start = from; | |
| 4040 | + this.end = to; | |
| 4041 | + this.unit = unit || this.unit || "px"; | |
| 4042 | + this.now = this.start; | |
| 4043 | + this.pos = this.state = 0; | |
| 4044 | + | |
| 4045 | + var self = this; | |
| 4046 | + function t(gotoEnd){ | |
| 4047 | + return self.step(gotoEnd); | |
| 4048 | + } | |
| 4049 | + | |
| 4050 | + t.elem = this.elem; | |
| 4051 | + | |
| 4052 | + if ( t() && jQuery.timers.push(t) && !timerId ) { | |
| 4053 | + timerId = setInterval(function(){ | |
| 4054 | + var timers = jQuery.timers; | |
| 4055 | + | |
| 4056 | + for ( var i = 0; i < timers.length; i++ ) | |
| 4057 | + if ( !timers[i]() ) | |
| 4058 | + timers.splice(i--, 1); | |
| 4059 | + | |
| 4060 | + if ( !timers.length ) { | |
| 4061 | + clearInterval( timerId ); | |
| 4062 | + timerId = undefined; | |
| 4063 | + } | |
| 4064 | + }, 13); | |
| 4065 | + } | |
| 4066 | + }, | |
| 4067 | + | |
| 4068 | + // Simple 'show' function | |
| 4069 | + show: function(){ | |
| 4070 | + // Remember where we started, so that we can go back to it later | |
| 4071 | + this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); | |
| 4072 | + this.options.show = true; | |
| 4073 | + | |
| 4074 | + // Begin the animation | |
| 4075 | + // Make sure that we start at a small width/height to avoid any | |
| 4076 | + // flash of content | |
| 4077 | + this.custom(this.prop == "width" || this.prop == "height" ? 1 : 0, this.cur()); | |
| 4078 | + | |
| 4079 | + // Start by showing the element | |
| 4080 | + jQuery(this.elem).show(); | |
| 4081 | + }, | |
| 4082 | + | |
| 4083 | + // Simple 'hide' function | |
| 4084 | + hide: function(){ | |
| 4085 | + // Remember where we started, so that we can go back to it later | |
| 4086 | + this.options.orig[this.prop] = jQuery.attr( this.elem.style, this.prop ); | |
| 4087 | + this.options.hide = true; | |
| 4088 | + | |
| 4089 | + // Begin the animation | |
| 4090 | + this.custom(this.cur(), 0); | |
| 4091 | + }, | |
| 4092 | + | |
| 4093 | + // Each step of an animation | |
| 4094 | + step: function(gotoEnd){ | |
| 4095 | + var t = now(); | |
| 4096 | + | |
| 4097 | + if ( gotoEnd || t >= this.options.duration + this.startTime ) { | |
| 4098 | + this.now = this.end; | |
| 4099 | + this.pos = this.state = 1; | |
| 4100 | + this.update(); | |
| 4101 | + | |
| 4102 | + this.options.curAnim[ this.prop ] = true; | |
| 4103 | + | |
| 4104 | + var done = true; | |
| 4105 | + for ( var i in this.options.curAnim ) | |
| 4106 | + if ( this.options.curAnim[i] !== true ) | |
| 4107 | + done = false; | |
| 4108 | + | |
| 4109 | + if ( done ) { | |
| 4110 | + if ( this.options.display != null ) { | |
| 4111 | + // Reset the overflow | |
| 4112 | + this.elem.style.overflow = this.options.overflow; | |
| 4113 | + | |
| 4114 | + // Reset the display | |
| 4115 | + this.elem.style.display = this.options.display; | |
| 4116 | + if ( jQuery.css(this.elem, "display") == "none" ) | |
| 4117 | + this.elem.style.display = "block"; | |
| 4118 | + } | |
| 4119 | + | |
| 4120 | + // Hide the element if the "hide" operation was done | |
| 4121 | + if ( this.options.hide ) | |
| 4122 | + jQuery(this.elem).hide(); | |
| 4123 | + | |
| 4124 | + // Reset the properties, if the item has been hidden or shown | |
| 4125 | + if ( this.options.hide || this.options.show ) | |
| 4126 | + for ( var p in this.options.curAnim ) | |
| 4127 | + jQuery.attr(this.elem.style, p, this.options.orig[p]); | |
| 4128 | + | |
| 4129 | + // Execute the complete function | |
| 4130 | + this.options.complete.call( this.elem ); | |
| 4131 | + } | |
| 4132 | + | |
| 4133 | + return false; | |
| 4134 | + } else { | |
| 4135 | + var n = t - this.startTime; | |
| 4136 | + this.state = n / this.options.duration; | |
| 4137 | + | |
| 4138 | + // Perform the easing function, defaults to swing | |
| 4139 | + this.pos = jQuery.easing[this.options.easing || (jQuery.easing.swing ? "swing" : "linear")](this.state, n, 0, 1, this.options.duration); | |
| 4140 | + this.now = this.start + ((this.end - this.start) * this.pos); | |
| 4141 | + | |
| 4142 | + // Perform the next step of the animation | |
| 4143 | + this.update(); | |
| 4144 | + } | |
| 4145 | + | |
| 4146 | + return true; | |
| 4147 | + } | |
| 4148 | + | |
| 4149 | +}; | |
| 4150 | + | |
| 4151 | +jQuery.extend( jQuery.fx, { | |
| 4152 | + speeds:{ | |
| 4153 | + slow: 600, | |
| 4154 | + fast: 200, | |
| 4155 | + // Default speed | |
| 4156 | + _default: 400 | |
| 4157 | + }, | |
| 4158 | + step: { | |
| 4159 | + | |
| 4160 | + opacity: function(fx){ | |
| 4161 | + jQuery.attr(fx.elem.style, "opacity", fx.now); | |
| 4162 | + }, | |
| 4163 | + | |
| 4164 | + _default: function(fx){ | |
| 4165 | + if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) | |
| 4166 | + fx.elem.style[ fx.prop ] = fx.now + fx.unit; | |
| 4167 | + else | |
| 4168 | + fx.elem[ fx.prop ] = fx.now; | |
| 4169 | + } | |
| 4170 | + } | |
| 4171 | +}); | |
| 4172 | +if ( document.documentElement["getBoundingClientRect"] ) | |
| 4173 | + jQuery.fn.offset = function() { | |
| 4174 | + if ( !this[0] ) return { top: 0, left: 0 }; | |
| 4175 | + if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] ); | |
| 4176 | + var box = this[0].getBoundingClientRect(), doc = this[0].ownerDocument, body = doc.body, docElem = doc.documentElement, | |
| 4177 | + clientTop = docElem.clientTop || body.clientTop || 0, clientLeft = docElem.clientLeft || body.clientLeft || 0, | |
| 4178 | + top = box.top + (self.pageYOffset || jQuery.boxModel && docElem.scrollTop || body.scrollTop ) - clientTop, | |
| 4179 | + left = box.left + (self.pageXOffset || jQuery.boxModel && docElem.scrollLeft || body.scrollLeft) - clientLeft; | |
| 4180 | + return { top: top, left: left }; | |
| 4181 | + }; | |
| 4182 | +else | |
| 4183 | + jQuery.fn.offset = function() { | |
| 4184 | + if ( !this[0] ) return { top: 0, left: 0 }; | |
| 4185 | + if ( this[0] === this[0].ownerDocument.body ) return jQuery.offset.bodyOffset( this[0] ); | |
| 4186 | + jQuery.offset.initialized || jQuery.offset.initialize(); | |
| 4187 | + | |
| 4188 | + var elem = this[0], offsetParent = elem.offsetParent, prevOffsetParent = elem, | |
| 4189 | + doc = elem.ownerDocument, computedStyle, docElem = doc.documentElement, | |
| 4190 | + body = doc.body, defaultView = doc.defaultView, | |
| 4191 | + prevComputedStyle = defaultView.getComputedStyle(elem, null), | |
| 4192 | + top = elem.offsetTop, left = elem.offsetLeft; | |
| 4193 | + | |
| 4194 | + while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) { | |
| 4195 | + computedStyle = defaultView.getComputedStyle(elem, null); | |
| 4196 | + top -= elem.scrollTop, left -= elem.scrollLeft; | |
| 4197 | + if ( elem === offsetParent ) { | |
| 4198 | + top += elem.offsetTop, left += elem.offsetLeft; | |
| 4199 | + if ( jQuery.offset.doesNotAddBorder && !(jQuery.offset.doesAddBorderForTableAndCells && /^t(able|d|h)$/i.test(elem.tagName)) ) | |
| 4200 | + top += parseInt( computedStyle.borderTopWidth, 10) || 0, | |
| 4201 | + left += parseInt( computedStyle.borderLeftWidth, 10) || 0; | |
| 4202 | + prevOffsetParent = offsetParent, offsetParent = elem.offsetParent; | |
| 4203 | + } | |
| 4204 | + if ( jQuery.offset.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) | |
| 4205 | + top += parseInt( computedStyle.borderTopWidth, 10) || 0, | |
| 4206 | + left += parseInt( computedStyle.borderLeftWidth, 10) || 0; | |
| 4207 | + prevComputedStyle = computedStyle; | |
| 4208 | + } | |
| 4209 | + | |
| 4210 | + if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) | |
| 4211 | + top += body.offsetTop, | |
| 4212 | + left += body.offsetLeft; | |
| 4213 | + | |
| 4214 | + if ( prevComputedStyle.position === "fixed" ) | |
| 4215 | + top += Math.max(docElem.scrollTop, body.scrollTop), | |
| 4216 | + left += Math.max(docElem.scrollLeft, body.scrollLeft); | |
| 4217 | + | |
| 4218 | + return { top: top, left: left }; | |
| 4219 | + }; | |
| 4220 | + | |
| 4221 | +jQuery.offset = { | |
| 4222 | + initialize: function() { | |
| 4223 | + if ( this.initialized ) return; | |
| 4224 | + var body = document.body, container = document.createElement('div'), innerDiv, checkDiv, table, td, rules, prop, bodyMarginTop = body.style.marginTop, | |
| 4225 | + html = '<div style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;"><div></div></div><table style="position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;" cellpadding="0" cellspacing="0"><tr><td></td></tr></table>'; | |
| 4226 | + | |
| 4227 | + rules = { position: 'absolute', top: 0, left: 0, margin: 0, border: 0, width: '1px', height: '1px', visibility: 'hidden' }; | |
| 4228 | + for ( prop in rules ) container.style[prop] = rules[prop]; | |
| 4229 | + | |
| 4230 | + container.innerHTML = html; | |
| 4231 | + body.insertBefore(container, body.firstChild); | |
| 4232 | + innerDiv = container.firstChild, checkDiv = innerDiv.firstChild, td = innerDiv.nextSibling.firstChild.firstChild; | |
| 4233 | + | |
| 4234 | + this.doesNotAddBorder = (checkDiv.offsetTop !== 5); | |
| 4235 | + this.doesAddBorderForTableAndCells = (td.offsetTop === 5); | |
| 4236 | + | |
| 4237 | + innerDiv.style.overflow = 'hidden', innerDiv.style.position = 'relative'; | |
| 4238 | + this.subtractsBorderForOverflowNotVisible = (checkDiv.offsetTop === -5); | |
| 4239 | + | |
| 4240 | + body.style.marginTop = '1px'; | |
| 4241 | + this.doesNotIncludeMarginInBodyOffset = (body.offsetTop === 0); | |
| 4242 | + body.style.marginTop = bodyMarginTop; | |
| 4243 | + | |
| 4244 | + body.removeChild(container); | |
| 4245 | + this.initialized = true; | |
| 4246 | + }, | |
| 4247 | + | |
| 4248 | + bodyOffset: function(body) { | |
| 4249 | + jQuery.offset.initialized || jQuery.offset.initialize(); | |
| 4250 | + var top = body.offsetTop, left = body.offsetLeft; | |
| 4251 | + if ( jQuery.offset.doesNotIncludeMarginInBodyOffset ) | |
| 4252 | + top += parseInt( jQuery.curCSS(body, 'marginTop', true), 10 ) || 0, | |
| 4253 | + left += parseInt( jQuery.curCSS(body, 'marginLeft', true), 10 ) || 0; | |
| 4254 | + return { top: top, left: left }; | |
| 4255 | + } | |
| 4256 | +}; | |
| 4257 | + | |
| 4258 | + | |
| 4259 | +jQuery.fn.extend({ | |
| 4260 | + position: function() { | |
| 4261 | + var left = 0, top = 0, results; | |
| 4262 | + | |
| 4263 | + if ( this[0] ) { | |
| 4264 | + // Get *real* offsetParent | |
| 4265 | + var offsetParent = this.offsetParent(), | |
| 4266 | + | |
| 4267 | + // Get correct offsets | |
| 4268 | + offset = this.offset(), | |
| 4269 | + parentOffset = /^body|html$/i.test(offsetParent[0].tagName) ? { top: 0, left: 0 } : offsetParent.offset(); | |
| 4270 | + | |
| 4271 | + // Subtract element margins | |
| 4272 | + // note: when an element has margin: auto the offsetLeft and marginLeft | |
| 4273 | + // are the same in Safari causing offset.left to incorrectly be 0 | |
| 4274 | + offset.top -= num( this, 'marginTop' ); | |
| 4275 | + offset.left -= num( this, 'marginLeft' ); | |
| 4276 | + | |
| 4277 | + // Add offsetParent borders | |
| 4278 | + parentOffset.top += num( offsetParent, 'borderTopWidth' ); | |
| 4279 | + parentOffset.left += num( offsetParent, 'borderLeftWidth' ); | |
| 4280 | + | |
| 4281 | + // Subtract the two offsets | |
| 4282 | + results = { | |
| 4283 | + top: offset.top - parentOffset.top, | |
| 4284 | + left: offset.left - parentOffset.left | |
| 4285 | + }; | |
| 4286 | + } | |
| 4287 | + | |
| 4288 | + return results; | |
| 4289 | + }, | |
| 4290 | + | |
| 4291 | + offsetParent: function() { | |
| 4292 | + var offsetParent = this[0].offsetParent || document.body; | |
| 4293 | + while ( offsetParent && (!/^body|html$/i.test(offsetParent.tagName) && jQuery.css(offsetParent, 'position') == 'static') ) | |
| 4294 | + offsetParent = offsetParent.offsetParent; | |
| 4295 | + return jQuery(offsetParent); | |
| 4296 | + } | |
| 4297 | +}); | |
| 4298 | + | |
| 4299 | + | |
| 4300 | +// Create scrollLeft and scrollTop methods | |
| 4301 | +jQuery.each( ['Left', 'Top'], function(i, name) { | |
| 4302 | + var method = 'scroll' + name; | |
| 4303 | + | |
| 4304 | + jQuery.fn[ method ] = function(val) { | |
| 4305 | + if (!this[0]) return null; | |
| 4306 | + | |
| 4307 | + return val !== undefined ? | |
| 4308 | + | |
| 4309 | + // Set the scroll offset | |
| 4310 | + this.each(function() { | |
| 4311 | + this == window || this == document ? | |
| 4312 | + window.scrollTo( | |
| 4313 | + !i ? val : jQuery(window).scrollLeft(), | |
| 4314 | + i ? val : jQuery(window).scrollTop() | |
| 4315 | + ) : | |
| 4316 | + this[ method ] = val; | |
| 4317 | + }) : | |
| 4318 | + | |
| 4319 | + // Return the scroll offset | |
| 4320 | + this[0] == window || this[0] == document ? | |
| 4321 | + self[ i ? 'pageYOffset' : 'pageXOffset' ] || | |
| 4322 | + jQuery.boxModel && document.documentElement[ method ] || | |
| 4323 | + document.body[ method ] : | |
| 4324 | + this[0][ method ]; | |
| 4325 | + }; | |
| 4326 | +}); | |
| 4327 | +// Create innerHeight, innerWidth, outerHeight and outerWidth methods | |
| 4328 | +jQuery.each([ "Height", "Width" ], function(i, name){ | |
| 4329 | + | |
| 4330 | + var tl = i ? "Left" : "Top", // top or left | |
| 4331 | + br = i ? "Right" : "Bottom", // bottom or right | |
| 4332 | + lower = name.toLowerCase(); | |
| 4333 | + | |
| 4334 | + // innerHeight and innerWidth | |
| 4335 | + jQuery.fn["inner" + name] = function(){ | |
| 4336 | + return this[0] ? | |
| 4337 | + jQuery.css( this[0], lower, false, "padding" ) : | |
| 4338 | + null; | |
| 4339 | + }; | |
| 4340 | + | |
| 4341 | + // outerHeight and outerWidth | |
| 4342 | + jQuery.fn["outer" + name] = function(margin) { | |
| 4343 | + return this[0] ? | |
| 4344 | + jQuery.css( this[0], lower, false, margin ? "margin" : "border" ) : | |
| 4345 | + null; | |
| 4346 | + }; | |
| 4347 | + | |
| 4348 | + var type = name.toLowerCase(); | |
| 4349 | + | |
| 4350 | + jQuery.fn[ type ] = function( size ) { | |
| 4351 | + // Get window width or height | |
| 4352 | + return this[0] == window ? | |
| 4353 | + // Everyone else use document.documentElement or document.body depending on Quirks vs Standards mode | |
| 4354 | + document.compatMode == "CSS1Compat" && document.documentElement[ "client" + name ] || | |
| 4355 | + document.body[ "client" + name ] : | |
| 4356 | + | |
| 4357 | + // Get document width or height | |
| 4358 | + this[0] == document ? | |
| 4359 | + // Either scroll[Width/Height] or offset[Width/Height], whichever is greater | |
| 4360 | + Math.max( | |
| 4361 | + document.documentElement["client" + name], | |
| 4362 | + document.body["scroll" + name], document.documentElement["scroll" + name], | |
| 4363 | + document.body["offset" + name], document.documentElement["offset" + name] | |
| 4364 | + ) : | |
| 4365 | + | |
| 4366 | + // Get or set width or height on the element | |
| 4367 | + size === undefined ? | |
| 4368 | + // Get width or height on the element | |
| 4369 | + (this.length ? jQuery.css( this[0], type ) : null) : | |
| 4370 | + | |
| 4371 | + // Set the width or height on the element (default to pixels if value is unitless) | |
| 4372 | + this.css( type, typeof size === "string" ? size : size + "px" ); | |
| 4373 | + }; | |
| 4374 | + | |
| 4375 | +}); | |
| 4376 | +})(); | ... | ... |
setup/upgrade/resources/wizard.css
0 → 100644
| 1 | +* { margin: 0; padding: 0; } | |
| 2 | + | |
| 3 | +body { | |
| 4 | + background-attachment:scroll; | |
| 5 | + background-color:transparent; | |
| 6 | + background-image:url("graphics/dame/loginbg.png"); | |
| 7 | + background-position:0 0; | |
| 8 | + background-repeat:repeat-x; | |
| 9 | + font-family:sans-serif; | |
| 10 | + color:grey; | |
| 11 | +} | |
| 12 | + | |
| 13 | +h1 { | |
| 14 | + font-size:165%; | |
| 15 | + margin-bottom:5px; | |
| 16 | + margin-top:0; | |
| 17 | +} | |
| 18 | + | |
| 19 | +h2 { | |
| 20 | + font-size: 1.5em; | |
| 21 | + font-weight: normal; | |
| 22 | + padding: 10px 0; | |
| 23 | + color: #555; | |
| 24 | +} | |
| 25 | + | |
| 26 | +h3 { | |
| 27 | + font-size: 1.2em; | |
| 28 | + font-weight: normal; | |
| 29 | + padding: 10px 0; | |
| 30 | + color: #555; | |
| 31 | +} | |
| 32 | + | |
| 33 | + | |
| 34 | +p { | |
| 35 | + padding-bottom: 10px; | |
| 36 | + word-wrap: break-word; | |
| 37 | +} | |
| 38 | + | |
| 39 | +p.title { | |
| 40 | + font-size: 165%; | |
| 41 | + margin-bottom: 5px; | |
| 42 | + margin-top: 0px; | |
| 43 | +} | |
| 44 | + | |
| 45 | +a { | |
| 46 | + color: #EC7725; | |
| 47 | +} | |
| 48 | + | |
| 49 | +th { | |
| 50 | + font-weight: bold; | |
| 51 | + text-align: left; | |
| 52 | + padding: 5px 5px; | |
| 53 | +} | |
| 54 | + | |
| 55 | +td { | |
| 56 | + padding: 2px 5px; | |
| 57 | +} | |
| 58 | + | |
| 59 | +select { | |
| 60 | + width: 320px; | |
| 61 | +} | |
| 62 | + | |
| 63 | +/* *** Layout Styles *** */ | |
| 64 | + | |
| 65 | +#outer-wrapper { | |
| 66 | + border:1px solid #B7B7B7; | |
| 67 | + left:215px; | |
| 68 | + position:relative; | |
| 69 | + top:20px; | |
| 70 | + width:1024px; | |
| 71 | +} | |
| 72 | + | |
| 73 | +#header { | |
| 74 | + background: transparent url("graphics/dame/upgrader_head.png") repeat scroll 0% 0%; | |
| 75 | + text-align: right; | |
| 76 | + font-size: 100%; | |
| 77 | + color: rgb(167, 167, 167); | |
| 78 | + font-family: sans-serif; | |
| 79 | + height: 71px; | |
| 80 | + font-family:sans-serif; | |
| 81 | + padding-right:15px; | |
| 82 | +} | |
| 83 | + | |
| 84 | +#wrapper { | |
| 85 | + background: white url("graphics/background.gif") repeat-y left; | |
| 86 | +} | |
| 87 | + | |
| 88 | +#container { | |
| 89 | + width: 100%; | |
| 90 | + background: white url("graphics/background.gif") repeat-y left; | |
| 91 | + float: right; | |
| 92 | +} | |
| 93 | + | |
| 94 | +#content { | |
| 95 | + margin-left: 220px; | |
| 96 | + height:515px; | |
| 97 | +} | |
| 98 | + | |
| 99 | +#content_container { | |
| 100 | + padding:20px; | |
| 101 | + vertical-align: middle; | |
| 102 | + font-size: 10pt; | |
| 103 | +} | |
| 104 | + | |
| 105 | +#step_content { | |
| 106 | + border: 1px solid rgb(207, 207, 207); | |
| 107 | + padding: 5px; | |
| 108 | + overflow: auto; | |
| 109 | + height: 400px; | |
| 110 | +} | |
| 111 | + | |
| 112 | +#step_content_dependencies { | |
| 113 | + border: 1px solid rgb(207, 207, 207); | |
| 114 | + padding: 5px; | |
| 115 | + min-height:265px; | |
| 116 | +} | |
| 117 | + | |
| 118 | +#step_content_configuration { | |
| 119 | + border: 1px solid rgb(207, 207, 207); | |
| 120 | + padding: 5px; | |
| 121 | + min-height:290px; | |
| 122 | +} | |
| 123 | + | |
| 124 | +#step_content_registration { | |
| 125 | + border: 1px solid rgb(207, 207, 207); | |
| 126 | + padding: 5px; | |
| 127 | + height:295px; | |
| 128 | +} | |
| 129 | + | |
| 130 | +#step_content_registration_confirm { | |
| 131 | + border: 1px solid rgb(207, 207, 207); | |
| 132 | + padding: 5px; | |
| 133 | + height:400px; | |
| 134 | +} | |
| 135 | + | |
| 136 | +#step_content_upgrade { | |
| 137 | + border: 1px solid rgb(207, 207, 207); | |
| 138 | + padding: 5px; | |
| 139 | + height:290px; | |
| 140 | +} | |
| 141 | + | |
| 142 | +#step_content_database { | |
| 143 | + border: 1px solid rgb(207, 207, 207); | |
| 144 | + padding: 5px; | |
| 145 | + min-height:355px; | |
| 146 | +} | |
| 147 | + | |
| 148 | +#step_content_database_confirm { | |
| 149 | + border: 1px solid rgb(207, 207, 207); | |
| 150 | + padding: 5px; | |
| 151 | + height:375px; | |
| 152 | +} | |
| 153 | + | |
| 154 | +#step_content_complete { | |
| 155 | + border: 1px solid rgb(207, 207, 207); | |
| 156 | + padding: 5px; | |
| 157 | + min-height:355px; | |
| 158 | +} | |
| 159 | + | |
| 160 | +#sidebar { | |
| 161 | + /*background: rgb(239, 239, 239) none repeat scroll 0% 0%;*/ | |
| 162 | + font-size: 90%; | |
| 163 | + color: grey; | |
| 164 | + font-family: sans-serif; | |
| 165 | + margin-top: 0px; | |
| 166 | + /*width: 235px;*/ | |
| 167 | + float: left; | |
| 168 | + padding-top: 20px; | |
| 169 | + padding-bottom: 20px; | |
| 170 | + /*height:475px;*/ | |
| 171 | + /*color:#616161;*/ | |
| 172 | + line-height:3; | |
| 173 | + padding-left:20px; | |
| 174 | + text-align:left; | |
| 175 | +} | |
| 176 | + | |
| 177 | +#footer { | |
| 178 | + background-image:url("graphics/dame/navbar.png"); | |
| 179 | + height:35px; | |
| 180 | +} | |
| 181 | + | |
| 182 | +.clearing { | |
| 183 | + height: 0; | |
| 184 | + clear: both; | |
| 185 | +} | |
| 186 | + | |
| 187 | +/* Content Styles */ | |
| 188 | + | |
| 189 | +.logo { | |
| 190 | + background: url("graphics/logo.png") no-repeat; | |
| 191 | + background-position: top left; | |
| 192 | + height: 50px; | |
| 193 | + width: 200px; | |
| 194 | + margin-left: 10px; | |
| 195 | +} | |
| 196 | + | |
| 197 | +#logo { | |
| 198 | + position:relative; | |
| 199 | + right:760px; | |
| 200 | + top:20px; | |
| 201 | +} | |
| 202 | + | |
| 203 | +#upgrade_details { | |
| 204 | + bottom:20px; | |
| 205 | + position:relative; | |
| 206 | + right:10px; | |
| 207 | +} | |
| 208 | + | |
| 209 | +.indicator a { | |
| 210 | + background:url("graphics/dame/tick1.png") no-repeat left; | |
| 211 | + padding-top:15px; | |
| 212 | + padding-bottom:10px; | |
| 213 | + padding-left:30px; | |
| 214 | + color: #1c9e00; | |
| 215 | +} | |
| 216 | + | |
| 217 | +.active { | |
| 218 | + background:url("graphics/dame/tick1.png") no-repeat left; | |
| 219 | + padding-top:15px; | |
| 220 | + padding-bottom:10px; | |
| 221 | + padding-left:30px; | |
| 222 | + color: #1c9e00; | |
| 223 | +} | |
| 224 | + | |
| 225 | +.inactive { | |
| 226 | + background:url("graphics/dame/tick2.png") no-repeat left; | |
| 227 | + padding-top:15px; | |
| 228 | + padding-bottom:10px; | |
| 229 | + padding-left:30px; | |
| 230 | + color:#a7a7a7; | |
| 231 | +} | |
| 232 | + | |
| 233 | +.current { | |
| 234 | + background:url("graphics/dame/dot.png") no-repeat left; | |
| 235 | + padding-top:15px; | |
| 236 | + padding-bottom:10px; | |
| 237 | + padding-left:30px; | |
| 238 | + color: #f36a00; | |
| 239 | +} | |
| 240 | + | |
| 241 | +.tick { | |
| 242 | + background: url("graphics/tick.png") no-repeat; | |
| 243 | + height: 16px; | |
| 244 | + width: 16px; | |
| 245 | +} | |
| 246 | + | |
| 247 | +.cross { | |
| 248 | + background: url("graphics/cross.png") no-repeat; | |
| 249 | + height: 16px; | |
| 250 | + width: 16px; | |
| 251 | + color:#A30000; | |
| 252 | +} | |
| 253 | + | |
| 254 | +.cross_orange { | |
| 255 | + background: url("graphics/cross_orange.png") no-repeat; | |
| 256 | + height: 16px; | |
| 257 | + width: 16px; | |
| 258 | + color:#EC7725; | |
| 259 | +} | |
| 260 | + | |
| 261 | +.green { | |
| 262 | + color: green; | |
| 263 | + align: center; | |
| 264 | +} | |
| 265 | + | |
| 266 | +.orange { | |
| 267 | + color: orange; | |
| 268 | + align: center; | |
| 269 | +} | |
| 270 | + | |
| 271 | +.error { | |
| 272 | + font-weight: bold; | |
| 273 | + color: red; | |
| 274 | +} | |
| 275 | + | |
| 276 | +.conf_paths { | |
| 277 | + width:755px; | |
| 278 | +} | |
| 279 | + | |
| 280 | +.errors { | |
| 281 | + color: #9F0000; | |
| 282 | +} | |
| 283 | + | |
| 284 | +.buttons { | |
| 285 | + bottom: 40px; | |
| 286 | + right:20px; | |
| 287 | + position: absolute; | |
| 288 | + width:120px; | |
| 289 | +} | |
| 290 | + | |
| 291 | +.back { | |
| 292 | + background-image: url("graphics/dame/kt_gradient.jpg"); | |
| 293 | + background-repeat:repeat-x; | |
| 294 | + border:1px solid #CECECE; | |
| 295 | + float:left; | |
| 296 | + font-size:13px; | |
| 297 | + font-weight:bold; | |
| 298 | + margin-left:0; | |
| 299 | + margin-top:10px; | |
| 300 | +} | |
| 301 | + | |
| 302 | +.textinput { | |
| 303 | + margin-top:0px; | |
| 304 | + float:left; | |
| 305 | +} | |
| 306 | + | |
| 307 | +.step input { | |
| 308 | + background-image: url("graphics/dame/kt_gradient.jpg"); | |
| 309 | + background-repeat:repeat-x; | |
| 310 | + border:1px solid #CECECE; | |
| 311 | + float:right; | |
| 312 | + font-size:13px; | |
| 313 | + font-weight:bold; | |
| 314 | + margin-left:5px; | |
| 315 | + /*margin-top:10px;*/ | |
| 316 | +} | |
| 317 | + | |
| 318 | +.step .radio { | |
| 319 | + float:none; | |
| 320 | +} | |
| 321 | + | |
| 322 | +.button_next { | |
| 323 | + float:right; | |
| 324 | + margin-left:5px; | |
| 325 | + margin-top:10px; | |
| 326 | +} | |
| 327 | + | |
| 328 | +.button_previous { | |
| 329 | + float:left; | |
| 330 | + margin-left:0px; | |
| 331 | + margin-top:10px; | |
| 332 | +} | |
| 333 | + | |
| 334 | +.buttons a { | |
| 335 | + background: #DDDDDD; | |
| 336 | + border: solid 1px #888; | |
| 337 | + padding: 2px 8px 2px 5px; | |
| 338 | + text-decoration: none; | |
| 339 | + color: #EC7725; | |
| 340 | +} | |
| 341 | + | |
| 342 | +.powered-by { | |
| 343 | + background: url("graphics/powered-by-kt.png") no-repeat; | |
| 344 | + background-position: center left; | |
| 345 | + height: 50px; | |
| 346 | + width: 140px; | |
| 347 | + margin-left: 10px; | |
| 348 | +} | |
| 349 | + | |
| 350 | +.adv_options { | |
| 351 | + | |
| 352 | +} | |
| 353 | + | |
| 354 | +.onclick { | |
| 355 | + cursor: pointer; | |
| 356 | + color: #EC7725; | |
| 357 | + width: 130px; | |
| 358 | +} | |
| 359 | + | |
| 360 | +.description { | |
| 361 | + color:#898989; | |
| 362 | + line-height:150%; | |
| 363 | + /*margin-bottom:0.75em;*/ | |
| 364 | + font-size:90%; | |
| 365 | +} | |
| 366 | + | |
| 367 | +.disclaimer { | |
| 368 | + border: solid 1px #EFBE87; | |
| 369 | + margin: 0 20px; | |
| 370 | + padding: 5px; | |
| 371 | + font-size: 85%; | |
| 372 | +} | |
| 373 | + | |
| 374 | +.top { | |
| 375 | + font-size: 2em; | |
| 376 | + font-weight: normal; | |
| 377 | + padding: 10px 0; | |
| 378 | + color: #444; | |
| 379 | +} | |
| 380 | + | |
| 381 | +.right_top { | |
| 382 | + height:45px; | |
| 383 | +} | |
| 384 | + | |
| 385 | +#dbconf { | |
| 386 | + width:755px; | |
| 387 | +} | |
| 388 | + | |
| 389 | +table#dbconf tr td { | |
| 390 | + width:50%; | |
| 391 | +} | |
| 392 | + | |
| 393 | +table#dbconf tr td input{ | |
| 394 | + | |
| 395 | +} | |
| 396 | + | |
| 397 | +.options { | |
| 398 | + width:15%; | |
| 399 | +} | |
| 400 | + | |
| 401 | +.adv_options { | |
| 402 | + padding: 5px 8px; | |
| 403 | +} | |
| 404 | + | |
| 405 | +#section { | |
| 406 | + | |
| 407 | +} | |
| 408 | + | |
| 409 | +.php_ext_details table { | |
| 410 | + width:745px; | |
| 411 | +} | |
| 412 | + | |
| 413 | +.php_ext_details table tr { | |
| 414 | + | |
| 415 | +} | |
| 416 | + | |
| 417 | +td.ext_indicator { | |
| 418 | + width:10px; | |
| 419 | +} | |
| 420 | + | |
| 421 | +td.ext_name { | |
| 422 | + width:110p; | |
| 423 | +} | |
| 424 | + | |
| 425 | +td.ext_description { | |
| 426 | + width:360px; | |
| 427 | +} | |
| 428 | + | |
| 429 | +td.ext_error { | |
| 430 | + width:350px; | |
| 431 | +} | |
| 432 | + | |
| 433 | +td.ext_refresh { | |
| 434 | + width:10px; | |
| 435 | +} | |
| 436 | + | |
| 437 | +td.dir_name { | |
| 438 | + width:200px; | |
| 439 | +} | |
| 440 | + | |
| 441 | +td.dir_description { | |
| 442 | + width:200px; | |
| 443 | +} | |
| 444 | + | |
| 445 | +.php_con_details table { | |
| 446 | + width:745px; | |
| 447 | + /*border:1px solid;*/ | |
| 448 | +} | |
| 449 | + | |
| 450 | +.error_message { | |
| 451 | + border:none; | |
| 452 | + color:#A30000; | |
| 453 | + padding:0px; | |
| 454 | + color:red; | |
| 455 | + font-size:90%; | |
| 456 | + margin-bottom:0.75em; | |
| 457 | + font-weight:bold; | |
| 458 | +} | |
| 459 | + | |
| 460 | +.warning_message{ | |
| 461 | + border:none; | |
| 462 | + color:#A30000; | |
| 463 | + padding:0px; | |
| 464 | + color:#EC7725; | |
| 465 | + font-size:90%; | |
| 466 | + margin-bottom:0.75em; | |
| 467 | + font-weight:bold; | |
| 468 | +} | |
| 469 | + | |
| 470 | +.continue_message { | |
| 471 | + border:none; | |
| 472 | + width:550px; | |
| 473 | + padding:0px; | |
| 474 | + color:#898989; | |
| 475 | + font-size:90%; | |
| 476 | + margin-bottom:0.75em; | |
| 477 | + height:16px; | |
| 478 | +} | |
| 479 | + | |
| 480 | +.big_ok { | |
| 481 | + background: url("graphics/big-ok.png") no-repeat; | |
| 482 | + padding:4px; | |
| 483 | + /*width:16px; | |
| 484 | + height:16px; | |
| 485 | + padding-bottom:1px;*/ | |
| 486 | +} | |
| 487 | + | |
| 488 | +.license_agreement { | |
| 489 | + overflow: scroll; | |
| 490 | + height: 255px; | |
| 491 | + width:765px; | |
| 492 | + height:370px; | |
| 493 | + overflow-x:hidden; | |
| 494 | + border:1px solid #CFCFCF; | |
| 495 | +} | |
| 496 | + | |
| 497 | +.db_adv_options { | |
| 498 | + height:200px; | |
| 499 | + width:720px; | |
| 500 | +} | |
| 501 | + | |
| 502 | +.adv_option { | |
| 503 | + height:65px; | |
| 504 | + width:720px; | |
| 505 | +} | |
| 506 | + | |
| 507 | +#tooltips { | |
| 508 | + background: url("graphics/question.gif") no-repeat; | |
| 509 | + width:16px; | |
| 510 | + height:16px; | |
| 511 | + cursor:pointer; | |
| 512 | +} | |
| 513 | + | |
| 514 | +.empty_space { | |
| 515 | + font-size:12pt; | |
| 516 | +} | |
| 517 | + | |
| 518 | +.demo { | |
| 519 | + left:75px; | |
| 520 | + position:relative; | |
| 521 | + width:600px | |
| 522 | +} | |
| 523 | + | |
| 524 | +.text_message { | |
| 525 | + | |
| 526 | +} | |
| 527 | + | |
| 528 | +.description_click { | |
| 529 | + line-height:150%; | |
| 530 | + font-size:90%; | |
| 531 | +} | |
| 532 | + | |
| 533 | +.specify { | |
| 534 | + background: #DDDDDD; | |
| 535 | + border: solid 1px #888; | |
| 536 | + padding: 2px 8px 2px 5px; | |
| 537 | + text-decoration: none; | |
| 538 | + color: #EC7725; | |
| 539 | +} | |
| 0 | 540 | \ No newline at end of file | ... | ... |
setup/upgrade/resources/wizard.js
0 → 100644
| 1 | +// Class Wizard | |
| 2 | +function wizard() { | |
| 3 | +} | |
| 4 | + | |
| 5 | +// Does a form check on every new page load | |
| 6 | +wizard.prototype.doFormCheck = function() { | |
| 7 | + w.addReadOnly(); | |
| 8 | + w.preload(); | |
| 9 | +} | |
| 10 | + | |
| 11 | +// Toggle Advance Database options | |
| 12 | +wizard.prototype.toggleClass = function(ele, option) { | |
| 13 | + var el = document.getElementsByClassName(ele); //adv_options|php_details|php_ext_details|php_con_details | |
| 14 | + if(el[0].style.display == 'none') { | |
| 15 | + el[0].style.display = 'block'; | |
| 16 | + if(document.getElementById(option).innerHTML != ' Advanced Options') | |
| 17 | + document.getElementById(option).innerHTML = "Hide Details"; | |
| 18 | + } else { | |
| 19 | + el[0].style.display = 'none'; | |
| 20 | + if(document.getElementById(option).innerHTML != ' Advanced Options') | |
| 21 | + document.getElementById(option).innerHTML = "Show Details"; | |
| 22 | + } | |
| 23 | +} | |
| 24 | + | |
| 25 | +// Toggle display of an element | |
| 26 | +wizard.prototype.toggleElement = function(el) { | |
| 27 | + if(el.style.display == 'none') | |
| 28 | + el.style.display = 'block'; | |
| 29 | + else | |
| 30 | + el.style.display = 'none'; | |
| 31 | +} | |
| 32 | + | |
| 33 | +// Handle steps within database page | |
| 34 | + wizard.prototype.showStep = function(p, d) { | |
| 35 | + if(d != 'p') { // Don't check if previous is clicked | |
| 36 | + var ueq = 0; | |
| 37 | + if(p == 2) { // Check User 1 | |
| 38 | + ueq = w.validateUsers('dmsname', 'dmspassword', 'dmspassword2'); | |
| 39 | + } else if(p == 3) { // Check User 2 | |
| 40 | + ueq = w.validateUsers('dmsusername', 'dmsuserpassword', 'dmsuserpassword2'); | |
| 41 | + } | |
| 42 | + if(ueq != 0) { | |
| 43 | + return w.display("error_"+ ueq + "_" + p) ; | |
| 44 | + } | |
| 45 | + } | |
| 46 | + w.hideErrors(); // If theres no errors, hide the ones displaying | |
| 47 | + var el = document.getElementsByClassName("step"+p); | |
| 48 | + el[0].style.display = 'none'; | |
| 49 | + var j = 0; | |
| 50 | + if(d == "n") { | |
| 51 | + j = p+1; | |
| 52 | + } else if(d == "p") { | |
| 53 | + j = p-1; | |
| 54 | + } | |
| 55 | + el = document.getElementsByClassName("step"+j); | |
| 56 | + if(el != 'undefined') { | |
| 57 | + el[0].style.display = 'block'; | |
| 58 | + } | |
| 59 | + return true; | |
| 60 | +} | |
| 61 | + | |
| 62 | +// Validate Users | |
| 63 | + wizard.prototype.validateUsers = function(id1, id2, id3) { | |
| 64 | + var el1 = document.getElementById(id1); | |
| 65 | + var el2 = document.getElementById(id2); | |
| 66 | + var el3 = document.getElementById(id3); | |
| 67 | + var elVal1 = el1.value; | |
| 68 | + var elVal2 = el2.value; | |
| 69 | + var elVal3 = el3.value; | |
| 70 | + if(elVal1 == '') { // User name empty | |
| 71 | + w.focusElement(el1); | |
| 72 | + return 1; | |
| 73 | + } else if(elVal2 == '') { // Empty Password | |
| 74 | + w.focusElement(el2); | |
| 75 | + return 2; | |
| 76 | + } else if(elVal3 == '') { // Empty Confirmation Password | |
| 77 | + w.focusElement(el3); | |
| 78 | + return 3; | |
| 79 | + } else if(elVal2 != elVal3) { // Passwords not equal | |
| 80 | + w.focusElement(el2); | |
| 81 | + return 4; | |
| 82 | + } else { | |
| 83 | + return 0; | |
| 84 | + } | |
| 85 | +} | |
| 86 | + | |
| 87 | +// Display Errors | |
| 88 | +wizard.prototype.display = function(elname, er) { | |
| 89 | + var el = document.getElementById(elname); | |
| 90 | + w.showElement(el); | |
| 91 | + return 'display'; | |
| 92 | +} | |
| 93 | + | |
| 94 | +// Hide Errors | |
| 95 | +wizard.prototype.hideErrors = function() { | |
| 96 | + var errors = document.getElementsByClassName('error'); | |
| 97 | + var i; | |
| 98 | + for(i=0;i<errors.length;i++) { | |
| 99 | + w.hideElement(errors[i]); | |
| 100 | + } | |
| 101 | + return true; | |
| 102 | +} | |
| 103 | + | |
| 104 | +// Hide an element | |
| 105 | +wizard.prototype.hideElement = function(el) { | |
| 106 | + if(el.style.display == 'block') | |
| 107 | + el.style.display = 'none'; | |
| 108 | +} | |
| 109 | + | |
| 110 | +// Show an element | |
| 111 | +wizard.prototype.showElement = function(el) { | |
| 112 | + if(el.style.display == 'none') | |
| 113 | + el.style.display = 'block'; | |
| 114 | +} | |
| 115 | + | |
| 116 | +// Focus on element | |
| 117 | +wizard.prototype.focusElement = function(el) { | |
| 118 | + el.focus(); | |
| 119 | +} | |
| 120 | + | |
| 121 | +// Catch form submit and validate | |
| 122 | +wizard.prototype.onSubmitValidate = function(silent) { | |
| 123 | + var response = w.showStep(3, 'n'); | |
| 124 | + if(response == true || silent == true) { | |
| 125 | + document.getElementById('sendAll').name = 'Next'; // Force the next step | |
| 126 | + document.getElementById('sendAll').value = 'next'; | |
| 127 | + document.getElementById('dbsettings').submit(); | |
| 128 | + } else if(response == 'display') { | |
| 129 | + var el = document.getElementsByClassName("step1"); | |
| 130 | + if(el[0].style.display == 'block') { | |
| 131 | + document.getElementById('sendAll').name = 'Previous'; // Force the previous step | |
| 132 | + document.getElementById('sendAll').value = 'previous'; | |
| 133 | + document.getElementById('dbsettings').submit(); | |
| 134 | + } else { | |
| 135 | + return false; | |
| 136 | + } | |
| 137 | + } | |
| 138 | + return true; | |
| 139 | +} | |
| 140 | + | |
| 141 | +wizard.prototype.pClick = function() { | |
| 142 | + var state = document.getElementById('state'); | |
| 143 | + if(state != "undefined") { | |
| 144 | + state.name = 'previous'; | |
| 145 | + } | |
| 146 | +} | |
| 147 | + | |
| 148 | +wizard.prototype.nClick = function() { | |
| 149 | + var state = document.getElementById('state'); | |
| 150 | + if(state != "undefined") { | |
| 151 | + state.name = 'next'; | |
| 152 | + } | |
| 153 | +} | |
| 154 | + | |
| 155 | +// Validate Registration Page | |
| 156 | +wizard.prototype.validateRegistration = function() { | |
| 157 | + // See if next or previous is clicked. | |
| 158 | + var state = document.getElementById('state').name; | |
| 159 | + if(state == 'next') { | |
| 160 | + if(w.valRegHelper()) { | |
| 161 | + document.getElementById('sendAll').name = 'Next'; // Force the next step | |
| 162 | + document.getElementById('sendAll').value = 'next'; | |
| 163 | + document.getElementById('registration').submit(); | |
| 164 | + } | |
| 165 | + } else if(state == 'previous') { | |
| 166 | + document.getElementById('sendAll').name = 'Previous'; // Force the previous step | |
| 167 | + document.getElementById('sendAll').value = 'previous'; | |
| 168 | + document.getElementById('registration').submit(); | |
| 169 | + } | |
| 170 | +} | |
| 171 | + | |
| 172 | +wizard.prototype.valRegHelper = function() { | |
| 173 | + var first = document.getElementById('first'); | |
| 174 | + var last = document.getElementById('last'); | |
| 175 | + var email = document.getElementById('email'); | |
| 176 | + if(first.value.length < 1) { | |
| 177 | + document.getElementById("reg_error").innerHTML = "Please enter a First Name"; | |
| 178 | + w.focusElement(first); | |
| 179 | + return false; | |
| 180 | + } | |
| 181 | + if(!w.nameCheck(first.value)) { | |
| 182 | + document.getElementById("reg_error").innerHTML = "Please enter a valid First Name"; | |
| 183 | + w.focusElement(first); | |
| 184 | + return false; | |
| 185 | + } | |
| 186 | + if(last.value.length < 1) { | |
| 187 | + document.getElementById("reg_error").innerHTML = "Please enter a Last Name"; | |
| 188 | + w.focusElement(last); | |
| 189 | + return false; | |
| 190 | + } | |
| 191 | + if(!w.nameCheck(last.value)) { | |
| 192 | + document.getElementById("reg_error").innerHTML = "Please enter a valid Last Name"; | |
| 193 | + w.focusElement(last); | |
| 194 | + return false; | |
| 195 | + } | |
| 196 | + if(!w.emailCheck(email.value)) { | |
| 197 | + document.getElementById("reg_error").innerHTML = "Please enter a valid email address"; | |
| 198 | + w.focusElement(email); | |
| 199 | + return false; | |
| 200 | + } | |
| 201 | + | |
| 202 | + return true; | |
| 203 | +} | |
| 204 | + | |
| 205 | +wizard.prototype.nameCheck = function(str) { | |
| 206 | + var nameRegxp = /^([a-zA-Z]+)$/; | |
| 207 | + if(str.match(nameRegxp)) { | |
| 208 | + return true; | |
| 209 | + } else { | |
| 210 | + return false; | |
| 211 | + } | |
| 212 | +} | |
| 213 | + | |
| 214 | +// Validate Registration Page Courtesy of SmartWebby.com (http://www.smartwebby.com/dhtml/) | |
| 215 | +wizard.prototype.emailCheck = function(str) { | |
| 216 | + str = w.trim(str); | |
| 217 | + var at="@"; | |
| 218 | + var dot="."; | |
| 219 | + var lat=str.indexOf(at); | |
| 220 | + var lstr=str.length; | |
| 221 | + var ldot=str.indexOf(dot); | |
| 222 | + if (str.indexOf(at)==-1) { | |
| 223 | + return false; | |
| 224 | + } | |
| 225 | + if (str.indexOf(at)==-1 || str.indexOf(at)==0 || str.indexOf(at)==lstr) { | |
| 226 | + return false; | |
| 227 | + } | |
| 228 | + if (str.indexOf(dot)==-1 || str.indexOf(dot)==0 || str.indexOf(dot)==lstr) { | |
| 229 | + return false; | |
| 230 | + } | |
| 231 | + if (str.indexOf(at,(lat+1))!=-1) { | |
| 232 | + return false; | |
| 233 | + } | |
| 234 | + if (str.substring(lat-1,lat)==dot || str.substring(lat+1,lat+2)==dot){ | |
| 235 | + return false; | |
| 236 | + } | |
| 237 | + if (str.indexOf(dot,(lat+2))==-1){ | |
| 238 | + return false; | |
| 239 | + } | |
| 240 | + if (str.indexOf(" ")!=-1){ | |
| 241 | + return false; | |
| 242 | + } | |
| 243 | + return true; | |
| 244 | +} | |
| 245 | + | |
| 246 | +wizard.prototype.trim = function (str, chars) { | |
| 247 | + return w.ltrim(w.rtrim(str, chars), chars); | |
| 248 | +} | |
| 249 | + | |
| 250 | +wizard.prototype.ltrim = function (str, chars) { | |
| 251 | + chars = chars || "\\s"; | |
| 252 | + return str.replace(new RegExp("^[" + chars + "]+", "g"), ""); | |
| 253 | +} | |
| 254 | + | |
| 255 | +wizard.prototype.rtrim = function (str, chars) { | |
| 256 | + chars = chars || "\\s"; | |
| 257 | + return str.replace(new RegExp("[" + chars + "]+$", "g"), ""); | |
| 258 | +} | |
| 259 | + | |
| 260 | +// Disable DnD on element | |
| 261 | +// Element has to have a readOnly status set to readonly | |
| 262 | +wizard.prototype.disableDnd = function(el_id) { | |
| 263 | +// el = document.getElementById(el_id); | |
| 264 | +// el.removeAttribute('readOnly'); | |
| 265 | +} | |
| 266 | + | |
| 267 | +// Add readOnly access on all inputs of a form | |
| 268 | +wizard.prototype.addReadOnly = function() { | |
| 269 | + inputs = document.getElementsByTagName('input'); | |
| 270 | + for(i=0;i<inputs.length;i++) { | |
| 271 | + var input_id = inputs[i].id; | |
| 272 | + if(input_id != '') { | |
| 273 | +// inputs[i].setAttribute('readOnly', 'readonly'); | |
| 274 | +// inputs[i].setAttribute('onfocus', "javascript:{w.disableDnd('"+ input_id +"')}"); | |
| 275 | +// inputs[i].focus(); | |
| 276 | +// w.focusElement(inputs[i]); | |
| 277 | + } | |
| 278 | + } | |
| 279 | +} | |
| 280 | + | |
| 281 | +/* */ | |
| 282 | +wizard.prototype.preload = function() { | |
| 283 | +// $('#tooltips').tooltip(); | |
| 284 | +} | |
| 0 | 285 | \ No newline at end of file | ... | ... |
setup/upgrade/step.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Step . | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +class Step | |
| 43 | +{ | |
| 44 | + /** | |
| 45 | + * List of variables to be loaded to template | |
| 46 | + * | |
| 47 | + * @author KnowledgeTree Team | |
| 48 | + * @access protected | |
| 49 | + * @var array | |
| 50 | + */ | |
| 51 | + protected $temp_variables = array(); | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * List of errors encountered by step | |
| 55 | + * | |
| 56 | + * @author KnowledgeTree Team | |
| 57 | + * @access protected | |
| 58 | + * @var array | |
| 59 | + */ | |
| 60 | + protected $error = array(); | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * List of warnings encountered by step | |
| 64 | + * | |
| 65 | + * @author KnowledgeTree Team | |
| 66 | + * @access protected | |
| 67 | + * @var array | |
| 68 | + */ | |
| 69 | + protected $warnings = array(); | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * Flag to store class information in session | |
| 73 | + * | |
| 74 | + * @author KnowledgeTree Team | |
| 75 | + * @access public | |
| 76 | + * @var array | |
| 77 | + */ | |
| 78 | + protected $storeInSession = false; | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * Flag if step needs to be upgraded | |
| 82 | + * | |
| 83 | + * @author KnowledgeTree Team | |
| 84 | + * @access public | |
| 85 | + * @var array | |
| 86 | + */ | |
| 87 | + protected $runUpgrade = false; | |
| 88 | + | |
| 89 | + /** | |
| 90 | + * Step order | |
| 91 | + * | |
| 92 | + * @author KnowledgeTree Team | |
| 93 | + * @access public | |
| 94 | + * @var string | |
| 95 | + */ | |
| 96 | + protected $order = false; | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * Flag if step needs to run silently | |
| 100 | + * | |
| 101 | + * @author KnowledgeTree Team | |
| 102 | + * @access public | |
| 103 | + * @var boolean | |
| 104 | + */ | |
| 105 | + protected $silent = false; | |
| 106 | + | |
| 107 | + public $displayFirst = false; | |
| 108 | + | |
| 109 | + private $salt = 'upgrade'; | |
| 110 | + /** | |
| 111 | + * Returns step state | |
| 112 | + * | |
| 113 | + * @author KnowledgeTree Team | |
| 114 | + * @param none | |
| 115 | + * @access public | |
| 116 | + * @return string | |
| 117 | + */ | |
| 118 | + public function doStep() | |
| 119 | + { | |
| 120 | + // if not authenticated, return to step 1 | |
| 121 | + if (!isset($_SESSION['setup_user'])) { | |
| 122 | + header('index.php?step=welcome'); | |
| 123 | + exit; | |
| 124 | + } | |
| 125 | + | |
| 126 | + return ''; | |
| 127 | + } | |
| 128 | + | |
| 129 | + public function displayFirst() { | |
| 130 | + return $this->displayFirst; | |
| 131 | + } | |
| 132 | + | |
| 133 | + /** | |
| 134 | + * Returns step variables | |
| 135 | + * | |
| 136 | + * @author KnowledgeTree Team | |
| 137 | + * @param none | |
| 138 | + * @access public | |
| 139 | + * @return array | |
| 140 | + */ | |
| 141 | + public function getStepVars() | |
| 142 | + { | |
| 143 | + return $this->temp_variables; | |
| 144 | + } | |
| 145 | + | |
| 146 | + /** | |
| 147 | + * Returns step errors | |
| 148 | + * | |
| 149 | + * @author KnowledgeTree Team | |
| 150 | + * @param none | |
| 151 | + * @access public | |
| 152 | + * @return array | |
| 153 | + */ | |
| 154 | + public function getErrors() { | |
| 155 | + return $this->error; | |
| 156 | + } | |
| 157 | + | |
| 158 | + /** | |
| 159 | + * Returns step errors | |
| 160 | + * | |
| 161 | + * @author KnowledgeTree Team | |
| 162 | + * @param none | |
| 163 | + * @access public | |
| 164 | + * @return array | |
| 165 | + */ | |
| 166 | + public function getWarnings() { | |
| 167 | + return $this->warnings; | |
| 168 | + } | |
| 169 | + | |
| 170 | + /** | |
| 171 | + * Load default step values | |
| 172 | + * | |
| 173 | + * @author KnowledgeTree Team | |
| 174 | + * @param none | |
| 175 | + * @access public | |
| 176 | + * @return void | |
| 177 | + */ | |
| 178 | + public function loadDefaults() { | |
| 179 | + | |
| 180 | + } | |
| 181 | + | |
| 182 | + /** | |
| 183 | + * Return default step values | |
| 184 | + * | |
| 185 | + * @author KnowledgeTree Team | |
| 186 | + * @param none | |
| 187 | + * @access public | |
| 188 | + * @return array | |
| 189 | + */ | |
| 190 | + public function getDefaults() { | |
| 191 | + return array(); | |
| 192 | + } | |
| 193 | + | |
| 194 | + /** | |
| 195 | + * Checks if edit button has been clicked | |
| 196 | + * | |
| 197 | + * @author KnowledgeTree Team | |
| 198 | + * @param none | |
| 199 | + * @access public | |
| 200 | + * @return boolean | |
| 201 | + */ | |
| 202 | + public function edit() { | |
| 203 | + if(isset($_POST['Edit'])) { | |
| 204 | + return true; | |
| 205 | + } | |
| 206 | + | |
| 207 | + return false; | |
| 208 | + } | |
| 209 | + | |
| 210 | + /** | |
| 211 | + * Checks if next button has been clicked | |
| 212 | + * | |
| 213 | + * @author KnowledgeTree Team | |
| 214 | + * @param none | |
| 215 | + * @access public | |
| 216 | + * @return boolean | |
| 217 | + */ | |
| 218 | + public function next() { | |
| 219 | + if(isset($_POST['Next'])) { | |
| 220 | + return true; | |
| 221 | + } | |
| 222 | + | |
| 223 | + return false; | |
| 224 | + } | |
| 225 | + | |
| 226 | + /** | |
| 227 | + * Checks if previous button has been clicked | |
| 228 | + * | |
| 229 | + * @author KnowledgeTree Team | |
| 230 | + * @param none | |
| 231 | + * @access public | |
| 232 | + * @return boolean | |
| 233 | + */ | |
| 234 | + public function previous() { | |
| 235 | + if(isset($_POST['Previous'])) { | |
| 236 | + return true; | |
| 237 | + } | |
| 238 | + | |
| 239 | + return false; | |
| 240 | + } | |
| 241 | + | |
| 242 | + /** | |
| 243 | + * Checks if Confirm button has been clicked | |
| 244 | + * | |
| 245 | + * @author KnowledgeTree Team | |
| 246 | + * @param none | |
| 247 | + * @access public | |
| 248 | + * @return boolean | |
| 249 | + */ | |
| 250 | + function confirm() { | |
| 251 | + if(isset($_POST['Confirm'])) { | |
| 252 | + return true; | |
| 253 | + } | |
| 254 | + | |
| 255 | + return false; | |
| 256 | + } | |
| 257 | + | |
| 258 | + /** | |
| 259 | + * Checks if Confirm button has been clicked | |
| 260 | + * | |
| 261 | + * @author KnowledgeTree Team | |
| 262 | + * @param none | |
| 263 | + * @access public | |
| 264 | + * @return boolean | |
| 265 | + */ | |
| 266 | + function upgrade() { | |
| 267 | + if(isset($_POST['Upgrade'])) { | |
| 268 | + return true; | |
| 269 | + } | |
| 270 | + | |
| 271 | + return false; | |
| 272 | + } | |
| 273 | + | |
| 274 | + /** | |
| 275 | + * Checks if Confirm button has been clicked | |
| 276 | + * | |
| 277 | + * @author KnowledgeTree Team | |
| 278 | + * @param none | |
| 279 | + * @access public | |
| 280 | + * @return boolean | |
| 281 | + */ | |
| 282 | + function installer() { | |
| 283 | + if(isset($_POST['Install'])) { | |
| 284 | + return true; | |
| 285 | + } | |
| 286 | + | |
| 287 | + return false; | |
| 288 | + } | |
| 289 | + /** | |
| 290 | + * Checks if we are currently in this class step | |
| 291 | + * | |
| 292 | + * @author KnowledgeTree Team | |
| 293 | + * @param string | |
| 294 | + * @access public | |
| 295 | + * @return boolean | |
| 296 | + */ | |
| 297 | + public function inStep($name) { | |
| 298 | + if($_GET['step_name'] == $name) | |
| 299 | + return true; | |
| 300 | + return false; | |
| 301 | + } | |
| 302 | + | |
| 303 | + /** | |
| 304 | + * Load session data to post | |
| 305 | + * | |
| 306 | + * @author KnowledgeTree Team | |
| 307 | + * @params none | |
| 308 | + * @access private | |
| 309 | + * @return boolean | |
| 310 | + */ | |
| 311 | + public function setDataFromSession($class) { | |
| 312 | + if(empty($_SESSION[$this->salt][$class])) { | |
| 313 | + return false; | |
| 314 | + } | |
| 315 | + $_POST = isset($_SESSION[$this->salt]['upgrade'][$class]) ? $_SESSION[$this->salt]['upgrade'][$class]: ''; | |
| 316 | + | |
| 317 | + return true; | |
| 318 | + } | |
| 319 | + | |
| 320 | + /** | |
| 321 | + * Get session data from post | |
| 322 | + * | |
| 323 | + * @author KnowledgeTree Team | |
| 324 | + * @params none | |
| 325 | + * @access private | |
| 326 | + * @return boolean | |
| 327 | + */ | |
| 328 | + public function getDataFromSession($class) { | |
| 329 | + if(empty($_SESSION[$this->salt][$class])) { | |
| 330 | + return false; | |
| 331 | + } | |
| 332 | + | |
| 333 | + return $_SESSION[$this->salt][$class]; | |
| 334 | + } | |
| 335 | + | |
| 336 | + /** | |
| 337 | + * Safer way to return post data | |
| 338 | + * | |
| 339 | + * @author KnowledgeTree Team | |
| 340 | + * @params SimpleXmlObject $simplexml | |
| 341 | + * @access public | |
| 342 | + * @return void | |
| 343 | + */ | |
| 344 | + public function getPostSafe($key) { | |
| 345 | + return isset($_POST[$key]) ? $_POST[$key] : ""; | |
| 346 | + } | |
| 347 | + | |
| 348 | + /** | |
| 349 | + * Safer way to return post data | |
| 350 | + * | |
| 351 | + * @author KnowledgeTree Team | |
| 352 | + * @params SimpleXmlObject $simplexml | |
| 353 | + * @access public | |
| 354 | + * @return void | |
| 355 | + */ | |
| 356 | + public function getPostBoolean($key) { | |
| 357 | + return isset($_POST[$key]) ? $_POST[$key] : false; | |
| 358 | + } | |
| 359 | + | |
| 360 | + /** | |
| 361 | + * Runs step upgrade if required | |
| 362 | + * | |
| 363 | + * @author KnowledgeTree Team | |
| 364 | + * @param none | |
| 365 | + * @access public | |
| 366 | + * @return void | |
| 367 | + */ | |
| 368 | + public function upgradeStep() { | |
| 369 | + return ''; | |
| 370 | + } | |
| 371 | + | |
| 372 | + /** | |
| 373 | + * Return whether or not to store a step information in session | |
| 374 | + * | |
| 375 | + * @author KnowledgeTree Team | |
| 376 | + * @param none | |
| 377 | + * @access public | |
| 378 | + * @return boolean | |
| 379 | + */ | |
| 380 | + public function storeInSession() { | |
| 381 | + return $this->storeInSession; | |
| 382 | + } | |
| 383 | + | |
| 384 | + /** | |
| 385 | + * Return whether or not to a step has to be upgraded | |
| 386 | + * | |
| 387 | + * @author KnowledgeTree Team | |
| 388 | + * @param none | |
| 389 | + * @access public | |
| 390 | + * @return boolean | |
| 391 | + */ | |
| 392 | + public function runUpgrade() { | |
| 393 | + return $this->runUpgrade; | |
| 394 | + } | |
| 395 | + | |
| 396 | + public function setPostConfig() { | |
| 397 | + return ''; | |
| 398 | + } | |
| 399 | + | |
| 400 | + /** | |
| 401 | + * Return whether or not to a step has to be in silent mode | |
| 402 | + * | |
| 403 | + * @author KnowledgeTree Team | |
| 404 | + * @param none | |
| 405 | + * @access public | |
| 406 | + * @return boolean | |
| 407 | + */ | |
| 408 | + public function silentMode() { | |
| 409 | + return $this->silent; | |
| 410 | + } | |
| 411 | + | |
| 412 | + /** | |
| 413 | + * Set step errors | |
| 414 | + * | |
| 415 | + * @author KnowledgeTree Team | |
| 416 | + * @param none | |
| 417 | + * @access public | |
| 418 | + * @return array | |
| 419 | + */ | |
| 420 | + public function setErrors($error) { | |
| 421 | + $this->error = $error; | |
| 422 | + } | |
| 423 | +} | |
| 424 | + | |
| 425 | +?> | |
| 0 | 426 | \ No newline at end of file | ... | ... |
setup/upgrade/stepAction.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Steap Action Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +class stepAction { | |
| 44 | + /** | |
| 45 | + * Step class name | |
| 46 | + * | |
| 47 | + * @author KnowledgeTree Team | |
| 48 | + * @access protected | |
| 49 | + * @var string | |
| 50 | + */ | |
| 51 | + protected $stepName = ''; | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Step names for classes | |
| 55 | + * | |
| 56 | + * @author KnowledgeTree Team | |
| 57 | + * @access protected | |
| 58 | + * @var array | |
| 59 | + */ | |
| 60 | + protected $stepClassNames = array(); | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * Flag if step needs confirmation | |
| 64 | + * | |
| 65 | + * @author KnowledgeTree Team | |
| 66 | + * @access protected | |
| 67 | + * @var boolean | |
| 68 | + */ | |
| 69 | + protected $displayConfirm = false; | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * Returns whether or not to display the confirmation page first | |
| 73 | + * | |
| 74 | + * @author KnowledgeTree Team | |
| 75 | + * @access protected | |
| 76 | + * @var boolean | |
| 77 | + */ | |
| 78 | + protected $displayFirst = false; | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * List of upgrade properties | |
| 82 | + * | |
| 83 | + * @author KnowledgeTree Team | |
| 84 | + * @access protected | |
| 85 | + * @var boolean | |
| 86 | + */ | |
| 87 | + protected $upgradeProperties = array(); | |
| 88 | + | |
| 89 | + /** | |
| 90 | + * Reference to session object | |
| 91 | + * | |
| 92 | + * @author KnowledgeTree Team | |
| 93 | + * @access protected | |
| 94 | + * @var object Session | |
| 95 | + */ | |
| 96 | + protected $session = null; | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * Reference to current step object | |
| 100 | + * | |
| 101 | + * @author KnowledgeTree Team | |
| 102 | + * @access protected | |
| 103 | + * @var object class Step | |
| 104 | + */ | |
| 105 | + protected $action = null; | |
| 106 | + | |
| 107 | + /** | |
| 108 | + * Constructs step action object | |
| 109 | + * | |
| 110 | + * @author KnowledgeTree Team | |
| 111 | + * @access public | |
| 112 | + * @param string class name of the current step | |
| 113 | + */ | |
| 114 | + public function __construct($step) { | |
| 115 | + $this->stepName = $step; | |
| 116 | + } | |
| 117 | + | |
| 118 | + /** | |
| 119 | + * Helper to initialize step actions | |
| 120 | + * | |
| 121 | + * @author KnowledgeTree Team | |
| 122 | + * @param string | |
| 123 | + * @access public | |
| 124 | + * @return string | |
| 125 | + */ | |
| 126 | + public function setUpStepAction($steps, $stepNames, $stepConfirmation, $stepDisplayFirst, $session, $upgradeProperties) { | |
| 127 | + $this->setSteps($steps); | |
| 128 | + $this->setStepNames($stepNames); | |
| 129 | + $this->setDisplayConfirm($stepConfirmation); | |
| 130 | + $this->setDisplayFirst($stepDisplayFirst); | |
| 131 | + $this->loadSession($session); | |
| 132 | + $this->setUpgradeProperties($upgradeProperties); | |
| 133 | + } | |
| 134 | + | |
| 135 | + /** | |
| 136 | + * Sets steps class names in string format | |
| 137 | + * | |
| 138 | + * @author KnowledgeTree Team | |
| 139 | + * @param array | |
| 140 | + * @access public | |
| 141 | + * @return void | |
| 142 | + */ | |
| 143 | + public function setSteps($stepClassNames) { | |
| 144 | + $this->stepClassNames = $stepClassNames; | |
| 145 | + } | |
| 146 | + | |
| 147 | + /** | |
| 148 | + * Sets steps in human readable string format | |
| 149 | + * | |
| 150 | + * @author KnowledgeTree Team | |
| 151 | + * @param array | |
| 152 | + * @access public | |
| 153 | + * @return void | |
| 154 | + */ | |
| 155 | + public function setStepNames($step_names) { | |
| 156 | + $this->step_names = $step_names; | |
| 157 | + } | |
| 158 | + | |
| 159 | + /** | |
| 160 | + * Sets confirmation page flag | |
| 161 | + * | |
| 162 | + * @author KnowledgeTree Team | |
| 163 | + * @param boolean | |
| 164 | + * @access public | |
| 165 | + * @return void | |
| 166 | + */ | |
| 167 | + public function setDisplayConfirm($displayConfirm) { | |
| 168 | + $this->displayConfirm = $displayConfirm; | |
| 169 | + } | |
| 170 | + | |
| 171 | + /** | |
| 172 | + * Sets confirmation page first flag | |
| 173 | + * | |
| 174 | + * @author KnowledgeTree Team | |
| 175 | + * @param boolean | |
| 176 | + * @access public | |
| 177 | + * @return void | |
| 178 | + */ | |
| 179 | + public function setDisplayFirst($displayFirst) { | |
| 180 | + $this->displayFirst = $displayFirst; | |
| 181 | + } | |
| 182 | + | |
| 183 | + /** | |
| 184 | + * Sets session object | |
| 185 | + * | |
| 186 | + * @author KnowledgeTree Team | |
| 187 | + * @param object Session | |
| 188 | + * @access public | |
| 189 | + * @return void | |
| 190 | + */ | |
| 191 | + public function loadSession($ses) { | |
| 192 | + $this->session = $ses; | |
| 193 | + } | |
| 194 | + | |
| 195 | + /** | |
| 196 | + * Sets upgrade properties | |
| 197 | + * | |
| 198 | + * @author KnowledgeTree Team | |
| 199 | + * @param array | |
| 200 | + * @access public | |
| 201 | + * @return void | |
| 202 | + */ | |
| 203 | + public function setUpgradeProperties($upgradeProperties) { | |
| 204 | + $this->upgradeProperties = $upgradeProperties; | |
| 205 | + } | |
| 206 | + | |
| 207 | + /** | |
| 208 | + * Main control to handle the steps actions | |
| 209 | + * | |
| 210 | + * @author KnowledgeTree Team | |
| 211 | + * @param none | |
| 212 | + * @access public | |
| 213 | + * @return string | |
| 214 | + */ | |
| 215 | + public function doAction() { | |
| 216 | + if($this->stepName != '') { | |
| 217 | + $this->action = $this->createStep(); | |
| 218 | + if(!$this->action) { | |
| 219 | + $this->stepName = 'errors'; | |
| 220 | + $this->action = $this->createStep(); | |
| 221 | + $this->action->error = array('Class Files Missing in Step Directory'); | |
| 222 | + } | |
| 223 | + $response = $this->action->doStep(); | |
| 224 | + if($this->action->storeInSession()) { // Check if class values need to be stored in session | |
| 225 | + $this->_loadStepToSession($this->stepName); // Send class to session | |
| 226 | + } | |
| 227 | + if ($response == 'error') { | |
| 228 | + $this->_handleErrors(); // Send Errors to session | |
| 229 | + } else { | |
| 230 | + $this->_clearErrors($this->stepName); // Send Errors to session | |
| 231 | + } | |
| 232 | + return $response; | |
| 233 | + } else { | |
| 234 | + $this->stepName = 'errors'; | |
| 235 | + $this->action = $this->createStep(); | |
| 236 | + $this->action->error = array('Class File Missing in Step Directory'); | |
| 237 | + } | |
| 238 | + } | |
| 239 | + | |
| 240 | + /** | |
| 241 | + * Instantiate a step. | |
| 242 | + * | |
| 243 | + * @author KnowledgeTree Team | |
| 244 | + * @param none | |
| 245 | + * @access public | |
| 246 | + * @return object Step | |
| 247 | + */ | |
| 248 | + public function createStep() { | |
| 249 | + $step_class = "upgrade".$this->makeCamelCase($this->stepName); | |
| 250 | + | |
| 251 | + return new $step_class(); | |
| 252 | + } | |
| 253 | + | |
| 254 | + /** | |
| 255 | + * Converts string to camel case | |
| 256 | + * | |
| 257 | + * @author KnowledgeTree Team | |
| 258 | + * @param string | |
| 259 | + * @access public | |
| 260 | + * @return string | |
| 261 | + */ | |
| 262 | + public function makeCamelCase($str) { | |
| 263 | + $upper=ucwords($str); | |
| 264 | + $str=str_replace('_', '', $upper); | |
| 265 | + | |
| 266 | + return $str; | |
| 267 | + } | |
| 268 | + | |
| 269 | + /** | |
| 270 | + * Converts string to human readable heading | |
| 271 | + * | |
| 272 | + * @author KnowledgeTree Team | |
| 273 | + * @param string | |
| 274 | + * @access public | |
| 275 | + * @return string | |
| 276 | + */ | |
| 277 | + public function makeHeading($str) { | |
| 278 | + $str = str_replace('_', ' ', $str); | |
| 279 | + $str = ucwords($str); | |
| 280 | + | |
| 281 | + return $str; | |
| 282 | + } | |
| 283 | + | |
| 284 | + /** | |
| 285 | + * Returns current step name | |
| 286 | + * | |
| 287 | + * @author KnowledgeTree Team | |
| 288 | + * @param none | |
| 289 | + * @access public | |
| 290 | + * @return string | |
| 291 | + */ | |
| 292 | + public function getCurrentStepName() { | |
| 293 | + if($this->stepName != 'errors') | |
| 294 | + return $this->step_names[$this->stepName]; | |
| 295 | + return ''; | |
| 296 | + } | |
| 297 | + | |
| 298 | + /** | |
| 299 | + * Returns left menu | |
| 300 | + * | |
| 301 | + * @author KnowledgeTree Team | |
| 302 | + * @param none | |
| 303 | + * @access public | |
| 304 | + * @return string | |
| 305 | + */ | |
| 306 | + public function getLeftMenu() | |
| 307 | + { | |
| 308 | + $menu = ''; | |
| 309 | + $active = false; | |
| 310 | + if($this->stepClassNames) { | |
| 311 | + foreach ($this->stepClassNames as $k=>$step) { | |
| 312 | + if($this->step_names[$step] != '') { | |
| 313 | + $item = $this->step_names[$step]; | |
| 314 | + } else { | |
| 315 | + $item = $this->makeHeading($step); | |
| 316 | + } | |
| 317 | + if($step == $this->stepName) { | |
| 318 | + $class = 'current'; | |
| 319 | + $active = true; | |
| 320 | + } else { | |
| 321 | + if($active){ | |
| 322 | + $class = 'inactive'; | |
| 323 | + }else{ | |
| 324 | + $class = 'indicator'; | |
| 325 | + $item = "<a href=\"index.php?step_name={$step}\">{$item}</a>"; | |
| 326 | + } | |
| 327 | + } | |
| 328 | + | |
| 329 | + $menu .= "<span class='{$class}'>$item</span><br />"; | |
| 330 | + } | |
| 331 | + } | |
| 332 | +// $menu .= '</div>'; | |
| 333 | + return $menu; | |
| 334 | + } | |
| 335 | + | |
| 336 | + /** | |
| 337 | + * Returns confirmation page flag | |
| 338 | + * | |
| 339 | + * @author KnowledgeTree Team | |
| 340 | + * @param none | |
| 341 | + * @access public | |
| 342 | + * @return boolean | |
| 343 | + */ | |
| 344 | + public function displayConfirm() { | |
| 345 | + return $this->displayConfirm; | |
| 346 | + } | |
| 347 | + | |
| 348 | + /** | |
| 349 | + * Returns whether or not to display the confirmation page first | |
| 350 | + * | |
| 351 | + * @author KnowledgeTree Team | |
| 352 | + * @param none | |
| 353 | + * @access public | |
| 354 | + * @return boolean | |
| 355 | + */ | |
| 356 | + public function displayFirst() { | |
| 357 | + return $this->displayFirst; | |
| 358 | + } | |
| 359 | + | |
| 360 | + /** | |
| 361 | + * Returns session object | |
| 362 | + * | |
| 363 | + * @author KnowledgeTree Team | |
| 364 | + * @param object Session | |
| 365 | + * @access public | |
| 366 | + * @return object | |
| 367 | + */ | |
| 368 | + public function getSession() { | |
| 369 | + return $this->session; | |
| 370 | + } | |
| 371 | + | |
| 372 | + /** | |
| 373 | + * Returns step tenplate content | |
| 374 | + * | |
| 375 | + * @author KnowledgeTree Team | |
| 376 | + * @param none | |
| 377 | + * @access public | |
| 378 | + * @return string | |
| 379 | + */ | |
| 380 | + public function paintAction() { | |
| 381 | + | |
| 382 | + $step_errors = $this->action->getErrors(); // Get errors | |
| 383 | + $step_warnings = $this->action->getWarnings(); // Get warnings | |
| 384 | + if($this->displayConfirm()) { // Check if theres a confirm step | |
| 385 | + $template = "templates/{$this->stepName}_confirm.tpl"; | |
| 386 | + } else { | |
| 387 | + if($this->displayFirst()) { | |
| 388 | + $template = "templates/{$this->stepName}_confirm.tpl"; | |
| 389 | + } else { | |
| 390 | + $template = "templates/{$this->stepName}.tpl"; | |
| 391 | + } | |
| 392 | + } | |
| 393 | + $step_tpl = new Template($template); | |
| 394 | + $step_tpl->set("errors", $step_errors); // Set template errors | |
| 395 | + $step_tpl->set("warnings", $step_warnings); // Set template warnings | |
| 396 | + $step_vars = $this->action->getStepVars(); // Get template variables | |
| 397 | + $step_tpl->set("step_vars", $step_vars); // Set template errors | |
| 398 | + foreach ($step_vars as $key => $value) { // Set template variables | |
| 399 | + $step_tpl->set($key, $value); // Load values to session | |
| 400 | + if($this->action->storeInSession()) { // Check if class values need to be stored in session | |
| 401 | + $this->_loadValueToSession($this->stepName, $key, $value); | |
| 402 | + } | |
| 403 | + } | |
| 404 | + $content = $step_tpl->fetch(); | |
| 405 | + $tpl = new Template("templates/wizard.tpl"); | |
| 406 | + $vars = $this->getVars(); // Get template variables | |
| 407 | + $tpl->set("vars", $vars); // Set template errors | |
| 408 | + $tpl->set('content', $content); | |
| 409 | + echo $tpl->fetch(); | |
| 410 | + } | |
| 411 | + | |
| 412 | + public function getVars() { | |
| 413 | + $left = $this->getLeftMenu(); | |
| 414 | + $vars['left'] = $left; // Set left menu | |
| 415 | + $vars['upgrade_version'] = $this->upgradeProperties['upgrade_version']; // Set version | |
| 416 | + $vars['upgrade_type'] = $this->upgradeProperties['upgrade_type']; // Set type | |
| 417 | + return $vars; | |
| 418 | + } | |
| 419 | + /** | |
| 420 | + * Load class to session | |
| 421 | + * | |
| 422 | + * @author KnowledgeTree Team | |
| 423 | + * @param string $class name of class | |
| 424 | + * @param array $v array of values | |
| 425 | + * @param boolean $overwrite whether or not to overwrite existing | |
| 426 | + * @access private | |
| 427 | + * @return void | |
| 428 | + */ | |
| 429 | + private function _loadStepToSession($class, $v = array(), $overwrite = false) { | |
| 430 | + if($this->session != null) { | |
| 431 | + if($overwrite) { | |
| 432 | + $this->session->set($class , $v); | |
| 433 | + } else { | |
| 434 | + if(!$this->session->is_set($class)) | |
| 435 | + $this->session->set($class , $v); | |
| 436 | + } | |
| 437 | + } else { | |
| 438 | + $this->stepName = 'errors'; | |
| 439 | + $this->action = $this->createStep(); | |
| 440 | + $this->action->error = array('Sessions Are Disabled'); | |
| 441 | + } | |
| 442 | + } | |
| 443 | + | |
| 444 | + /** | |
| 445 | + * Load class value to session | |
| 446 | + * | |
| 447 | + * @author KnowledgeTree Team | |
| 448 | + * @param string $class name of class | |
| 449 | + * @param string $k key value | |
| 450 | + * @param string $v value to store | |
| 451 | + * @param boolean $overwrite whether or not to overwrite existing | |
| 452 | + * @access private | |
| 453 | + * @return void | |
| 454 | + */ | |
| 455 | + private function _loadValueToSession($class, $k, $v, $overwrite = false) { | |
| 456 | + if($this->session != null) { | |
| 457 | + $this->session->setClass($class, $k, $v); | |
| 458 | + } else { | |
| 459 | + $this->stepName = 'errors'; | |
| 460 | + $this->action = $this->createStep(); | |
| 461 | + $this->action->error = array('Sessions Are Disabled'); | |
| 462 | + } | |
| 463 | + } | |
| 464 | + | |
| 465 | + /** | |
| 466 | + * Load all class errors value to session | |
| 467 | + * | |
| 468 | + * @author KnowledgeTree Team | |
| 469 | + * @param none | |
| 470 | + * @access private | |
| 471 | + * @return void | |
| 472 | + */ | |
| 473 | + private function _handleErrors() {// TODO: handle multiple errors | |
| 474 | + $step_errors = $this->action->getErrors(); // Get errors | |
| 475 | + foreach ($step_errors as $key => $value) { | |
| 476 | + $this->_loadErrorToSession($this->stepName, $key, $value); // Load values session | |
| 477 | + } | |
| 478 | + } | |
| 479 | + | |
| 480 | + /** | |
| 481 | + * Remove all class errors value to session | |
| 482 | + * | |
| 483 | + * @author KnowledgeTree Team | |
| 484 | + * @param none | |
| 485 | + * @access private | |
| 486 | + * @return void | |
| 487 | + */ | |
| 488 | + private function _clearErrors($class) { | |
| 489 | + if($this->session) { | |
| 490 | + $this->session->clearErrors($class); | |
| 491 | + } | |
| 492 | + } | |
| 493 | + | |
| 494 | + /** | |
| 495 | + * Load class error value to session | |
| 496 | + * | |
| 497 | + * @author KnowledgeTree Team | |
| 498 | + * @param string $class name of class | |
| 499 | + * @param string $k key value | |
| 500 | + * @param string $v value to store | |
| 501 | + * @param boolean $overwrite whether or not to overwrite existing | |
| 502 | + * @access private | |
| 503 | + * @return void | |
| 504 | + */ | |
| 505 | + private function _loadErrorToSession($class, $k, $v, $overwrite = false) { | |
| 506 | + $k = "errors"; | |
| 507 | + if($this->session != null) { | |
| 508 | + $this->session->setClassError($class, $k, $v); | |
| 509 | + } else { | |
| 510 | + $this->stepName = 'errors'; | |
| 511 | + $this->action = $this->createStep(); | |
| 512 | + $this->action->error = array('Sessions Are Disabled'); | |
| 513 | + } | |
| 514 | + } | |
| 515 | +} | |
| 516 | + | |
| 517 | +?> | |
| 0 | 518 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeBackup.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Complete Step Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +require '../../config/dmsDefaults.php'; | |
| 44 | + | |
| 45 | +class upgradeBackup extends Step { | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Reference to Database object | |
| 49 | + * | |
| 50 | + * @author KnowledgeTree Team | |
| 51 | + * @access private | |
| 52 | + * @var object | |
| 53 | + */ | |
| 54 | + private $_dbhandler = null; | |
| 55 | + | |
| 56 | + private $privileges_check = 'tick'; | |
| 57 | + private $database_check = 'tick'; | |
| 58 | + protected $silent = true; | |
| 59 | + | |
| 60 | + protected $util = null; | |
| 61 | + | |
| 62 | + public function __construct() { | |
| 63 | + $this->temp_variables = array("step_name"=>"backup", "silent"=>$this->silent); | |
| 64 | + $this->_dbhandler = new UpgradedbUtil(); | |
| 65 | + $this->util = new UpgradeUtil(); | |
| 66 | + } | |
| 67 | + | |
| 68 | + function doStep() { | |
| 69 | + parent::doStep(); | |
| 70 | + if(!$this->inStep("backup")) { | |
| 71 | + $this->doRun(); | |
| 72 | + return 'landing'; | |
| 73 | + } | |
| 74 | + if($this->next()) { | |
| 75 | + if ($this->doRun()) { | |
| 76 | + return 'next'; | |
| 77 | + } | |
| 78 | + } else if($this->previous()) { | |
| 79 | + return 'previous'; | |
| 80 | + } | |
| 81 | + | |
| 82 | + $this->doRun(); | |
| 83 | + return 'landing'; | |
| 84 | + } | |
| 85 | + | |
| 86 | + function doRun() { | |
| 87 | + $this->backupConfirm(); | |
| 88 | + $this->storeSilent();// Set silent mode variables | |
| 89 | + | |
| 90 | + return true; | |
| 91 | + } | |
| 92 | + | |
| 93 | + /** | |
| 94 | + * Set all silent mode varibles | |
| 95 | + * | |
| 96 | + */ | |
| 97 | + private function storeSilent() { | |
| 98 | + } | |
| 99 | + | |
| 100 | + private function backup() { | |
| 101 | + check_state(1); | |
| 102 | + set_state(2); | |
| 103 | + title('Backup In Progress'); | |
| 104 | + $targetfile=$_SESSION['backupFile']; | |
| 105 | + $stmt=create_backup_stmt($targetfile); | |
| 106 | + $dir=$stmt['dir']; | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + if (is_file($dir . '/mysqladmin') || is_file($dir . '/mysqladmin.exe')) | |
| 112 | + { | |
| 113 | + ob_flush(); | |
| 114 | + flush(); | |
| 115 | + ?> | |
| 116 | + The backup is now underway. Please wait till it completes. | |
| 117 | + <?php | |
| 118 | + | |
| 119 | + ob_flush(); | |
| 120 | + flush(); | |
| 121 | + $curdir=getcwd(); | |
| 122 | + chdir($dir); | |
| 123 | + ob_flush(); | |
| 124 | + flush(); | |
| 125 | + | |
| 126 | + $handle = popen($stmt['cmd'], 'r'); | |
| 127 | + $read = fread($handle, 10240); | |
| 128 | + pclose($handle); | |
| 129 | + $_SESSION['backupOutput']=$read; | |
| 130 | + $dir=$this->resolveTempDir(); | |
| 131 | + $_SESSION['backupFile'] = $stmt['target']; | |
| 132 | + | |
| 133 | + if (OS_UNIX) | |
| 134 | + { | |
| 135 | + chmod($stmt['target'],0600); | |
| 136 | + } | |
| 137 | + | |
| 138 | + if (is_file($stmt['target']) && filesize($stmt['target']) > 0) | |
| 139 | + { | |
| 140 | + $_SESSION['backupStatus'] = true; | |
| 141 | + | |
| 142 | + } | |
| 143 | + else | |
| 144 | + { | |
| 145 | + $_SESSION['backupStatus'] = false; | |
| 146 | + } | |
| 147 | + ?> | |
| 148 | + <script type="text/javascript"> | |
| 149 | + document.location="?go=BackupDone"; | |
| 150 | + </script> | |
| 151 | + <?php | |
| 152 | + | |
| 153 | + | |
| 154 | + } | |
| 155 | + else | |
| 156 | + { | |
| 157 | + ?> | |
| 158 | + <P> | |
| 159 | + The <i>mysqldump</i> utility was not found in the <?php echo $dir;?> subdirectory. | |
| 160 | + | |
| 161 | + <input type=button value="back" onclick="javascript:do_start('welcome')"> | |
| 162 | + <?php | |
| 163 | + } | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + } | |
| 168 | + | |
| 169 | + private function backupDone() { | |
| 170 | + check_state(2); | |
| 171 | + set_state(3); | |
| 172 | + title('Backup Status'); | |
| 173 | + $status = $_SESSION['backupStatus']; | |
| 174 | + $filename=$_SESSION['backupFile']; | |
| 175 | + | |
| 176 | + if ($status) | |
| 177 | + { | |
| 178 | + $stmt=create_restore_stmt($filename); | |
| 179 | + ?> | |
| 180 | + The backup file <nobr><i>"<?php echo $filename;?>"</i></nobr> has been created. | |
| 181 | + <P> It appears as though the <font color=green>backup has been successful</font>. | |
| 182 | + <P> | |
| 183 | + <?php | |
| 184 | + if ($stmt['dir'] != '') | |
| 185 | + { | |
| 186 | + ?> | |
| 187 | + Manually, you would do the following to restore the backup: | |
| 188 | + <P> | |
| 189 | + <table bgcolor="lightgrey"> | |
| 190 | + <tr> | |
| 191 | + <td> | |
| 192 | + <nobr>cd <?php echo $stmt['dir'];?></nobr> | |
| 193 | + <br/> | |
| 194 | + <?php | |
| 195 | + } | |
| 196 | + else | |
| 197 | + { | |
| 198 | + ?> | |
| 199 | + The mysql backup utility could not be found automatically. Please edit the config.ini and update the backup/mysql Directory entry. | |
| 200 | + <P> | |
| 201 | + If you need to restore from this backup, you should be able to use the following statements: | |
| 202 | + <P> | |
| 203 | + <table bgcolor="lightgrey"> | |
| 204 | + <tr> | |
| 205 | + <td> | |
| 206 | + <?php | |
| 207 | + } | |
| 208 | + ?> | |
| 209 | + <nobr><?php echo $stmt['display'];?></nobr> | |
| 210 | + </table> | |
| 211 | + | |
| 212 | + <?php | |
| 213 | + } | |
| 214 | + else | |
| 215 | + { | |
| 216 | + ?> | |
| 217 | + It appears as though <font color=red>the backup process has failed</font>.<P></P> Unfortunately, it is difficult to diagnose these problems automatically | |
| 218 | + and would recommend that you try to do the backup process manually. | |
| 219 | + <P> | |
| 220 | + We appologise for the inconvenience. | |
| 221 | + <P> | |
| 222 | + <table bgcolor="lightgrey"> | |
| 223 | + <tr> | |
| 224 | + <td> | |
| 225 | + <?php echo $_SESSION['backupOutput'];?> | |
| 226 | + </table> | |
| 227 | + <?php | |
| 228 | + | |
| 229 | + } | |
| 230 | + ?> | |
| 231 | + <br/> | |
| 232 | + | |
| 233 | + <input type=button value="back" onclick="javascript:do_start('welcome')"> | |
| 234 | + <?php | |
| 235 | + if ($status) | |
| 236 | + { | |
| 237 | + ?> | |
| 238 | + <input type=button value="next" onclick="javascript:do_start('UpgradeConfirm')"> | |
| 239 | + | |
| 240 | + <?php | |
| 241 | + } | |
| 242 | +} | |
| 243 | + | |
| 244 | +function create_backup_stmt($targetfile=null) | |
| 245 | +{ | |
| 246 | + $oKTConfig =& KTConfig::getSingleton(); | |
| 247 | + | |
| 248 | + $adminUser = $oKTConfig->get('db/dbAdminUser'); | |
| 249 | + $adminPwd = $oKTConfig->get('db/dbAdminPass'); | |
| 250 | + $dbHost = $oKTConfig->get('db/dbHost'); | |
| 251 | + $dbName = $oKTConfig->get('db/dbName'); | |
| 252 | + | |
| 253 | + $dbPort = trim($oKTConfig->get('db/dbPort')); | |
| 254 | + if (empty($dbPort) || $dbPort=='default') $dbPort = get_cfg_var('mysql.default_port'); | |
| 255 | + if (empty($dbPort)) $dbPort='3306'; | |
| 256 | + $dbSocket = trim($oKTConfig->get('db/dbSocket')); | |
| 257 | + if (empty($dbSocket) || $dbSocket=='default') $dbSocket = get_cfg_var('mysql.default_socket'); | |
| 258 | + if (empty($dbSocket)) $dbSocket='../tmp/mysql.sock'; | |
| 259 | + | |
| 260 | + $date=date('Y-m-d-H-i-s'); | |
| 261 | + | |
| 262 | + $dir=$this->resolveMysqlDir(); | |
| 263 | + | |
| 264 | + $info['dir']=$dir; | |
| 265 | + | |
| 266 | + $prefix=''; | |
| 267 | + if (OS_UNIX) | |
| 268 | + { | |
| 269 | + $prefix .= "./"; | |
| 270 | + } | |
| 271 | + | |
| 272 | + if (@stat($dbSocket) !== false) | |
| 273 | + { | |
| 274 | + $mechanism="--socket=\"$dbSocket\""; | |
| 275 | + } | |
| 276 | + else | |
| 277 | + { | |
| 278 | + $mechanism="--port=\"$dbPort\""; | |
| 279 | + } | |
| 280 | + | |
| 281 | + $tmpdir=$this->resolveTempDir(); | |
| 282 | + | |
| 283 | + if (is_null($targetfile)) | |
| 284 | + { | |
| 285 | + $targetfile="$tmpdir/kt-backup-$date.sql"; | |
| 286 | + } | |
| 287 | + | |
| 288 | + $stmt = $prefix . "mysqldump --user=\"$adminUser\" -p $mechanism \"$dbName\" > \"$targetfile\""; | |
| 289 | + $info['display']=$stmt; | |
| 290 | + $info['target']=$targetfile; | |
| 291 | + | |
| 292 | + | |
| 293 | + $stmt = $prefix. "mysqldump --user=\"$adminUser\" --password=\"$adminPwd\" $mechanism \"$dbName\" > \"$targetfile\""; | |
| 294 | + $info['cmd']=$stmt; | |
| 295 | + return $info; | |
| 296 | +} | |
| 297 | + | |
| 298 | +function resolveMysqlDir() | |
| 299 | +{ | |
| 300 | + // possibly detect existing installations: | |
| 301 | + | |
| 302 | + if (OS_UNIX) | |
| 303 | + { | |
| 304 | + $dirs = array('/opt/mysql/bin','/usr/local/mysql/bin'); | |
| 305 | + $mysqlname ='mysql'; | |
| 306 | + } | |
| 307 | + else | |
| 308 | + { | |
| 309 | + $dirs = explode(';', $_SERVER['PATH']); | |
| 310 | + $dirs[] ='c:/Program Files/MySQL/MySQL Server 5.0/bin'; | |
| 311 | + $dirs[] = 'c:/program files/ktdms/mysql/bin'; | |
| 312 | + $mysqlname ='mysql.exe'; | |
| 313 | + } | |
| 314 | + | |
| 315 | + $oKTConfig =& KTConfig::getSingleton(); | |
| 316 | + $mysqldir = $oKTConfig->get('backup/mysqlDirectory',$mysqldir); | |
| 317 | + $dirs[] = $mysqldir; | |
| 318 | + | |
| 319 | + if (strpos(__FILE__,'knowledgeTree') !== false && strpos(__FILE__,'ktdms') != false) | |
| 320 | + { | |
| 321 | + $dirs [] = realpath(dirname($FILE) . '/../../mysql/bin'); | |
| 322 | + } | |
| 323 | + | |
| 324 | + foreach($dirs as $dir) | |
| 325 | + { | |
| 326 | + if (is_file($dir . '/' . $mysqlname)) | |
| 327 | + { | |
| 328 | + return $dir; | |
| 329 | + } | |
| 330 | + } | |
| 331 | + | |
| 332 | + return ''; | |
| 333 | +} | |
| 334 | + | |
| 335 | +function resolveTempDir() | |
| 336 | +{ | |
| 337 | + | |
| 338 | + if (OS_UNIX) | |
| 339 | + { | |
| 340 | + $dir='/tmp/kt-db-backup'; | |
| 341 | + } | |
| 342 | + else | |
| 343 | + { | |
| 344 | + $dir='c:/kt-db-backup'; | |
| 345 | + } | |
| 346 | + $oKTConfig =& KTConfig::getSingleton(); | |
| 347 | + $dir = $oKTConfig->get('backup/backupDirectory',$dir); | |
| 348 | + | |
| 349 | + if (!is_dir($dir)) | |
| 350 | + { | |
| 351 | + mkdir($dir); | |
| 352 | + } | |
| 353 | + return $dir; | |
| 354 | +} | |
| 355 | + | |
| 356 | + | |
| 357 | +function backupConfirm() | |
| 358 | +{ | |
| 359 | + $stmt = $this->create_backup_stmt(); | |
| 360 | + $_SESSION['backupFile'] = $stmt['target']; | |
| 361 | + | |
| 362 | + $dir = $stmt['dir']; | |
| 363 | + $this->temp_variables['dir'] = $dir; | |
| 364 | + $this->temp_variables['display'] = $stmt['display']; | |
| 365 | +} | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | +} | |
| 370 | +?> | |
| 0 | 371 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeComplete.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Complete Step Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +class upgradeComplete extends Step { | |
| 44 | + | |
| 45 | + /** | |
| 46 | + * Reference to Database object | |
| 47 | + * | |
| 48 | + * @author KnowledgeTree Team | |
| 49 | + * @access private | |
| 50 | + * @var object | |
| 51 | + */ | |
| 52 | + private $_dbhandler = null; | |
| 53 | + | |
| 54 | + private $privileges_check = 'tick'; | |
| 55 | + private $database_check = 'tick'; | |
| 56 | + protected $silent = true; | |
| 57 | + | |
| 58 | + protected $util = null; | |
| 59 | + | |
| 60 | + public function __construct() { | |
| 61 | + $this->temp_variables = array("step_name"=>"complete", "silent"=>$this->silent); | |
| 62 | + $this->_dbhandler = new dbUtil(); | |
| 63 | + $this->util = new UpgradeUtil(); | |
| 64 | + } | |
| 65 | + | |
| 66 | + function doStep() { | |
| 67 | + $this->doRun(); | |
| 68 | + return 'landing'; | |
| 69 | + } | |
| 70 | + | |
| 71 | + function doRun() { | |
| 72 | + $this->storeSilent();// Set silent mode variables | |
| 73 | + } | |
| 74 | + | |
| 75 | + /** | |
| 76 | + * Set all silent mode varibles | |
| 77 | + * | |
| 78 | + */ | |
| 79 | + private function storeSilent() { | |
| 80 | + } | |
| 81 | +} | |
| 82 | +?> | |
| 0 | 83 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeDatabase.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Database Step Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +// include defaults | |
| 44 | +require '../../config/dmsDefaults.php'; | |
| 45 | +require_once KT_LIB_DIR . '/config/config.inc.php'; | |
| 46 | +include KT_LIB_DIR . '/upgrades/upgrade.inc.php'; | |
| 47 | + | |
| 48 | +class upgradeDatabase extends Step | |
| 49 | +{ | |
| 50 | + /** | |
| 51 | + * Reference to Database object | |
| 52 | + * | |
| 53 | + * @author KnowledgeTree Team | |
| 54 | + * @access public | |
| 55 | + * @var object | |
| 56 | + */ | |
| 57 | + public $_dbhandler = null; | |
| 58 | + | |
| 59 | + /** | |
| 60 | + * Reference to Database object | |
| 61 | + * | |
| 62 | + * @author KnowledgeTree Team | |
| 63 | + * @access public | |
| 64 | + * @var object | |
| 65 | + */ | |
| 66 | + public $_util = null; | |
| 67 | + | |
| 68 | + /** | |
| 69 | + * Database type | |
| 70 | + * | |
| 71 | + * @author KnowledgeTree Team | |
| 72 | + * @access private | |
| 73 | + * @var array | |
| 74 | + */ | |
| 75 | + private $dtype = ''; | |
| 76 | + | |
| 77 | + /** | |
| 78 | + * Database types | |
| 79 | + * | |
| 80 | + * @author KnowledgeTree Team | |
| 81 | + * @access private | |
| 82 | + * @var array | |
| 83 | + */ | |
| 84 | + private $dtypes = array(); | |
| 85 | + | |
| 86 | + /** | |
| 87 | + * Database host | |
| 88 | + * | |
| 89 | + * @author KnowledgeTree Team | |
| 90 | + * @access private | |
| 91 | + * @var string | |
| 92 | + */ | |
| 93 | + private $dhost = ''; | |
| 94 | + | |
| 95 | + /** | |
| 96 | + * Database port | |
| 97 | + * | |
| 98 | + * @author KnowledgeTree Team | |
| 99 | + * @access private | |
| 100 | + * @var string | |
| 101 | + */ | |
| 102 | + private $dport = ''; | |
| 103 | + | |
| 104 | + /** | |
| 105 | + * Database name | |
| 106 | + * | |
| 107 | + * @author KnowledgeTree Team | |
| 108 | + * @access private | |
| 109 | + * @var string | |
| 110 | + */ | |
| 111 | + private $dname = ''; | |
| 112 | + | |
| 113 | + /** | |
| 114 | + * Database root username | |
| 115 | + * | |
| 116 | + * @author KnowledgeTree Team | |
| 117 | + * @access private | |
| 118 | + * @var string | |
| 119 | + */ | |
| 120 | + private $duname = ''; | |
| 121 | + | |
| 122 | + /** | |
| 123 | + * Database root password | |
| 124 | + * | |
| 125 | + * @author KnowledgeTree Team | |
| 126 | + * @access private | |
| 127 | + * @var string | |
| 128 | + */ | |
| 129 | + private $dpassword = ''; | |
| 130 | + | |
| 131 | + /** | |
| 132 | + * Database dms username | |
| 133 | + * | |
| 134 | + * @author KnowledgeTree Team | |
| 135 | + * @access private | |
| 136 | + * @var string | |
| 137 | + */ | |
| 138 | + private $dmsname = ''; | |
| 139 | + | |
| 140 | + /** | |
| 141 | + * Database dms password | |
| 142 | + * | |
| 143 | + * @author KnowledgeTree Team | |
| 144 | + * @access private | |
| 145 | + * @var string | |
| 146 | + */ | |
| 147 | + private $dmspassword = ''; | |
| 148 | + | |
| 149 | + /** | |
| 150 | + * Default dms user username | |
| 151 | + * | |
| 152 | + * @author KnowledgeTree Team | |
| 153 | + * @access private | |
| 154 | + * @var boolean | |
| 155 | + */ | |
| 156 | + private $dmsusername = ''; | |
| 157 | + | |
| 158 | + /** | |
| 159 | + * Default dms user password | |
| 160 | + * | |
| 161 | + * @author KnowledgeTree Team | |
| 162 | + * @access private | |
| 163 | + * @var boolean | |
| 164 | + */ | |
| 165 | + private $dmsuserpassword = ''; | |
| 166 | + | |
| 167 | + /** | |
| 168 | + * Location of database binaries. | |
| 169 | + * | |
| 170 | + * @author KnowledgeTree Team | |
| 171 | + * @access private | |
| 172 | + * @var string | |
| 173 | + */ | |
| 174 | + private $mysqlDir; // TODO:multiple databases | |
| 175 | + | |
| 176 | + /** | |
| 177 | + * Name of database binary. | |
| 178 | + * | |
| 179 | + * @author KnowledgeTree Team | |
| 180 | + * @access private | |
| 181 | + * @var string | |
| 182 | + */ | |
| 183 | + private $dbbinary = ''; // TODO:multiple databases | |
| 184 | + | |
| 185 | + /** | |
| 186 | + * Database table prefix | |
| 187 | + * | |
| 188 | + * @author KnowledgeTree Team | |
| 189 | + * @access private | |
| 190 | + * @var string | |
| 191 | + */ | |
| 192 | + private $tprefix = ''; | |
| 193 | + | |
| 194 | + /** | |
| 195 | + * Flag to drop database | |
| 196 | + * | |
| 197 | + * @author KnowledgeTree Team | |
| 198 | + * @access private | |
| 199 | + * @var boolean | |
| 200 | + */ | |
| 201 | + private $ddrop = false; | |
| 202 | + | |
| 203 | + /** | |
| 204 | + * List of errors encountered | |
| 205 | + * | |
| 206 | + * @author KnowledgeTree Team | |
| 207 | + * @access public | |
| 208 | + * @var array | |
| 209 | + */ | |
| 210 | + public $error = array(); | |
| 211 | + | |
| 212 | + /** | |
| 213 | + * List of errors used in template | |
| 214 | + * | |
| 215 | + * @author KnowledgeTree Team | |
| 216 | + * @access public | |
| 217 | + * @var array | |
| 218 | + */ | |
| 219 | + public $templateErrors = array('dmspassword', 'dmsuserpassword', 'con', 'dname', 'dtype', 'duname', 'dpassword'); | |
| 220 | + | |
| 221 | + /** | |
| 222 | + * Flag to store class information in session | |
| 223 | + * | |
| 224 | + * @author KnowledgeTree Team | |
| 225 | + * @access public | |
| 226 | + * @var array | |
| 227 | + */ | |
| 228 | + public $storeInSession = true; | |
| 229 | + | |
| 230 | + /** | |
| 231 | + * Flag if step needs to be upgraded | |
| 232 | + * | |
| 233 | + * @author KnowledgeTree Team | |
| 234 | + * @access public | |
| 235 | + * @var array | |
| 236 | + */ | |
| 237 | + protected $runUpgrade = true; | |
| 238 | + | |
| 239 | + /** | |
| 240 | + * Flag if step needs to run silently | |
| 241 | + * | |
| 242 | + * @author KnowledgeTree Team | |
| 243 | + * @access public | |
| 244 | + * @var array | |
| 245 | + */ | |
| 246 | + protected $silent = true; | |
| 247 | + | |
| 248 | + /** | |
| 249 | + * Constructs database object | |
| 250 | + * | |
| 251 | + * @author KnowledgeTree Team | |
| 252 | + * @access public | |
| 253 | + * @param none | |
| 254 | + */ | |
| 255 | + public function __construct() { | |
| 256 | + $this->temp_variables = array("step_name"=>"database", "silent"=>$this->silent); | |
| 257 | + $this->_dbhandler = new UpgradedbUtil(); | |
| 258 | + $this->_util = new UpgradeUtil(); | |
| 259 | + if(WINDOWS_OS) | |
| 260 | + $this->mysqlDir = MYSQL_BIN; | |
| 261 | + } | |
| 262 | + | |
| 263 | + /** | |
| 264 | + * Main control of database setup | |
| 265 | + * | |
| 266 | + * @author KnowledgeTree Team | |
| 267 | + * @param none | |
| 268 | + * @access public | |
| 269 | + * @return string | |
| 270 | + */ | |
| 271 | + public function doStep() { | |
| 272 | + parent::doStep(); | |
| 273 | + $this->initErrors(); | |
| 274 | + $this->setDetails(); // Set any posted variables | |
| 275 | + if(!$this->inStep("database")) { | |
| 276 | + $this->doRun(); | |
| 277 | + return 'landing'; | |
| 278 | + } | |
| 279 | + if($this->next()) { | |
| 280 | + if ($this->doRun()) { | |
| 281 | + return 'next'; | |
| 282 | + } | |
| 283 | + } else if($this->previous()) { | |
| 284 | + return 'previous'; | |
| 285 | + } | |
| 286 | + else if ($this->backup()) { | |
| 287 | + return 'backup'; | |
| 288 | + } | |
| 289 | + else if ($this->restore()) { | |
| 290 | + return 'restore'; | |
| 291 | + } | |
| 292 | + else if ($this->upgrading()) { | |
| 293 | + $this->doRun('runUpgrade'); | |
| 294 | + return 'next'; | |
| 295 | + } | |
| 296 | + else if ($this->confirm()) { | |
| 297 | + if ($this->doRun('confirm')) { | |
| 298 | + return 'next'; | |
| 299 | + } | |
| 300 | + return 'error'; | |
| 301 | + } | |
| 302 | + | |
| 303 | + $this->doRun(); | |
| 304 | + return 'landing'; | |
| 305 | + } | |
| 306 | + | |
| 307 | + function backup() { | |
| 308 | + return isset($_POST['Backup']); | |
| 309 | + } | |
| 310 | + | |
| 311 | + function restore() { | |
| 312 | + return isset($_POST['Restore']); | |
| 313 | + } | |
| 314 | + | |
| 315 | + function upgrading() { | |
| 316 | + return isset($_POST['RunUpgrade']); | |
| 317 | + } | |
| 318 | + | |
| 319 | + function doRun($action = null) { | |
| 320 | + $this->readConfig(KTConfig::getConfigFilename()); | |
| 321 | + | |
| 322 | + if($this->dbSettings['dbPort'] == '') { | |
| 323 | + $con = $this->_dbhandler->load($this->dbSettings['dbHost'], $this->dbSettings['dbUser'], | |
| 324 | + $this->dbSettings['dbPass'], $this->dbSettings['dbName']); | |
| 325 | + } else { | |
| 326 | + $con = $this->_dbhandler->load($this->dbSettings['dbHost'].":".$this->dbSettings['dbPort'], $this->dbSettings['dbUser'], | |
| 327 | + $this->dbSettings['dbPass'], $this->dbSettings['dbName']); | |
| 328 | + } | |
| 329 | + | |
| 330 | + if (is_null($action) || ($action == 'preview')) { | |
| 331 | + $this->temp_variables['action'] = 'preview'; | |
| 332 | + $this->temp_variables['title'] = 'Preview Upgrade'; | |
| 333 | + $this->temp_variables['upgradeTable'] = $this->generateUpgradeTable(); | |
| 334 | + } | |
| 335 | + else if ($action == 'runUpgrade') { | |
| 336 | + $this->temp_variables['action'] = 'runUpgrade'; | |
| 337 | + $this->temp_variables['title'] = 'Confirm Upgrade'; | |
| 338 | + $this->temp_variables['upgradeTable'] = $this->upgradeConfirm(); | |
| 339 | + } | |
| 340 | + else if ($action == 'confirm') { | |
| 341 | + $this->temp_variables['action'] = 'confirm'; | |
| 342 | + $this->temp_variables['title'] = 'Upgrade In Progress'; | |
| 343 | + if (!$this->upgrade()) { | |
| 344 | + $this->temp_variables['upgradeTable'] = $this->upgradeErrors(); | |
| 345 | + return false; | |
| 346 | + } | |
| 347 | + } | |
| 348 | + | |
| 349 | + return true; | |
| 350 | + } | |
| 351 | + | |
| 352 | + public function generateUpgradeTable() { | |
| 353 | + global $default; | |
| 354 | + | |
| 355 | + $this->temp_variables['systemVersion'] = $default->systemVersion; | |
| 356 | + $query = sprintf('SELECT value FROM %s WHERE name = "databaseVersion"', $default->system_settings_table); | |
| 357 | + | |
| 358 | + $result = $this->_dbhandler->query($query); | |
| 359 | + if ($result) { | |
| 360 | + $lastVersionObj = $this->_dbhandler->fetchNextObject($result); | |
| 361 | + $lastVersion = $lastVersionObj->value; | |
| 362 | + } | |
| 363 | + $currentVersion = $default->systemVersion; | |
| 364 | + | |
| 365 | + $upgrades = describeUpgrade($lastVersion, $currentVersion); | |
| 366 | + | |
| 367 | + $ret = "<table border=1 cellpadding=1 cellspacing=1 width='100%'>\n"; | |
| 368 | + $ret .= "<tr bgcolor='darkgrey'><th width='10'>Code</th><th width='100%'>Description</th><th width='30'>Applied</th></tr>\n"; | |
| 369 | + $i=0; | |
| 370 | + foreach ($upgrades as $upgrade) { | |
| 371 | + $color=((($i++)%2)==0)?'white':'lightgrey'; | |
| 372 | + $ret .= sprintf("<tr bgcolor='$color'><td>%s</td><td>%s</td><td>%s</td></tr>\n", | |
| 373 | + htmlspecialchars($upgrade->getDescriptor()), | |
| 374 | + htmlspecialchars($upgrade->getDescription()), | |
| 375 | + $upgrade->isAlreadyApplied() ? "Yes" : "No" | |
| 376 | + ); | |
| 377 | + } | |
| 378 | + $ret .= '</table>'; | |
| 379 | + return $ret; | |
| 380 | + } | |
| 381 | + | |
| 382 | + /** | |
| 383 | + * Store options | |
| 384 | + * | |
| 385 | + * @author KnowledgeTree Team | |
| 386 | + * @params object SimpleXmlObject | |
| 387 | + * @access private | |
| 388 | + * @return void | |
| 389 | + */ | |
| 390 | + private function setDetails() { | |
| 391 | + // create lock file to indicate Upgrade mode | |
| 392 | + $this->createUpgradeFile(); | |
| 393 | + } | |
| 394 | + | |
| 395 | + /** | |
| 396 | + * Creates miUpgradeock file so that system knows it is supposed to run an upgrade installation | |
| 397 | + * | |
| 398 | + * @author KnowledgeTree Team | |
| 399 | + * @access private | |
| 400 | + * @return void | |
| 401 | + */ | |
| 402 | + private function createUpgradeFile() { | |
| 403 | + @touch($this->wizardLocation . DIRECTORY_SEPARATOR . "upgrade.lock"); | |
| 404 | + } | |
| 405 | + | |
| 406 | + /** | |
| 407 | + * Safer way to return post data | |
| 408 | + * | |
| 409 | + * @author KnowledgeTree Team | |
| 410 | + * @params SimpleXmlObject $simplexml | |
| 411 | + * @access public | |
| 412 | + * @return void | |
| 413 | + */ | |
| 414 | + public function getPostSafe($key) { | |
| 415 | + return isset($_POST[$key]) ? $_POST[$key] : ""; | |
| 416 | + } | |
| 417 | + | |
| 418 | + /** | |
| 419 | + * Stores varibles used by template | |
| 420 | + * | |
| 421 | + * @author KnowledgeTree Team | |
| 422 | + * @params none | |
| 423 | + * @access public | |
| 424 | + * @return array | |
| 425 | + */ | |
| 426 | + public function getStepVars() { | |
| 427 | + return $this->temp_variables; | |
| 428 | + } | |
| 429 | + | |
| 430 | + /** | |
| 431 | + * Returns database errors | |
| 432 | + * | |
| 433 | + * @author KnowledgeTree Team | |
| 434 | + * @access public | |
| 435 | + * @params none | |
| 436 | + * @return array | |
| 437 | + */ | |
| 438 | + public function getErrors() { | |
| 439 | + | |
| 440 | + return $this->error; | |
| 441 | + } | |
| 442 | + | |
| 443 | + /** | |
| 444 | + * Initialize errors to false | |
| 445 | + * | |
| 446 | + * @author KnowledgeTree Team | |
| 447 | + * @param none | |
| 448 | + * @access private | |
| 449 | + * @return boolean | |
| 450 | + */ | |
| 451 | + private function initErrors() { | |
| 452 | + foreach ($this->templateErrors as $e) { | |
| 453 | + $this->error[$e] = false; | |
| 454 | + } | |
| 455 | + } | |
| 456 | + | |
| 457 | + private function readConfig($path) { | |
| 458 | + $ini = new UpgradeIni($path); | |
| 459 | + $dbSettings = $ini->getSection('db'); | |
| 460 | + $this->dbSettings = array('dbHost'=> $dbSettings['dbHost'], | |
| 461 | + 'dbName'=> $dbSettings['dbName'], | |
| 462 | + 'dbUser'=> $dbSettings['dbUser'], | |
| 463 | + 'dbPass'=> $dbSettings['dbPass'], | |
| 464 | + 'dbPort'=> $dbSettings['dbPort'], | |
| 465 | + 'dbAdminUser'=> $dbSettings['dbAdminUser'], | |
| 466 | + 'dbAdminPass'=> $dbSettings['dbAdminPass'], | |
| 467 | + ); | |
| 468 | +// $ktSettings = $ini->getSection('KnowledgeTree'); | |
| 469 | +// $froot = $ktSettings['fileSystemRoot']; | |
| 470 | +// if ($froot == 'default') { | |
| 471 | +// $froot = $this->location; | |
| 472 | +// } | |
| 473 | +// $this->ktSettings = array('fileSystemRoot'=> $froot, | |
| 474 | +// ); | |
| 475 | +// $urlPaths = $ini->getSection('urls'); | |
| 476 | +// $this->urlPaths = array(array('name'=> 'Var Directory', 'path'=> $froot.DS.'var'), | |
| 477 | +// array('name'=> 'Log Directory', 'path'=> $froot.DS.'log'), | |
| 478 | +// array('name'=> 'Document Root', 'path'=> $froot.DS.'Documents'), | |
| 479 | +// array('name'=> 'UI Directory', 'path'=> $froot.DS.'presentation'.DS.'lookAndFeel'.DS.'knowledgeTree'), | |
| 480 | +// array('name'=> 'Temporary Directory', 'path'=> $froot.DS.'tmp'), | |
| 481 | +// array('name'=> 'Cache Directory', 'path'=> $froot.DS.'cache'), | |
| 482 | +// ); | |
| 483 | +// $this->temp_variables['urlPaths'] = $this->urlPaths; | |
| 484 | +// $this->temp_variables['ktSettings'] = $this->ktSettings; | |
| 485 | + $this->temp_variables['dbSettings'] = $this->dbSettings; | |
| 486 | + } | |
| 487 | + | |
| 488 | + function upgradeConfirm() | |
| 489 | + { | |
| 490 | + if (!isset($_SESSION['backupStatus']) || $_SESSION['backupStatus'] === false) | |
| 491 | + { | |
| 492 | + $this->temp_variables['backupStatus'] = false; | |
| 493 | + } | |
| 494 | + } | |
| 495 | + | |
| 496 | + | |
| 497 | +function upgrade() | |
| 498 | +{ | |
| 499 | + global $default; | |
| 500 | +?> | |
| 501 | + <p>The table below describes the upgrades that have occurred to | |
| 502 | + upgrade your <?php echo APP_NAME;?> installation to <strong><?php echo $default->systemVersion;?></strong>. | |
| 503 | + | |
| 504 | + <?php | |
| 505 | + $pre_res = performPreUpgradeActions(); | |
| 506 | + if (PEAR::isError($pre_res)) | |
| 507 | + { | |
| 508 | +?> | |
| 509 | +<font color="red">Pre-Upgrade actions failed.</font><br/> | |
| 510 | +<?php | |
| 511 | + } | |
| 512 | + else | |
| 513 | + { | |
| 514 | +?> | |
| 515 | +<p> | |
| 516 | +<font color="green">Pre-Upgrade actions succeeded.</font><br/> | |
| 517 | +<?php | |
| 518 | + } | |
| 519 | +?> | |
| 520 | +<p> | |
| 521 | + <?php | |
| 522 | + $res = performAllUpgrades(); | |
| 523 | + if (PEAR::isError($res) || PEAR::isError($pres)) | |
| 524 | + { | |
| 525 | +?> | |
| 526 | +<font color="red">Upgrade failed.</font> | |
| 527 | +<?php | |
| 528 | + } | |
| 529 | + else | |
| 530 | + { | |
| 531 | +?> | |
| 532 | +<p> | |
| 533 | +<font color="green">Upgrade succeeded.</font> | |
| 534 | +<?php | |
| 535 | + } | |
| 536 | +?> | |
| 537 | +<p> | |
| 538 | + <?php | |
| 539 | + $post_pres = performPostUpgradeActions(); | |
| 540 | + if (PEAR::isError($post_res)) | |
| 541 | + { | |
| 542 | +?> | |
| 543 | +<font color="red">Post-Upgrade actions failed.</font><br/><br/> | |
| 544 | +<?php | |
| 545 | + } | |
| 546 | + else | |
| 547 | + { | |
| 548 | +?> | |
| 549 | +<p> | |
| 550 | +<font color="green">Post-Upgrade actions succeeded.</font><br/><br/> | |
| 551 | +<script type="text/javascript"> | |
| 552 | + alert("To complete the upgrade please do the following before continuing:\n\n1. Restart the services as appropriate for your environment.\n\n\nOn first run of your upgraded installaton please do the following:\n\n1. Hard refresh your bowser (CTRL-F5) on first view of the Dashboard.\n2. Enable the new plugins you wish to use.\n\n\nSelect 'next' at the bottom of this page to continue.") | |
| 553 | +</script> | |
| 554 | +<?php | |
| 555 | + } | |
| 556 | +?> | |
| 557 | + | |
| 558 | + <input type=button value="back" onclick="javascript:do_start('home')"> | |
| 559 | + <input type=button value="next" onclick="javascript:document.location='..';"> | |
| 560 | +<?php | |
| 561 | +} | |
| 562 | + | |
| 563 | +} | |
| 564 | +?> | |
| 0 | 565 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeErrors.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Error Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrade | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +class UpgradeErrors extends Step { | |
| 43 | + public $error = array(); | |
| 44 | + | |
| 45 | + function doStep() { | |
| 46 | + return 'landing'; | |
| 47 | + } | |
| 48 | + | |
| 49 | + function getErrors() { | |
| 50 | + return $this->error; | |
| 51 | + } | |
| 52 | + | |
| 53 | + function getName() { | |
| 54 | + return 'error'; | |
| 55 | + } | |
| 56 | +} | |
| 57 | +?> | |
| 0 | 58 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeInstallation.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrade Step Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrade | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +class UpgradeInstallation extends step | |
| 44 | +{ | |
| 45 | + /** | |
| 46 | + * Flag if step needs to run silently | |
| 47 | + * | |
| 48 | + * @author KnowledgeTree Team | |
| 49 | + * @access public | |
| 50 | + * @var array | |
| 51 | + */ | |
| 52 | + protected $silent = false; | |
| 53 | + | |
| 54 | + function __construct() { | |
| 55 | + $this->temp_variables = array("step_name"=>"welcome"); | |
| 56 | + } | |
| 57 | + | |
| 58 | + function doStep() { | |
| 59 | + parent::doStep(); | |
| 60 | + if($this->next()) { | |
| 61 | + return 'next'; // Just a welcome, so return "next" action | |
| 62 | + } | |
| 63 | + | |
| 64 | + return 'landing'; | |
| 65 | + } | |
| 66 | + | |
| 67 | +} | |
| 68 | +?> | |
| 0 | 69 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeRestore.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Complete Step Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +require '../../config/dmsDefaults.php'; | |
| 44 | + | |
| 45 | +class upgradeRestore extends Step { | |
| 46 | + | |
| 47 | + /** | |
| 48 | + * Reference to Database object | |
| 49 | + * | |
| 50 | + * @author KnowledgeTree Team | |
| 51 | + * @access private | |
| 52 | + * @var object | |
| 53 | + */ | |
| 54 | + private $_dbhandler = null; | |
| 55 | + | |
| 56 | + private $privileges_check = 'tick'; | |
| 57 | + private $database_check = 'tick'; | |
| 58 | + protected $silent = true; | |
| 59 | + | |
| 60 | + protected $util = null; | |
| 61 | + | |
| 62 | + public function __construct() { | |
| 63 | + $this->temp_variables = array("step_name"=>"restore", "silent"=>$this->silent); | |
| 64 | + $this->_dbhandler = new UpgradedbUtil(); | |
| 65 | + $this->util = new UpgradeUtil(); | |
| 66 | + } | |
| 67 | + | |
| 68 | + function doStep() { | |
| 69 | + parent::doStep(); | |
| 70 | + if(!$this->inStep("restore")) { | |
| 71 | + $this->doRun(); | |
| 72 | + return 'landing'; | |
| 73 | + } | |
| 74 | + if($this->next()) { | |
| 75 | + if ($this->doRun()) { | |
| 76 | + return 'next'; | |
| 77 | + } | |
| 78 | + } else if($this->previous()) { | |
| 79 | + return 'previous'; | |
| 80 | + } | |
| 81 | + | |
| 82 | + $this->doRun(); | |
| 83 | + return 'landing'; | |
| 84 | + } | |
| 85 | + | |
| 86 | + function doRun() { | |
| 87 | + if ($this->select()) { | |
| 88 | + $this->restoreSelected(); | |
| 89 | + } | |
| 90 | + $this->restoreConfirm(); | |
| 91 | + $this->storeSilent();// Set silent mode variables | |
| 92 | + | |
| 93 | + return true; | |
| 94 | + } | |
| 95 | + | |
| 96 | + function select() { | |
| 97 | + return isset($_POST['RestoreSelect']); | |
| 98 | + } | |
| 99 | + | |
| 100 | + /** | |
| 101 | + * Set all silent mode varibles | |
| 102 | + * | |
| 103 | + */ | |
| 104 | + private function storeSilent() { | |
| 105 | + } | |
| 106 | + | |
| 107 | + function restore() | |
| 108 | +{ | |
| 109 | + check_state(1); | |
| 110 | + set_state(5); | |
| 111 | +// title('Restore In Progress'); | |
| 112 | + $status = $_SESSION['backupStatus']; | |
| 113 | + $filename=$_SESSION['backupFile']; | |
| 114 | + $stmt=create_restore_stmt($filename); | |
| 115 | + $dir=$stmt['dir']; | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + if (is_file($dir . '/mysql') || is_file($dir . '/mysql.exe')) | |
| 121 | + { | |
| 122 | + | |
| 123 | +?> | |
| 124 | + The restore is now underway. Please wait till it completes. | |
| 125 | +<?php | |
| 126 | + print "\n"; | |
| 127 | + | |
| 128 | + | |
| 129 | + $curdir=getcwd(); | |
| 130 | + chdir($dir); | |
| 131 | + | |
| 132 | + | |
| 133 | + $ok=true; | |
| 134 | + $stmts=explode("\n",$stmt['cmd']); | |
| 135 | + foreach($stmts as $stmt) | |
| 136 | + { | |
| 137 | + | |
| 138 | + $handle = popen($stmt, 'r'); | |
| 139 | + if ($handle=='false') | |
| 140 | + { | |
| 141 | + $ok=false; | |
| 142 | + break; | |
| 143 | + } | |
| 144 | + $read = fread($handle, 10240); | |
| 145 | + pclose($handle); | |
| 146 | + $_SESSION['restoreOutput']=$read; | |
| 147 | + } | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + $_SESSION['restoreStatus'] = $ok; | |
| 154 | + | |
| 155 | + | |
| 156 | +?> | |
| 157 | + <script type="text/javascript"> | |
| 158 | + document.location="?go=RestoreDone"; | |
| 159 | + </script> | |
| 160 | +<?php | |
| 161 | + | |
| 162 | + | |
| 163 | + } | |
| 164 | + else | |
| 165 | + { | |
| 166 | +?> | |
| 167 | +<P> | |
| 168 | + The <i>mysql</i> utility was not found in the <?php echo $dir;?> subdirectory. | |
| 169 | + | |
| 170 | + <input type=button value="back" onclick="javascript:do_start('welcome')"> | |
| 171 | +<?php | |
| 172 | + } | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | +} | |
| 177 | + | |
| 178 | + | |
| 179 | +function restoreDone() | |
| 180 | +{ | |
| 181 | + check_state(5); | |
| 182 | + set_state(6); | |
| 183 | +// title('Restore Status'); | |
| 184 | + $status = $_SESSION['restoreStatus']; | |
| 185 | + $filename=$_SESSION['backupFile']; | |
| 186 | + | |
| 187 | + if ($status) | |
| 188 | + { | |
| 189 | + | |
| 190 | +?> | |
| 191 | + The restore of <nobr><i>"<?php echo $filename;?>"</i></nobr> has been completed. | |
| 192 | + <P> | |
| 193 | + It appears as though the <font color=green>restore has been successful</font>. | |
| 194 | + <P> | |
| 195 | + | |
| 196 | + | |
| 197 | + | |
| 198 | +<?php | |
| 199 | + } | |
| 200 | + else | |
| 201 | + { | |
| 202 | +?> | |
| 203 | +It appears as though <font color=red>the restore process has failed</font>. <P> | |
| 204 | +Unfortunately, it is difficult to diagnose these problems automatically | |
| 205 | +and would recommend that you try to do the backup process manually. | |
| 206 | +<P> | |
| 207 | +We appologise for the inconvenience. | |
| 208 | +<P> | |
| 209 | +<table bgcolor="lightgrey"> | |
| 210 | +<tr> | |
| 211 | +<td> | |
| 212 | +<?php echo $_SESSION['restoreOutput'];?> | |
| 213 | +</table> | |
| 214 | +<?php | |
| 215 | + | |
| 216 | + } | |
| 217 | +?> | |
| 218 | + | |
| 219 | +<br/> | |
| 220 | + | |
| 221 | + <input type=button value="back" onclick="javascript:do_start('welcome')"> | |
| 222 | + | |
| 223 | +<?php | |
| 224 | + | |
| 225 | +} | |
| 226 | + | |
| 227 | +function create_restore_stmt($targetfile) | |
| 228 | +{ | |
| 229 | + $oKTConfig =& KTConfig::getSingleton(); | |
| 230 | + | |
| 231 | + $adminUser = $oKTConfig->get('db/dbAdminUser'); | |
| 232 | + $adminPwd = $oKTConfig->get('db/dbAdminPass'); | |
| 233 | + $dbHost = $oKTConfig->get('db/dbHost'); | |
| 234 | + $dbName = $oKTConfig->get('db/dbName'); | |
| 235 | + $dbPort = trim($oKTConfig->get('db/dbPort')); | |
| 236 | + if ($dbPort=='' || $dbPort=='default')$dbPort = get_cfg_var('mysql.default_port'); | |
| 237 | + if (empty($dbPort)) $dbPort='3306'; | |
| 238 | + $dbSocket = trim($oKTConfig->get('db/dbSocket')); | |
| 239 | + if (empty($dbSocket) || $dbSocket=='default') $dbSocket = get_cfg_var('mysql.default_socket'); | |
| 240 | + if (empty($dbSocket)) $dbSocket='../tmp/mysql.sock'; | |
| 241 | + | |
| 242 | + $dir = $this->resolveMysqlDir(); | |
| 243 | + | |
| 244 | + $info['dir']=$dir; | |
| 245 | + | |
| 246 | + $prefix=''; | |
| 247 | + if (OS_UNIX) | |
| 248 | + { | |
| 249 | + $prefix .= "./"; | |
| 250 | + } | |
| 251 | + | |
| 252 | + if (@stat($dbSocket) !== false) | |
| 253 | + { | |
| 254 | + $mechanism="--socket=\"$dbSocket\""; | |
| 255 | + } | |
| 256 | + else | |
| 257 | + { | |
| 258 | + $mechanism="--port=\"$dbPort\""; | |
| 259 | + } | |
| 260 | + | |
| 261 | + $tmpdir = $this->resolveTempDir(); | |
| 262 | + | |
| 263 | + $stmt = $prefix ."mysqladmin --user=\"$adminUser\" -p $mechanism drop \"$dbName\"<br/>"; | |
| 264 | + $stmt .= $prefix ."mysqladmin --user=\"$adminUser\" -p $mechanism create \"$dbName\"<br/>"; | |
| 265 | + | |
| 266 | + | |
| 267 | + $stmt .= $prefix ."mysql --user=\"$adminUser\" -p $mechanism \"$dbName\" < \"$targetfile\"\n"; | |
| 268 | + $info['display']=$stmt; | |
| 269 | + | |
| 270 | + | |
| 271 | + $stmt = $prefix ."mysqladmin --user=\"$adminUser\" --force --password=\"$adminPwd\" $mechanism drop \"$dbName\"\n"; | |
| 272 | + $stmt .= $prefix ."mysqladmin --user=\"$adminUser\" --password=\"$adminPwd\" $mechanism create \"$dbName\"\n"; | |
| 273 | + | |
| 274 | + $stmt .= $prefix ."mysql --user=\"$adminUser\" --password=\"$adminPwd\" $mechanism \"$dbName\" < \"$targetfile\""; | |
| 275 | + $info['cmd']=$stmt; | |
| 276 | + return $info; | |
| 277 | +} | |
| 278 | + | |
| 279 | +function resolveMysqlDir() | |
| 280 | +{ | |
| 281 | + // possibly detect existing installations: | |
| 282 | + | |
| 283 | + if (OS_UNIX) | |
| 284 | + { | |
| 285 | + $dirs = array('/opt/mysql/bin','/usr/local/mysql/bin'); | |
| 286 | + $mysqlname ='mysql'; | |
| 287 | + } | |
| 288 | + else | |
| 289 | + { | |
| 290 | + $dirs = explode(';', $_SERVER['PATH']); | |
| 291 | + $dirs[] ='c:/Program Files/MySQL/MySQL Server 5.0/bin'; | |
| 292 | + $dirs[] = 'c:/program files/ktdms/mysql/bin'; | |
| 293 | + $mysqlname ='mysql.exe'; | |
| 294 | + } | |
| 295 | + | |
| 296 | + $oKTConfig =& KTConfig::getSingleton(); | |
| 297 | + $mysqldir = $oKTConfig->get('backup/mysqlDirectory',$mysqldir); | |
| 298 | + $dirs[] = $mysqldir; | |
| 299 | + | |
| 300 | + if (strpos(__FILE__,'knowledgeTree') !== false && strpos(__FILE__,'ktdms') != false) | |
| 301 | + { | |
| 302 | + $dirs [] = realpath(dirname($FILE) . '/../../mysql/bin'); | |
| 303 | + } | |
| 304 | + | |
| 305 | + foreach($dirs as $dir) | |
| 306 | + { | |
| 307 | + if (is_file($dir . '/' . $mysqlname)) | |
| 308 | + { | |
| 309 | + return $dir; | |
| 310 | + } | |
| 311 | + } | |
| 312 | + | |
| 313 | + return ''; | |
| 314 | +} | |
| 315 | + | |
| 316 | +function resolveTempDir() | |
| 317 | +{ | |
| 318 | + | |
| 319 | + if (OS_UNIX) | |
| 320 | + { | |
| 321 | + $dir='/tmp/kt-db-backup'; | |
| 322 | + } | |
| 323 | + else | |
| 324 | + { | |
| 325 | + $dir='c:/kt-db-backup'; | |
| 326 | + } | |
| 327 | + $oKTConfig =& KTConfig::getSingleton(); | |
| 328 | + $dir = $oKTConfig->get('backup/backupDirectory',$dir); | |
| 329 | + | |
| 330 | + if (!is_dir($dir)) | |
| 331 | + { | |
| 332 | + mkdir($dir); | |
| 333 | + } | |
| 334 | + return $dir; | |
| 335 | +} | |
| 336 | + | |
| 337 | + | |
| 338 | +function restoreSelect() | |
| 339 | +{ | |
| 340 | +// title('Select Backup to Restore'); | |
| 341 | + | |
| 342 | + $dir = $this->resolveTempDir(); | |
| 343 | + | |
| 344 | + $files = array(); | |
| 345 | + if ($dh = opendir($dir)) | |
| 346 | + { | |
| 347 | + while (($file = readdir($dh)) !== false) | |
| 348 | + { | |
| 349 | + if (!preg_match('/kt-backup.+\.sql/',$file)) | |
| 350 | + { | |
| 351 | + continue; | |
| 352 | + } | |
| 353 | + $files[] = $file; | |
| 354 | + } | |
| 355 | + closedir($dh); | |
| 356 | + } | |
| 357 | + | |
| 358 | + if (count($files) == 0) | |
| 359 | + { | |
| 360 | + ?> | |
| 361 | + There don't seem to be any backups to restore from the <i>"<?php echo $dir;?>"</i> directory. | |
| 362 | + <?php | |
| 363 | + } | |
| 364 | + else | |
| 365 | + { | |
| 366 | + ?> | |
| 367 | + <P> | |
| 368 | + Select a backup to restore from the list below: | |
| 369 | + <P> | |
| 370 | + <form action="index.php?step_name=restore" method="post"> | |
| 371 | + | |
| 372 | + <table border=1 cellpadding=1 cellspacing=1> | |
| 373 | + <tr bgcolor="darkgrey"> | |
| 374 | + <td>Filename | |
| 375 | + <td>File Size | |
| 376 | + <td>Action | |
| 377 | +<?php | |
| 378 | + $i=0; | |
| 379 | + foreach($files as $file) | |
| 380 | + { | |
| 381 | + $color=((($i++)%2)==0)?'white':'lightgrey'; | |
| 382 | +?> | |
| 383 | + <tr bgcolor="<?php echo $color;?>"> | |
| 384 | + <td><?php echo $file;?> | |
| 385 | + <td><?php echo filesize($dir . '/'.$file);?> | |
| 386 | + <td><input type="submit" name="RestoreSelect" value="restore"> | |
| 387 | +<?php | |
| 388 | + } | |
| 389 | +?> | |
| 390 | + </table> | |
| 391 | + <input type="hidden" name="file" value="<?php echo $file; ?>" /> | |
| 392 | + </form> | |
| 393 | + <?php | |
| 394 | + } | |
| 395 | + ?> | |
| 396 | + | |
| 397 | + <p> | |
| 398 | + <input type=button value="back" onclick="javascript:do_start('welcome')"> | |
| 399 | + <?php | |
| 400 | + | |
| 401 | +} | |
| 402 | + | |
| 403 | +function restoreSelected() | |
| 404 | +{ | |
| 405 | + $file=$_REQUEST['file']; | |
| 406 | + | |
| 407 | + $dir = $this->resolveTempDir(); | |
| 408 | + $_SESSION['backupFile'] = $dir . '/' . $file; | |
| 409 | +?> | |
| 410 | +<?php | |
| 411 | + | |
| 412 | +} | |
| 413 | + | |
| 414 | +function restoreConfirm() | |
| 415 | +{ | |
| 416 | + if (!isset($_SESSION['backupFile']) || !is_file($_SESSION['backupFile']) || filesize($_SESSION['backupFile']) == 0) | |
| 417 | + { | |
| 418 | + $this->restoreSelect(); | |
| 419 | + exit; | |
| 420 | + } | |
| 421 | + | |
| 422 | + $status = $_SESSION['backupStatus']; | |
| 423 | + $filename=$_SESSION['backupFile']; | |
| 424 | + $stmt = $this->create_restore_stmt($filename); | |
| 425 | + | |
| 426 | + $this->temp_variables['dir'] = $stmt['dir']; | |
| 427 | + $this->temp_variables['display'] = $stmt['display']; | |
| 428 | +} | |
| 429 | + | |
| 430 | + | |
| 431 | + | |
| 432 | + | |
| 433 | +} | |
| 434 | +?> | |
| 0 | 435 | \ No newline at end of file | ... | ... |
setup/upgrade/steps/upgradeWelcome.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Welcome Step Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +global $default; | |
| 44 | +// include defaults | |
| 45 | +include '../../config/dmsDefaults.php'; | |
| 46 | +require_once KT_LIB_DIR . '/authentication/authenticationutil.inc.php'; | |
| 47 | + | |
| 48 | +class upgradeWelcome extends step { | |
| 49 | + | |
| 50 | + protected $silent = true; | |
| 51 | + | |
| 52 | + public function __construct() { | |
| 53 | + $this->temp_variables = array("step_name"=>"welcome"); | |
| 54 | + } | |
| 55 | + | |
| 56 | + public function doStep() { | |
| 57 | + if($this->next()) { | |
| 58 | + if ($this->doRun()) { | |
| 59 | + return 'next'; | |
| 60 | + } | |
| 61 | + else { | |
| 62 | + return 'error'; | |
| 63 | + } | |
| 64 | + } | |
| 65 | + | |
| 66 | + return 'landing'; | |
| 67 | + } | |
| 68 | + | |
| 69 | + private function doRun() { | |
| 70 | + // attempt login | |
| 71 | + $username = $_REQUEST['username']; | |
| 72 | + $password = $_REQUEST['password']; | |
| 73 | + | |
| 74 | + $authenticated = $this->checkPassword($username, $password); | |
| 75 | + | |
| 76 | + if (!$authenticated) | |
| 77 | + { | |
| 78 | + session_unset(); | |
| 79 | +// loginFailed(_kt('Could not authenticate administrative user')); | |
| 80 | + return false; | |
| 81 | + } | |
| 82 | + | |
| 83 | + $_SESSION['setup_user'] = $username; | |
| 84 | + | |
| 85 | + return true; | |
| 86 | + } | |
| 87 | + | |
| 88 | + private function checkPassword($username, $password) { | |
| 89 | + global $default; | |
| 90 | + | |
| 91 | + $sTable = KTUtil::getTableName('users'); | |
| 92 | + $sQuery = "SELECT count(*) AS match_count FROM $sTable WHERE username = ? AND password = ?"; | |
| 93 | + $aParams = array($username, md5($password)); | |
| 94 | + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'match_count'); | |
| 95 | + if (PEAR::isError($res)) { return false; } | |
| 96 | + else { | |
| 97 | + $sTable = KTUtil::getTableName('users_groups_link'); | |
| 98 | + $sQuery = "SELECT count(*) AS match_count FROM $sTable WHERE user_id = ? AND group_id = 1"; | |
| 99 | + $aParams = array($res); | |
| 100 | + $res = DBUtil::getOneResultKey(array($sQuery, $aParams), 'match_count'); | |
| 101 | + if (PEAR::isError($res)) { return false; } | |
| 102 | + else { | |
| 103 | + return ($res == 1); | |
| 104 | + } | |
| 105 | + } | |
| 106 | + } | |
| 107 | + | |
| 108 | +} | |
| 109 | + | |
| 110 | +?> | |
| 0 | 111 | \ No newline at end of file | ... | ... |
setup/upgrade/template.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Template Engine. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +class Template | |
| 44 | +{ | |
| 45 | + /** | |
| 46 | + * Hold all the variables that are going to be imported into the template file | |
| 47 | + * @var array | |
| 48 | + */ | |
| 49 | + var $template_vars = Array(); | |
| 50 | + | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Constructor | |
| 54 | + * | |
| 55 | + * @author KnowledgeTree Team | |
| 56 | + * @param string $file the file name you want to load | |
| 57 | + * @access public | |
| 58 | + * @return void | |
| 59 | + */ | |
| 60 | + public function Template($file = null) | |
| 61 | + { | |
| 62 | + $this->file = $file; | |
| 63 | + } | |
| 64 | + | |
| 65 | + | |
| 66 | + /** | |
| 67 | + * Set a variable into the template | |
| 68 | + * If the variable is a template object, go and call its template::fetch() method | |
| 69 | + * | |
| 70 | + * @author KnowledgeTree Team | |
| 71 | + * @param string $name The name for this value in the template file | |
| 72 | + * @param string $value The value to show in the template file | |
| 73 | + * @access public | |
| 74 | + * @return void | |
| 75 | + */ | |
| 76 | + public function set($name, $value) | |
| 77 | + { | |
| 78 | + //if(is_a($value, 'Template')) { | |
| 79 | + $class = 'Template'; | |
| 80 | + $isA = $value instanceof $class; | |
| 81 | + if($isA) { | |
| 82 | + $value = $value->fetch(); | |
| 83 | + } | |
| 84 | + $this->template_vars[$name] = $value; | |
| 85 | + } | |
| 86 | + | |
| 87 | + | |
| 88 | + /** | |
| 89 | + * Create the template and import its variables | |
| 90 | + * | |
| 91 | + * @author KnowledgeTree Team | |
| 92 | + * @param string $file The file to use as the template | |
| 93 | + * @access public | |
| 94 | + * @return string The parsed template | |
| 95 | + */ | |
| 96 | + public function fetch($file = null) | |
| 97 | + { | |
| 98 | + if (is_null($file)) $file = $this->file; | |
| 99 | + if (!file_exists($file)) { | |
| 100 | + trigger_error('Template file '.$file.' does not exist ', E_USER_ERROR); | |
| 101 | + } | |
| 102 | + extract($this->template_vars); // Extract the vars to local namespace | |
| 103 | + ob_start(); | |
| 104 | + include($file); | |
| 105 | + $contents = ob_get_contents(); | |
| 106 | + ob_end_clean(); | |
| 107 | + return $contents; | |
| 108 | + } | |
| 109 | + | |
| 110 | +} | |
| 111 | +?> | |
| 0 | 112 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/backup.tpl
0 → 100644
| 1 | +<form action="index.php?step_name=backup" method="post"> | |
| 2 | + <p class="title">Confirm Backup</p> | |
| 3 | + | |
| 4 | + <?php | |
| 5 | + if($errors || $warnings){ | |
| 6 | + echo '<div>' | |
| 7 | + . '<a href="http://wiki.knowledgetree.com/Web_Based_Upgrader#Post_Upgrade" target="_blank">' | |
| 8 | + . 'Click Here for help on overcoming backup issues</a></div><br/>'; | |
| 9 | + } | |
| 10 | + ?> | |
| 11 | + <div id="step_content_complete" class="step"> | |
| 12 | + <br/><br/> | |
| 13 | + <div> | |
| 14 | + <?php | |
| 15 | +if ($dir != '') { | |
| 16 | +?> | |
| 17 | + Are you sure you want to perform the backup? | |
| 18 | + | |
| 19 | +<p> | |
| 20 | +Your mysql installation has been resolved. Manually, you would do the following: | |
| 21 | + </p> | |
| 22 | +<p> | |
| 23 | +<table bgcolor="lightgrey"> | |
| 24 | +<tr> | |
| 25 | +<td> | |
| 26 | +<nobr>cd "<?php echo $dir; ?>"</nobr> | |
| 27 | +<br/> | |
| 28 | +</p><?php | |
| 29 | + } | |
| 30 | + else | |
| 31 | + { | |
| 32 | + ?> | |
| 33 | + The mysql backup utility could not be found automatically. Either do a manual backup, or edit the config.ini | |
| 34 | + and update the backup/mysql Directory entry. | |
| 35 | +<P> | |
| 36 | +You can continue to do the backup manually using the following process: | |
| 37 | +<P> | |
| 38 | +<table bgcolor="lightgrey"> | |
| 39 | +<tr> | |
| 40 | +<td><?php | |
| 41 | + } | |
| 42 | +?><nobr><?php echo $display; ?></nobr> | |
| 43 | +</table> | |
| 44 | +<P> | |
| 45 | + <?php if($silent) { ?> | |
| 46 | + </div> | |
| 47 | + <?php } ?> | |
| 48 | + </div> | |
| 49 | + <?php | |
| 50 | +if ($dir != '') | |
| 51 | +{ | |
| 52 | +?><input type="submit" name="Next" value="Next" class="button_next"><?php | |
| 53 | +} | |
| 54 | + | |
| 55 | + ?> | |
| 56 | + <input type="submit" name="Previous" value="Back" class="button_previous"> | |
| 57 | + </div> | |
| 58 | +</form> | |
| 0 | 59 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/complete.tpl
0 → 100644
| 1 | +<form> | |
| 2 | + <p class="title">Upgrade Completed</p> | |
| 3 | + | |
| 4 | + <p class="description">This allows you to check that your KnowledgeTree configuration is set | |
| 5 | + up correctly. You can run this at any time after configuration to check | |
| 6 | + that things are still set up correctly.</p> | |
| 7 | + | |
| 8 | + <?php | |
| 9 | + if($errors || $warnings){ | |
| 10 | + echo '<div>' | |
| 11 | + . '<a href="http://wiki.knowledgetree.com/Web_Based_Upgrader#Post_Upgrade" target="_blank">' | |
| 12 | + . 'Click Here for help on overcoming post Upgrade issues</a></div><br/>'; | |
| 13 | + } | |
| 14 | + ?> | |
| 15 | + <div id="step_content_complete" class="step"> | |
| 16 | +<!-- Services --> | |
| 17 | + <br/><br/> | |
| 18 | + <div> | |
| 19 | + <h3><?php echo "<span class='{$services_check}'> </span>"; ?>Services</h3> | |
| 20 | + <?php if($silent) { ?> | |
| 21 | + <div id="option2" class="onclick" onclick="javascript:{w.toggleClass('services_check', 'option2');}">Show Details</div> | |
| 22 | + <div class="services_check" style="display:none"> | |
| 23 | + <?php } ?> | |
| 24 | + <table style="width:755px;"> | |
| 25 | + <tr> | |
| 26 | + <td style="width:15px;"> <?php echo "<span class='{$LuceneStatus}'> </span>"; ?> </td> | |
| 27 | + <td style="width:640px;"> Lucene Service <?php if ($LuceneStatus != 'tick') { ?> Could not be stopped <?php } else { ?> Stopped <?php } ?></td> | |
| 28 | + <?php if ($LuceneStatus != 'tick') { ?> | |
| 29 | + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td> | |
| 30 | + <?php } ?> | |
| 31 | + </tr> | |
| 32 | + <tr> | |
| 33 | + <td> <?php echo "<span class='{$SchedulerStatus}'> </span>"; ?> </td> | |
| 34 | + <td> Scheduler Service <?php if ($LuceneStatus != 'tick') { ?> Could not be stopped <?php } else { ?> Stopped <?php } ?></td> | |
| 35 | + <?php if ($SchedulerStatus != 'tick') { ?> | |
| 36 | + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td> | |
| 37 | + <?php } ?> | |
| 38 | + </tr> | |
| 39 | + <tr> | |
| 40 | + <td> <?php echo "<span class='{$OpenOfficeStatus}'> </span>"; ?> </td> | |
| 41 | + <td> OpenOffice Service <?php if ($OpenOfficeStatus != 'tick') { ?> Could not be stopped <?php } else { ?> Stopped <?php } ?></td> | |
| 42 | + <?php if ($OpenOfficeStatus != 'tick') { ?> | |
| 43 | + <td><a href="javascript:this.location.reload();" class="refresh">Refresh</a></td> | |
| 44 | + <?php } ?> | |
| 45 | + </tr> | |
| 46 | + </table> | |
| 47 | + <?php if($silent) { ?> | |
| 48 | + </div> | |
| 49 | + <?php } ?> | |
| 50 | + </div> | |
| 51 | + </div> | |
| 52 | + <a href="../wizard" class="buttons back" style="width:100px;">Goto Installer</a> | |
| 53 | +</form> | |
| 0 | 54 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/database.tpl
0 → 100644
| 1 | +<form id="dbsettings" action="index.php?step_name=database" method="post"> | |
| 2 | + <p class="title"><?php echo $title; ?></p> | |
| 3 | + <div id="database" class="step1" style="display:block;"> | |
| 4 | + <div class="description"> | |
| 5 | + This step performs the necessary Database Upgrades. | |
| 6 | + </div> | |
| 7 | + <div id="step_content_database" class="step"> | |
| 8 | + <br/><br/> | |
| 9 | + <?php if ($action == 'preview') { ?> | |
| 10 | + <p>The table below describes the upgrades that need to occur to | |
| 11 | + upgrade your KnowledgeTree installation to <strong><?php echo $systemVersion;?></strong>. | |
| 12 | + Click on the button below the table to perform the upgrades.</p> | |
| 13 | + <?php echo $upgradeTable; ?> | |
| 14 | + <?php } | |
| 15 | + else if ($action == 'runUpgrade') { ?> | |
| 16 | + <br/> | |
| 17 | + <font color="Red">Please ensure that you have made a backup before continuing with the upgrade process.</font> | |
| 18 | + <p> | |
| 19 | + <br/> | |
| 20 | + <?php } ?> | |
| 21 | + <p> | |
| 22 | + We are about to start the upgrade process. | |
| 23 | + <P> | |
| 24 | + </div> | |
| 25 | + </div> | |
| 26 | + <?php if ($action == 'preview') { ?> | |
| 27 | + <input type="submit" name="Previous" value="previous" class="button_previous"/> | |
| 28 | + <input type="submit" name="RunUpgrade" value="next" class="button_next"/> | |
| 29 | + <?php } | |
| 30 | + else if ($action == 'runUpgrade') { ?> | |
| 31 | + <input type="submit" name="Cancel" value="cancel" class="button_previous"/> | |
| 32 | + <input type="submit" name="Confirm" value="next" class="button_next"/> | |
| 33 | + <?php } ?> | |
| 34 | +</form> | |
| 0 | 35 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/error.tpl
0 → 100644
| 1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
| 2 | +<html> | |
| 3 | + <head> | |
| 4 | + <title>KnowledgeTree Installer</title> | |
| 5 | + <script type="text/javascript" src="resources/jquery.js"></script> | |
| 6 | + <script type="text/javascript" src="resources/wizard.js" ></script> | |
| 7 | + <link rel="stylesheet" type="text/css" href="resources/wizard.css" /> | |
| 8 | + | |
| 9 | + </head> | |
| 10 | + | |
| 11 | + <body onload=""> | |
| 12 | + <div id="outer-wrapper"> | |
| 13 | + <div id="header"> | |
| 14 | + <div id="logo"><img src="resources/graphics/dame/installer-header_logo.png"/></div> | |
| 15 | + <div id="install_details"> | |
| 16 | + <span style="font-size:120%;"> 3.7 </span> | |
| 17 | + <span style="font-size:80%;">Commercial Edition</span> | |
| 18 | + </div> | |
| 19 | + </div> | |
| 20 | + <div id="wrapper"> | |
| 21 | + <div id="container"> | |
| 22 | + <div id="sidebar"> | |
| 23 | + <span class="current">Welcome</span><br> | |
| 24 | + <span class="inactive">Current Installation</span><br> | |
| 25 | + <span class="inactive">Database Upgrade</span><br> | |
| 26 | + <span class="inactive">Complete</span><br></div> | |
| 27 | + | |
| 28 | + <div id="content"> | |
| 29 | + <div id="content_container"> | |
| 30 | + <form action="index.php?step_name=welcome" method="post"> | |
| 31 | + <div id="step_content" class="step"> | |
| 32 | + <p class="title">Welcome to the KnowledgeTree Upgrade Wizard</p> | |
| 33 | + <?php if(isset($error)) { | |
| 34 | + echo "<span class='error'>".$error."</span>"; | |
| 35 | + ?> | |
| 36 | + <?php | |
| 37 | + } | |
| 38 | + ?> | |
| 39 | + <?php | |
| 40 | + if(isset($errors)) { | |
| 41 | + if($errors){ | |
| 42 | + echo '<div class="error">'; | |
| 43 | + foreach ($errors as $msg){ | |
| 44 | + echo $msg . "<br />"; | |
| 45 | + ?> | |
| 46 | + <a href="javascript:this.location.reload();" class="refresh">Refresh</a> | |
| 47 | + <?php | |
| 48 | + } | |
| 49 | + echo '</div>'; | |
| 50 | + } | |
| 51 | + } | |
| 52 | + ?> | |
| 53 | + </div> | |
| 54 | + </form> | |
| 55 | + </div> | |
| 56 | + </div> | |
| 57 | + </div> | |
| 58 | + <div class="clearing"> </div> | |
| 59 | + </div> | |
| 60 | + | |
| 61 | + <div id="footer"> | |
| 62 | + | |
| 63 | + <img width="105" height="23" align="right" src="resources/graphics/dame/powered-by-kt.png" style="padding: 5px;"/> | |
| 64 | + </div> | |
| 65 | + </div> | |
| 66 | + </body> | |
| 67 | +</html> | |
| 68 | +<script> | |
| 69 | + var w = new wizard(); | |
| 70 | +</script> | |
| 0 | 71 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/errors.tpl
0 → 100644
| 1 | +<p class="title">Welcome to the KnowledgeTree Database Upgrade Wizard</p> | |
| 2 | + | |
| 3 | +<div style="width: 800px;"> | |
| 4 | +<?php if(isset($error)) echo $error; ?> | |
| 5 | +<?php | |
| 6 | +if($errors){ | |
| 7 | + echo '<div class="error">'; | |
| 8 | + foreach ($errors as $msg){ | |
| 9 | + echo $msg . "<br />\n"; | |
| 10 | + } | |
| 11 | + echo '</div>'; | |
| 12 | +} | |
| 13 | +?> | |
| 14 | +</div> | |
| 0 | 15 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/installation.tpl
0 → 100644
| 1 | +<form action="index.php?step_name=installation" method="post"> | |
| 2 | + <p class="title">Current Installation</p> | |
| 3 | + <div id="step_content" class="step"> | |
| 4 | + <p class="empty_space"> | |
| 5 | + <?php // set_state(1); ?> | |
| 6 | + <p class="empty_space"> If you have just updated | |
| 7 | + your KnowledgeTree code base, you will need to complete the upgrade process in order to ensure your system is fully operational with the new version. | |
| 8 | + <p class="empty_space"> | |
| 9 | + You will not be able to log into KnowledgeTree until your the database upgrade process is completed. | |
| 10 | + </p> | |
| 11 | + <p class="empty_space"> | |
| 12 | + <font color="#ffa500">!!NB!! You are advised to backup the database before attempting the upgrade. !!NB!!</font> | |
| 13 | + </p> | |
| 14 | + <p class="empty_space"></p> | |
| 15 | + If you have already done this, you may skip this step and can continue directly to the upgrade. | |
| 16 | + </div> | |
| 17 | + <input type="submit" name="Previous" value="Cancel" class="button_previous"/> | |
| 18 | + <!-- NOTE class button_next requires reverse order to the desired display order, go figure :) --> | |
| 19 | + <input type="submit" name="Upgrade" value="Upgrade" class="button_next"/> | |
| 20 | + <input type="submit" name="Restore" value="Restore Database" class="button_next"/> | |
| 21 | + <input type="submit" name="Next" value="Backup Now" class="button_next"/> | |
| 22 | +</form> | |
| 23 | +<script type="text/javascript"> | |
| 24 | + $("#location").focus(); | |
| 25 | +</script> | |
| 0 | 26 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/restore.tpl
0 → 100644
| 1 | +<form action="index.php?step_name=restore" method="post"> | |
| 2 | + <p class="title">Confirm Restore</p> | |
| 3 | + | |
| 4 | + <?php | |
| 5 | + if($errors || $warnings){ | |
| 6 | + echo '<div>' | |
| 7 | + . '<a href="http://wiki.knowledgetree.com/Web_Based_Upgrader#Post_Upgrade" target="_blank">' | |
| 8 | + . 'Click Here for help on overcoming backup issues</a></div><br/>'; | |
| 9 | + } | |
| 10 | + ?> | |
| 11 | + <div id="step_content_complete" class="step"> | |
| 12 | + <br/><br/> | |
| 13 | + <div> | |
| 14 | + <?php | |
| 15 | +if ($dir != '') { | |
| 16 | +?> | |
| 17 | +<P> | |
| 18 | +<P> | |
| 19 | +Manually, you would do the following to restore the backup: | |
| 20 | +<P> | |
| 21 | +<table bgcolor="lightgrey"> | |
| 22 | +<tr> | |
| 23 | +<td> | |
| 24 | +<nobr>cd "<?php echo $dir;?>"</nobr> | |
| 25 | +<br/> | |
| 26 | +<?php | |
| 27 | + } | |
| 28 | + else | |
| 29 | + { | |
| 30 | + ?> | |
| 31 | + The mysql backup utility could not be found automatically. Either do a manual restore, or edit the config.ini and update the backup/mysql Directory entry. | |
| 32 | +<P> | |
| 33 | +You can continue to do the restore manually using the following command(s): | |
| 34 | +<P> | |
| 35 | +<table bgcolor="lightgrey"> | |
| 36 | +<tr> | |
| 37 | +<td><?php | |
| 38 | + } | |
| 39 | +?> | |
| 40 | +<nobr><?php echo $display;?></nobr> | |
| 41 | +</td> | |
| 42 | +</tr> | |
| 43 | +</table> | |
| 44 | +<P> | |
| 45 | + <?php if($silent) { ?> | |
| 46 | + </div> | |
| 47 | + <?php } ?> | |
| 48 | + <?php | |
| 49 | +if ($dir != '') | |
| 50 | +{ | |
| 51 | +?> | |
| 52 | +Press <i>Next</i> to attempt the command(s) above. | |
| 53 | + | |
| 54 | +<P> | |
| 55 | +<?php | |
| 56 | +} | |
| 57 | + ?> | |
| 58 | + </div> | |
| 59 | + | |
| 60 | + | |
| 61 | + <input type="submit" name="Previous" value="Back" class="button_previous"> | |
| 62 | + <input type="submit" name="Next" value="Next" class="button_next"> | |
| 63 | + </div> | |
| 64 | +</form> | |
| 0 | 65 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/welcome.tpl
0 → 100644
| 1 | +<form action="index.php?step_name=welcome" method="post"> | |
| 2 | + <p class="title">Welcome to the KnowledgeTree Database Upgrade Wizard</p> | |
| 3 | + | |
| 4 | + <div id="step_content" class="step"> | |
| 5 | + <br/> | |
| 6 | + <br/> | |
| 7 | + <p class="empty_space"> The database upgrade wizard completes the upgrade process on an existing KnowledgeTree installation. It applies | |
| 8 | + any upgrades to the database that may be required. </p> | |
| 9 | + <p class="empty_space"> Only administrator users may access the upgrade wizard. </p> | |
| 10 | + <div class="demo"> | |
| 11 | + <table> | |
| 12 | + <tr><td>Username<td><input name=username> | |
| 13 | + <tr><td>Password<td><input name=password type="password"> | |
| 14 | + </table> | |
| 15 | + </div> | |
| 16 | + </div> | |
| 17 | + <input type="submit" name="Next" value="Next" class="button_next"/> | |
| 18 | +</form> | |
| 0 | 19 | \ No newline at end of file | ... | ... |
setup/upgrade/templates/wizard.tpl
0 → 100644
| 1 | +<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> | |
| 2 | +<html> | |
| 3 | + <head> | |
| 4 | + <title>KnowledgeTree Upgrader</title> | |
| 5 | + <script type="text/javascript" src="resources/jquery.js"></script> | |
| 6 | + <script type="text/javascript" src="resources/wizard.js" ></script> | |
| 7 | + <link rel="stylesheet" type="text/css" href="resources/wizard.css" /> | |
| 8 | + | |
| 9 | + </head> | |
| 10 | + <body onload="w.doFormCheck();"> | |
| 11 | + <div id="outer-wrapper"> | |
| 12 | + <div id="header"> | |
| 13 | + <div id="logo"><img src="resources/graphics/dame/upgrader-header_logo.png"/></div> | |
| 14 | + <div id="upgrade_details"> | |
| 15 | + <span style="font-size:120%;"> <?php echo $vars['upgrade_version']; ?> </span> | |
| 16 | + <span style="font-size:120%;"><?php echo $vars['upgrade_type']; ?></span> | |
| 17 | + </div> | |
| 18 | + </div> | |
| 19 | + <div id="wrapper"> | |
| 20 | + <div id="container"> | |
| 21 | + <div id="sidebar"> | |
| 22 | + <?php echo $vars['left']; ?> | |
| 23 | + </div> | |
| 24 | + <div id="content"> | |
| 25 | + <div id="content_container"> | |
| 26 | + <?php echo $content; ?> | |
| 27 | + </div> | |
| 28 | + </div> | |
| 29 | + </div> | |
| 30 | + <div class="clearing"> </div> | |
| 31 | + </div> | |
| 32 | + | |
| 33 | + <div id="footer"> | |
| 34 | + <img width="105" height="23" align="right" src="resources/graphics/dame/powered-by-kt.png" style="padding: 5px;"/> | |
| 35 | + </div> | |
| 36 | + </div> | |
| 37 | + </body> | |
| 38 | +</html> | |
| 39 | +<script> | |
| 40 | + var w = new wizard(); | |
| 41 | +</script> | |
| 0 | 42 | \ No newline at end of file | ... | ... |
setup/upgrade/upgrade
0 → 100644
setup/upgrade/upgradeIni.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | + * $Id:$ | |
| 4 | + * | |
| 5 | + * KnowledgeTree Community Edition | |
| 6 | + * Document Management Made Simple | |
| 7 | + * Copyright (C) 2008, 2009 KnowledgeTree Inc. | |
| 8 | + * Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | + * | |
| 10 | + * This program is free software; you can redistribute it and/or modify it under | |
| 11 | + * the terms of the GNU General Public License version 3 as published by the | |
| 12 | + * Free Software Foundation. | |
| 13 | + * | |
| 14 | + * This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | + * details. | |
| 18 | + * | |
| 19 | + * You should have received a copy of the GNU General Public License | |
| 20 | + * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | + * | |
| 22 | + * You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | + * California 94120-7775, or email info@knowledgetree.com. | |
| 24 | + * | |
| 25 | + * The interactive user interfaces in modified source and object code versions | |
| 26 | + * of this program must display Appropriate Legal Notices, as required under | |
| 27 | + * Section 5 of the GNU General Public License version 3. | |
| 28 | + * | |
| 29 | + * In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | + * these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | + * KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | + * logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | + * must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | + * copyright notice. | |
| 35 | + * Contributor( s): ______________________________________ | |
| 36 | + * | |
| 37 | + */ | |
| 38 | + | |
| 39 | +class UpgradeIni { | |
| 40 | + | |
| 41 | + private $cleanArray = array(); | |
| 42 | + private $iniFile = ''; | |
| 43 | + private $lineNum = 0; | |
| 44 | + private $exists = ''; | |
| 45 | + | |
| 46 | + function __construct($iniFile = '../../config.ini') { | |
| 47 | + $this->iniFile = $iniFile; | |
| 48 | + $this->backupIni($iniFile); | |
| 49 | + $this->read($iniFile); | |
| 50 | + } | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Create a backup with the date as an extension in the same location as the original config.ini | |
| 54 | + * | |
| 55 | + * @param string $iniFile | |
| 56 | + * @return boolean | |
| 57 | + */ | |
| 58 | + function backupIni($iniFile) | |
| 59 | + { | |
| 60 | + $content = file_get_contents($iniFile); | |
| 61 | + if ($content === false) | |
| 62 | + { | |
| 63 | + return false; | |
| 64 | + } | |
| 65 | + $date = date('YmdHis'); | |
| 66 | + | |
| 67 | + $backupFile = $iniFile . '.' .$date; | |
| 68 | + if (is_writeable($backupFile)) { | |
| 69 | + file_put_contents($backupFile, $content); | |
| 70 | + } | |
| 71 | + } | |
| 72 | + | |
| 73 | + function read($iniFile) { | |
| 74 | + | |
| 75 | + $iniArray = file($iniFile); | |
| 76 | + $section = ''; | |
| 77 | + foreach($iniArray as $iniLine) { | |
| 78 | + $this->lineNum++; | |
| 79 | + $iniLine = trim($iniLine); | |
| 80 | + $firstChar = substr($iniLine, 0, 1); | |
| 81 | + if($firstChar == ';') { | |
| 82 | + if($section == ''){ | |
| 83 | + $this->cleanArray['_comment_'.$this->lineNum]=$iniLine; | |
| 84 | + }else { | |
| 85 | + $this->cleanArray[$section]['_comment_'.$this->lineNum]=$iniLine; | |
| 86 | + } | |
| 87 | + continue; | |
| 88 | + } | |
| 89 | + if($iniLine == '') { | |
| 90 | + if($section == ''){ | |
| 91 | + $this->cleanArray['_blankline_'.$this->lineNum]=''; | |
| 92 | + }else { | |
| 93 | + $this->cleanArray[$section]['_blankline_'.$this->lineNum]=''; | |
| 94 | + } | |
| 95 | + continue; | |
| 96 | + } | |
| 97 | + | |
| 98 | + if ($firstChar == '[' && substr($iniLine, -1, 1) == ']') { | |
| 99 | + $section = substr($iniLine, 1, -1); | |
| 100 | + $this->sections[] = $section; | |
| 101 | + } else { | |
| 102 | + $equalsPos = strpos($iniLine, '='); | |
| 103 | + if ($equalsPos > 0 && $equalsPos != sizeof($iniLine)) { | |
| 104 | + $key = trim(substr($iniLine, 0, $equalsPos)); | |
| 105 | + $value = trim(substr($iniLine, $equalsPos+1)); | |
| 106 | + if (substr($value, 1, 1) == '"' && substr( $value, -1, 1) == '"') { | |
| 107 | + $value = substr($value, 1, -1); | |
| 108 | + } | |
| 109 | + $this->cleanArray[$section][$key] = stripcslashes($value); | |
| 110 | + } else { | |
| 111 | + $this->cleanArray[$section][trim($iniLine)]=''; | |
| 112 | + } | |
| 113 | + } | |
| 114 | + } | |
| 115 | + return $this->cleanArray; | |
| 116 | + } | |
| 117 | + | |
| 118 | + function write($iniFile = "") { | |
| 119 | + | |
| 120 | + if(empty($iniFile)) { | |
| 121 | + $iniFile = $this->iniFile; | |
| 122 | + } | |
| 123 | + if (!is_writeable($iniFile)) { | |
| 124 | + return; | |
| 125 | + } | |
| 126 | + | |
| 127 | + $fileHandle = fopen($iniFile, 'wb'); | |
| 128 | + foreach ($this->cleanArray as $section => $items) { | |
| 129 | + if (substr($section, 0, strlen('_blankline_')) === '_blankline_' ) { | |
| 130 | + fwrite ($fileHandle, "\r\n"); | |
| 131 | + continue; | |
| 132 | + } | |
| 133 | + if (substr($section, 0, strlen('_comment_')) === '_comment_' ) { | |
| 134 | + fwrite ($fileHandle, "$items\r\n"); | |
| 135 | + continue; | |
| 136 | + } | |
| 137 | + fwrite ($fileHandle, "[".$section."]\r\n"); | |
| 138 | + foreach ($items as $key => $value) { | |
| 139 | + if (substr($key, 0, strlen('_blankline_')) === '_blankline_' ) { | |
| 140 | + fwrite ($fileHandle, "\r\n"); | |
| 141 | + continue; | |
| 142 | + } | |
| 143 | + if (substr($key, 0, strlen('_comment_')) === '_comment_' ) { | |
| 144 | + fwrite ($fileHandle, "$value\r\n"); | |
| 145 | + continue; | |
| 146 | + } | |
| 147 | + | |
| 148 | + $value = addcslashes($value,''); | |
| 149 | + //fwrite ($fileHandle, $key.' = "'.$value."\"\r\n"); | |
| 150 | + fwrite ($fileHandle, $key.' = '.$value."\r\n"); | |
| 151 | + } | |
| 152 | + } | |
| 153 | + fclose($fileHandle); | |
| 154 | + } | |
| 155 | + | |
| 156 | + function itemExists($checkSection, $checkItem) { | |
| 157 | + | |
| 158 | + $this->exists = ''; | |
| 159 | + foreach($this->cleanArray as $section => $items) { | |
| 160 | + if($section == $checkSection) { | |
| 161 | + $this->exists = 'section'; | |
| 162 | + foreach ($items as $key => $value) { | |
| 163 | + if($key == $checkItem) { | |
| 164 | + return true; | |
| 165 | + } | |
| 166 | + } | |
| 167 | + } | |
| 168 | + } | |
| 169 | + return false; | |
| 170 | + } | |
| 171 | + | |
| 172 | + function addItem($addSection, $addItem, $value, $itemComment = '', $sectionComment = '') { | |
| 173 | + | |
| 174 | + if($this->itemExists($addSection, $addItem)) { | |
| 175 | + $this->delItem($addSection, $addItem); | |
| 176 | + } | |
| 177 | + | |
| 178 | + if($this->exists != 'section') { | |
| 179 | + $this->cleanArray['_blankline_'.$this->lineNum++]=''; | |
| 180 | + if(!empty($sectionComment)) $this->cleanArray['_comment_'.$this->lineNum++] = '; '.$sectionComment; | |
| 181 | + } | |
| 182 | + if(!empty($itemComment)) { | |
| 183 | + $this->cleanArray[$addSection]['_comment_'.$this->lineNum++] = '; '.$itemComment; | |
| 184 | + } | |
| 185 | + $this->cleanArray[$addSection][$addItem] = stripcslashes($value); | |
| 186 | + return true; | |
| 187 | + } | |
| 188 | + | |
| 189 | + function updateItem($addSection, $addItem, $value) { | |
| 190 | + | |
| 191 | + $this->cleanArray[$addSection][$addItem] = stripcslashes($value); | |
| 192 | + return true; | |
| 193 | + } | |
| 194 | + | |
| 195 | + function delItem($delSection, $delItem) { | |
| 196 | + | |
| 197 | + if(!$this->itemExists($delSection, $delItem)) return false; | |
| 198 | + | |
| 199 | + unset($this->cleanArray[$delSection][$delItem]); | |
| 200 | + return true; | |
| 201 | + } | |
| 202 | + | |
| 203 | + function delSection($delSection) { | |
| 204 | + | |
| 205 | + unset($this->cleanArray[$delSection]); | |
| 206 | + return true; | |
| 207 | + } | |
| 208 | + | |
| 209 | + // Return file line by line | |
| 210 | + public function getFileByLine() { | |
| 211 | + $data = $this->read($this->iniFile); | |
| 212 | + return $data['']; | |
| 213 | + } | |
| 214 | + | |
| 215 | + public function getSection($section) { | |
| 216 | + if (isset($this->cleanArray[$section])) { | |
| 217 | + return $this->cleanArray[$section]; | |
| 218 | + } | |
| 219 | + | |
| 220 | + return false; | |
| 221 | + } | |
| 222 | +} | |
| 223 | +?> | ... | ... |
setup/upgrade/upgradeSession.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Session Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +class UpgradeSession | |
| 43 | +{ | |
| 44 | + private $salt = 'upgrade'; | |
| 45 | + /** | |
| 46 | + * Constructs session object | |
| 47 | + * | |
| 48 | + * @author KnowledgeTree Team | |
| 49 | + * @access public | |
| 50 | + * @param none | |
| 51 | + */ | |
| 52 | + public function __construct() { | |
| 53 | + $this->startSession(); | |
| 54 | + } | |
| 55 | + | |
| 56 | + /** | |
| 57 | + * Starts a session if one does not exist | |
| 58 | + * | |
| 59 | + * @author KnowledgeTree Team | |
| 60 | + * @param none | |
| 61 | + * @access public | |
| 62 | + * @return void | |
| 63 | + */ | |
| 64 | + public function startSession() { | |
| 65 | + if(!isset($_SESSION[$this->salt]['ready'])) { | |
| 66 | + session_start(); | |
| 67 | + $_SESSION[$this->salt] ['ready'] = TRUE; | |
| 68 | + } | |
| 69 | + } | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * Sets a value key pair in session | |
| 73 | + * | |
| 74 | + * @author KnowledgeTree Team | |
| 75 | + * @param string $fld | |
| 76 | + * @param string $val | |
| 77 | + * @access public | |
| 78 | + * @return void | |
| 79 | + */ | |
| 80 | + public function set($fld, $val) { | |
| 81 | + $this->startSession(); | |
| 82 | + $_SESSION[$this->salt] [$fld] = $val; | |
| 83 | + } | |
| 84 | + | |
| 85 | + /** | |
| 86 | + * Sets a value key pair in a class in session | |
| 87 | + * | |
| 88 | + * @author KnowledgeTree Team | |
| 89 | + * @param string $class | |
| 90 | + * @param string $fld | |
| 91 | + * @param string $val | |
| 92 | + * @access public | |
| 93 | + * @return void | |
| 94 | + */ | |
| 95 | + public function setClass($class , $k, $v) { | |
| 96 | + $this->startSession(); | |
| 97 | + $classArray = $this->get($class); | |
| 98 | + if(isset($classArray[$k])) { | |
| 99 | + $classArray[$k] = $v; | |
| 100 | + } else { | |
| 101 | + $classArray[$k] = $v; | |
| 102 | + } | |
| 103 | + $_SESSION[$this->salt] [ $class] = $classArray; | |
| 104 | + } | |
| 105 | + | |
| 106 | + /** | |
| 107 | + * Sets a error value key pair in a class in session | |
| 108 | + * | |
| 109 | + * @author KnowledgeTree Team | |
| 110 | + * @param string $class | |
| 111 | + * @param string $fld | |
| 112 | + * @param string $val | |
| 113 | + * @access public | |
| 114 | + * @return void | |
| 115 | + */ | |
| 116 | + public function setClassError($class, $k, $v) { | |
| 117 | + $this->startSession(); | |
| 118 | + $classArray = $this->get($class); | |
| 119 | + if(isset($classArray[$k])) { | |
| 120 | + $classArray[$k] = $v; | |
| 121 | + } else { | |
| 122 | + $classArray[$k] = $v; | |
| 123 | + } | |
| 124 | + $_SESSION[$this->salt] [ $class] = $classArray; | |
| 125 | + } | |
| 126 | + | |
| 127 | + /** | |
| 128 | + * Clear error values in a class session | |
| 129 | + * | |
| 130 | + * @author KnowledgeTree Team | |
| 131 | + * @param string $class | |
| 132 | + * @param string $fld | |
| 133 | + * @param string $val | |
| 134 | + * @access public | |
| 135 | + * @return void | |
| 136 | + */ | |
| 137 | + public function clearErrors($class) { | |
| 138 | + $classArray = $this->get($class); | |
| 139 | + unset($classArray['errors']); | |
| 140 | + $_SESSION[$this->salt] [ $class] = $classArray; | |
| 141 | + } | |
| 142 | + | |
| 143 | + /** | |
| 144 | + * Unset a value in session | |
| 145 | + * | |
| 146 | + * @author KnowledgeTree Team | |
| 147 | + * @param string $fld | |
| 148 | + * @access public | |
| 149 | + * @return void | |
| 150 | + */ | |
| 151 | + public function un_set($fld) { | |
| 152 | + $this->startSession(); | |
| 153 | + unset($_SESSION[$this->salt] [$fld]); | |
| 154 | + } | |
| 155 | + | |
| 156 | + /** | |
| 157 | + * Unset a class value in session | |
| 158 | + * | |
| 159 | + * @author KnowledgeTree Team | |
| 160 | + * @param string $class | |
| 161 | + * @access public | |
| 162 | + * @return void | |
| 163 | + */ | |
| 164 | + public function un_setClass($class) { | |
| 165 | + $this->startSession(); | |
| 166 | + if(isset($_SESSION[$this->salt] [$class])) | |
| 167 | + unset($_SESSION[$this->salt] [$class]); | |
| 168 | + } | |
| 169 | + | |
| 170 | + /** | |
| 171 | + * Destroy the session | |
| 172 | + * | |
| 173 | + * @author KnowledgeTree Team | |
| 174 | + * @param none | |
| 175 | + * @access public | |
| 176 | + * @return void | |
| 177 | + */ | |
| 178 | + public function destroy() { | |
| 179 | + $this->startSession(); | |
| 180 | + unset($_SESSION[$this->salt]); | |
| 181 | + session_destroy(); | |
| 182 | + } | |
| 183 | + | |
| 184 | + /** | |
| 185 | + * Get a session value | |
| 186 | + * | |
| 187 | + * @author KnowledgeTree Team | |
| 188 | + * @param string $fld | |
| 189 | + * @access public | |
| 190 | + * @return string | |
| 191 | + */ | |
| 192 | + public function get($fld) { | |
| 193 | + $this->startSession(); | |
| 194 | + if(isset($_SESSION[$this->salt] [$fld])) | |
| 195 | + return $_SESSION[$this->salt] [$fld]; | |
| 196 | + return false; | |
| 197 | + } | |
| 198 | + | |
| 199 | + /** | |
| 200 | + * Check if a field exists in session | |
| 201 | + * | |
| 202 | + * @author KnowledgeTree Team | |
| 203 | + * @param string $fld | |
| 204 | + * @access public | |
| 205 | + * @return string | |
| 206 | + */ | |
| 207 | + public function is_set($fld) { | |
| 208 | + $this->startSession(); | |
| 209 | + return isset($_SESSION[$this->salt] [$fld]); | |
| 210 | + } | |
| 211 | + | |
| 212 | + /** | |
| 213 | + * Return a class from session | |
| 214 | + * | |
| 215 | + * @author KnowledgeTree Team | |
| 216 | + * @param string $fld | |
| 217 | + * @access public | |
| 218 | + * @return string | |
| 219 | + */ | |
| 220 | + public function getClass($class) { | |
| 221 | + return $_SESSION[$this->salt][$class]; | |
| 222 | + } | |
| 223 | +} | |
| 224 | +?> | |
| 0 | 225 | \ No newline at end of file | ... | ... |
setup/upgrade/upgradeUtil.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrader Utilities Library | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright(C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software(Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +class UpgradeUtil { | |
| 43 | + /** | |
| 44 | + * Constructs upgradeation object | |
| 45 | + * | |
| 46 | + * @author KnowledgeTree Team | |
| 47 | + * @access public | |
| 48 | + */ | |
| 49 | + public function __construct() { | |
| 50 | + } | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Check if system needs to be upgraded | |
| 54 | + * | |
| 55 | + * @author KnowledgeTree Team | |
| 56 | + * @access public | |
| 57 | + * @param none | |
| 58 | + * @return boolean | |
| 59 | + */ | |
| 60 | + public function isSystemUpgradeed() { | |
| 61 | + if (file_exists(dirname(__FILE__)."/upgrade")) { | |
| 62 | + | |
| 63 | + return true; | |
| 64 | + } | |
| 65 | + | |
| 66 | + return false; | |
| 67 | + } | |
| 68 | + | |
| 69 | + public function error($error) { | |
| 70 | + $template_vars['error'] = $error; | |
| 71 | + $file = "templates/error.tpl"; | |
| 72 | + if (!file_exists($file)) { | |
| 73 | + return false; | |
| 74 | + } | |
| 75 | + extract($template_vars); // Extract the vars to local namespace | |
| 76 | + ob_start(); | |
| 77 | + include($file); | |
| 78 | + $contents = ob_get_contents(); | |
| 79 | + ob_end_clean(); | |
| 80 | + echo $contents; | |
| 81 | + } | |
| 82 | + | |
| 83 | + /** | |
| 84 | + * Check if system needs to be upgraded | |
| 85 | + * | |
| 86 | + * @author KnowledgeTree Team | |
| 87 | + * @access public | |
| 88 | + * @param none | |
| 89 | + * @return mixed | |
| 90 | + */ | |
| 91 | + public function checkStructurePermissions() { | |
| 92 | + // Check if Wizard Directory is writable | |
| 93 | + if(!$this->_checkPermission(UPGRADE_DIR)) { | |
| 94 | + return 'wizard'; | |
| 95 | + } | |
| 96 | + | |
| 97 | + return true; | |
| 98 | + } | |
| 99 | + | |
| 100 | + | |
| 101 | + /** | |
| 102 | + * Redirect | |
| 103 | + * | |
| 104 | + * This function redirects the client. This is done by issuing | |
| 105 | + * a "Location" header and exiting if wanted. If you set $rfc2616 to true | |
| 106 | + * HTTP will output a hypertext note with the location of the redirect. | |
| 107 | + * | |
| 108 | + * @static | |
| 109 | + * @access public | |
| 110 | + * have already been sent. | |
| 111 | + * @param string $url URL where the redirect should go to. | |
| 112 | + * @param bool $exit Whether to exit immediately after redirection. | |
| 113 | + * @param bool $rfc2616 Wheter to output a hypertext note where we're | |
| 114 | + * redirecting to (Redirecting to <a href="...">...</a>.) | |
| 115 | + * @return mixed Returns true on succes (or exits) or false if headers | |
| 116 | + */ | |
| 117 | + public function redirect($url, $exit = true, $rfc2616 = false) | |
| 118 | + { | |
| 119 | + if (headers_sent()) { | |
| 120 | + return false; | |
| 121 | + } | |
| 122 | + | |
| 123 | + $url = $this->absoluteURI($url); | |
| 124 | + header('Location: '. $url); | |
| 125 | + | |
| 126 | + if ( $rfc2616 && isset($_SERVER['REQUEST_METHOD']) && | |
| 127 | + $_SERVER['REQUEST_METHOD'] != 'HEAD') { | |
| 128 | + printf('Redirecting to: <a href="%s">%s</a>.', $url, $url); | |
| 129 | + } | |
| 130 | + if ($exit) { | |
| 131 | + exit; | |
| 132 | + } | |
| 133 | + return true; | |
| 134 | + } | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Absolute URI | |
| 138 | + * | |
| 139 | + * This function returns the absolute URI for the partial URL passed. | |
| 140 | + * The current scheme (HTTP/HTTPS), host server, port, current script | |
| 141 | + * location are used if necessary to resolve any relative URLs. | |
| 142 | + * | |
| 143 | + * Offsets potentially created by PATH_INFO are taken care of to resolve | |
| 144 | + * relative URLs to the current script. | |
| 145 | + * | |
| 146 | + * You can choose a new protocol while resolving the URI. This is | |
| 147 | + * particularly useful when redirecting a web browser using relative URIs | |
| 148 | + * and to switch from HTTP to HTTPS, or vice-versa, at the same time. | |
| 149 | + * | |
| 150 | + * @author Philippe Jausions <Philippe.Jausions@11abacus.com> | |
| 151 | + * @static | |
| 152 | + * @access public | |
| 153 | + * @param string $url Absolute or relative URI the redirect should go to. | |
| 154 | + * @param string $protocol Protocol to use when redirecting URIs. | |
| 155 | + * @param integer $port A new port number. | |
| 156 | + * @return string The absolute URI. | |
| 157 | + */ | |
| 158 | + public function absoluteURI($url = null, $protocol = null, $port = null) | |
| 159 | + { | |
| 160 | + // filter CR/LF | |
| 161 | + $url = str_replace(array("\r", "\n"), ' ', $url); | |
| 162 | + | |
| 163 | + // Mess around with already absolute URIs | |
| 164 | + if (preg_match('!^([a-z0-9]+)://!i', $url)) { | |
| 165 | + if (empty($protocol) && empty($port)) { | |
| 166 | + return $url; | |
| 167 | + } | |
| 168 | + if (!empty($protocol)) { | |
| 169 | + $url = $protocol .':'. end($array = explode(':', $url, 2)); | |
| 170 | + } | |
| 171 | + if (!empty($port)) { | |
| 172 | + $url = preg_replace('!^(([a-z0-9]+)://[^/:]+)(:[\d]+)?!i', | |
| 173 | + '\1:'. $port, $url); | |
| 174 | + } | |
| 175 | + return $url; | |
| 176 | + } | |
| 177 | + | |
| 178 | + $host = 'localhost'; | |
| 179 | + if (!empty($_SERVER['HTTP_HOST'])) { | |
| 180 | + list($host) = explode(':', $_SERVER['HTTP_HOST']); | |
| 181 | + } elseif (!empty($_SERVER['SERVER_NAME'])) { | |
| 182 | + list($host) = explode(':', $_SERVER['SERVER_NAME']); | |
| 183 | + } | |
| 184 | + | |
| 185 | + if (empty($protocol)) { | |
| 186 | + if (isset($_SERVER['HTTPS']) && !strcasecmp($_SERVER['HTTPS'], 'on')) { | |
| 187 | + $protocol = 'https'; | |
| 188 | + } else { | |
| 189 | + $protocol = 'http'; | |
| 190 | + } | |
| 191 | + if (!isset($port) || $port != intval($port)) { | |
| 192 | + $port = isset($_SERVER['SERVER_PORT']) ? $_SERVER['SERVER_PORT'] : 80; | |
| 193 | + } | |
| 194 | + } | |
| 195 | + | |
| 196 | + if ($protocol == 'http' && $port == 80) { | |
| 197 | + unset($port); | |
| 198 | + } | |
| 199 | + if ($protocol == 'https' && $port == 443) { | |
| 200 | + unset($port); | |
| 201 | + } | |
| 202 | + | |
| 203 | + $server = $protocol .'://'. $host . (isset($port) ? ':'. $port : ''); | |
| 204 | + | |
| 205 | + if (!strlen($url)) { | |
| 206 | + $url = isset($_SERVER['REQUEST_URI']) ? | |
| 207 | + $_SERVER['REQUEST_URI'] : $_SERVER['PHP_SELF']; | |
| 208 | + } | |
| 209 | + | |
| 210 | + if ($url{0} == '/') { | |
| 211 | + return $server . $url; | |
| 212 | + } | |
| 213 | + | |
| 214 | + // Check for PATH_INFO | |
| 215 | + if (isset($_SERVER['PATH_INFO']) && strlen($_SERVER['PATH_INFO']) && | |
| 216 | + $_SERVER['PHP_SELF'] != $_SERVER['PATH_INFO']) { | |
| 217 | + $path = dirname(substr($_SERVER['PHP_SELF'], 0, -strlen($_SERVER['PATH_INFO']))); | |
| 218 | + } else { | |
| 219 | + $path = dirname($_SERVER['PHP_SELF']); | |
| 220 | + } | |
| 221 | + | |
| 222 | + if (substr($path = strtr($path, '\\', '/'), -1) != '/') { | |
| 223 | + $path .= '/'; | |
| 224 | + } | |
| 225 | + | |
| 226 | + return $server . $path . $url; | |
| 227 | + } | |
| 228 | + | |
| 229 | + /** | |
| 230 | + * Check whether a given directory / file path exists and is writable | |
| 231 | + * | |
| 232 | + * @author KnowledgeTree Team | |
| 233 | + * @access private | |
| 234 | + * @param string $dir The directory / file to check | |
| 235 | + * @param boolean $create Whether to create the directory if it doesn't exist | |
| 236 | + * @return array The message and css class to use | |
| 237 | + */ | |
| 238 | + private function _checkPermission($dir) | |
| 239 | + { | |
| 240 | + if(is_readable($dir) && is_writable($dir)) { | |
| 241 | + return true; | |
| 242 | + } else { | |
| 243 | + return false; | |
| 244 | + } | |
| 245 | + | |
| 246 | + } | |
| 247 | + | |
| 248 | + /** | |
| 249 | + * Check whether a given directory / file path exists and is writable | |
| 250 | + * | |
| 251 | + * @author KnowledgeTree Team | |
| 252 | + * @access private | |
| 253 | + * @param string $dir The directory / file to check | |
| 254 | + * @param boolean $create Whether to create the directory if it doesn't exist | |
| 255 | + * @return array The message and css class to use | |
| 256 | + */ | |
| 257 | + public function checkPermission($dir, $create=false) | |
| 258 | + { | |
| 259 | + $exist = 'Directory doesn\'t exist'; | |
| 260 | + $write = 'Directory not writable'; | |
| 261 | + $ret = array('class' => 'cross'); | |
| 262 | + | |
| 263 | + if(!file_exists($dir)){ | |
| 264 | + if($create === false){ | |
| 265 | + $this->done = false; | |
| 266 | + $ret['msg'] = $exist; | |
| 267 | + return $ret; | |
| 268 | + } | |
| 269 | + $par_dir = dirname($dir); | |
| 270 | + if(!file_exists($par_dir)){ | |
| 271 | + $this->done = false; | |
| 272 | + $ret['msg'] = $exist; | |
| 273 | + return $ret; | |
| 274 | + } | |
| 275 | + if(!is_writable($par_dir)){ | |
| 276 | + $this->done = false; | |
| 277 | + $ret['msg'] = $exist; | |
| 278 | + return $ret; | |
| 279 | + } | |
| 280 | + mkdir($dir, '0755'); | |
| 281 | + } | |
| 282 | + | |
| 283 | + if(is_writable($dir)){ | |
| 284 | + $ret['class'] = 'tick'; | |
| 285 | + | |
| 286 | + return $ret; | |
| 287 | + } | |
| 288 | + | |
| 289 | + $this->done = false; | |
| 290 | + $ret['msg'] = $write; | |
| 291 | + return $ret; | |
| 292 | + } | |
| 293 | + | |
| 294 | + /** | |
| 295 | + * Change permissions on a directory helper | |
| 296 | + * | |
| 297 | + * @author KnowledgeTree Team | |
| 298 | + * @access public | |
| 299 | + * @param string $folderPath The directory / file to check | |
| 300 | + * @return boolean | |
| 301 | + */ | |
| 302 | + public function canChangePermissions($folderPath) { | |
| 303 | + return $this->_chmodRecursive($folderPath, 0755); | |
| 304 | + } | |
| 305 | + | |
| 306 | + /** | |
| 307 | + * Change permissions on a directory (recursive) | |
| 308 | + * | |
| 309 | + * @author KnowledgeTree Team | |
| 310 | + * @access private | |
| 311 | + * @param string $folderPath The directory / file to check | |
| 312 | + * @param boolean $create Whether to create the directory if it doesn't exist | |
| 313 | + * @return boolean | |
| 314 | + */ | |
| 315 | + private function _chmodRecursive($path, $filemode) { | |
| 316 | + if (!is_dir($path)) | |
| 317 | + return chmod($path, $filemode); | |
| 318 | + $dh = opendir($path); | |
| 319 | + while (($file = readdir($dh)) !== false) { | |
| 320 | + if($file != '.' && $file != '..') { | |
| 321 | + $fullpath = $path.'/'.$file; | |
| 322 | + if(is_link($fullpath)) | |
| 323 | + return false; | |
| 324 | + elseif(!is_dir($fullpath)) { | |
| 325 | + $perms = substr(sprintf('%o', fileperms($fullpath)), -4); | |
| 326 | + if($perms != $filemode) | |
| 327 | + if (!chmod($fullpath, $filemode)) | |
| 328 | + return false; | |
| 329 | + } elseif(!$this->chmodRecursive($fullpath, $filemode)) | |
| 330 | + return false; | |
| 331 | + } | |
| 332 | + } | |
| 333 | + closedir($dh); | |
| 334 | + $perms = substr(sprintf('%o', fileperms($path)), -4); | |
| 335 | + if($perms != $filemode) { | |
| 336 | + if(chmod($path, $filemode)) | |
| 337 | + return true; | |
| 338 | + else | |
| 339 | + return false; | |
| 340 | + } else { | |
| 341 | + return true; | |
| 342 | + } | |
| 343 | + } | |
| 344 | + | |
| 345 | + /** | |
| 346 | + * Check if a file can be written to a folder | |
| 347 | + * | |
| 348 | + * @author KnowledgeTree Team | |
| 349 | + * @access public | |
| 350 | + * @param string $filename the path to the file to create | |
| 351 | + * @return boolean | |
| 352 | + */ | |
| 353 | + public function canWriteFile($filename) { | |
| 354 | + $fh = fopen($filename, "w+"); | |
| 355 | + if($fr = fwrite($fh, 'test') === false) { | |
| 356 | + return false; | |
| 357 | + } | |
| 358 | + | |
| 359 | + fclose($fh); | |
| 360 | + return true; | |
| 361 | + } | |
| 362 | + | |
| 363 | + /** | |
| 364 | + * Attempt using the php-java bridge | |
| 365 | + * | |
| 366 | + * @author KnowledgeTree Team | |
| 367 | + * @access public | |
| 368 | + * @param none | |
| 369 | + * @return boolean | |
| 370 | + */ | |
| 371 | + public function javaBridge() { | |
| 372 | + try { | |
| 373 | + $javaSystem = new Java('java.lang.System'); | |
| 374 | + } catch (JavaException $e) { | |
| 375 | + return false; | |
| 376 | + } | |
| 377 | + return true; | |
| 378 | + } | |
| 379 | + | |
| 380 | + /** | |
| 381 | + * Attempt java detection | |
| 382 | + * | |
| 383 | + * @author KnowledgeTree Team | |
| 384 | + * @access public | |
| 385 | + * @param none | |
| 386 | + * @return boolean | |
| 387 | + */ | |
| 388 | + public function tryJava1() { | |
| 389 | + $response = $this->pexec("java -version"); // Java Runtime Check | |
| 390 | + if(empty($response['out'])) { | |
| 391 | + return false; | |
| 392 | + } | |
| 393 | + | |
| 394 | + return 'java'; | |
| 395 | + } | |
| 396 | + | |
| 397 | + /** | |
| 398 | + * Attempt java detection | |
| 399 | + * | |
| 400 | + * @author KnowledgeTree Team | |
| 401 | + * @access public | |
| 402 | + * @param none | |
| 403 | + * @return boolean | |
| 404 | + */ | |
| 405 | + public function tryJava2() { | |
| 406 | + $response = $this->pexec("java"); // Java Runtime Check | |
| 407 | + if(empty($response['out'])) { | |
| 408 | + return false; | |
| 409 | + } | |
| 410 | + | |
| 411 | + return 'java'; | |
| 412 | + } | |
| 413 | + | |
| 414 | + /** | |
| 415 | + * Attempt java detection | |
| 416 | + * | |
| 417 | + * @author KnowledgeTree Team | |
| 418 | + * @access public | |
| 419 | + * @param none | |
| 420 | + * @return boolean | |
| 421 | + */ | |
| 422 | + public function tryJava3() { | |
| 423 | + $response = $this->pexec("whereis java"); // Java Runtime Check | |
| 424 | + if(empty($response['out'])) { | |
| 425 | + return false; | |
| 426 | + } | |
| 427 | + $broke = explode(' ', $response['out'][0]); | |
| 428 | + foreach ($broke as $r) { | |
| 429 | + $match = preg_match('/bin/', $r); | |
| 430 | + if($match) { | |
| 431 | + return preg_replace('/java:/', '', $r); | |
| 432 | + } | |
| 433 | + } | |
| 434 | + } | |
| 435 | + | |
| 436 | + /** | |
| 437 | + * Check if user entered location of JRE | |
| 438 | + * | |
| 439 | + * @author KnowledgeTree Team | |
| 440 | + * @param none | |
| 441 | + * @access private | |
| 442 | + * @return mixed | |
| 443 | + */ | |
| 444 | + public function javaSpecified() { | |
| 445 | + if(isset($_POST['java'])) { | |
| 446 | + if($_POST['java'] != '') { | |
| 447 | + return $_POST['java']; | |
| 448 | + } else { | |
| 449 | + return false; | |
| 450 | + } | |
| 451 | + } else { | |
| 452 | + return false; | |
| 453 | + } | |
| 454 | + } | |
| 455 | + | |
| 456 | + /** | |
| 457 | + * Check if user entered location of PHP | |
| 458 | + * | |
| 459 | + * @author KnowledgeTree Team | |
| 460 | + * @param none | |
| 461 | + * @access private | |
| 462 | + * @return mixed | |
| 463 | + */ | |
| 464 | + public function phpSpecified() { | |
| 465 | + if(isset($_POST['php'])) { | |
| 466 | + if($_POST['php'] != '') { | |
| 467 | + return $_POST['php']; | |
| 468 | + } else { | |
| 469 | + return false; | |
| 470 | + } | |
| 471 | + } else { | |
| 472 | + return false; | |
| 473 | + } | |
| 474 | + } | |
| 475 | + | |
| 476 | + /** | |
| 477 | + * Determine the location of JAVA_HOME | |
| 478 | + * | |
| 479 | + * @author KnowledgeTree Team | |
| 480 | + * @param none | |
| 481 | + * @access private | |
| 482 | + * @return mixed | |
| 483 | + */ | |
| 484 | + function getJava() { | |
| 485 | + $response = $this->tryJava1(); | |
| 486 | + if(!is_array($response)) { | |
| 487 | + $response = $this->tryJava2(); | |
| 488 | + if(!is_array($response)) { | |
| 489 | + $response = $this->tryJava3(); | |
| 490 | + } | |
| 491 | + } | |
| 492 | +// return false; | |
| 493 | + return $response; | |
| 494 | + } | |
| 495 | + | |
| 496 | + /** | |
| 497 | + * Determine the location of PHP | |
| 498 | + * | |
| 499 | + * @author KnowledgeTree Team | |
| 500 | + * @param none | |
| 501 | + * @access private | |
| 502 | + * @return mixed | |
| 503 | + */ | |
| 504 | + function getPhp() { | |
| 505 | + $cmd = "whereis php"; | |
| 506 | + $res = $this->getPhpHelper($cmd); | |
| 507 | + if($res != '') { | |
| 508 | + return $res; | |
| 509 | + } | |
| 510 | + $cmd = "which php"; | |
| 511 | + return $this->getPhpHelper($cmd); | |
| 512 | + } | |
| 513 | + | |
| 514 | + function getPhpHelper($cmd) { | |
| 515 | + $response = $this->pexec($cmd); | |
| 516 | + if(is_array($response['out'])) { | |
| 517 | + if (isset($response['out'][0])) { | |
| 518 | + $broke = explode(' ', $response['out'][0]); | |
| 519 | + foreach ($broke as $r) { | |
| 520 | + $match = preg_match('/bin/', $r); | |
| 521 | + if($match) { | |
| 522 | + return preg_replace('/php:/', '', $r); | |
| 523 | + } | |
| 524 | + } | |
| 525 | + } | |
| 526 | + } | |
| 527 | + | |
| 528 | + return ''; | |
| 529 | + } | |
| 530 | + | |
| 531 | + function getOpenOffice() { | |
| 532 | + $cmd = "whereis soffice"; | |
| 533 | + $response = $this->pexec($cmd); | |
| 534 | + if(is_array($response['out'])) { | |
| 535 | + if (isset($response['out'][0])) { | |
| 536 | + $broke = explode(' ', $response['out'][0]); | |
| 537 | + foreach ($broke as $r) { | |
| 538 | + $match = preg_match('/bin/', $r); | |
| 539 | + if($match) { | |
| 540 | + return preg_replace('/soffice:/', '', $r); | |
| 541 | + } | |
| 542 | + } | |
| 543 | + } | |
| 544 | + } | |
| 545 | + | |
| 546 | + return ''; | |
| 547 | + } | |
| 548 | + /** | |
| 549 | + * Portably execute a command on any of the supported platforms. | |
| 550 | + * | |
| 551 | + * @author KnowledgeTree Team | |
| 552 | + * @access public | |
| 553 | + * @param string $aCmd | |
| 554 | + * @param array $aOptions | |
| 555 | + * @return array | |
| 556 | + */ | |
| 557 | + public function pexec($aCmd, $aOptions = null) { | |
| 558 | + if (is_array($aCmd)) { | |
| 559 | + $sCmd = $this->safeShellString($aCmd); | |
| 560 | + } else { | |
| 561 | + $sCmd = $aCmd; | |
| 562 | + } | |
| 563 | + $sAppend = $this->arrayGet($aOptions, 'append'); | |
| 564 | + if ($sAppend) { | |
| 565 | + $sCmd .= " >> " . escapeshellarg($sAppend); | |
| 566 | + } | |
| 567 | + $sPopen = $this->arrayGet($aOptions, 'popen'); | |
| 568 | + if ($sPopen) { | |
| 569 | + if (WINDOWS_OS) { | |
| 570 | + $sCmd = "start /b \"kt\" " . $sCmd; | |
| 571 | + } | |
| 572 | + return popen($sCmd, $sPopen); | |
| 573 | + } | |
| 574 | + // for exec, check return code and output... | |
| 575 | + $aRet = array(); | |
| 576 | + $aOutput = array(); | |
| 577 | + $iRet = ''; | |
| 578 | + if(WINDOWS_OS) { | |
| 579 | + $sCmd = 'call '.$sCmd; | |
| 580 | + } | |
| 581 | + | |
| 582 | + exec($sCmd, $aOutput, $iRet); | |
| 583 | + $aRet['ret'] = $iRet; | |
| 584 | + $aRet['out'] = $aOutput; | |
| 585 | + | |
| 586 | + return $aRet; | |
| 587 | + } | |
| 588 | + | |
| 589 | + /** | |
| 590 | + * | |
| 591 | + * | |
| 592 | + * @author KnowledgeTree Team | |
| 593 | + * @access public | |
| 594 | + * @return string | |
| 595 | + */ | |
| 596 | + public function arrayGet($aArray, $sKey, $mDefault = null, $bDefaultIfEmpty = true) { | |
| 597 | + if (!is_array($aArray)) { | |
| 598 | + $aArray = (array) $aArray; | |
| 599 | + } | |
| 600 | + | |
| 601 | + if ($aArray !== 0 && $aArray !== '0' && empty($aArray)) { | |
| 602 | + return $mDefault; | |
| 603 | + } | |
| 604 | + if (array_key_exists($sKey, $aArray)) { | |
| 605 | + $mVal =& $aArray[$sKey]; | |
| 606 | + if (empty($mVal) && $bDefaultIfEmpty) { | |
| 607 | + return $mDefault; | |
| 608 | + } | |
| 609 | + return $mVal; | |
| 610 | + } | |
| 611 | + return $mDefault; | |
| 612 | + } | |
| 613 | + | |
| 614 | + /** | |
| 615 | + * | |
| 616 | + * | |
| 617 | + * @author KnowledgeTree Team | |
| 618 | + * @access public | |
| 619 | + * @return string | |
| 620 | + */ | |
| 621 | + public function safeShellString () { | |
| 622 | + $aArgs = func_get_args(); | |
| 623 | + $aSafeArgs = array(); | |
| 624 | + if (is_array($aArgs[0])) { | |
| 625 | + $aArgs = $aArgs[0]; | |
| 626 | + } | |
| 627 | + $aSafeArgs[] = escapeshellarg(array_shift($aArgs)); | |
| 628 | + if (is_array($aArgs[0])) { | |
| 629 | + $aArgs = $aArgs; | |
| 630 | + } | |
| 631 | + foreach ($aArgs as $sArg) { | |
| 632 | + if (empty($sArg)) { | |
| 633 | + $aSafeArgs[] = "''"; | |
| 634 | + } else { | |
| 635 | + $aSafeArgs[] = escapeshellarg($sArg); | |
| 636 | + } | |
| 637 | + } | |
| 638 | + return join(" ", $aSafeArgs); | |
| 639 | + } | |
| 640 | + | |
| 641 | +} | |
| 642 | +?> | |
| 0 | 643 | \ No newline at end of file | ... | ... |
setup/upgrade/upgradeWizard.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrader Index. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +include("path.php"); // Paths | |
| 43 | + | |
| 44 | +/** | |
| 45 | + * Auto loader to bind upgrader package | |
| 46 | + * | |
| 47 | + * @param string $class | |
| 48 | + * @return void | |
| 49 | + */ | |
| 50 | +function __autoload($class) { // Attempt and autoload classes | |
| 51 | + $class = strtolower(substr($class,0,1)).substr($class,1); // Linux Systems. | |
| 52 | + if(file_exists(UPGRADE_DIR."$class.php")) { | |
| 53 | + require_once(UPGRADE_DIR."$class.php"); | |
| 54 | + } elseif (file_exists(STEP_DIR."$class.php")) { | |
| 55 | + require_once(STEP_DIR."$class.php"); | |
| 56 | + } elseif (file_exists(WIZARD_LIB."$class.php")) { | |
| 57 | + require_once(WIZARD_LIB."$class.php"); | |
| 58 | + } else { | |
| 59 | + return null; | |
| 60 | + } | |
| 61 | +} | |
| 62 | + | |
| 63 | +class UpgradeWizard { | |
| 64 | + /** | |
| 65 | + * Upgrade bypass flag | |
| 66 | + * | |
| 67 | + * @author KnowledgeTree Team | |
| 68 | + * @access protected | |
| 69 | + * @var mixed | |
| 70 | + */ | |
| 71 | + protected $bypass = null; | |
| 72 | + | |
| 73 | + /** | |
| 74 | + * Reference to upgrader utility object | |
| 75 | + * | |
| 76 | + * @author KnowledgeTree Team | |
| 77 | + * @access protected | |
| 78 | + * @var boolean | |
| 79 | + */ | |
| 80 | + protected $iutil = null; | |
| 81 | + | |
| 82 | + /** | |
| 83 | + * Constructs upgradeation wizard object | |
| 84 | + * | |
| 85 | + * @author KnowledgeTree Team | |
| 86 | + * @access public | |
| 87 | + */ | |
| 88 | + public function __construct(){} | |
| 89 | + | |
| 90 | + /** | |
| 91 | + * Check if system has been upgrade | |
| 92 | + * | |
| 93 | + * @author KnowledgeTree Team | |
| 94 | + * @access private | |
| 95 | + * @param none | |
| 96 | + * @return boolean | |
| 97 | + */ | |
| 98 | + private function isSystemUpgradeed() { | |
| 99 | + return $this->iutil->isSystemUpgradeed(); | |
| 100 | + } | |
| 101 | + | |
| 102 | + /** | |
| 103 | + * Display the wizard | |
| 104 | + * | |
| 105 | + * @author KnowledgeTree Team | |
| 106 | + * @access private | |
| 107 | + * @param string | |
| 108 | + * @return void | |
| 109 | + */ | |
| 110 | + public function displayUpgrader($response = null) { | |
| 111 | + if($response) { | |
| 112 | + $ins = new Upgrader(); // Instantiate the upgrader | |
| 113 | + $ins->resolveErrors($response); // Run step | |
| 114 | + } else { | |
| 115 | + $ins = new Upgrader(new UpgradeSession()); // Instantiate the upgrader and pass the session class | |
| 116 | + $ins->step(); // Run step | |
| 117 | + } | |
| 118 | + } | |
| 119 | + | |
| 120 | + /** | |
| 121 | + * Set bypass flag | |
| 122 | + * | |
| 123 | + * @author KnowledgeTree Team | |
| 124 | + * @access private | |
| 125 | + * @param boolean | |
| 126 | + * @return void | |
| 127 | + */ | |
| 128 | + private function setBypass($bypass) { | |
| 129 | + $this->bypass = $bypass; | |
| 130 | + } | |
| 131 | + | |
| 132 | + /** | |
| 133 | + * Set util reference | |
| 134 | + * | |
| 135 | + * @author KnowledgeTree Team | |
| 136 | + * @access private | |
| 137 | + * @param object upgrader utility | |
| 138 | + * @return void | |
| 139 | + */ | |
| 140 | + private function setIUtil($iutil) { | |
| 141 | + $this->iutil = $iutil; | |
| 142 | + } | |
| 143 | + | |
| 144 | + /** | |
| 145 | + * Create upgrade file | |
| 146 | + * | |
| 147 | + * @author KnowledgeTree Team | |
| 148 | + * @access private | |
| 149 | + * @param none | |
| 150 | + * @return void | |
| 151 | + */ | |
| 152 | + private function createUpgradeFile() { | |
| 153 | + @touch("upgrade"); | |
| 154 | + } | |
| 155 | + | |
| 156 | + /** | |
| 157 | + * Remove upgrade file | |
| 158 | + * | |
| 159 | + * @author KnowledgeTree Team | |
| 160 | + * @access private | |
| 161 | + * @param none | |
| 162 | + * @return void | |
| 163 | + */ | |
| 164 | + private function removeUpgradeFile() { | |
| 165 | + @unlink("upgrade"); | |
| 166 | + } | |
| 167 | + | |
| 168 | + /** | |
| 169 | + * Load default values | |
| 170 | + * | |
| 171 | + * @author KnowledgeTree Team | |
| 172 | + * @access private | |
| 173 | + * @param none | |
| 174 | + * @return void | |
| 175 | + */ | |
| 176 | + function load() { | |
| 177 | + $this->setIUtil(new UpgradeUtil()); | |
| 178 | + } | |
| 179 | + | |
| 180 | + /** | |
| 181 | + * Run pre-upgradeation system checks | |
| 182 | + * | |
| 183 | + * @author KnowledgeTree Team | |
| 184 | + * @access public | |
| 185 | + * @param none | |
| 186 | + * @return mixed | |
| 187 | + */ | |
| 188 | + public function systemChecks() { | |
| 189 | + $res = $this->iutil->checkStructurePermissions(); | |
| 190 | + if($res === true) return $res; | |
| 191 | + switch ($res) { | |
| 192 | + case "wizard": | |
| 193 | + $this->iutil->error("Upgrader directory is not writable (KT_Installation_Directory/setup/upgrade/)"); | |
| 194 | + return 'Upgrader directory is not writable (KT_Installation_Directory/setup/upgrade/)'; | |
| 195 | + break; | |
| 196 | + case "/": | |
| 197 | + $this->iutil->error("System root is not writable (KT_Installation_Directory/)"); | |
| 198 | + return "System root is not writable (KT_Installation_Directory/)"; | |
| 199 | + break; | |
| 200 | + default: | |
| 201 | + return true; | |
| 202 | + break; | |
| 203 | + } | |
| 204 | + | |
| 205 | + return $res; | |
| 206 | + } | |
| 207 | + | |
| 208 | + /** | |
| 209 | + * Control all requests to wizard | |
| 210 | + * | |
| 211 | + * @author KnowledgeTree Team | |
| 212 | + * @access public | |
| 213 | + * @param none | |
| 214 | + * @return void | |
| 215 | + */ | |
| 216 | + public function dispatch() { | |
| 217 | + $this->load(); | |
| 218 | + // is this necessary? | |
| 219 | + $this->createUpgradeFile(); | |
| 220 | +// if(!$this->isSystemUpgradeed()) { // Check if the systems not upgraded | |
| 221 | + $response = $this->systemChecks(); | |
| 222 | + if($response === true) { | |
| 223 | + $this->displayUpgrader(); | |
| 224 | + } else { | |
| 225 | + exit(); | |
| 226 | + } | |
| 227 | +// } else { | |
| 228 | +// // TODO: Die gracefully | |
| 229 | +// $this->iutil->error("System has been upgraded <div class=\"buttons\"><a href='../../'>Goto Login</a></div>"); | |
| 230 | +// } | |
| 231 | + } | |
| 232 | +} | |
| 233 | + | |
| 234 | +$ic = new UpgradeWizard(); | |
| 235 | +$ic->dispatch(); | |
| 236 | +?> | |
| 0 | 237 | \ No newline at end of file | ... | ... |
setup/upgrade/upgradedbUtil.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrader Database Control. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | +class UpgradedbUtil { | |
| 43 | + /** | |
| 44 | + * Host | |
| 45 | + * | |
| 46 | + * @author KnowledgeTree Team | |
| 47 | + * @access protected | |
| 48 | + * @var string | |
| 49 | + */ | |
| 50 | + protected $dbhost = ''; | |
| 51 | + | |
| 52 | + /** | |
| 53 | + * Host | |
| 54 | + * | |
| 55 | + * @author KnowledgeTree Team | |
| 56 | + * @access protected | |
| 57 | + * @var string | |
| 58 | + */ | |
| 59 | + protected $dbname = ''; | |
| 60 | + | |
| 61 | + /** | |
| 62 | + * Host | |
| 63 | + * | |
| 64 | + * @author KnowledgeTree Team | |
| 65 | + * @access protected | |
| 66 | + * @var string | |
| 67 | + */ | |
| 68 | + protected $dbuname = ''; | |
| 69 | + | |
| 70 | + /** | |
| 71 | + * Host | |
| 72 | + * | |
| 73 | + * @author KnowledgeTree Team | |
| 74 | + * @access protected | |
| 75 | + * @var string | |
| 76 | + */ | |
| 77 | + protected $dbpassword = ''; | |
| 78 | + | |
| 79 | + /** | |
| 80 | + * Host | |
| 81 | + * | |
| 82 | + * @author KnowledgeTree Team | |
| 83 | + * @access protected | |
| 84 | + * @var object mysql connection | |
| 85 | + */ | |
| 86 | + protected $dbconnection = ''; | |
| 87 | + | |
| 88 | + /** | |
| 89 | + * Any errors encountered | |
| 90 | + * | |
| 91 | + * @author KnowledgeTree Team | |
| 92 | + * @access protected | |
| 93 | + * @var array | |
| 94 | + */ | |
| 95 | + protected $error = array(); | |
| 96 | + | |
| 97 | + /** | |
| 98 | + * Constructs database connection object | |
| 99 | + * | |
| 100 | + * @author KnowledgeTree Team | |
| 101 | + * @access public | |
| 102 | + */ | |
| 103 | + public function __construct() { | |
| 104 | + | |
| 105 | + } | |
| 106 | + | |
| 107 | + public function load($dhost = 'localhost', $duname, $dpassword, $dbname) { | |
| 108 | + $this->dbhost = $dhost; | |
| 109 | + $this->dbuname = $duname; | |
| 110 | + $this->dbpassword = $dpassword; | |
| 111 | + $this->dbconnection = @mysql_connect($dhost, $duname, $dpassword); | |
| 112 | + if($dbname != '') { | |
| 113 | + $this->setDb($dbname); | |
| 114 | + $this->useDb($dbname); | |
| 115 | + } | |
| 116 | + if($this->dbconnection) { | |
| 117 | + return $this->dbconnection; | |
| 118 | + } | |
| 119 | + else { | |
| 120 | + $this->error[] = @mysql_error($this->dbconnection); | |
| 121 | + return false; | |
| 122 | + } | |
| 123 | + } | |
| 124 | + | |
| 125 | + /** | |
| 126 | + * Choose a database to use | |
| 127 | + * | |
| 128 | + * @param string $dbname name of the database | |
| 129 | + * @access public | |
| 130 | + * @return boolean | |
| 131 | + */ | |
| 132 | + public function useDb($dbname = '') { | |
| 133 | + if($dbname != '') { | |
| 134 | + $this->setDb($dbname); | |
| 135 | + } | |
| 136 | + | |
| 137 | + if(@mysql_select_db($this->dbname, $this->dbconnection)) | |
| 138 | + return true; | |
| 139 | + else { | |
| 140 | + $this->error[] = @mysql_error($this->dbconnection); | |
| 141 | + return false; | |
| 142 | + } | |
| 143 | + } | |
| 144 | + | |
| 145 | + public function setDb($dbname) { | |
| 146 | + $this->dbname = $dbname; | |
| 147 | + } | |
| 148 | + | |
| 149 | + /** | |
| 150 | + * Query the database. | |
| 151 | + * | |
| 152 | + * @param $query the sql query. | |
| 153 | + * @access public | |
| 154 | + * @return object The result of the query. | |
| 155 | + */ | |
| 156 | + public function query($query) { | |
| 157 | + $result = mysql_query($query, $this->dbconnection); | |
| 158 | + if($result) { | |
| 159 | + return $result; | |
| 160 | + } else { | |
| 161 | + $this->error[] = @mysql_error($this->dbconnection); | |
| 162 | + return false; | |
| 163 | + } | |
| 164 | + } | |
| 165 | + | |
| 166 | + /** | |
| 167 | + * Do the same as query. | |
| 168 | + * | |
| 169 | + * @param $query the sql query. | |
| 170 | + * @access public | |
| 171 | + * @return boolean | |
| 172 | + */ | |
| 173 | + public function execute($query) { | |
| 174 | + $result = @mysql_query($query, $this->dbconnection); | |
| 175 | + if($result) { | |
| 176 | + return true; | |
| 177 | + } else { | |
| 178 | + $this->error[] = @mysql_error($this->dbconnection); | |
| 179 | + return false; | |
| 180 | + } | |
| 181 | + } | |
| 182 | + | |
| 183 | + /** | |
| 184 | + * Convenience method for mysql_fetch_object(). | |
| 185 | + * | |
| 186 | + * @param $result The resource returned by query(). | |
| 187 | + * @access public | |
| 188 | + * @return object An object representing a data row. | |
| 189 | + */ | |
| 190 | + public function fetchNextObject($result = NULL) { | |
| 191 | + if ($result == NULL || @mysql_num_rows($result) < 1) | |
| 192 | + return NULL; | |
| 193 | + else | |
| 194 | + return @mysql_fetch_object($result); | |
| 195 | + } | |
| 196 | + | |
| 197 | + /** | |
| 198 | + * Convenience method for mysql_fetch_assoc(). | |
| 199 | + * | |
| 200 | + * @param $result The resource returned by query(). | |
| 201 | + * @access public | |
| 202 | + * @return array Returns an associative array of strings. | |
| 203 | + */ | |
| 204 | + public function fetchAssoc($result = NULL) { | |
| 205 | + $r = array(); | |
| 206 | + if ($result == NULL || @mysql_num_rows($result) < 1) | |
| 207 | + return NULL; | |
| 208 | + else { | |
| 209 | + $row = @mysql_fetch_assoc($result); | |
| 210 | + while ($row) { | |
| 211 | + $r[] = $row; | |
| 212 | + } | |
| 213 | + return $r; | |
| 214 | + } | |
| 215 | + } | |
| 216 | + | |
| 217 | + /** | |
| 218 | + * Close the connection with the database server. | |
| 219 | + * | |
| 220 | + * @param none. | |
| 221 | + * @access public | |
| 222 | + * @return void. | |
| 223 | + */ | |
| 224 | + public function close() { | |
| 225 | + @mysql_close($this->dbconnection); | |
| 226 | + } | |
| 227 | + | |
| 228 | + /** | |
| 229 | + * Get database errors. | |
| 230 | + * | |
| 231 | + * @param none. | |
| 232 | + * @access public | |
| 233 | + * @return array. | |
| 234 | + */ | |
| 235 | + public function getErrors() { | |
| 236 | + return $this->error; | |
| 237 | + } | |
| 238 | + | |
| 239 | + /** | |
| 240 | + * Fetches the last generated error | |
| 241 | + | |
| 242 | + * @return string | |
| 243 | + */ | |
| 244 | + function getLastError() { | |
| 245 | + return end($this->error); | |
| 246 | + } | |
| 247 | + | |
| 248 | + /** | |
| 249 | + * Start a database transaction | |
| 250 | + */ | |
| 251 | + public function startTransaction() { | |
| 252 | + $this->query("START TRANSACTION"); | |
| 253 | + } | |
| 254 | + | |
| 255 | + /** | |
| 256 | + * Roll back a database transaction | |
| 257 | + */ | |
| 258 | + public function rollback() { | |
| 259 | + $this->query("ROLLBACK"); | |
| 260 | + } | |
| 261 | +} | |
| 262 | +?> | |
| 0 | 263 | \ No newline at end of file | ... | ... |
setup/upgrade/upgrader.php
0 → 100644
| 1 | +<?php | |
| 2 | +/** | |
| 3 | +* Upgrader Controller. | |
| 4 | +* | |
| 5 | +* KnowledgeTree Community Edition | |
| 6 | +* Document Management Made Simple | |
| 7 | +* Copyright (C) 2008,2009 KnowledgeTree Inc. | |
| 8 | +* Portions copyright The Jam Warehouse Software (Pty) Limited | |
| 9 | +* | |
| 10 | +* This program is free software; you can redistribute it and/or modify it under | |
| 11 | +* the terms of the GNU General Public License version 3 as published by the | |
| 12 | +* Free Software Foundation. | |
| 13 | +* | |
| 14 | +* This program is distributed in the hope that it will be useful, but WITHOUT | |
| 15 | +* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | |
| 16 | +* FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | |
| 17 | +* details. | |
| 18 | +* | |
| 19 | +* You should have received a copy of the GNU General Public License | |
| 20 | +* along with this program. If not, see <http://www.gnu.org/licenses/>. | |
| 21 | +* | |
| 22 | +* You can contact KnowledgeTree Inc., PO Box 7775 #87847, San Francisco, | |
| 23 | +* California 94120-7775, or email info@knowledgetree.com. | |
| 24 | +* | |
| 25 | +* The interactive user interfaces in modified source and object code versions | |
| 26 | +* of this program must display Appropriate Legal Notices, as required under | |
| 27 | +* Section 5 of the GNU General Public License version 3. | |
| 28 | +* | |
| 29 | +* In accordance with Section 7(b) of the GNU General Public License version 3, | |
| 30 | +* these Appropriate Legal Notices must retain the display of the "Powered by | |
| 31 | +* KnowledgeTree" logo and retain the original copyright notice. If the display of the | |
| 32 | +* logo is not reasonably feasible for technical reasons, the Appropriate Legal Notices | |
| 33 | +* must display the words "Powered by KnowledgeTree" and retain the original | |
| 34 | +* copyright notice. | |
| 35 | +* | |
| 36 | +* @copyright 2008-2009, KnowledgeTree Inc. | |
| 37 | +* @license GNU General Public License version 3 | |
| 38 | +* @author KnowledgeTree Team | |
| 39 | +* @package Upgrader | |
| 40 | +* @version Version 0.1 | |
| 41 | +*/ | |
| 42 | + | |
| 43 | +class Upgrader { | |
| 44 | + /** | |
| 45 | + * Reference to simple xml object | |
| 46 | + * | |
| 47 | + * @author KnowledgeTree Team | |
| 48 | + * @access protected | |
| 49 | + * @var object SimpleXMLElement | |
| 50 | + */ | |
| 51 | + protected $simpleXmlObj = null; | |
| 52 | + | |
| 53 | + /** | |
| 54 | + * Reference to step action object | |
| 55 | + * | |
| 56 | + * @author KnowledgeTree Team | |
| 57 | + * @access protected | |
| 58 | + * @var object StepAction | |
| 59 | + */ | |
| 60 | + protected $stepAction = null; | |
| 61 | + | |
| 62 | + /** | |
| 63 | + * Reference to session object | |
| 64 | + * | |
| 65 | + * @author KnowledgeTree Team | |
| 66 | + * @access protected | |
| 67 | + * @var object Session | |
| 68 | + */ | |
| 69 | + protected $session = null; | |
| 70 | + | |
| 71 | + /** | |
| 72 | + * List of upgradeation steps as strings | |
| 73 | + * | |
| 74 | + * @author KnowledgeTree Team | |
| 75 | + * @access protected | |
| 76 | + * @var array string | |
| 77 | + */ | |
| 78 | + protected $stepClassNames = array(); | |
| 79 | + | |
| 80 | + /** | |
| 81 | + * List of upgradeation steps as human readable strings | |
| 82 | + * | |
| 83 | + * @author KnowledgeTree Team | |
| 84 | + * @access protected | |
| 85 | + * @var array string | |
| 86 | + */ | |
| 87 | + protected $stepNames = array(); | |
| 88 | + | |
| 89 | + /** | |
| 90 | + * List of upgradeation steps as human readable strings | |
| 91 | + * | |
| 92 | + * @author KnowledgeTree Team | |
| 93 | + * @access protected | |
| 94 | + * @var array string | |
| 95 | + */ | |
| 96 | + protected $stepObjects = array(); | |
| 97 | + | |
| 98 | + /** | |
| 99 | + * Order in which steps have to be upgraded | |
| 100 | + * | |
| 101 | + * @author KnowledgeTree Team | |
| 102 | + * @access protected | |
| 103 | + * @var array string | |
| 104 | + */ | |
| 105 | + protected $upgradeOrders = array(); | |
| 106 | + | |
| 107 | + /** | |
| 108 | + * List of upgradeation properties | |
| 109 | + * | |
| 110 | + * @author KnowledgeTree Team | |
| 111 | + * @access protected | |
| 112 | + * @var array string | |
| 113 | + */ | |
| 114 | + protected $upgradeProperties = array(); | |
| 115 | + | |
| 116 | + /** | |
| 117 | + * Flag if a step object needs confirmation | |
| 118 | + * | |
| 119 | + * @author KnowledgeTree Team | |
| 120 | + * @access protected | |
| 121 | + * @var boolean | |
| 122 | + */ | |
| 123 | + protected $stepConfirmation = false; | |
| 124 | + | |
| 125 | + /** | |
| 126 | + * Flag if a step object needs confirmation | |
| 127 | + * | |
| 128 | + * @author KnowledgeTree Team | |
| 129 | + * @access protected | |
| 130 | + * @var boolean | |
| 131 | + */ | |
| 132 | + protected $stepDisplayFirst = false; | |
| 133 | + | |
| 134 | + private $upgraderAction = ''; | |
| 135 | + | |
| 136 | + /** | |
| 137 | + * Constructs upgradeation object | |
| 138 | + * | |
| 139 | + * @author KnowledgeTree Team | |
| 140 | + * @access public | |
| 141 | + * @param object Session $session Instance of the Session object | |
| 142 | + */ | |
| 143 | + public function __construct($session = null) { | |
| 144 | + $this->session = $session; | |
| 145 | + } | |
| 146 | + | |
| 147 | + /** | |
| 148 | + * Read xml configuration file | |
| 149 | + * | |
| 150 | + * @author KnowledgeTree Team | |
| 151 | + * @param string $name of config file | |
| 152 | + * @access private | |
| 153 | + * @return object | |
| 154 | + */ | |
| 155 | + private function _readXml($name = "config.xml") { | |
| 156 | + try { | |
| 157 | + $this->simpleXmlObj = simplexml_load_file(CONF_DIR.$name); | |
| 158 | + } catch (Exception $e) { | |
| 159 | + $iutil = new UpgradeUtil(); | |
| 160 | + $iutil->error("Error reading configuration file: $name"); | |
| 161 | + exit(); | |
| 162 | + } | |
| 163 | + } | |
| 164 | + | |
| 165 | + /** | |
| 166 | + * Checks if first step of upgrader | |
| 167 | + * | |
| 168 | + * @author KnowledgeTree Team | |
| 169 | + * @param none | |
| 170 | + * @access private | |
| 171 | + * @return boolean | |
| 172 | + */ | |
| 173 | + private function _firstStep() { | |
| 174 | + if(isset($_GET['step_name'])) { | |
| 175 | + return false; | |
| 176 | + } | |
| 177 | + | |
| 178 | + return true; | |
| 179 | + } | |
| 180 | + | |
| 181 | + /** | |
| 182 | + * Checks if first step of upgrader | |
| 183 | + * | |
| 184 | + * @author KnowledgeTree Team | |
| 185 | + * @param none | |
| 186 | + * @access private | |
| 187 | + * @return boolean | |
| 188 | + */ | |
| 189 | + private function _firstStepPeriod() { | |
| 190 | + if(isset($_GET['step_name'])) { | |
| 191 | + if($_GET['step_name'] != 'welcome') | |
| 192 | + return false; | |
| 193 | + } | |
| 194 | + | |
| 195 | + return true; | |
| 196 | + } | |
| 197 | + | |
| 198 | + /** | |
| 199 | + * Returns next step | |
| 200 | + * | |
| 201 | + * @author KnowledgeTree Team | |
| 202 | + * @param none | |
| 203 | + * @access private | |
| 204 | + * @return string | |
| 205 | + */ | |
| 206 | + private function _getNextStep() { | |
| 207 | + return $this->_getStepName(1); | |
| 208 | + } | |
| 209 | + | |
| 210 | + /** | |
| 211 | + * Returns previous step | |
| 212 | + * | |
| 213 | + * @author KnowledgeTree Team | |
| 214 | + * @param none | |
| 215 | + * @access private | |
| 216 | + * @return string | |
| 217 | + */ | |
| 218 | + private function _getPreviousStep() { | |
| 219 | + return $this->_getStepName(-1); | |
| 220 | + } | |
| 221 | + | |
| 222 | + /** | |
| 223 | + * Returns the step name, given a position | |
| 224 | + * | |
| 225 | + * @author KnowledgeTree Team | |
| 226 | + * @param integer $pos current position | |
| 227 | + * @access private | |
| 228 | + * @return string $name | |
| 229 | + */ | |
| 230 | + private function _getStepName($pos = 0) { | |
| 231 | + if($this->_firstStep()) { | |
| 232 | + $step = (string) $this->simpleXmlObj->steps->step[0]; | |
| 233 | + } else { | |
| 234 | + $pos += $this->getStepPosition(); | |
| 235 | + $step = (string) $this->simpleXmlObj->steps->step[$pos]; | |
| 236 | + } | |
| 237 | + | |
| 238 | + return $step; | |
| 239 | + } | |
| 240 | + | |
| 241 | + /** | |
| 242 | + * Executes next step | |
| 243 | + * | |
| 244 | + * @author KnowledgeTree Team | |
| 245 | + * @param none | |
| 246 | + * @access private | |
| 247 | + * @return string | |
| 248 | + */ | |
| 249 | + private function _proceed() { | |
| 250 | + $step_name = $this->_getNextStep(); | |
| 251 | + | |
| 252 | + return $this->_runStepAction($step_name); | |
| 253 | + } | |
| 254 | + | |
| 255 | + /** | |
| 256 | + * Executes previous step | |
| 257 | + * | |
| 258 | + * @author KnowledgeTree Team | |
| 259 | + * @param none | |
| 260 | + * @access private | |
| 261 | + * @return string | |
| 262 | + */ | |
| 263 | + private function _backward() { | |
| 264 | + $step_name = $this->_getPreviousStep(); | |
| 265 | + | |
| 266 | + return $this->_runStepAction($step_name); | |
| 267 | + } | |
| 268 | + | |
| 269 | + /** | |
| 270 | + * Executes step landing | |
| 271 | + * | |
| 272 | + * @author KnowledgeTree Team | |
| 273 | + * @param none | |
| 274 | + * @access private | |
| 275 | + * @return string | |
| 276 | + */ | |
| 277 | + private function _landing() { | |
| 278 | + $step_name = $this->_getStepName(); | |
| 279 | + | |
| 280 | + return $this->_runStepAction($step_name); | |
| 281 | + } | |
| 282 | + | |
| 283 | + /** | |
| 284 | + * Executes step based on step class name | |
| 285 | + * | |
| 286 | + * @author KnowledgeTree Team | |
| 287 | + * @param string $step_name | |
| 288 | + * @access private | |
| 289 | + * @return string | |
| 290 | + */ | |
| 291 | + private function _runStepAction($stepName) { | |
| 292 | + $this->stepAction = new stepAction($stepName); | |
| 293 | + $this->stepAction->setUpStepAction($this->getSteps(), $this->getStepNames(), $this->getStepConfirmation(), $this->stepDisplayFirst(), $this->getSession(), $this->getUpgradeProperties()); | |
| 294 | + | |
| 295 | + return $this->stepAction->doAction(); | |
| 296 | + } | |
| 297 | + | |
| 298 | + private function stepDisplayFirst() { | |
| 299 | + if($this->upgraderAction == 'edit') | |
| 300 | + return false; // | |
| 301 | + $class = $this->stepAction->createStep(); // Get step class | |
| 302 | + return $class->displayFirst(); // Check if class needs to display first | |
| 303 | + } | |
| 304 | + | |
| 305 | + /** | |
| 306 | + * Set steps class names in string format | |
| 307 | + * | |
| 308 | + * @author KnowledgeTree Team | |
| 309 | + * @param none | |
| 310 | + * @access private | |
| 311 | + * @return array | |
| 312 | + */ | |
| 313 | + private function _getUpgradeOrders() { | |
| 314 | + return $this->upgradeOrders; | |
| 315 | + } | |
| 316 | + | |
| 317 | + /** | |
| 318 | + * Set steps as names | |
| 319 | + * | |
| 320 | + * @author KnowledgeTree Team | |
| 321 | + * @param none | |
| 322 | + * @access private | |
| 323 | + * @return void | |
| 324 | + */ | |
| 325 | + private function _xmlStepsToArray() { | |
| 326 | + if(isset($this->simpleXmlObj)) { | |
| 327 | + foreach($this->simpleXmlObj->steps->step as $d_step) { | |
| 328 | + $step_name = (string) $d_step[0]; | |
| 329 | + $this->stepClassNames[] = $step_name; | |
| 330 | + } | |
| 331 | + $this->_loadToSession('stepClassNames', $this->stepClassNames); | |
| 332 | + } | |
| 333 | + } | |
| 334 | + | |
| 335 | + /** | |
| 336 | + * Set steps as human readable strings | |
| 337 | + * | |
| 338 | + * @author KnowledgeTree Team | |
| 339 | + * @param none | |
| 340 | + * @access private | |
| 341 | + * @return void | |
| 342 | + */ | |
| 343 | + private function _xmlStepsNames() { | |
| 344 | + if(isset($this->simpleXmlObj)) { | |
| 345 | + foreach($this->simpleXmlObj->steps->step as $d_step) { | |
| 346 | + $step_name = (string) $d_step[0]; | |
| 347 | + $this->stepNames[$step_name] = (string) $d_step['name']; | |
| 348 | + } | |
| 349 | + $this->_loadToSession('stepNames', $this->stepNames); | |
| 350 | + } | |
| 351 | + } | |
| 352 | + | |
| 353 | + /** | |
| 354 | + * Set steps upgrade order | |
| 355 | + * | |
| 356 | + * @author KnowledgeTree Team | |
| 357 | + * @param none | |
| 358 | + * @access private | |
| 359 | + * @return void | |
| 360 | + */ | |
| 361 | + private function _xmlStepsOrders() { | |
| 362 | + if(isset($this->simpleXmlObj)) { | |
| 363 | + foreach($this->simpleXmlObj->steps->step as $d_step) { | |
| 364 | + if(isset($d_step['order'])) { | |
| 365 | + $step_name = (string) $d_step[0]; | |
| 366 | + $order = (string) $d_step['order']; | |
| 367 | + $this->upgradeOrders[$order] = $step_name; // Store step upgrade order | |
| 368 | + } | |
| 369 | + } | |
| 370 | + $this->_loadToSession('upgradeOrders', $this->upgradeOrders); | |
| 371 | + } | |
| 372 | + } | |
| 373 | + | |
| 374 | + /** | |
| 375 | + * Set upgrade properties | |
| 376 | + * | |
| 377 | + * @author KnowledgeTree Team | |
| 378 | + * @param none | |
| 379 | + * @access private | |
| 380 | + * @return void | |
| 381 | + */ | |
| 382 | + private function _xmlUpgradeProperties() { | |
| 383 | + if(isset($this->simpleXmlObj)) { | |
| 384 | + $this->upgradeProperties['upgrade_version'] = (string) $this->simpleXmlObj['version']; | |
| 385 | + $this->upgradeProperties['upgrade_type'] = (string) $this->simpleXmlObj['type']; | |
| 386 | + $this->_loadToSession('upgradeProperties', $this->upgradeProperties); | |
| 387 | + } | |
| 388 | + } | |
| 389 | + | |
| 390 | + /** | |
| 391 | + * Upgrade steps | |
| 392 | + * | |
| 393 | + * @author KnowledgeTree Team | |
| 394 | + * @param none | |
| 395 | + * @access private | |
| 396 | + * @return void | |
| 397 | + */ | |
| 398 | + private function _runStepsUpgrades() { | |
| 399 | + $steps = $this->_getUpgradeOrders(); | |
| 400 | + for ($i=1; $i< count($steps)+1; $i++) { | |
| 401 | + $this->_upgradeHelper($steps[$i]); | |
| 402 | + } | |
| 403 | + | |
| 404 | + $this->_completeUpgrade(); | |
| 405 | + } | |
| 406 | + | |
| 407 | + /** | |
| 408 | + * Complete upgrade cleanup process | |
| 409 | + * | |
| 410 | + * @author KnowledgeTree Team | |
| 411 | + * @param none | |
| 412 | + * @access private | |
| 413 | + * @return void | |
| 414 | + */ | |
| 415 | + private function _completeUpgrade() { | |
| 416 | + @touch("upgrade"); | |
| 417 | + } | |
| 418 | + | |
| 419 | + /** | |
| 420 | + * Upgrade steps helper | |
| 421 | + * | |
| 422 | + * @author KnowledgeTree Team | |
| 423 | + * @param none | |
| 424 | + * @access private | |
| 425 | + * @return void | |
| 426 | + */ | |
| 427 | + private function _upgradeHelper($className) { | |
| 428 | + $stepAction = new stepAction($className); // Instantiate a step action | |
| 429 | + $class = $stepAction->createStep(); // Get step class | |
| 430 | + if($class) { // Check if class Exists | |
| 431 | + if($class->runUpgrade()) { // Check if step needs to be upgraded | |
| 432 | + $class->setDataFromSession($className); // Set Session Information | |
| 433 | + $class->setPostConfig(); // Set any posted variables | |
| 434 | + $response = $class->upgradeStep(); // Run upgrade step | |
| 435 | + // TODO : Break on error response | |
| 436 | + } | |
| 437 | + } else { | |
| 438 | + $iutil = new UpgradeUtil(); | |
| 439 | + $iutil->error("Class File Missing in Step Directory: $className"); | |
| 440 | + exit(); | |
| 441 | + } | |
| 442 | + } | |
| 443 | + | |
| 444 | + /** | |
| 445 | + * Reset all session information on welcome landing | |
| 446 | + * | |
| 447 | + * @author KnowledgeTree Team | |
| 448 | + * @param none | |
| 449 | + * @access private | |
| 450 | + * @return void | |
| 451 | + */ | |
| 452 | + private function _resetSessions() { | |
| 453 | + if($this->session) { | |
| 454 | + if($this->_firstStepPeriod()) { | |
| 455 | + foreach ($this->getSteps() as $class) { | |
| 456 | + $this->session->un_setClass($class); | |
| 457 | + } | |
| 458 | + foreach ($this->getStepNames() as $class) { | |
| 459 | + $this->session->un_setClass($class); | |
| 460 | + } | |
| 461 | + foreach ($this->_getUpgradeOrders() as $class) { | |
| 462 | + $this->session->un_setClass($class); | |
| 463 | + } | |
| 464 | + } | |
| 465 | + } | |
| 466 | + } | |
| 467 | + | |
| 468 | + function _loadFromSessions() { | |
| 469 | + $this->stepClassNames = $this->session->get('stepClassNames'); | |
| 470 | + if(!$this->stepClassNames) { | |
| 471 | + $this->_xmlStepsToArray(); // String steps | |
| 472 | + } | |
| 473 | + $this->stepNames = $this->session->get('stepNames'); | |
| 474 | + if(!$this->stepNames) { | |
| 475 | + $this->_xmlStepsNames(); | |
| 476 | + } | |
| 477 | + $this->upgradeOrders = $this->session->get('upgradeOrders'); | |
| 478 | + if(!$this->upgradeOrders) { | |
| 479 | + $this->_xmlStepsOrders(); | |
| 480 | + } | |
| 481 | + $this->upgradeProperties = $this->session->get('upgradeProperties'); | |
| 482 | + if(!$this->upgradeProperties) { | |
| 483 | + $this->_xmlUpgradeProperties(); | |
| 484 | + } | |
| 485 | + } | |
| 486 | + | |
| 487 | + private function loadNeeded() { | |
| 488 | + $this->_readXml(); // Xml steps | |
| 489 | + // Make sure session is cleared | |
| 490 | + $this->_resetSessions(); | |
| 491 | + $this->_loadFromSessions(); | |
| 492 | + if(isset($_POST['Next'])) { | |
| 493 | + $this->upgraderAction = 'next'; | |
| 494 | + $this->response = 'next'; | |
| 495 | + } elseif (isset($_POST['Previous'])) { | |
| 496 | + $this->upgraderAction = 'previous'; | |
| 497 | + $this->response = 'previous'; | |
| 498 | + } elseif (isset($_POST['Confirm'])) { | |
| 499 | + $this->upgraderAction = 'confirm'; | |
| 500 | + $this->response = 'next'; | |
| 501 | + } elseif (isset($_POST['Upgrade'])) { | |
| 502 | + $this->upgraderAction = 'upgrade'; | |
| 503 | + $this->response = 'next'; | |
| 504 | + } elseif (isset($_POST['Edit'])) { | |
| 505 | + $this->upgraderAction = 'edit'; | |
| 506 | + $this->response = 'next'; | |
| 507 | + } elseif (isset($_POST['Install'])) { | |
| 508 | + $this->upgraderAction = 'install'; | |
| 509 | + $this->response = 'install'; | |
| 510 | + } else { | |
| 511 | + $this->response = ''; | |
| 512 | + $this->upgraderAction = ''; | |
| 513 | + } | |
| 514 | + } | |
| 515 | + | |
| 516 | + /** | |
| 517 | + * Main control to handle the flow of upgrade | |
| 518 | + * | |
| 519 | + * @author KnowledgeTree Team | |
| 520 | + * @param none | |
| 521 | + * @access public | |
| 522 | + * @return void | |
| 523 | + */ | |
| 524 | + public function step() { | |
| 525 | + $this->loadNeeded(); | |
| 526 | + switch($this->response) { | |
| 527 | + case 'next': | |
| 528 | + $step_name = $this->_getStepName(); | |
| 529 | + $res = $this->_runStepAction($step_name); | |
| 530 | + if($res == 'next') { | |
| 531 | + $this->_proceed(); // Load next window | |
| 532 | + } elseif ($res == 'upgrade') { | |
| 533 | + $this->_runStepsUpgraders(); // Load landing | |
| 534 | + $this->_proceed(); // Load next window | |
| 535 | + } elseif ($res == 'confirm') { | |
| 536 | + if(!$this->stepDisplayFirst()) | |
| 537 | + $this->stepConfirmation = true; | |
| 538 | + $this->_landing(); | |
| 539 | + } elseif ($res == 'landing') { | |
| 540 | + $this->_landing(); | |
| 541 | + } else { | |
| 542 | + } | |
| 543 | + break; | |
| 544 | + case 'previous': | |
| 545 | + $this->_backward(); // Load previous page | |
| 546 | + break; | |
| 547 | + case 'install': | |
| 548 | + $iutil = new UpgradeUtil(); | |
| 549 | + $iutil->redirect('../wizard/index.php?step_name=installtype'); | |
| 550 | + break; | |
| 551 | + default: | |
| 552 | + // TODO : handle silent | |
| 553 | + $this->_landing(); | |
| 554 | + break; | |
| 555 | + } | |
| 556 | + $this->stepAction->paintAction(); // Display step | |
| 557 | + } | |
| 558 | + | |
| 559 | + /** | |
| 560 | + * Returns the step number | |
| 561 | + * | |
| 562 | + * @author KnowledgeTree Team | |
| 563 | + * @param none | |
| 564 | + * @access public | |
| 565 | + * @return integer $pos | |
| 566 | + */ | |
| 567 | + public function getStepPosition() { | |
| 568 | + $pos = 0; | |
| 569 | + foreach($this->simpleXmlObj->steps->step as $d_step) { | |
| 570 | + $step = (string) $d_step; | |
| 571 | + if ($step == $_GET['step_name']) { | |
| 572 | + break; | |
| 573 | + } | |
| 574 | + $pos++; | |
| 575 | + } | |
| 576 | + if(isset($_GET['step'])) { | |
| 577 | + if($_GET['step'] == "next") | |
| 578 | + $pos = $pos+1; | |
| 579 | + else | |
| 580 | + $pos = $pos-1; | |
| 581 | + } | |
| 582 | + | |
| 583 | + return $pos; | |
| 584 | + } | |
| 585 | + | |
| 586 | + /** | |
| 587 | + * Returns the step names for classes | |
| 588 | + * | |
| 589 | + * @author KnowledgeTree Team | |
| 590 | + * @param none | |
| 591 | + * @access public | |
| 592 | + * @return array | |
| 593 | + */ | |
| 594 | + public function getSteps() { | |
| 595 | + return $this->stepClassNames; | |
| 596 | + } | |
| 597 | + | |
| 598 | + /** | |
| 599 | + * Returns the steps as human readable string | |
| 600 | + * | |
| 601 | + * @author KnowledgeTree Team | |
| 602 | + * @param none | |
| 603 | + * @access public | |
| 604 | + * @return array | |
| 605 | + */ | |
| 606 | + public function getStepNames() { | |
| 607 | + return $this->stepNames; | |
| 608 | + } | |
| 609 | + | |
| 610 | + /** | |
| 611 | + * Returns whether or not a confirmation step is needed | |
| 612 | + * | |
| 613 | + * @author KnowledgeTree Team | |
| 614 | + * @param none | |
| 615 | + * @access public | |
| 616 | + * @return boolean | |
| 617 | + */ | |
| 618 | + public function getStepConfirmation() { | |
| 619 | + return $this->stepConfirmation; | |
| 620 | + } | |
| 621 | + | |
| 622 | + /** | |
| 623 | + * Return upgrade properties | |
| 624 | + * | |
| 625 | + * @author KnowledgeTree Team | |
| 626 | + * @param string | |
| 627 | + * @access public | |
| 628 | + * @return string | |
| 629 | + */ | |
| 630 | + public function getUpgradeProperties() { | |
| 631 | + return $this->upgradeProperties; | |
| 632 | + } | |
| 633 | + | |
| 634 | + /** | |
| 635 | + * Returns session | |
| 636 | + * | |
| 637 | + * @author KnowledgeTree Team | |
| 638 | + * @param none | |
| 639 | + * @access public | |
| 640 | + * @return boolean | |
| 641 | + */ | |
| 642 | + public function getSession() { | |
| 643 | + return $this->session; | |
| 644 | + } | |
| 645 | + | |
| 646 | + /** | |
| 647 | + * Dump of SESSION | |
| 648 | + * | |
| 649 | + * @author KnowledgeTree Team | |
| 650 | + * @param none | |
| 651 | + * @access public | |
| 652 | + * @return array | |
| 653 | + */ | |
| 654 | + public function showSession() { | |
| 655 | + echo '<pre>'; | |
| 656 | + print_r($_SESSION); | |
| 657 | + echo '</pre>'; | |
| 658 | + } | |
| 659 | + | |
| 660 | + /** | |
| 661 | + * Display errors that are not allowing the upgrader to operate | |
| 662 | + * | |
| 663 | + * @author KnowledgeTree Team | |
| 664 | + * @param none | |
| 665 | + * @access public | |
| 666 | + * @return void | |
| 667 | + */ | |
| 668 | + public function resolveErrors($errors) { | |
| 669 | + echo $errors; | |
| 670 | + exit(); | |
| 671 | + } | |
| 672 | + | |
| 673 | + private function _loadToSession($type, $values) { | |
| 674 | + if($values) { | |
| 675 | + $this->session->set($type , $values); | |
| 676 | + } | |
| 677 | + } | |
| 678 | +} | |
| 679 | + | |
| 680 | +?> | ... | ... |