Exemplo n.º 1
0
 /**
  * Returns the client side validation script
  *
  * @since     2.0
  * @access    public
  * @return    string    Javascript to perform validation, empty string if no 'client' rules were added
  */
 function getValidationScript()
 {
     if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
         return '';
     }
     include_once 'HTML/QuickForm/RuleRegistry.php';
     $registry = HTML_QuickForm_RuleRegistry::singleton();
     $test = array();
     $js_escape = array("\r" => '\\r', "\n" => '\\n', "\t" => '\\t', "'" => "\\'", '"' => '\\"', '\\' => '\\\\');
     foreach ($this->_rules as $elementName => $rules) {
         foreach ($rules as $rule) {
             if ('client' == $rule['validation']) {
                 unset($element);
                 $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
                 $rule['message'] = strtr($rule['message'], $js_escape);
                 if (isset($rule['group'])) {
                     $group = $this->getElement($rule['group']);
                     // No JavaScript validation for frozen elements
                     if ($group->isFrozen()) {
                         continue 2;
                     }
                     $elements = $group->getElements();
                     foreach (array_keys($elements) as $key) {
                         if ($elementName == $group->getElementName($key)) {
                             $element = $elements[$key];
                             break;
                         }
                     }
                 } elseif ($dependent) {
                     $element = array();
                     $element[] = $this->getElement($elementName);
                     foreach ($rule['dependent'] as $elName) {
                         $element[] = $this->getElement($elName);
                     }
                 } else {
                     $element = $this->getElement($elementName);
                 }
                 // No JavaScript validation for frozen elements
                 if (is_object($element) && $element->isFrozen()) {
                     continue 2;
                 } elseif (is_array($element)) {
                     foreach (array_keys($element) as $key) {
                         if ($element[$key]->isFrozen()) {
                             continue 3;
                         }
                     }
                 }
                 $test[] = $registry->getValidationScript($element, $elementName, $rule);
             }
         }
     }
     if (count($test) > 0) {
         return "<script type='text/javascript'>\n" . "/*\n" . " * Returning an array with the pairs of eFront and vLab eFront2vLabTimezones\n" . " */\n" . "function geteFront2vLabTimezones() {\n" . "\t\n" . "\tvLab2eFrontTimezones = {\n" . "\t\t'GMT-11:00'\t\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'Etc/GMT+11'\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'MIT'\t\t\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'Pacific/Apia'\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'Pacific/Midway'\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'Pacific/Niue'\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'Pacific/Pago_Pago'\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'Pacific/Samoa'\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t'US/Samoa'\t\t\t\t\t\t: 'Pacific/Samoa',\n" . "\t\t\n" . "\t\t'GMT-10:00'\t\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'America/Adak'\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'America/Atka'\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'Etc/GMT+10'\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'HST'\t\t\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'Pacific/Fakaofo'\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'Pacific/Honolulu'\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'Pacific/Johnston'\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'Pacific/Rarotonga'\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'Pacific/Tahiti'\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'SystemV/HST10'\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'US/Aleutian'\t\t\t\t\t: 'Pacific/Honolulu',\n" . "\t\t'US/Hawaii'\t\t\t\t\t\t: 'Pacific/Honolulu',\t\t\n" . "\t\t\n" . "\t\t'GMT-09:30'\t\t\t\t\t\t:  'Pacific/Honolulu', // This timzezone does not exist in eFront\n" . "\t\t'Pacific/Marquesas'\t\t\t\t:  'Pacific/Honolulu', // This timzezone does not exist in eFront\n" . "\t\t\n" . "\t\t'GMT-09:00'\t\t\t\t\t\t: 'US/Alaska',\n" . "\t\t'AST'\t\t\t\t\t\t\t: 'US/Alaska',\n" . "\t\t'America/Anchorage'\t\t\t\t: 'US/Alaska',\n" . "\t\t'America/Juneau'\t\t\t\t: 'US/Alaska',\n" . "\t\t'America/Nome'\t\t\t\t\t: 'US/Alaska',\n" . "\t\t'America/Yakutat'\t\t\t\t: 'US/Alaska',\n" . "\t\t'Etc/GMT+9'\t\t\t\t\t\t: 'US/Alaska',\n" . "\t\t'Pacific/Gambier'\t\t\t\t: 'US/Alaska',\n" . "\t\t'SystemV/YST9'\t\t\t\t\t: 'US/Alaska',\n" . "\t\t'SystemV/YST9YDT'\t\t\t\t: 'US/Alaska',\n" . "\t\t'US/Alaska'\t\t\t\t\t\t: 'US/Alaska',\t\t\n" . "\t\t\n" . "\t\t'GMT-08:00'\t\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'America/Dawson'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'America/Ensenada'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'America/Los_Angeles'\t\t\t: 'America/Los_Angeles',\n" . "\t\t'America/Tijuana'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'America/Vancouver'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'America/Whitehorse'\t\t\t: 'America/Los_Angeles',\n" . "\t\t'Canada/Pacific'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'Canada/Yukon'\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'Etc/GMT+8'\t\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'Mexico/BajaNorte'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'PST'\t\t\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'PST8PDT'\t\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'Pacific/Pitcairn'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'SystemV/PST8'\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'SystemV/PST8PDT'\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'US/Pacific'\t\t\t\t\t: 'America/Los_Angeles',\n" . "\t\t'US/Pacific-New'\t\t\t\t: 'America/Los_Angeles',\n" . "\n" . "\t\t'GMT-07:00'\t\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Boise'\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Cambridge_Bay'\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Chihuahua'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Dawson_Creek'\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Denver'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Edmonton'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Hermosillo'\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Inuvik'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Mazatlan'\t\t\t\t: 'America/Mazatlan',\n" . "\t\t'America/Phoenix'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Shiprock'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'America/Yellowknife'\t\t\t: 'America/Phoenix',\n" . "\t\t'Canada/Mountain'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'Etc/GMT+7'\t\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'MST'\t\t\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'MST7MDT'\t\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'Mexico/BajaSur'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'Navajo'\t\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'PNT'\t\t\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'SystemV/MST7'\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'SystemV/MST7MDT'\t\t\t\t: 'America/Phoenix',\n" . "\t\t'US/Arizona'\t\t\t\t\t: 'America/Phoenix',\n" . "\t\t'US/Mountain'\t\t\t\t\t: 'America/Phoenix',\n" . "\t\n" . "\t\t'GMT-06:00'\t\t\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Belize'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Cancun'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Chicago'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Costa_Rica'\t\t\t: 'America/Costa_Rica',\n" . "\t\t'America/El_Salvador'\t\t\t: 'America/Chicago',\n" . "\t\t'America/Guatemala'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Indiana/Knox'\t\t\t: 'America/Chicago',\n" . "\t\t'America/Indiana/Tell_City'\t\t: 'America/Chicago',\n" . "\t\t'America/Knox_IN'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Managua'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Menominee'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Merida'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Mexico_City'\t\t\t: 'America/Mexico_City',\n" . "\t\t'America/Monterrey'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/North_Dakota/Center'\t: 'America/Chicago',\n" . "\t\t'America/North_Dakota/New_Salem': 'America/Chicago',\n" . "\t\t'America/Rainy_River'\t\t\t: 'America/Chicago',\n" . "\t\t'America/Rankin_Inlet'\t\t\t: 'America/Chicago',\n" . "\t\t'America/Regina'\t\t\t\t: 'America/Chicago',\n" . "\t\t'America/Swift_Current'\t\t\t: 'America/Chicago',\n" . "\t\t'America/Tegucigalpa'\t\t\t: 'America/Chicago',\n" . "\t\t'America/Winnipeg'\t\t\t\t: 'America/Chicago',\n" . "\t\t'CST'\t\t\t\t\t\t\t: 'America/Chicago',\n" . "\t\t'CST6CDT'\t\t\t\t\t\t: 'America/Chicago',\n" . "\t\t'Canada/Central'\t\t\t\t: 'America/Chicago',\n" . "\t\t'Canada/East-Saskatchewan'\t\t: 'America/Chicago',\n" . "\t\t'Canada/Saskatchewan'\t\t\t: 'Canada/Saskatchewan',\n" . "\t\t'Chile/EasterIsland'\t\t\t: 'America/Chicago',\n" . "\t\t'Etc/GMT+6'\t\t\t\t\t\t: 'America/Chicago',\n" . "\t\t'Mexico/General'\t\t\t\t: 'America/Chicago',\n" . "\t\t'Pacific/Easter'\t\t\t\t: 'America/Chicago',\n" . "\t\t'Pacific/Galapagos'\t\t\t\t: 'America/Chicago',\n" . "\t\t'SystemV/CST6'\t\t\t\t\t: 'America/Chicago',\n" . "\t\t'SystemV/CST6CDT'\t\t\t\t: 'America/Chicago',\n" . "\t\t'US/Central'\t\t\t\t\t: 'America/Chicago',\n" . "\t\t'US/Indiana-Starke'\t\t\t\t: 'America/Chicago',\n" . "\t\t\n" . "\t\t'GMT-05:00'\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Atikokan'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Bogota'\t\t\t\t: 'America/Bogota',\n" . "\t\t'America/Cayman'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Coral_Harbour'\t\t\t: 'America/New_York',\n" . "\t\t'America/Detroit'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Fort_Wayne'\t\t\t: 'America/New_York',\n" . "\t\t'America/Grand_Turk'\t\t\t: 'America/New_York',\n" . "\t\t'America/Guayaquil'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Havana'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Indiana/Indianapolis'\t: 'America/Indiana/Indianapolis',\n" . "\t\t'America/Indiana/Marengo'\t\t: 'America/New_York',\n" . "\t\t'America/Indiana/Petersburg'\t: 'America/New_York',\n" . "\t\t'America/Indiana/Vevay'\t\t\t: 'America/New_York',\n" . "\t\t'America/Indiana/Vincennes'\t\t: 'America/New_York',\n" . "\t\t'America/Indiana/Winamac'\t\t: 'America/New_York',\n" . "\t\t'America/Indianapolis'\t\t\t: 'America/New_York',\n" . "\t\t'America/Iqaluit'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Jamaica'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Kentucky/Louisville'\t: 'America/New_York',\n" . "\t\t'America/Kentucky/Monticello'\t: 'America/New_York',\n" . "\t\t'America/Lima'\t\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Louisville'\t\t\t: 'America/New_York',\n" . "\t\t'America/Montreal'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Nassau'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/New_York'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Nipigon'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Panama'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Pangnirtung'\t\t\t: 'America/New_York',\n" . "\t\t'America/Port-au-Prince'\t\t: 'America/New_York',\n" . "\t\t'America/Resolute'\t\t\t\t: 'America/New_York',\n" . "\t\t'America/Thunder_Bay'\t\t\t: 'America/New_York',\n" . "\t\t'America/Toronto'\t\t\t\t: 'America/New_York',\n" . "\t\t'Canada/Eastern'\t\t\t\t: 'America/New_York',\n" . "\t\t'Cuba'\t\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'EST'\t\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'EST5EDT'\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'Etc/GMT+5'\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'IET'\t\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'Jamaica'\t\t\t\t\t\t: 'America/New_York',\n" . "\t\t'SystemV/EST5'\t\t\t\t\t: 'America/New_York',\n" . "\t\t'SystemV/EST5EDT'\t\t\t\t: 'America/New_York',\n" . "\t\t'US/East-Indiana'\t\t\t\t: 'America/New_York',\n" . "\t\t'US/Eastern'\t\t\t\t\t: 'America/New_York',\n" . "\t\t'US/Michigan'\t\t\t\t\t: 'America/New_York',\n" . "\n" . "\t\t'GMT-04:30'\t\t\t\t\t\t: 'America/Caracas',\n" . "\t\t'America/Caracas'\t\t\t\t: 'America/Caracas',\n" . "\t\t\n" . "\t\t'GMT-04:00'\t\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Anguilla'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Antigua'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Argentina/San_Luis'\t: 'America/Santiago',\n" . "\t\t'America/Aruba'\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Asuncion'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Barbados'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Blanc-Sablon'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Boa_Vista'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Campo_Grande'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Cuiaba'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Curacao'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Dominica'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Eirunepe'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Glace_Bay'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Goose_Bay'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Grenada'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Guadeloupe'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Guyana'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Halifax'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/La_Paz'\t\t\t\t: 'America/La_Paz',\n" . "\t\t'America/Manaus'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Marigot'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Martinique'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Moncton'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Montserrat'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Port_of_Spain'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Porto_Acre'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Porto_Velho'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Puerto_Rico'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Rio_Branco'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Santiago'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Santo_Domingo'\t\t\t: 'America/Santiago',\n" . "\t\t'America/St_Barthelemy'\t\t\t: 'America/Santiago',\n" . "\t\t'America/St_Kitts'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/St_Lucia'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/St_Thomas'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/St_Vincent'\t\t\t: 'America/Santiago',\n" . "\t\t'America/Thule'\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Tortola'\t\t\t\t: 'America/Santiago',\n" . "\t\t'America/Virgin'\t\t\t\t: 'America/Santiago',\n" . "\t\t'Antarctica/Palmer'\t\t\t\t: 'America/Santiago',\n" . "\t\t'Atlantic/Bermuda'\t\t\t\t: 'America/Santiago',\n" . "\t\t'Atlantic/Stanley'\t\t\t\t: 'America/Santiago',\n" . "\t\t'Brazil/Acre'\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'Brazil/West'\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'Canada/Atlantic'\t\t\t\t: 'America/Santiago',\n" . "\t\t'Chile/Continental'\t\t\t\t: 'America/Santiago',\n" . "\t\t'Etc/GMT+4'\t\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'PRT'\t\t\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'SystemV/AST4'\t\t\t\t\t: 'America/Santiago',\n" . "\t\t'SystemV/AST4ADT'\t\t\t\t: 'America/Santiago',\t\n" . "\t\t\n" . "\t\t'GMT-03:30'\t\t\t\t\t\t: 'Canada/Newfoundland', \n" . "\t\t'America/St_Johns'\t\t\t\t: 'Canada/Newfoundland',\n" . "\t\t'CNT'\t\t\t\t\t\t\t: 'Canada/Newfoundland',\n" . "\t\t'Canada/Newfoundland'\t\t\t: 'Canada/Newfoundland',\n" . "\t\t\n" . "\t\t'GMT-03:00'\t\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'AGT'\t\t\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Araguaina'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Buenos_Aires': 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Catamarca'\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/ComodRivadavia'\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Cordoba'\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Jujuy'\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/La_Rioja'\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Mendoza'\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Rio_Gallegos': 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Salta'\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/San_Juan'\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Tucuman'\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Argentina/Ushuaia'\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Bahia'\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Belem'\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Buenos_Aires'\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Catamarca'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Cayenne'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Cordoba'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Fortaleza'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Godthab'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Jujuy'\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Maceio'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Mendoza'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Miquelon'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Montevideo'\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Paramaribo'\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Recife'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Rosario'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Santarem'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'America/Sao_Paulo'\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'Antarctica/Rothera'\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'BET'\t\t\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'Brazil/East'\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t'Etc/GMT+3'\t\t\t\t\t\t: 'America/Buenos_Aires',\n" . "\t\t\n" . "\t\t'GMT-02:00'\t\t\t\t\t\t: 'Etc/GMT+2',\n" . "\t\t'America/Noronha'\t\t\t\t: 'Etc/GMT+2',\n" . "\t\t'Atlantic/South_Georgia'\t\t: 'Etc/GMT+2',\n" . "\t\t'Brazil/DeNoronha'\t\t\t\t: 'Etc/GMT+2',\n" . "\t\t'Etc/GMT+2'\t\t\t\t\t\t: 'Etc/GMT+2',\t\t\n" . "\t\t\n" . "\t\t'GMT-01:00'\t\t\t\t\t\t: 'Atlantic/Azores',\n" . "\t\t'America/Scoresbysund'\t\t\t: 'Atlantic/Azores',\n" . "\t\t'Atlantic/Azores'\t\t\t\t: 'Atlantic/Azores',\n" . "\t\t'Atlantic/Cape_Verde'\t\t\t: 'Atlantic/Cape_Verde',\n" . "\t\t'Etc/GMT+1'\t\t\t\t\t\t: 'Atlantic/Azores',\n" . "\t\t\n" . "\t\t'GMT+00:00'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Africa/Abidjan'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Accra'\t\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Bamako'\t\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Banjul'\t\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Bissau'\t\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Casablanca'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Conakry'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Dakar'\t\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/El_Aaiun'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Freetown'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Lome'\t\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Monrovia'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Nouakchott'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Ouagadougou'\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Sao_Tome'\t\t\t\t: 'Africa/Casablanca',\n" . "\t\t'Africa/Timbuktu'\t\t\t\t: 'Europe/London',\n" . "\t\t'America/Danmarkshavn'\t\t\t: 'Europe/London',\n" . "\t\t'Atlantic/Canary'\t\t\t\t: 'Europe/London',\n" . "\t\t'Atlantic/Faeroe'\t\t\t\t: 'Europe/London',\n" . "\t\t'Atlantic/Faroe'\t\t\t\t: 'Europe/London',\n" . "\t\t'Atlantic/Madeira'\t\t\t\t: 'Europe/London',\n" . "\t\t'Atlantic/Reykjavik'\t\t\t: 'Europe/London',\n" . "\t\t'Atlantic/St_Helena'\t\t\t: 'Europe/London',\n" . "\t\t'Eire'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/GMT'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/GMT+0'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/GMT-0'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/GMT0'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/Greenwich'\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/UCT'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/UTC'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/Universal'\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Etc/Zulu'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Europe/Belfast'\t\t\t\t: 'Europe/London',\n" . "\t\t'Europe/Dublin'\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Europe/Guernsey'\t\t\t\t: 'Europe/London',\n" . "\t\t'Europe/Isle_of_Man'\t\t\t: 'Europe/London',\n" . "\t\t'Europe/Jersey'\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Europe/Lisbon'\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Europe/London'\t\t\t\t\t: 'Europe/London',\n" . "\t\t'GB'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'GB-Eire'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'GMT'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'GMT0'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Greenwich'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Iceland'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Portugal'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'UCT'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'UTC'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Universal'\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'WET'\t\t\t\t\t\t\t: 'Europe/London',\n" . "\t\t'Zulu'\t\t\t\t\t\t\t: 'Europe/London',\t\t\n" . "\n" . "\t\t'GMT+01:00'\t\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Algiers'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Bangui'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Brazzaville'\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Ceuta'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Douala'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Kinshasa'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Lagos'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Libreville'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Luanda'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Malabo'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Ndjamena'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Niamey'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Porto-Novo'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Tunis'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Africa/Windhoek'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Arctic/Longyearbyen'\t\t\t: 'Europe/Paris',\n" . "\t\t'Atlantic/Jan_Mayen'\t\t\t: 'Europe/Paris',\n" . "\t\t'CET'\t\t\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'ECT'\t\t\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Etc/GMT-1'\t\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Amsterdam'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Andorra'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Belgrade'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Berlin'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Bratislava'\t\t\t\t: 'Europe/Bratislava',\n" . "\t\t'Europe/Brussels'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Budapest'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Copenhagen'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Gibraltar'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Ljubljana'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Luxembourg'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Madrid'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Malta'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Monaco'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Oslo'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Paris'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Podgorica'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Prague'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Rome'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/San_Marino'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Sarajevo'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Skopje'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Stockholm'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Tirane'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Vaduz'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Vatican'\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Vienna'\t\t\t\t\t: 'Europe/Vienna',\n" . "\t\t'Europe/Warsaw'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Europe/Zagreb'\t\t\t\t\t: 'Europe/Zagreb',\n" . "\t\t'Europe/Zurich'\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'MET'\t\t\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t'Poland'\t\t\t\t\t\t: 'Europe/Paris',\n" . "\t\t\t\t\t\n" . "\t\t'GMT+02:00' \t\t\t\t\t: 'Africa/Cairo',\n" . "\t\t'ART' \t\t\t\t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Blantyre' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Bujumbura' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Cairo' \t\t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Gaborone' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Harare' \t\t\t\t: 'Africa/Harare',\n" . "\t\t'Africa/Johannesburg' \t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Kigali' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Lubumbashi' \t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Lusaka' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Maputo' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Maseru' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Mbabane' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Africa/Tripoli' \t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Asia/Amman' \t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Beirut' \t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Damascus' \t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Gaza' \t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Istanbul' \t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Jerusalem' \t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Nicosia' \t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Asia/Tel_Aviv' \t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'CAT' \t\t\t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'EET' \t\t\t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Egypt' \t\t\t\t\t\t: 'Africa/Cairo',\n" . "\t\t'Etc/GMT-2' \t\t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Athens' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Bucharest' \t\t\t\t: 'Europe/Bucharest',\n" . "\t\t'Europe/Chisinau' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Helsinki' \t\t\t\t: 'Europe/Helsinki',\n" . "\t\t'Europe/Istanbul' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Kaliningrad' \t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Kiev' \t\t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Mariehamn' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Minsk' \t\t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Nicosia' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Riga' \t\t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Simferopol' \t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Sofia' \t\t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Tallinn' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Tiraspol' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Uzhgorod' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Vilnius' \t\t\t\t: 'Europe/Athens',\n" . "\t\t'Europe/Zaporozhye' \t\t\t: 'Europe/Athens',\n" . "\t\t'Israel' \t\t\t\t\t\t: 'Asia/Jerusalem',\n" . "\t\t'Libya' \t\t\t\t\t\t: 'Europe/Athens',\n" . "\t\t'Turkey' \t\t\t\t\t\t: 'Europe/Athens',\n" . "\t\t\n" . "\t\t'GMT+03:00' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Africa/Addis_Ababa' \t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Asmara' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Asmera' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Dar_es_Salaam' \t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Djibouti' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Kampala' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Khartoum' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Mogadishu' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Africa/Nairobi' \t\t\t\t: 'Africa/Nairobi',\n" . "\t\t'Antarctica/Syowa' \t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Asia/Aden' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Asia/Baghdad' \t\t\t\t\t: 'Asia/Baghdad',\n" . "\t\t'Asia/Bahrain' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Asia/Kuwait' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Asia/Qatar' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Asia/Riyadh' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'EAT' \t\t\t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Etc/GMT-3' \t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Europe/Moscow' \t\t\t\t: 'Europe/Moscow',\n" . "\t\t'Europe/Volgograd' \t\t\t\t: 'Europe/Moscow',\n" . "\t\t'Indian/Antananarivo' \t\t\t: 'Asia/Kuwait',\n" . "\t\t'Indian/Comoro' \t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'Indian/Mayotte' \t\t\t\t: 'Asia/Kuwait',\n" . "\t\t'W-SU' \t\t\t\t\t\t\t: 'Asia/Kuwait',\n" . "\t\t\n" . "\t\t'GMT+03:07' \t\t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t'Asia/Riyadh87' \t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t'Asia/Riyadh88' \t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t'Asia/Riyadh89' \t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t'Mideast/Riyadh87' \t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t'Mideast/Riyadh88' \t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t'Mideast/Riyadh89' \t\t\t\t: 'Asia/Kuwait', // This timzezone does not exist in eFront\n" . "\t\t\n" . "\t\t'GMT+03:30' \t\t\t\t\t: 'Asia/Tehran',\n" . "\t\t'Asia/Tehran' \t\t\t\t\t: 'Asia/Tehran',\n" . "\t\t'Iran' \t\t\t\t\t\t\t: 'Asia/Tehran',\t\n" . "\t\t\t\n" . "\t\t'GMT+04:00' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Asia/Baku' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Asia/Dubai' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Asia/Muscat' \t\t\t\t\t: 'Asia/Muscat',\n" . "\t\t'Asia/Tbilisi' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Asia/Yerevan' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Etc/GMT-4' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Europe/Samara' \t\t\t\t: 'Asia/Baku',\n" . "\t\t'Indian/Mahe' \t\t\t\t\t: 'Asia/Baku',\n" . "\t\t'Indian/Mauritius' \t\t\t\t: 'Asia/Baku',\n" . "\t\t'Indian/Reunion' \t\t\t\t: 'Asia/Baku',\n" . "\t\t'NET' \t\t\t\t\t\t\t: 'Asia/Baku',\t\n" . "\t\t\t\t\n" . "\t\t'GMT+04:30' \t\t\t\t\t: 'Asia/Kabul',\n" . "\t\t'Asia/Kabul' \t\t\t\t\t: 'Asia/Kabul',\n" . "\t\n" . "\t\t'GMT+05:00' \t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Aqtau' \t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Aqtobe' \t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Ashgabat' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Ashkhabad' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Dushanbe' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Karachi' \t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Oral' \t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Samarkand' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Tashkent' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Asia/Yekaterinburg' \t\t\t: 'Asia/Yekaterinburg',\n" . "\t\t'Etc/GMT-5' \t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Indian/Kerguelen' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'Indian/Maldives' \t\t\t\t: 'Asia/Karachi',\n" . "\t\t'PLT' \t\t\t\t\t\t\t: 'Asia/Karachi',\n" . "\t\t\n" . "\t\t'GMT+05:30' \t\t\t\t\t: 'Asia/Calcutta',\n" . "\t\t'Asia/Calcutta' \t\t\t\t: 'Asia/Calcutta',\n" . "\t\t'Asia/Colombo' \t\t\t\t\t: 'Asia/Colombo',\n" . "\t\t'Asia/Kolkata' \t\t\t\t\t: 'Asia/Calcutta',\n" . "\t\t'IST' \t\t\t\t\t\t\t: 'Asia/Calcutta',\t\t\n" . "\t\n" . "\t\t'GMT+05:45' \t\t\t\t\t: 'Asia/Kathmandu',\n" . "\t\t'Asia/Kathmandu' \t\t\t\t: 'Asia/Kathmandu',\n" . "\t\t'Asia/Katmandu' \t\t\t\t: 'Asia/Kathmandu',\t\t\n" . "\t\n" . "\t\t'GMT+06:00' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Antarctica/Mawson' \t\t\t: 'Asia/Almaty',\n" . "\t\t'Antarctica/Vostok' \t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Almaty' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Bishkek' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Dacca' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Dhaka' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Novosibirsk' \t\t\t\t: 'Asia/Novosibirsk',\n" . "\t\t'Asia/Omsk' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Qyzylorda' \t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Thimbu' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Asia/Thimphu' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'BST' \t\t\t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Etc/GMT-6' \t\t\t\t\t: 'Asia/Almaty',\n" . "\t\t'Indian/Chagos' \t\t\t\t: 'Asia/Almaty',\n" . "\n" . "\t\t'GMT+06:30' \t\t\t\t\t: 'Asia/Rangoon',\n" . "\t\t'Asia/Rangoon' \t\t\t\t\t: 'Asia/Rangoon',\n" . "\t\t'Indian/Cocos' \t\t\t\t\t: 'Asia/Rangoon',\n" . "\t\n" . "\t\t'GMT+07:00' \t\t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Antarctica/Davis' \t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Bangkok' \t\t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Ho_Chi_Minh' \t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Hovd' \t\t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Jakarta' \t\t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Krasnoyarsk' \t\t\t\t: 'Asia/Krasnoyarsk',\n" . "\t\t'Asia/Phnom_Penh' \t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Pontianak' \t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Saigon' \t\t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Asia/Vientiane' \t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Etc/GMT-7' \t\t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'Indian/Christmas' \t\t\t\t: 'Asia/Bangkok',\n" . "\t\t'VST' \t\t\t\t\t\t\t: 'Asia/Bangkok',\t\n" . "\t\t\n" . "\t\t'GMT+08:00' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Antarctica/Casey' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Brunei' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Choibalsan' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Chongqing' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Chungking' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Harbin' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Hong_Kong' \t\t\t\t: 'Asia/Hong_Kong',\n" . "\t\t'Asia/Irkutsk' \t\t\t\t\t: 'Asia/Irkutsk',\n" . "\t\t'Asia/Kashgar' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Kuala_Lumpur' \t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Kuching' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Macao' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Macau' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Makassar' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Manila' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Shanghai' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Singapore' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Taipei' \t\t\t\t\t: 'Asia/Taipei',\n" . "\t\t'Asia/Ujung_Pandang' \t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Ulaanbaatar' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Ulan_Bator' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Asia/Urumqi' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Australia/Perth' \t\t\t\t: 'Asia/Perth',\n" . "\t\t'Australia/West' \t\t\t\t: 'Asia/Singapore',\n" . "\t\t'CTT' \t\t\t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Etc/GMT-8' \t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Hongkong' \t\t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'PRC' \t\t\t\t\t\t\t: 'Asia/Singapore',\n" . "\t\t'Singapore' \t\t\t\t\t: 'Asia/Singapore',\t\n" . "\t\n" . "\t\t'GMT+08:45' \t\t\t\t\t: 'Asia/Singapore', // This timzezone does not exist in eFront\n" . "\t\t'Australia/Eucla' \t\t\t\t: 'Asia/Singapore', // This timzezone does not exist in eFront\n" . "\n" . "\t\t'GMT+09:00' \t\t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Asia/Dili' \t\t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Asia/Jayapura' \t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Asia/Pyongyang' \t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Asia/Seoul' \t\t\t\t\t: 'Asia/Seoul',\n" . "\t\t'Asia/Tokyo' \t\t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Asia/Yakutsk' \t\t\t\t\t: 'Asia/Yakutsk',\n" . "\t\t'Etc/GMT-9' \t\t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'JST' \t\t\t\t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Japan' \t\t\t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'Pacific/Palau' \t\t\t\t: 'Asia/Tokyo',\n" . "\t\t'ROK' \t\t\t\t\t\t\t: 'Asia/Tokyo',\t\n" . "\t\t\n" . "\t\t'GMT+09:30' \t\t\t\t\t: 'Australia/Darwin',\n" . "\t\t'ACT' \t\t\t\t\t\t\t: 'Australia/Darwin',\n" . "\t\t'Australia/Adelaide' \t\t\t: 'Australia/Adelaide',\n" . "\t\t'Australia/Broken_Hill' \t\t: 'Australia/Darwin',\n" . "\t\t'Australia/Darwin' \t\t\t\t: 'Australia/Darwin',\n" . "\t\t'Australia/North' \t\t\t\t: 'Australia/Darwin',\n" . "\t\t'Australia/South' \t\t\t\t: 'Australia/Darwin',\n" . "\t\t'Australia/Yancowinna' \t\t\t: 'Australia/Darwin',\n" . "\t\n" . "\t\t'GMT+10:00' \t\t\t\t\t: 'Australia/Canberra',\n" . "\t\t'AET' \t\t\t\t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Antarctica/DumontDUrville' \t: 'Australia/Canberra',\n" . "\t\t'Asia/Sakhalin' \t\t\t\t: 'Asia/Vladivostok',\n" . "\t\t'Asia/Vladivostok' \t\t\t\t: '',\n" . "\t\t'Australia/ACT' \t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Brisbane' \t\t\t: 'Australia/Brisbane',\n" . "\t\t'Australia/Canberra' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Currie' \t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Hobart' \t\t\t\t: 'Australia/Hobart',\n" . "\t\t'Australia/Lindeman' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Melbourne' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/NSW' \t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Queensland' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Sydney' \t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Tasmania' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Australia/Victoria' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Etc/GMT-10' \t\t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Pacific/Guam' \t\t\t\t\t: 'Pacific/Guam',\n" . "\t\t'Pacific/Port_Moresby' \t\t\t: 'Australia/Canberra',\n" . "\t\t'Pacific/Saipan' \t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Pacific/Truk' \t\t\t\t\t: 'Australia/Canberra',\n" . "\t\t'Pacific/Yap' \t\t\t\t\t: 'Australia/Canberra',\n" . "\t\t\n" . "\t\t'GMT+10:30' \t\t\t\t\t: 'Australia/Canberra', // This timzezone does not exist in eFront\n" . "\t\t'Australia/LHI' \t\t\t\t: 'Australia/Canberra', // This timzezone does not exist in eFront\n" . "\t\t'Australia/Lord_Howe' \t\t\t: 'Australia/Canberra', // This timzezone does not exist in eFront\n" . "\t\t\t\n" . "\t\t'GMT+11:00' \t\t\t\t\t: 'Asia/Magadan',\n" . "\t\t'Asia/Magadan' \t\t\t\t\t: 'Asia/Magadan',\n" . "\t\t'Etc/GMT-11' \t\t\t\t\t: 'Asia/Magadan',\n" . "\t\t'Pacific/Efate' \t\t\t\t: 'Asia/Magadan',\n" . "\t\t'Pacific/Guadalcanal' \t\t\t: 'Asia/Magadan',\n" . "\t\t'Pacific/Kosrae' \t\t\t\t: 'Asia/Magadan',\n" . "\t\t'Pacific/Noumea' \t\t\t\t: 'Asia/Magadan',\n" . "\t\t'Pacific/Ponape' \t\t\t\t: 'Asia/Magadan',\n" . "\t\t'SST' \t\t\t\t\t\t\t: 'Asia/Magadan',\n" . "\t\t\n" . "\t\t'GMT+11:30' \t\t\t\t\t: 'Asia/Magadan', // This timzezone does not exist in eFront\n" . "\t\t'Pacific/Norfolk' \t\t\t\t: 'Asia/Magadan', // This timzezone does not exist in eFront\n" . "\t\n" . "\t\t'GMT+12:00' \t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Antarctica/McMurdo' \t\t\t: 'Pacific/Auckland',\n" . "\t\t'Antarctica/South_Pole' \t\t: 'Pacific/Auckland',\n" . "\t\t'Asia/Anadyr' \t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Asia/Kamchatka' \t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Etc/GMT-12' \t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Kwajalein' \t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'NST' \t\t\t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'NZ' \t\t\t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Auckland' \t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Fiji' \t\t\t\t\t: 'Pacific/Fiji',\n" . "\t\t'Pacific/Funafuti' \t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Kwajalein' \t\t\t: 'Pacific/Kwajalein',\n" . "\t\t'Pacific/Majuro' \t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Nauru' \t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Tarawa' \t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Wake' \t\t\t\t\t: 'Pacific/Auckland',\n" . "\t\t'Pacific/Wallis' \t\t\t\t: 'Pacific/Auckland',\t\n" . "\t\t\n" . "\t\t'GMT+12:45' \t\t\t\t\t: 'Pacific/Tongatapu', // This timzezone does not exist in eFront\n" . "\t\t'NZ-CHAT' \t\t\t\t\t\t: 'Pacific/Tongatapu', // This timzezone does not exist in eFront\n" . "\t\t'Pacific/Chatham' \t\t\t\t: 'Pacific/Tongatapu', // This timzezone does not exist in eFront\n" . "\t\t\n" . "\t\t'GMT+13:00' \t\t\t\t\t: 'Pacific/Tongatapu',\n" . "\t\t'Etc/GMT-13' \t\t\t\t\t: 'Pacific/Tongatapu',\n" . "\t\t'Pacific/Enderbury' \t\t\t: 'Pacific/Tongatapu',\n" . "\t\t'Pacific/Tongatapu' \t\t\t: 'Pacific/Tongatapu',\n" . "\t\t\n" . "\t\t'GMT+14:00' \t\t\t\t\t: 'Pacific/Tongatapu', // This timzezone does not exist in eFront\n" . "\t\t'Etc/GMT-14' \t\t\t\t\t: 'Pacific/Tongatapu', // This timzezone does not exist in eFront\n" . "\t\t'Pacific/Kiritimati' \t\t\t: 'Pacific/Tongatapu' // This timzezone does not exist in eFront\n" . "\t}\n" . "\n" . "\treturn vLab2eFrontTimezones;\n" . "}\n" . "\n" . "/*\n" . " * *********************************\n" . " * Returns true, if values are valid\n" . " * *********************************\n" . " */\n" . "function validateProfileForm(frm) {\n" . "\tretVal = false;\n" . "\tdone = false;\n" . "\n" . "\tisAddUser = frm.elements['IS_ADD_USER'].value;\n;" . "\t\n" . "\tusername \t= frm.elements['login'].value\t\t;\n" . "\tpassword \t= frm.elements['password'].value\t;\n" . "   email \t\t= frm.elements['email'].value\t;\n" . "\t\n" . "\tvLabURL = 'http://ita-portal.cis.fiu.edu/';\n" . "\twscallsURL = vLabURL + 'mod/deva/php/virtuallabs-wscalls.php';\n" . "\t\n" . "\tif (!done && isAddUser && (username != '')) {\n" . "    \tjQuery.ajax({\n" . "    \t\ttype: 'POST',\n" . "    \t\turl: wscallsURL,\n" . "    \t\tdataType: 'json',\n" . "    \t\tasync: false,\n" . "    \t\ttimeout: 4000,\n" . "    \t\tdata: {\n" . "    \t\t\taction: 'getUserProfileByUsername',\n" . "    \t\t\tusername: username\n" . "    \t\t},\n" . "    \t\tsuccess: function(userProfile){\n" . "    \t\t\tvar message = '';\n" . "   \t \n" . "   \t \t\tif (userProfile != null) {\n" . "\t\t\t\t\tif (userProfile.success) {\n" . "\t\t\t\t\t\t\n" . "\t\t\t\t\t\tif ((userProfile.userName \t\t== frm.elements['login'].value\t\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.password \t\t== frm.elements['password'].value\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.emailAddress \t== frm.elements['email'].value)\n" . "\t\t\t\t\t\t) {\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t} else {\n" . "\t\t\t\t\t\t\talert(\"This user has an account in IT Scholars as follows: \\n\" +\n" . "\t\t\t\t\t\t\t\t'userName\t\t: ' + userProfile.userName \t\t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'firstNmae\t\t: ' + userProfile.firstName \t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'lastName\t\t: ' + userProfile.lastName \t\t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'emailAddress\t: ' + userProfile.emailAddress \t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'timeZone\t\t: ' + userProfile.timeZone \t\t+ \" \\n\" \n" . "\t\t\t\t\t\t\t);\t\n" . "\t\n" . "\t\t\t\t\t\t\tvLab2eFrontTimezones = geteFront2vLabTimezones();\n" . "   \t \n" . "\t\t\t\t\t\t\tfrm.elements['login'].value \t\t= userProfile.userName \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['password'].value \t\t= userProfile.password \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['passrepeat'].value \t= userProfile.password \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['name'].value \t\t\t= userProfile.firstName \t;\n" . "\t\t\t\t\t\t\tfrm.elements['surname'].value\t\t= userProfile.lastName \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['email'].value \t\t= userProfile.emailAddress \t;\n" . "\t\t\t\t\t\t\tfrm.elements['timezone'].value \t\t= vLab2eFrontTimezones[userProfile.timeZone];\n" . "\t\t\t\t\t\t\t\n" . "\t\t\t\t\t\t\t\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t}\n" . "\t\t\t\t\t\t\n" . "\t\t\t\t\t} else {\n" . "\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\tdone = false;\n" . "\t\t\t\t\t}\n" . "    \t\t\t} else {\n" . "\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\tdone = false;\n" . "\t\t\t\t}\n" . "    \t\t\t\n" . "    \t\t},\n" . "    \t\terror: function(XMLHttpRequest, textStatus, errorThrown){\n" . "    \t\t\talert('error:' + textStatus + 'errorThrown: ' + errorThrown);\n" . "    \t\t}\n" . "    \t});\n" . "\t}\n" . "\t\n" . "\tif (!done && (email != '')) {\n" . "    \tjQuery.ajax({\n" . "    \t\ttype: 'POST',\n" . "    \t\turl: wscallsURL,\n" . "    \t\tdataType: 'json',\n" . "    \t\tasync: false,\n" . "    \t\ttimeout: 4000,\n" . "    \t\tdata: {\n" . "    \t\t\taction: 'getUserProfileByEmail',\n" . "    \t\t\temail: email\n" . "    \t\t},\n" . "    \t\tsuccess: function(userProfile){\n" . "    \t\t\tvar message = '';\n" . "   \t \n" . "   \t \t\tif (userProfile != null) {\n" . "\t\t\t\t\tif (userProfile.success) {\n" . "\t\t\t\t\t\t\n" . "\t\t\t\t\t\tif (!isAddUser &&\n" . "\t\t\t\t\t\t\t(userProfile.userName \t\t!= frm.elements['login'].value\t\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.emailAddress \t== frm.elements['email'].value)) {\n" . "\t\t\t\t\t\t\talert('You must use another email!' + \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'This email (' + userProfile.emailAddress + ') is already in use in vLab by the following user:'******'userName\t\t: ' + userProfile.userName \t\t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'firstNmae\t\t: ' + userProfile.firstName \t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'lastName\t\t: ' + userProfile.lastName \t\t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'emailAddress\t: ' + userProfile.emailAddress \t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'timeZone\t\t: ' + userProfile.timeZone \t\t+ \" \\n\" \n" . "\t\t\t\t\t\t\t);\n" . "\t\t\t\t\t\t\tfrm.elements['email'].value \t\t= 'Please enter another email!';\n" . "\t\t\t\t\t\t\tretVal = false;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t} else if (!isAddUser &&\n" . "\t\t\t\t\t\t\t(userProfile.userName \t\t== frm.elements['login'].value\t\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.emailAddress \t== frm.elements['email'].value\t\t\t)) {\n" . "\t\t\t\t\t\t\tif ((userProfile.password != frm.elements['password'].value) && (frm.elements['password'].value != '')) {\n" . "\t\t\t\t\t\t\t\talert('Note that synchronizing the new password may take about 5 minutes. Please be patient ...');\n" . "\t\t\t\t\t\t\t}\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t} else if (isAddUser &&\n" . "\t\t\t\t\t\t\t(userProfile.userName \t\t== frm.elements['login'].value\t\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.password \t\t== frm.elements['password'].value\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.emailAddress \t== frm.elements['email'].value\t\t\t)) {\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t} else if (isAddUser) {\n" . "\t\t\t\t\t\t\talert(\"This user has an account in IT Scholars as follows: \\n\" +\n" . "\t\t\t\t\t\t\t\t'userName\t\t: ' + userProfile.userName \t\t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'firstNmae\t\t: ' + userProfile.firstName \t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'lastName\t\t: ' + userProfile.lastName \t\t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'emailAddress\t: ' + userProfile.emailAddress \t+ \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'timeZone\t\t: ' + userProfile.timeZone \t\t+ \" \\n\" \n" . "\t\t\t\t\t\t\t);\t\n" . "\t\n" . "\t\t\t\t\t\t\tvLab2eFrontTimezones = geteFront2vLabTimezones();\n" . "   \t \n" . "\t\t\t\t\t\t\tfrm.elements['login'].value \t\t= userProfile.userName \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['password'].value \t= userProfile.password \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['passrepeat'].value \t= userProfile.password \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['name'].value \t\t\t= userProfile.firstName \t;\n" . "\t\t\t\t\t\t\tfrm.elements['surname'].value\t\t= userProfile.lastName \t\t;\n" . "\t\t\t\t\t\t\tfrm.elements['email'].value \t\t= userProfile.emailAddress \t;\n" . "\t\t\t\t\t\t\tfrm.elements['timezone'].value \t\t= vLab2eFrontTimezones[userProfile.timeZone];\n" . "\t\t\t\t\t\t\t\n" . "\t\t\t\t\t\t\t\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t}\n" . "\t\t\t\t\t\t\n" . "\t\t\t\t\t} else {\n" . "\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\tdone = false;\n" . "\t\t\t\t\t}\n" . "    \t\t\t} else {\n" . "\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\tdone = false;\n" . "\t\t\t\t}\n" . "    \t\t\t\n" . "    \t\t},\n" . "    \t\terror: function(XMLHttpRequest, textStatus, errorThrown){\n" . "    \t\t\talert('error:' + textStatus + 'errorThrown: ' + errorThrown);\n" . "    \t\t}\n" . "    \t});\n" . "\t}\n" . "\n" . "\t\n" . "\t// done = true;\n" . "\t// return retVal;\n" . "\t\n" . "\t\n" . "  return retVal;\n" . "}\n" . "\n" . "/*\n" . " * *********************************\n" . " * Returns true, if values are valid\n" . " * *********************************\n" . " */\n" . "function validateSignupForm(frm) {\n" . "\tretVal = false;\n" . "\tdone = false;\n" . "\t\n" . "\tusername \t= frm.elements['login'].value\t\t;\n" . "\tpassword \t= frm.elements['password'].value\t;\n" . "   email \t\t= frm.elements['email'].value\t;\n" . "\t\n" . "\tvLabURL = 'http://ita-portal.cis.fiu.edu/';\n" . "\twscallsURL = vLabURL + 'mod/deva/php/virtuallabs-wscalls.php';\n" . "\t\n" . "\tif (!done && (username != '')) {\n" . "    \tjQuery.ajax({\n" . "    \t\ttype: 'POST',\n" . "    \t\turl: wscallsURL,\n" . "    \t\tdataType: 'json',\n" . "    \t\tasync: false,\n" . "    \t\ttimeout: 4000,\n" . "    \t\tdata: {\n" . "    \t\t\taction: 'getUserProfileByUsername',\n" . "    \t\t\tusername: username\n" . "    \t\t},\n" . "    \t\tsuccess: function(userProfile){\n" . "    \t\t\tvar message = '';\n" . "   \t \n" . "   \t \t\tif (userProfile != null) {\n" . "\t\t\t\t\tif (userProfile.success) {\n" . "\t\t\t\t\t\tif ((userProfile.userName \t\t== frm.elements['login'].value) &&\n" . "\t\t\t\t\t\t\t(userProfile.emailAddress \t== frm.elements['email'].value)\n" . "\t\t\t\t\t\t) {\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t} else {\n" . "\t\t\t\t\t\t\talert('The login, ' + userProfile.userName + ', is NOT available!');\n" . "\t\t\t\t\t\t\tfrm.elements['login'].value \t\t= '';\n" . "\t\t\t\t\t\t\tretVal = false;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t}\n" . "\t\t\t\t\t\t\n" . "\t\t\t\t\t} else {\n" . "\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\tdone = false;\n" . "\t\t\t\t\t}\n" . "    \t\t\t} else {\n" . "\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\tdone = false;\n" . "\t\t\t\t}\n" . "    \t\t\t\n" . "    \t\t},\n" . "    \t\terror: function(XMLHttpRequest, textStatus, errorThrown){\n" . "    \t\t\talert('error:' + textStatus + 'errorThrown: ' + errorThrown);\n" . "    \t\t}\n" . "    \t});\n" . "\t}\n" . "\t\n" . "\tif (!done && (email != '')) {\n" . "    \tjQuery.ajax({\n" . "    \t\ttype: 'POST',\n" . "    \t\turl: wscallsURL,\n" . "    \t\tdataType: 'json',\n" . "    \t\tasync: false,\n" . "    \t\ttimeout: 4000,\n" . "    \t\tdata: {\n" . "    \t\t\taction: 'getUserProfileByEmail',\n" . "    \t\t\temail: email\n" . "    \t\t},\n" . "    \t\tsuccess: function(userProfile){\n" . "    \t\t\tvar message = '';\n" . "   \t \n" . "   \t \t\tif (userProfile != null) {\n" . "\t\t\t\t\tif (userProfile.success) {\n" . "\t\t\t\t\t\tif ((userProfile.userName \t\t!= frm.elements['login'].value\t\t\t) &&\n" . "\t\t\t\t\t\t\t(userProfile.emailAddress \t== frm.elements['email'].value)) {\n" . "\t\t\t\t\t\t\talert('The email, ' + userProfile.emailAddress + ', is not available! ' +\n" . "\t\t\t\t\t\t\t\t'To proceed, you have the following options:' + \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'\t1) Simply use another email.' + \" \\n\" +\n" . "\t\t\t\t\t\t\t\t'\t2) If you remember your username and password from IT Scholars, use them together with ' + userProfile.emailAddress + '.'\n" . "\t\t\t\t\t\t\t);\n" . "\t\t\t\t\t\t\tfrm.elements['email'].value \t\t= 'Please enter another email or use your IT Scholars username/password that is associated with ' + userProfile.emailAddress + '.';\n" . "\t\t\t\t\t\t\tretVal = false;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t} else {\n" . "\t\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\t\tdone = true;\n" . "\t\t\t\t\t\t}\n" . "\t\t\t\t\t} else {\n" . "\t\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\t\tdone = false;\n" . "\t\t\t\t\t}\n" . "    \t\t\t} else {\n" . "\t\t\t\t\tretVal = true;\n" . "\t\t\t\t\tdone = false;\n" . "\t\t\t\t}\n" . "    \t\t\t\n" . "    \t\t},\n" . "    \t\terror: function(XMLHttpRequest, textStatus, errorThrown){\n" . "    \t\t\talert('error:' + textStatus + 'errorThrown: ' + errorThrown);\n" . "    \t\t}\n" . "    \t});\n" . "\t}\n" . "\n" . "\t\n" . "  return retVal;\n" . "}\n" . "\n" . "function print_r(arr,level) {\n" . "\tvar dumped_text = '';\n" . "\tif(!level) level = 0;\n" . "\t\n" . "\t//The padding given at the beginning of the line.\n" . "\tvar level_padding = '';\n" . "\tfor(var j=0;j<level+1;j++) level_padding += '    ';\n" . "\tif(typeof(arr) == 'object') { //Array/Hashes/Objects \n" . "\t\tfor(var item in arr) {\n" . "\t\t\tvar value = arr[item];\n" . "\t\t\t\n" . "\t\t\tif(typeof(value) == 'object') { //If it is an array,\n" . "\t\t\t\tdumped_text += level_padding + \"\\'\" + item + \"' ...\\n\";\n" . "\t\t\t\tdumped_text += print_r(value,level+1);\n" . "\t\t\t} else {\n" . "\t\t\t\tdumped_text += level_padding + \"\\'\" + item + \"\\' => \\\"\" + value + \"\\\"\\n\";\n" . "\t\t\t}\n" . "\t\t}\n" . "\t} else { //Stings/Chars/Numbers etc.\n" . "\t\tdumped_text = \"===>\"+arr+\"<===(\"+typeof(arr)+\")\";\n" . "\t}\n" . "\treturn dumped_text;\n" . "}\n" . "//<![CDATA[\n" . "function validate_" . $this->_attributes['id'] . "(frm) {\n" . "\t\n" . "\tretVal = true;\n" . "\tisProfileForm = frm.elements['IS_PROFILE_FORM'].value;\n" . "\tif (isProfileForm) {\n" . "\t\tretVal = validateProfileForm(frm); \n" . "\t\tif (retVal) {\n" . "\t\t\tuserType = frm.elements['user_type'].value;\n;" . "\t\t\tvalueOfInvalidUserType = frm.elements['VALUE_OF_INVALID_USER_TYPE'].value;\n;" . "\t\t\tif (userType == valueOfInvalidUserType) {;\n" . "\t\t\t\talert('Invalid user type! Please choose a valid user type.');\n" . "\t\t\t\tretVal = false;\n" . "\t\t\t\tdone = true;\n" . "\t\t\t} \n" . "\t\t} \n" . "\t} \n" . "\tisSignupForm = frm.elements['IS_SIGNUP_FORM'].value;\n" . "\tif (isSignupForm) {\n" . "\t\tretVal = validateSignupForm(frm); \n" . "\t} \n" . "\t\n" . "\tif (!retVal) \n" . "\t\treturn retVal; \n" . "\t\n" . "  var value = '';\n" . "  var errFlag = new Array();\n" . "  var _qfGroups = {};\n" . "  _qfMsg = '';\n\n" . join("\n", $test) . "\n  if (_qfMsg != '') {\n" . "    _qfMsg = '" . strtr($this->_jsPrefix, $js_escape) . "' + _qfMsg;\n" . "    _qfMsg = _qfMsg + '\\n" . strtr($this->_jsPostfix, $js_escape) . "';\n" . "    alert(_qfMsg);\n" . "    return false;\n" . "  }\n" . "  return true;\n" . "}\n" . "//]]>\n" . "</script>";
     }
     return '';
 }
    /**
     * Returns the client side validation script
     *
     * The code here was copied from HTML_QuickForm and slightly modified to run rules per-element
     *
     * @access    public
     * @return    string    Javascript to perform validation, empty string if no 'client' rules were added
     */
    function getValidationScript()
    {
        if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
            return '';
        }
        include_once 'HTML/QuickForm/RuleRegistry.php';
        $registry =& HTML_QuickForm_RuleRegistry::singleton();
        $test = array();
        $js_escape = array("\r" => '\\r', "\n" => '\\n', "\t" => '\\t', "'" => "\\'", '"' => '\\"', '\\' => '\\\\');
        foreach ($this->_rules as $elementName => $rules) {
            foreach ($rules as $rule) {
                if ('client' == $rule['validation']) {
                    unset($element);
                    $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
                    $rule['message'] = strtr($rule['message'], $js_escape);
                    if (isset($rule['group'])) {
                        $group =& $this->getElement($rule['group']);
                        // No JavaScript validation for frozen elements
                        if ($group->isFrozen()) {
                            continue 2;
                        }
                        $elements =& $group->getElements();
                        foreach (array_keys($elements) as $key) {
                            if ($elementName == $group->getElementName($key)) {
                                $element =& $elements[$key];
                                break;
                            }
                        }
                    } elseif ($dependent) {
                        $element = array();
                        $element[] =& $this->getElement($elementName);
                        foreach ($rule['dependent'] as $idx => $elName) {
                            $element[] =& $this->getElement($elName);
                        }
                    } else {
                        $element =& $this->getElement($elementName);
                    }
                    // No JavaScript validation for frozen elements
                    if (is_object($element) && $element->isFrozen()) {
                        continue 2;
                    } elseif (is_array($element)) {
                        foreach (array_keys($element) as $key) {
                            if ($element[$key]->isFrozen()) {
                                continue 3;
                            }
                        }
                    }
                    $test[$elementName][] = $registry->getValidationScript($element, $elementName, $rule);
                }
            }
        }
        $js = '
<script type="text/javascript">
//<![CDATA[
function qf_errorHandler(element, _qfMsg) {
  div = element.parentNode;
  if (_qfMsg != \'\') {
    span = document.createElement("span");
    span.className = "error";
    span.appendChild(document.createTextNode(_qfMsg.substring(3)));
    br = document.createElement("br");

    var errorDiv = document.getElementById(element.name + \'_errorDiv\');
    if (!errorDiv) {
      errorDiv = document.createElement("div");
      errorDiv.id = element.name + \'_errorDiv\';
    }
    while (errorDiv.firstChild) {
      errorDiv.removeChild(errorDiv.firstChild);
    }
    
    errorDiv.insertBefore(br, errorDiv.firstChild);
    errorDiv.insertBefore(span, errorDiv.firstChild);
    element.parentNode.insertBefore(errorDiv, element.parentNode.firstChild);

    if (div.className.substr(div.className.length - 6, 6) != " error"
        && div.className != "error") {
      div.className += " error";
    }

    return false;
  } else {
    var errorDiv = document.getElementById(element.name + \'_errorDiv\');
    if (errorDiv) {
      errorDiv.parentNode.removeChild(errorDiv);
    }

    if (div.className.substr(div.className.length - 6, 6) == " error") {
      div.className = div.className.substr(0, div.className.length - 6);
    } else if (div.className == "error") {
      div.className = "";
    }

    return true;
  }
}';
        $validateJS = '';
        foreach ($test as $elementName => $jsArr) {
            $js .= '
function validate_' . $this->_attributes['id'] . '_' . $elementName . '(element) {
  var value = \'\';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = \'\';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
' . join("\n", $jsArr) . '
  return qf_errorHandler(element, _qfMsg);
}
';
            $validateJS .= '
  ret = validate_' . $this->_attributes['id'] . '_' . $elementName . '(frm.elements[\'' . $elementName . '\']) && ret;';
            unset($element);
            $element =& $this->getElement($elementName);
            $valFunc = 'validate_' . $this->_attributes['id'] . '_' . $elementName . '(this)';
            $onBlur = $element->getAttribute('onBlur');
            $onChange = $element->getAttribute('onChange');
            $element->updateAttributes(array('onBlur' => $onBlur . $valFunc, 'onChange' => $onChange . $valFunc));
        }
        $js .= '
function validate_' . $this->_attributes['id'] . '(frm) {
  var ret = true;
' . $validateJS . ';
  return ret;
}
//]]>
</script>';
        return $js;
    }
Exemplo n.º 3
0
    /**
     * Returns the client side validation script
     *
     * The code here was copied from HTML_QuickForm_DHTMLRulesTableless who copied it from  HTML_QuickForm
     * and slightly modified to run rules per-element
     * Needed to override this because of an error with client side validation of grouped elements.
     *
     * @return string Javascript to perform validation, empty string if no 'client' rules were added
     */
    function getValidationScript()
    {
        if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
            return '';
        }
        include_once 'HTML/QuickForm/RuleRegistry.php';
        $registry =& HTML_QuickForm_RuleRegistry::singleton();
        $test = array();
        $js_escape = array("\r" => '\\r', "\n" => '\\n', "\t" => '\\t', "'" => "\\'", '"' => '\\"', '\\' => '\\\\');
        foreach ($this->_rules as $elementName => $rules) {
            foreach ($rules as $rule) {
                if ('client' == $rule['validation']) {
                    unset($element);
                    //TODO: find out how to properly initialize it
                    $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
                    $rule['message'] = strtr($rule['message'], $js_escape);
                    if (isset($rule['group'])) {
                        $group =& $this->getElement($rule['group']);
                        // No JavaScript validation for frozen elements
                        if ($group->isFrozen()) {
                            continue 2;
                        }
                        $elements =& $group->getElements();
                        foreach (array_keys($elements) as $key) {
                            if ($elementName == $group->getElementName($key)) {
                                $element =& $elements[$key];
                                break;
                            }
                        }
                    } elseif ($dependent) {
                        $element = array();
                        $element[] =& $this->getElement($elementName);
                        foreach ($rule['dependent'] as $elName) {
                            $element[] =& $this->getElement($elName);
                        }
                    } else {
                        $element =& $this->getElement($elementName);
                    }
                    // No JavaScript validation for frozen elements
                    if (is_object($element) && $element->isFrozen()) {
                        continue 2;
                    } elseif (is_array($element)) {
                        foreach (array_keys($element) as $key) {
                            if ($element[$key]->isFrozen()) {
                                continue 3;
                            }
                        }
                    }
                    //for editor element, [text] is appended to the name.
                    $fullelementname = $elementName;
                    if ($element->getType() == 'editor') {
                        $fullelementname .= '[text]';
                        //Add format to rule as moodleform check which format is supported by browser
                        //it is not set anywhere... So small hack to make sure we pass it down to quickform
                        if (is_null($rule['format'])) {
                            $rule['format'] = $element->getFormat();
                        }
                    }
                    // Fix for bug displaying errors for elements in a group
                    $test[$fullelementname][0][] = $registry->getValidationScript($element, $fullelementname, $rule);
                    $test[$fullelementname][1] = $element;
                    //end of fix
                }
            }
        }
        // Fix for MDL-9524. If you don't do this, then $element may be left as a reference to one of the fields in
        // the form, and then that form field gets corrupted by the code that follows.
        unset($element);
        $js = '
<script type="text/javascript">
//<![CDATA[

var skipClientValidation = false;

function qf_errorHandler(element, _qfMsg) {
  div = element.parentNode;

  if ((div == undefined) || (element.name == undefined)) {
    //no checking can be done for undefined elements so let server handle it.
    return true;
  }

  if (_qfMsg != \'\') {
    var errorSpan = document.getElementById(\'id_error_\'+element.name);
    if (!errorSpan) {
      errorSpan = document.createElement("span");
      errorSpan.id = \'id_error_\'+element.name;
      errorSpan.className = "error";
      element.parentNode.insertBefore(errorSpan, element.parentNode.firstChild);
      document.getElementById(errorSpan.id).setAttribute(\'TabIndex\', \'0\');
      document.getElementById(errorSpan.id).focus();
    }

    while (errorSpan.firstChild) {
      errorSpan.removeChild(errorSpan.firstChild);
    }

    errorSpan.appendChild(document.createTextNode(_qfMsg.substring(3)));

    if (div.className.substr(div.className.length - 6, 6) != " error"
      && div.className != "error") {
        div.className += " error";
        linebreak = document.createElement("br");
        linebreak.className = "error";
        linebreak.id = \'id_error_break_\'+element.name;
        errorSpan.parentNode.insertBefore(linebreak, errorSpan.nextSibling);
    }

    return false;
  } else {
    var errorSpan = document.getElementById(\'id_error_\'+element.name);
    if (errorSpan) {
      errorSpan.parentNode.removeChild(errorSpan);
    }
    var linebreak = document.getElementById(\'id_error_break_\'+element.name);
    if (linebreak) {
      linebreak.parentNode.removeChild(linebreak);
    }

    if (div.className.substr(div.className.length - 6, 6) == " error") {
      div.className = div.className.substr(0, div.className.length - 6);
    } else if (div.className == "error") {
      div.className = "";
    }

    return true;
  }
}';
        $validateJS = '';
        foreach ($test as $elementName => $jsandelement) {
            // Fix for bug displaying errors for elements in a group
            //unset($element);
            list($jsArr, $element) = $jsandelement;
            //end of fix
            $escapedElementName = preg_replace_callback('/[_\\[\\]-]/', create_function('$matches', 'return sprintf("_%2x",ord($matches[0]));'), $elementName);
            $js .= '
function validate_' . $this->_formName . '_' . $escapedElementName . '(element) {
  if (undefined == element) {
     //required element was not found, then let form be submitted without client side validation
     return true;
  }
  var value = \'\';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = \'\';
  var frm = element.parentNode;
  if ((undefined != element.name) && (frm != undefined)) {
      while (frm && frm.nodeName.toUpperCase() != "FORM") {
        frm = frm.parentNode;
      }
    ' . join("\n", $jsArr) . '
      return qf_errorHandler(element, _qfMsg);
  } else {
    //element name should be defined else error msg will not be displayed.
    return true;
  }
}
';
            $validateJS .= '
  ret = validate_' . $this->_formName . '_' . $escapedElementName . '(frm.elements[\'' . $elementName . '\']) && ret;
  if (!ret && !first_focus) {
    first_focus = true;
    Y.use(\'moodle-core-event\', function() {
        Y.Global.fire(M.core.globalEvents.FORM_ERROR, {formid: \'' . $this->_attributes['id'] . '\',
                                                       elementid: \'id_error_' . $elementName . '\'});
        document.getElementById(\'id_error_' . $elementName . '\').focus();
    });
  }
';
            // Fix for bug displaying errors for elements in a group
            //unset($element);
            //$element =& $this->getElement($elementName);
            //end of fix
            $valFunc = 'validate_' . $this->_formName . '_' . $escapedElementName . '(this)';
            $onBlur = $element->getAttribute('onBlur');
            $onChange = $element->getAttribute('onChange');
            $element->updateAttributes(array('onBlur' => $onBlur . $valFunc, 'onChange' => $onChange . $valFunc));
        }
        //  do not rely on frm function parameter, because htmlarea breaks it when overloading the onsubmit method
        $js .= '
function validate_' . $this->_formName . '(frm) {
  if (skipClientValidation) {
     return true;
  }
  var ret = true;

  var frm = document.getElementById(\'' . $this->_attributes['id'] . '\')
  var first_focus = false;
' . $validateJS . ';
  return ret;
}
//]]>
</script>';
        return $js;
    }
    /**
     * Returns the client side validation script
     *
     * The code here was copied from HTML_QuickForm_DHTMLRulesTableless who copied it from  HTML_QuickForm
     * and slightly modified to run rules per-element
     * Needed to override this because of an error with client side validation of grouped elements.
     *
     * @access    public
     * @return    string    Javascript to perform validation, empty string if no 'client' rules were added
     */
    function getValidationScript()
    {
        if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
            return '';
        }
        include_once 'HTML/QuickForm/RuleRegistry.php';
        $registry =& HTML_QuickForm_RuleRegistry::singleton();
        $test = array();
        $js_escape = array("\r" => '\\r', "\n" => '\\n', "\t" => '\\t', "'" => "\\'", '"' => '\\"', '\\' => '\\\\');
        foreach ($this->_rules as $elementName => $rules) {
            foreach ($rules as $rule) {
                if ('client' == $rule['validation']) {
                    unset($element);
                    //TODO: find out how to properly initialize it
                    $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
                    $rule['message'] = strtr($rule['message'], $js_escape);
                    if (isset($rule['group'])) {
                        $group =& $this->getElement($rule['group']);
                        // No JavaScript validation for frozen elements
                        if ($group->isFrozen()) {
                            continue 2;
                        }
                        $elements =& $group->getElements();
                        foreach (array_keys($elements) as $key) {
                            if ($elementName == $group->getElementName($key)) {
                                $element =& $elements[$key];
                                break;
                            }
                        }
                    } elseif ($dependent) {
                        $element = array();
                        $element[] =& $this->getElement($elementName);
                        foreach ($rule['dependent'] as $elName) {
                            $element[] =& $this->getElement($elName);
                        }
                    } else {
                        $element =& $this->getElement($elementName);
                    }
                    // No JavaScript validation for frozen elements
                    if (is_object($element) && $element->isFrozen()) {
                        continue 2;
                    } elseif (is_array($element)) {
                        foreach (array_keys($element) as $key) {
                            if ($element[$key]->isFrozen()) {
                                continue 3;
                            }
                        }
                    }
                    // Fix for bug displaying errors for elements in a group
                    //$test[$elementName][] = $registry->getValidationScript($element, $elementName, $rule);
                    $test[$elementName][0][] = $registry->getValidationScript($element, $elementName, $rule);
                    $test[$elementName][1] = $element;
                    //end of fix
                }
            }
        }
        // Fix for MDL-9524. If you don't do this, then $element may be left as a reference to one of the fields in
        // the form, and then that form field gets corrupted by the code that follows.
        unset($element);
        $js = '
<script type="text/javascript">
//<![CDATA[

var skipClientValidation = false;

function qf_errorHandler(element, _qfMsg) {
  div = element.parentNode;
  if (_qfMsg != \'\') {
    var errorSpan = document.getElementById(\'id_error_\'+element.name);
    if (!errorSpan) {
      errorSpan = document.createElement("span");
      errorSpan.id = \'id_error_\'+element.name;
      errorSpan.className = "error";
      element.parentNode.insertBefore(errorSpan, element.parentNode.firstChild);
    }

    while (errorSpan.firstChild) {
      errorSpan.removeChild(errorSpan.firstChild);
    }

    errorSpan.appendChild(document.createTextNode(_qfMsg.substring(3)));
    errorSpan.appendChild(document.createElement("br"));

    if (div.className.substr(div.className.length - 6, 6) != " error"
        && div.className != "error") {
      div.className += " error";
    }

    return false;
  } else {
    var errorSpan = document.getElementById(\'id_error_\'+element.name);
    if (errorSpan) {
      errorSpan.parentNode.removeChild(errorSpan);
    }

    if (div.className.substr(div.className.length - 6, 6) == " error") {
      div.className = div.className.substr(0, div.className.length - 6);
    } else if (div.className == "error") {
      div.className = "";
    }

    return true;
  }
}';
        $validateJS = '';
        foreach ($test as $elementName => $jsandelement) {
            // Fix for bug displaying errors for elements in a group
            //unset($element);
            list($jsArr, $element) = $jsandelement;
            //end of fix
            $escapedElementName = preg_replace_callback('/[_\\[\\]]/', create_function('$matches', 'return sprintf("_%2x",ord($matches[0]));'), $elementName);
            $js .= '
function validate_' . $this->_formName . '_' . $escapedElementName . '(element) {
  var value = \'\';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = \'\';
  var frm = element.parentNode;
  while (frm && frm.nodeName.toUpperCase() != "FORM") {
    frm = frm.parentNode;
  }
' . join("\n", $jsArr) . '
  return qf_errorHandler(element, _qfMsg);
}
';
            $validateJS .= '
  ret = validate_' . $this->_formName . '_' . $escapedElementName . '(frm.elements[\'' . $elementName . '\']) && ret;
  if (!ret && !first_focus) {
    first_focus = true;
    frm.elements[\'' . $elementName . '\'].focus();
  }
';
            // Fix for bug displaying errors for elements in a group
            //unset($element);
            //$element =& $this->getElement($elementName);
            //end of fix
            $valFunc = 'validate_' . $this->_formName . '_' . $escapedElementName . '(this)';
            $onBlur = $element->getAttribute('onBlur');
            $onChange = $element->getAttribute('onChange');
            $element->updateAttributes(array('onBlur' => $onBlur . $valFunc, 'onChange' => $onChange . $valFunc));
        }
        //  do not rely on frm function parameter, because htmlarea breaks it when overloading the onsubmit method
        $js .= '
function validate_' . $this->_formName . '(frm) {
  if (skipClientValidation) {
     return true;
  }
  var ret = true;

  var frm = document.getElementById(\'' . $this->_attributes['id'] . '\')
  var first_focus = false;
' . $validateJS . ';
  return ret;
}
//]]>
</script>';
        return $js;
    }
Exemplo n.º 5
0
 /**
  * Returns the client side validation script
  *
  * @since     2.0
  * @access    public
  * @return    string    Javascript to perform validation, empty string if no 'client' rules were added
  */
 function getValidationScript()
 {
     if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
         return '';
     }
     include_once 'HTML/QuickForm/RuleRegistry.php';
     $registry =& HTML_QuickForm_RuleRegistry::singleton();
     $test = array();
     $js_escape = array("\r" => '\\r', "\n" => '\\n', "\t" => '\\t', "'" => "\\'", '"' => '\\"', '\\' => '\\\\');
     foreach ($this->_rules as $elementName => $rules) {
         foreach ($rules as $rule) {
             if ('client' == $rule['validation']) {
                 unset($element);
                 $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
                 $rule['message'] = strtr($rule['message'], $js_escape);
                 if (isset($rule['group'])) {
                     $group =& $this->getElement($rule['group']);
                     // No JavaScript validation for frozen elements
                     if ($group->isFrozen()) {
                         continue 2;
                     }
                     $elements =& $group->getElements();
                     foreach (array_keys($elements) as $key) {
                         if ($elementName == $group->getElementName($key)) {
                             $element =& $elements[$key];
                             break;
                         }
                     }
                 } elseif ($dependent) {
                     $element = array();
                     $element[] =& $this->getElement($elementName);
                     foreach ($rule['dependent'] as $elName) {
                         $element[] =& $this->getElement($elName);
                     }
                 } else {
                     $element =& $this->getElement($elementName);
                 }
                 // No JavaScript validation for frozen elements
                 if (is_object($element) && $element->isFrozen()) {
                     continue 2;
                 } elseif (is_array($element)) {
                     foreach (array_keys($element) as $key) {
                         if ($element[$key]->isFrozen()) {
                             continue 3;
                         }
                     }
                 }
                 $test[] = $registry->getValidationScript($element, $elementName, $rule);
             }
         }
     }
     if (count($test) > 0) {
         return "\n<script type=\"text/javascript\">\n" . "//<![CDATA[\n" . "function validate_" . $this->_attributes['id'] . "(frm) {\n" . "  var value = '';\n" . "  var errFlag = new Array();\n" . "  var _qfGroups = {};\n" . "  _qfMsg = '';\n\n" . join("\n", $test) . "\n  if (_qfMsg != '') {\n" . "    _qfMsg = '" . strtr($this->_jsPrefix, $js_escape) . "' + _qfMsg;\n" . "    _qfMsg = _qfMsg + '\\n" . strtr($this->_jsPostfix, $js_escape) . "';\n" . "    alert(_qfMsg);\n" . "    return false;\n" . "  }\n" . "  return true;\n" . "}\n" . "//]]>\n" . "</script>";
     }
     return '';
 }
Exemplo n.º 6
0
    /**
     * Returns the client side validation script
     *
     * The code here was copied from HTML_QuickForm and slightly modified to run rules per-element
     *
     * @access    public
     * @return    string    Javascript to perform validation, empty string if no 'client' rules were added
     */
    function getValidationScript()
    {
        if (empty($this->_rules) || empty($this->_attributes['onsubmit'])) {
            return '';
        }
        include_once 'HTML/QuickForm/RuleRegistry.php';
        $registry =& HTML_QuickForm_RuleRegistry::singleton();
        $test = array();
        $js_escape = array("\r" => '\\r', "\n" => '\\n', "\t" => '\\t', "'" => "\\'", '"' => '\\"', '\\' => '\\\\');
        foreach ($this->_rules as $elementName => $rules) {
            foreach ($rules as $rule) {
                if ('client' == $rule['validation']) {
                    unset($element);
                    $dependent = isset($rule['dependent']) && is_array($rule['dependent']);
                    $rule['message'] = strtr($rule['message'], $js_escape);
                    if (isset($rule['group'])) {
                        $group =& $this->getElement($rule['group']);
                        // No JavaScript validation for frozen elements
                        if ($group->isFrozen()) {
                            continue 2;
                        }
                        $elements =& $group->getElements();
                        foreach (array_keys($elements) as $key) {
                            if ($elementName == $group->getElementName($key)) {
                                $element =& $elements[$key];
                                break;
                            }
                        }
                    } elseif ($dependent) {
                        $element = array();
                        $element[] =& $this->getElement($elementName);
                        foreach ($rule['dependent'] as $idx => $elName) {
                            $element[] =& $this->getElement($elName);
                        }
                    } else {
                        $element =& $this->getElement($elementName);
                    }
                    // No JavaScript validation for frozen elements
                    if (is_object($element) && $element->isFrozen()) {
                        continue 2;
                    } elseif (is_array($element)) {
                        foreach (array_keys($element) as $key) {
                            if ($element[$key]->isFrozen()) {
                                continue 3;
                            }
                        }
                    }
                    $test[$elementName][] = $registry->getValidationScript($element, $elementName, $rule);
                }
            }
        }
        $js = '
<script type="text/javascript"><!--//--><![CDATA[//><!--
qf_errorHandler = function(element, _qfMsg) {
  div = element.parentNode;
  var elementName = element.name.replace(/\\[/, "_____");
  var elementName = elementName.replace(/\\]/, "_____");
  if (_qfMsg != \'\') {
    span = document.createElement("span");
    span.className = "error";
    _qfMsg = _qfMsg.substring(4);
    span.appendChild(document.createTextNode(_qfMsg));
    br = document.createElement("br");

    var errorDiv = document.getElementById(elementName + \'_errorDiv\');
    if (!errorDiv) {
      errorDiv = document.createElement("div");
      errorDiv.id = elementName + \'_errorDiv\';
    } else {
      if (   div.firstChild.textContent == \'\'
          || _qfMsg == div.firstChild.textContent
         ) {
        return false;
      }
    }
    while (errorDiv.firstChild) {
      errorDiv.removeChild(errorDiv.firstChild);
    }

    errorDiv.insertBefore(br, errorDiv.firstChild);
    errorDiv.insertBefore(span, errorDiv.firstChild);

    errorDivInserted = false;
    for (var i = element.parentNode.childNodes.length - 1; i >= 0; i--) {
      j = i - 1;
      if (j >= 0 && element.parentNode.childNodes[j].nodeName == "DIV") {
        element.parentNode.insertBefore(errorDiv, element.parentNode.childNodes[i]);
        errorDivInserted = true;
        break;
      }
    }
    if (!errorDivInserted) {
      element.parentNode.insertBefore(errorDiv, element.parentNode.firstChild);
    }

    if (div.className.substr(div.className.length - 6, 6) != " error"
        && div.className != "error") {
      div.className += " error";
    }

    return false;
  } else {
    var errorDiv = document.getElementById(elementName + \'_errorDiv\');
    if (errorDiv) {
      errorDiv.parentNode.removeChild(errorDiv);
    }
    
    // do not remove the error style from the div tag if there is still an error
    // message
    if (div.firstChild.innerHTML != "") {
      return true;
    }

    if (div.className.substr(div.className.length - 6, 6) == " error") {
      div.className = div.className.substr(0, div.className.length - 6);
    } else if (div.className == "error") {
      div.className = "";
    }

    return true;
  }
}';
        $validateJS = '';
        foreach ($test as $elementName => $jsArr) {
            // remove group element part of the element name to avoid JS errors
            $singleElementName = $elementName;
            $shortNameForJS = str_replace(array('[', ']'), '__', $elementName);
            $bracketPos = strpos($elementName, '[');
            if ($bracketPos !== false) {
                $singleElementName = substr($elementName, 0, $bracketPos);
                $groupElementName = substr($elementName, $bracketPos + 1, -1);
            }
            if ($bracketPos === false || !$this->elementExists($singleElementName)) {
                $groupElementName = $elementName;
                $singleElementName = $elementName;
            }
            $id = str_replace('-', '_', $this->_attributes['id']);
            $js .= '
validate_' . $id . '_' . $shortNameForJS . ' = function(element) {
  var value = \'\';
  var errFlag = new Array();
  var _qfGroups = {};
  var _qfMsg = \'\';
  var frm = element.parentNode;
  while (frm && frm.nodeName != "FORM") {
    frm = frm.parentNode;
  }
' . join("\n", $jsArr) . '
  return qf_errorHandler(element, _qfMsg);
}
';
            unset($element);
            $element =& $this->getElement($singleElementName);
            $elementNameForJS = 'frm.elements[\'' . $elementName . '\']';
            if ($element->getType() === 'group' && $singleElementName === $elementName) {
                $elementNameForJS = 'document.getElementById(\'' . $element->_elements[0]->getAttribute('id') . '\')';
            }
            $validateJS .= '
  ret = validate_' . $id . '_' . $shortNameForJS . '(' . $elementNameForJS . ') && ret;';
            if ($element->getType() !== 'group') {
                // not a group
                $valFunc = 'validate_' . $id . '_' . $shortNameForJS . '(this)';
                $onBlur = $element->getAttribute('onBlur');
                $onChange = $element->getAttribute('onChange');
                $element->updateAttributes(array('onBlur' => $onBlur . $valFunc, 'onChange' => $onChange . $valFunc));
            } else {
                // group
                $elements =& $element->getElements();
                for ($i = 0; $i < count($elements); $i++) {
                    // $groupElementName is a substring of attribute name of the element
                    if (strpos($elements[$i]->getAttribute('name'), $groupElementName) === 0) {
                        $valFunc = 'validate_' . $id . '_' . $shortNameForJS . '(this)';
                        $onBlur = $elements[$i]->getAttribute('onBlur');
                        $onChange = $elements[$i]->getAttribute('onChange');
                        $elements[$i]->updateAttributes(array('onBlur' => $onBlur . $valFunc, 'onChange' => $onChange . $valFunc));
                    }
                }
            }
        }
        $js .= '
validate_' . $id . ' = function (frm) {
  var ret = true;
' . $validateJS . ';
  return ret;
}
//--><!]]></script>';
        return $js;
    }