* * -------------------------------------------- * * This program is free software; you can redistribute it and/or modify it * * under the terms of the GNU General Public License as published by the * * Free Software Foundation; either version 2 of the License, or (at your * * option) any later version. * \**************************************************************************/ /* $Id$ */ /*! @class select_widget @author ralfbecker @abstract Several select-boxes with predefined phpgw specific content. @discussion This widget replaces the old sbox class @discussion This widget is independent of the UI as it only uses etemplate-widgets and has therefor no render-function */ class select_widget { var $public_functions = array( 'pre_process' => True ); var $human_name = array( // this are the names for the editor 'select-percent' => 'Select Percentage', 'select-priority' => 'Select Priority', 'select-access' => 'Select Access', 'select-country' => 'Select Country', 'select-state' => 'Select State', // US-states 'select-cat' => 'Select Category',// Category-Selection, size: -1=Single+All, 0=Single, >0=Multiple with size lines 'select-account' => 'Select Account', // label=accounts(default),groups,both // size: -1=Single+not assigned, 0=Single, >0=Multiple 'select-year' => 'Select Year', 'select-month' => 'Select Month', 'select-day' => 'Select Day', 'select-number' => 'Select Number', 'select-app' => 'Select Application' ); var $monthnames = array( 0 => '', 1 => 'January', 2 => 'February', 3 => 'March', 4 => 'April', 5 => 'May', 6 => 'June', 7 => 'July', 8 => 'August', 9 => 'September', 10 => 'October', 11 => 'November', 12 => 'December' ); var $countrys = array( '' =>'', 'AF'=>'AFGHANISTAN', 'AL'=>'ALBANIA', 'DZ'=>'ALGERIA', 'AS'=>'AMERICAN SAMOA', 'AD'=>'ANDORRA', 'AO'=>'ANGOLA', 'AI'=>'ANGUILLA', 'AQ'=>'ANTARCTICA', 'AG'=>'ANTIGUA AND BARBUDA', 'AR'=>'ARGENTINA', 'AM'=>'ARMENIA', 'AW'=>'ARUBA', 'AU'=>'AUSTRALIA', 'AT'=>'AUSTRIA', 'AZ'=>'AZERBAIJAN', 'BS'=>'BAHAMAS', 'BH'=>'BAHRAIN', 'BD'=>'BANGLADESH', 'BB'=>'BARBADOS', 'BY'=>'BELARUS', 'BE'=>'BELGIUM', 'BZ'=>'BELIZE', 'BJ'=>'BENIN', 'BM'=>'BERMUDA', 'BT'=>'BHUTAN', 'BO'=>'BOLIVIA', 'BA'=>'BOSNIA AND HERZEGOVINA', 'BW'=>'BOTSWANA', 'BV'=>'BOUVET ISLAND', 'BR'=>'BRAZIL', 'IO'=>'BRITISH INDIAN OCEAN TERRITORY', 'BN'=>'BRUNEI DARUSSALAM', 'BG'=>'BULGARIA', 'BF'=>'BURKINA FASO', 'BI'=>'BURUNDI', 'KH'=>'CAMBODIA', 'CM'=>'CAMEROON', 'CA'=>'CANADA', 'CV'=>'CAPE VERDE', 'KY'=>'CAYMAN ISLANDS', 'CF'=>'CENTRAL AFRICAN REPUBLIC', 'TD'=>'CHAD', 'CL'=>'CHILE', 'CN'=>'CHINA', 'CX'=>'CHRISTMAS ISLAND', 'CC'=>'COCOS (KEELING) ISLANDS', 'CO'=>'COLOMBIA', 'KM'=>'COMOROS', 'CG'=>'CONGO', 'CD'=>'CONGO, THE DEMOCRATIC REPUBLIC OF THE', 'CK'=>'COOK ISLANDS', 'CR'=>'COSTA RICA', 'CI'=>'COTE D IVOIRE', 'HR'=>'CROATIA', 'CU'=>'CUBA', 'CY'=>'CYPRUS', 'CZ'=>'CZECH REPUBLIC', 'DK'=>'DENMARK', 'DJ'=>'DJIBOUTI', 'DM'=>'DOMINICA', 'DO'=>'DOMINICAN REPUBLIC', 'TP'=>'EAST TIMOR', 'EC'=>'ECUADOR', 'EG'=>'EGYPT', 'SV'=>'EL SALVADOR', 'GQ'=>'EQUATORIAL GUINEA', 'ER'=>'ERITREA', 'EE'=>'ESTONIA', 'ET'=>'ETHIOPIA', 'FK'=>'FALKLAND ISLANDS (MALVINAS)', 'FO'=>'FAROE ISLANDS', 'FJ'=>'FIJI', 'FI'=>'FINLAND', 'FR'=>'FRANCE', 'GF'=>'FRENCH GUIANA', 'PF'=>'FRENCH POLYNESIA', 'TF'=>'FRENCH SOUTHERN TERRITORIES', 'GA'=>'GABON', 'GM'=>'GAMBIA', 'GE'=>'GEORGIA', 'DE'=>'GERMANY', 'GH'=>'GHANA', 'GI'=>'GIBRALTAR', 'GR'=>'GREECE', 'GL'=>'GREENLAND', 'GD'=>'GRENADA', 'GP'=>'GUADELOUPE', 'GU'=>'GUAM', 'GT'=>'GUATEMALA', 'GN'=>'GUINEA', 'GW'=>'GUINEA-BISSAU', 'GY'=>'GUYANA', 'HT'=>'HAITI', 'HM'=>'HEARD ISLAND AND MCDONALD ISLANDS', 'VA'=>'HOLY SEE (VATICAN CITY STATE)', 'HN'=>'HONDURAS', 'HK'=>'HONG KONG', 'HU'=>'HUNGARY', 'IS'=>'ICELAND', 'IN'=>'INDIA', 'ID'=>'INDONESIA', 'IR'=>'IRAN, ISLAMIC REPUBLIC OF', 'IQ'=>'IRAQ', 'IE'=>'IRELAND', 'IL'=>'ISRAEL', 'IT'=>'ITALY', 'JM'=>'JAMAICA', 'JP'=>'JAPAN', 'JO'=>'JORDAN', 'KZ'=>'KAZAKSTAN', 'KE'=>'KENYA', 'KI'=>'KIRIBATI', 'KP'=>'KOREA, DEMOCRATIC PEOPLES REPUBLIC OF', 'KR'=>'KOREA, REPUBLIC OF', 'KW'=>'KUWAIT', 'KG'=>'KYRGYZSTAN', 'LA'=>'LAO PEOPLES DEMOCRATIC REPUBLIC', 'LV'=>'LATVIA', 'LB'=>'LEBANON', 'LS'=>'LESOTHO', 'LR'=>'LIBERIA', 'LY'=>'LIBYAN ARAB JAMAHIRIYA', 'LI'=>'LIECHTENSTEIN', 'LT'=>'LITHUANIA', 'LU'=>'LUXEMBOURG', 'MO'=>'MACAU', 'MK'=>'MACEDONIA, THE FORMER YUGOSLAV REPUBLIC OF', 'MG'=>'MADAGASCAR', 'MW'=>'MALAWI', 'MY'=>'MALAYSIA', 'MV'=>'MALDIVES', 'ML'=>'MALI', 'MT'=>'MALTA', 'MH'=>'MARSHALL ISLANDS', 'MQ'=>'MARTINIQUE', 'MR'=>'MAURITANIA', 'MU'=>'MAURITIUS', 'YT'=>'MAYOTTE', 'MX'=>'MEXICO', 'FM'=>'MICRONESIA, FEDERATED STATES OF', 'MD'=>'MOLDOVA, REPUBLIC OF', 'MC'=>'MONACO', 'MN'=>'MONGOLIA', 'MS'=>'MONTSERRAT', 'MA'=>'MOROCCO', 'MZ'=>'MOZAMBIQUE', 'MM'=>'MYANMAR', 'NA'=>'NAMIBIA', 'NR'=>'NAURU', 'NP'=>'NEPAL', 'NL'=>'NETHERLANDS', 'AN'=>'NETHERLANDS ANTILLES', 'NC'=>'NEW CALEDONIA', 'NZ'=>'NEW ZEALAND', 'NI'=>'NICARAGUA', 'NE'=>'NIGER', 'NG'=>'NIGERIA', 'NU'=>'NIUE', 'NF'=>'NORFOLK ISLAND', 'MP'=>'NORTHERN MARIANA ISLANDS', 'NO'=>'NORWAY', 'OM'=>'OMAN', 'PK'=>'PAKISTAN', 'PW'=>'PALAU', 'PS'=>'PALESTINIAN TERRITORY, OCCUPIED', 'PA'=>'PANAMA', 'PG'=>'PAPUA NEW GUINEA', 'PY'=>'PARAGUAY', 'PE'=>'PERU', 'PH'=>'PHILIPPINES', 'PN'=>'PITCAIRN', 'PL'=>'POLAND', 'PT'=>'PORTUGAL', 'PR'=>'PUERTO RICO', 'QA'=>'QATAR', 'RE'=>'REUNION', 'RO'=>'ROMANIA', 'RU'=>'RUSSIAN FEDERATION', 'RW'=>'RWANDA', 'SH'=>'SAINT HELENA', 'KN'=>'SAINT KITTS AND NEVIS', 'LC'=>'SAINT LUCIA', 'PM'=>'SAINT PIERRE AND MIQUELON', 'VC'=>'SAINT VINCENT AND THE GRENADINES', 'WS'=>'SAMOA', 'SM'=>'SAN MARINO', 'ST'=>'SAO TOME AND PRINCIPE', 'SA'=>'SAUDI ARABIA', 'SN'=>'SENEGAL', 'SC'=>'SEYCHELLES', 'SL'=>'SIERRA LEONE', 'SG'=>'SINGAPORE', 'SK'=>'SLOVAKIA', 'SI'=>'SLOVENIA', 'SB'=>'SOLOMON ISLANDS', 'SO'=>'SOMALIA', 'ZA'=>'SOUTH AFRICA', 'GS'=>'SOUTH GEORGIA AND THE SOUTH SANDWICH ISLANDS', 'ES'=>'SPAIN', 'LK'=>'SRI LANKA', 'SD'=>'SUDAN', 'SR'=>'SURINAME', 'SJ'=>'SVALBARD AND JAN MAYEN', 'SZ'=>'SWAZILAND', 'SE'=>'SWEDEN', 'CH'=>'SWITZERLAND', 'SY'=>'SYRIAN ARAB REPUBLIC', 'TW'=>'TAIWAN', 'TJ'=>'TAJIKISTAN', 'TZ'=>'TANZANIA, UNITED REPUBLIC OF', 'TH'=>'THAILAND', 'TG'=>'TOGO', 'TK'=>'TOKELAU', 'TO'=>'TONGA', 'TT'=>'TRINIDAD AND TOBAGO', 'TN'=>'TUNISIA', 'TR'=>'TURKEY', 'TM'=>'TURKMENISTAN', 'TC'=>'TURKS AND CAICOS ISLANDS', 'TV'=>'TUVALU', 'UG'=>'UGANDA', 'UA'=>'UKRAINE', 'AE'=>'UNITED ARAB EMIRATES', 'GB'=>'UNITED KINGDOM', 'US'=>'UNITED STATES', 'UM'=>'UNITED STATES MINOR OUTLYING ISLANDS', 'UY'=>'URUGUAY', 'UZ'=>'UZBEKISTAN', 'VU'=>'VANUATU', 'VE'=>'VENEZUELA', 'VN'=>'VIET NAM', 'VG'=>'VIRGIN ISLANDS, BRITISH', 'VI'=>'VIRGIN ISLANDS, U.S.', 'WF'=>'WALLIS AND FUTUNA', 'EH'=>'WESTERN SAHARA', 'YE'=>'YEMEN', 'YU'=>'YUGOSLAVIA', 'ZM'=>'ZAMBIA', 'ZW'=>'ZIMBABWE' ); var $states = array( '' => '', '--' => 'non US', 'AL' => 'Alabama', 'AK' => 'Alaska', 'AZ' => 'Arizona', 'AR' => 'Arkansas', 'CA' => 'California', 'CO' => 'Colorado', 'CT' => 'Connecticut', 'DE' => 'Delaware', 'DC' => 'District of Columbia', 'FL' => 'Florida', 'GA' => 'Georgia', 'HI' => 'Hawaii', 'ID' => 'Idaho', 'IL' => 'Illinois', 'IN' => 'Indiana', 'IA' => 'Iowa', 'KS' => 'Kansas', 'KY' => 'Kentucky', 'LA' => 'Louisiana', 'ME' => 'Maine', 'MD' => 'Maryland', 'MA' => 'Massachusetts', 'MI' => 'Michigan', 'MN' => 'Minnesota', 'MO' => 'Missouri', 'MS' => 'Mississippi', 'MT' => 'Montana', 'NC' => 'North Carolina', 'ND' => 'Noth Dakota', 'NE' => 'Nebraska', 'NH' => 'New Hampshire', 'NJ' => 'New Jersey', 'NM' => 'New Mexico', 'NV' => 'Nevada', 'NY' => 'New York', 'OH' => 'Ohio', 'OK' => 'Oklahoma', 'OR' => 'Oregon', 'PA' => 'Pennsylvania', 'RI' => 'Rhode Island', 'SC' => 'South Carolina', 'SD' => 'South Dakota', 'TN' => 'Tennessee', 'TX' => 'Texas', 'UT' => 'Utah', 'VA' => 'Virginia', 'VT' => 'Vermont', 'WA' => 'Washington', 'WI' => 'Wisconsin', 'WV' => 'West Virginia', 'WY' => 'Wyoming' ); function select_widget($ui) { foreach($this->monthnames as $k => $name) { if ($name) { $this->monthnames[$k] = lang($name); } } foreach($this->countrys as $k => $name) { if (($translated = lang($name)) != $name.'*') { $this->countrys[$k] = $translated; } } asort($this->countrys); } function pre_process($name,&$value,&$cell,&$readonlys,&$extension_data,&$tmpl) { list($rows,$type,$type2,$type3) = explode(',',$cell['size']); switch ($cell['type']) { case 'select-percent': // options: #row,decrement(default=10) $decr = $type > 0 ? $type : 10; for ($i=0; $i <= 100; $i += $decr) { $cell['sel_options'][intval($i)] = intval($i).'%'; } $cell['sel_options'][100] = '100%'; $value = intval(($value+($decr/2)) / $decr) * $decr; $cell['no_lang'] = True; break; case 'select-priority': $cell['sel_options'] = array('','low','normal','high'); break; case 'select-access': $cell['sel_options'] = array( 'private' => 'Private', 'public' => 'Global public', 'group' => 'Group public' ); break; case 'select-country': $cell['sel_options'] = $this->countrys; $cell['no_lang'] = True; break; case 'select-state': $cell['sel_options'] = $this->states; $cell['no_lang'] = True; break; case 'select-cat': // !$type == globals cats too if (!is_object($GLOBALS['phpgw']->categories)) { $GLOBALS['phpgw']->categories = CreateObject('phpgwapi.categories'); } $cats = $GLOBALS['phpgw']->categories->return_sorted_array(0,False,'','','',!$type); while (list(,$cat) = @each($cats)) { for ($j=0,$s=''; $j < $cat['level']; $j++) { $s .= ' '; } $s .= $GLOBALS['phpgw']->strip_html($cat['name']); if ($cat['app_name'] == 'phpgw') { $s .= ' <' . lang('Global') . '>'; } if ($cat['owner'] == '-1') { $s .= ' <' . lang('Global') . ' ' . lang($this->app_name) . '>'; } if ($tmpl->stable) { $cell['sel_options'][$cat['id']] = $s; // 0.9.14 only } else { $cell['sel_options'][$cat['cat_id']] = $s; } } $cell['no_lang'] = True; break; case 'select-account': // options: #rows,{accounts(default)|both|groups},{0(=lid)|1(default=name)|2(=lid+name))} $cell['no_lang'] = True; // in case of readonly, we read/create only the needed entries, as reading accounts is expensive if ($cell['readonly'] || $readonlys) { foreach(is_array($value) ? $value : array($value) as $id) { $cell['sel_options'][$id] = $this->accountInfo($id,$acc,$type2,$type=='both'); } break; } $accs = $GLOBALS['phpgw']->accounts->get_list(empty($type) ? 'accounts' : $type); // default is accounts foreach($accs as $acc) { if ($acc['account_type'] == 'g') { $cell['sel_options'][$acc['account_id']] = $this->accountInfo($acc['account_id'],$acc,$type2,$type=='both'); } } foreach($accs as $acc) { if ($acc['account_type'] == 'u') { $cell['sel_options'][$acc['account_id']] = $this->accountInfo($acc['account_id'],$acc,$type2,$type=='both'); } } break; case 'select-year': // options: #rows,#before(default=3),#after(default=2) $cell['sel_options'][''] = ''; if ($type <= 0) $type = 3; if ($type2 <= 0) $type2 = 2; if ($type > 100 && $type2 > 100 && $type > $type) { $y = $type; $type=$type2; $type2=$y; } $y = date('Y')-$type; if ($value && $value-$type < $y || $type > 100) $y = $type > 100 ? $type : $value-$type; $to = date('Y')+$type2; if ($value && $value+$type2 > $to || $type2 > 100) $to = $type2 > 100 ? $type2 : $value+$type2; for ($n = 0; $y <= $to && $n < 200; ++$n) { $cell['sel_options'][$y] = $y++; } $cell['no_lang'] = True; break; case 'select-month': $cell['sel_options'] = $this->monthnames; $value = intval($value); break; case 'select-day': $type = 1; $type2 = 31; $type3 = 1; // fall-through case 'select-number': // options: rows,min,max,decrement $type = $type === '' ? 1 : intval($type); // min $type2 = $type2 === '' ? 10 : intval($type2); // max $format = '%d'; if (!empty($type3) && $type3[0] == '0') // leading zero { $format = '%0'.strlen($type3).'d'; } $type3 = !$type3 ? 1 : intval($type3); // decrement if (($type < $type2) != ($type3 > 0)) { $type3 = -$type3; // void infinite loop } for ($i=0,$n=$type; $n <= $type2 && $i <= 100; $n += $type3) { $cell['sel_options'][$n] = sprintf($format,$n); } $cell['no_lang'] = True; break; case 'select-app': // type2: ''=users enabled apps, 'installed', 'all' = not installed ones too $apps = array(); foreach ($GLOBALS['phpgw_info']['apps'] as $app => $data) { if (!$type2 || $GLOBALS['phpgw_info']['user']['apps'][$app]) { $apps[$app] = $data['title'] ? $data['title'] : lang($app); } } if ($type2 == 'all') { $dir = opendir(PHPGW_SERVER_ROOT); while ($file = readdir($dir)) { if (@is_dir(PHPGW_SERVER_ROOT."/$file/setup") && $file[0] != '.' && !isset($apps[$app = basename($file)])) { $apps[$app] = $app . ' (*)'; } } closedir($dir); } $apps_lower = $apps; // case-in-sensitve sort foreach ($apps_lower as $app => $title) { $apps_lower[$app] = strtolower($title); } asort($apps_lower); foreach ($apps_lower as $app => $title) { $cell['sel_options'][$app] = $apps[$app]; } break; } if ($rows > 1) { unset($cell['sel_options']['']); } return True; // extra Label Ok } function accountInfo($id,$acc=0,$longnames=0,$show_type=0) { if (!$id) { return ' '; } if (!is_array($acc)) { $data = $GLOBALS['phpgw']->accounts->get_account_data($id); foreach(array('type','lid','firstname','lastname') as $name) { $acc['account_'.$name] = $data[$id][$name]; } } $info = $show_type ? '('.$acc['account_type'].') ' : ''; switch ($longnames) { case 2: $info .= '<'.$acc['account_lid'].'> '; // fall-through case 1: $info .= $acc['account_type'] == 'g' ? lang('group').' '.$acc['account_lid'] : $acc['account_firstname'].' '.$acc['account_lastname']; break; case '0': $info .= $acc['account_lid']; break; default: // use the phpgw default $info = $GLOBALS['phpgw']->common->display_fullname($acc['account_lid'], $acc['account_firstname'],$acc['account_lastname']); break; } return $info; } }