From 64fca63a29fb2a863d159734627795acfb17c853 Mon Sep 17 00:00:00 2001 From: Andreas Gohr Date: Tue, 19 Jun 2007 16:07:20 +0200 Subject: [PATCH] file hierachy reordering darcs-hash:20070619140720-6e07b-2001276d635b4578c12c90724ce6b2cd7f41e785.gz --- ajax.php | 11 +- COPYING => doc/COPYING | 0 README => doc/README | 0 TODO => doc/TODO | 0 ldapab.schema => doc/docs | 0 slapd.example => doc/slapd.example | 0 entries.conf | 20 - entry.php | 357 ++-- help.php | 16 +- img.php | 24 +- import.php | 240 +-- .../Contact_Vcard_Parse.php | 0 config.php => inc/config.php | 0 fields.php => inc/fields.php | 0 functions.php => inc/functions.php | 0 importVCF.php => inc/importVCF.php | 0 init.php => inc/init.php | 16 +- {lang => inc/lang}/ca.php | 0 {lang => inc/lang}/de.php | 0 {lang => inc/lang}/en.php | 0 {lang => inc/lang}/fr.php | 0 {lang => inc/lang}/it.php | 0 {lang => inc/lang}/nl.php | 0 {smarty => inc/smarty}/Config_File.class.php | 0 {smarty => inc/smarty}/Smarty.class.php | 0 .../smarty}/Smarty_Compiler.class.php | 0 {smarty => inc/smarty}/debug.tpl | 0 .../core.assemble_plugin_filepath.php | 0 .../core.assign_smarty_interface.php | 0 .../internals/core.create_dir_structure.php | 0 .../internals/core.display_debug_console.php | 0 .../internals/core.get_include_path.php | 0 .../smarty}/internals/core.get_microtime.php | 0 .../internals/core.get_php_resource.php | 0 .../smarty}/internals/core.is_secure.php | 0 .../smarty}/internals/core.is_trusted.php | 0 .../smarty}/internals/core.load_plugins.php | 0 .../internals/core.load_resource_plugin.php | 0 .../internals/core.process_cached_inserts.php | 0 .../core.process_compiled_include.php | 0 .../internals/core.read_cache_file.php | 0 .../smarty}/internals/core.rm_auto.php | 0 .../smarty}/internals/core.rmdir.php | 0 .../internals/core.run_insert_handler.php | 0 .../internals/core.smarty_include_php.php | 0 .../internals/core.write_cache_file.php | 0 .../internals/core.write_compiled_include.php | 0 .../core.write_compiled_resource.php | 0 .../smarty}/internals/core.write_file.php | 0 .../smarty}/plugins/block.textformat.php | 0 .../smarty}/plugins/compiler.assign.php | 0 .../smarty}/plugins/function.assign.php | 0 .../plugins/function.assign_debug_info.php | 0 .../smarty}/plugins/function.config_load.php | 0 .../smarty}/plugins/function.counter.php | 0 .../smarty}/plugins/function.cycle.php | 0 .../smarty}/plugins/function.debug.php | 0 .../smarty}/plugins/function.eval.php | 0 .../smarty}/plugins/function.fetch.php | 0 .../plugins/function.html_checkboxes.php | 0 .../smarty}/plugins/function.html_image.php | 0 .../smarty}/plugins/function.html_options.php | 0 .../smarty}/plugins/function.html_radios.php | 0 .../plugins/function.html_select_date.php | 0 .../plugins/function.html_select_time.php | 0 .../smarty}/plugins/function.html_table.php | 0 .../smarty}/plugins/function.mailto.php | 0 .../smarty}/plugins/function.math.php | 0 .../smarty}/plugins/function.popup.php | 0 .../smarty}/plugins/function.popup_init.php | 0 .../smarty}/plugins/modifier.capitalize.php | 0 .../smarty}/plugins/modifier.cat.php | 0 .../plugins/modifier.count_characters.php | 0 .../plugins/modifier.count_paragraphs.php | 0 .../plugins/modifier.count_sentences.php | 0 .../smarty}/plugins/modifier.count_words.php | 0 .../smarty}/plugins/modifier.csv.php | 0 .../smarty}/plugins/modifier.date_format.php | 0 .../plugins/modifier.debug_print_var.php | 0 .../smarty}/plugins/modifier.default.php | 0 .../smarty}/plugins/modifier.escape.php | 0 .../smarty}/plugins/modifier.indent.php | 0 .../smarty}/plugins/modifier.lower.php | 0 .../smarty}/plugins/modifier.nl2br.php | 0 .../smarty}/plugins/modifier.noteparser.php | 0 .../plugins/modifier.regex_replace.php | 0 .../smarty}/plugins/modifier.replace.php | 0 .../smarty}/plugins/modifier.spacify.php | 0 .../plugins/modifier.string_format.php | 0 .../smarty}/plugins/modifier.strip.php | 0 .../smarty}/plugins/modifier.strip_tags.php | 0 .../smarty}/plugins/modifier.truncate.php | 0 .../smarty}/plugins/modifier.upper.php | 0 .../smarty}/plugins/modifier.wordwrap.php | 0 .../plugins/outputfilter.trimwhitespace.php | 0 .../plugins/shared.escape_special_chars.php | 0 .../smarty}/plugins/shared.make_timestamp.php | 0 template.php => inc/template.php | 0 index.php | 9 +- js/builder.js | 101 - js/controls.js | 770 ------- js/date-formatting.js | 253 --- js/dragdrop.js | 585 ------ js/effects.js | 903 --------- js/formatDate.js | 290 --- js/gui.js | 148 -- js/prototype.js | 1785 ----------------- js/scriptaculous.js | 45 - js/slider.js | 283 --- js/unittest.js | 363 ---- login.php | 2 +- orgs.php | 2 +- tags.php | 4 +- xml.php | 139 -- 114 files changed, 315 insertions(+), 6051 deletions(-) rename COPYING => doc/COPYING (100%) rename README => doc/README (100%) rename TODO => doc/TODO (100%) rename ldapab.schema => doc/docs (100%) rename slapd.example => doc/slapd.example (100%) delete mode 100644 entries.conf rename Contact_Vcard_Parse.php => inc/Contact_Vcard_Parse.php (100%) rename config.php => inc/config.php (100%) rename fields.php => inc/fields.php (100%) rename functions.php => inc/functions.php (100%) rename importVCF.php => inc/importVCF.php (100%) rename init.php => inc/init.php (66%) rename {lang => inc/lang}/ca.php (100%) rename {lang => inc/lang}/de.php (100%) rename {lang => inc/lang}/en.php (100%) rename {lang => inc/lang}/fr.php (100%) rename {lang => inc/lang}/it.php (100%) rename {lang => inc/lang}/nl.php (100%) rename {smarty => inc/smarty}/Config_File.class.php (100%) rename {smarty => inc/smarty}/Smarty.class.php (100%) rename {smarty => inc/smarty}/Smarty_Compiler.class.php (100%) rename {smarty => inc/smarty}/debug.tpl (100%) rename {smarty => inc/smarty}/internals/core.assemble_plugin_filepath.php (100%) rename {smarty => inc/smarty}/internals/core.assign_smarty_interface.php (100%) rename {smarty => inc/smarty}/internals/core.create_dir_structure.php (100%) rename {smarty => inc/smarty}/internals/core.display_debug_console.php (100%) rename {smarty => inc/smarty}/internals/core.get_include_path.php (100%) rename {smarty => inc/smarty}/internals/core.get_microtime.php (100%) rename {smarty => inc/smarty}/internals/core.get_php_resource.php (100%) rename {smarty => inc/smarty}/internals/core.is_secure.php (100%) rename {smarty => inc/smarty}/internals/core.is_trusted.php (100%) rename {smarty => inc/smarty}/internals/core.load_plugins.php (100%) rename {smarty => inc/smarty}/internals/core.load_resource_plugin.php (100%) rename {smarty => inc/smarty}/internals/core.process_cached_inserts.php (100%) rename {smarty => inc/smarty}/internals/core.process_compiled_include.php (100%) rename {smarty => inc/smarty}/internals/core.read_cache_file.php (100%) rename {smarty => inc/smarty}/internals/core.rm_auto.php (100%) rename {smarty => inc/smarty}/internals/core.rmdir.php (100%) rename {smarty => inc/smarty}/internals/core.run_insert_handler.php (100%) rename {smarty => inc/smarty}/internals/core.smarty_include_php.php (100%) rename {smarty => inc/smarty}/internals/core.write_cache_file.php (100%) rename {smarty => inc/smarty}/internals/core.write_compiled_include.php (100%) rename {smarty => inc/smarty}/internals/core.write_compiled_resource.php (100%) rename {smarty => inc/smarty}/internals/core.write_file.php (100%) rename {smarty => inc/smarty}/plugins/block.textformat.php (100%) rename {smarty => inc/smarty}/plugins/compiler.assign.php (100%) rename {smarty => inc/smarty}/plugins/function.assign.php (100%) rename {smarty => inc/smarty}/plugins/function.assign_debug_info.php (100%) rename {smarty => inc/smarty}/plugins/function.config_load.php (100%) rename {smarty => inc/smarty}/plugins/function.counter.php (100%) rename {smarty => inc/smarty}/plugins/function.cycle.php (100%) rename {smarty => inc/smarty}/plugins/function.debug.php (100%) rename {smarty => inc/smarty}/plugins/function.eval.php (100%) rename {smarty => inc/smarty}/plugins/function.fetch.php (100%) rename {smarty => inc/smarty}/plugins/function.html_checkboxes.php (100%) rename {smarty => inc/smarty}/plugins/function.html_image.php (100%) rename {smarty => inc/smarty}/plugins/function.html_options.php (100%) rename {smarty => inc/smarty}/plugins/function.html_radios.php (100%) rename {smarty => inc/smarty}/plugins/function.html_select_date.php (100%) rename {smarty => inc/smarty}/plugins/function.html_select_time.php (100%) rename {smarty => inc/smarty}/plugins/function.html_table.php (100%) rename {smarty => inc/smarty}/plugins/function.mailto.php (100%) rename {smarty => inc/smarty}/plugins/function.math.php (100%) rename {smarty => inc/smarty}/plugins/function.popup.php (100%) rename {smarty => inc/smarty}/plugins/function.popup_init.php (100%) rename {smarty => inc/smarty}/plugins/modifier.capitalize.php (100%) rename {smarty => inc/smarty}/plugins/modifier.cat.php (100%) rename {smarty => inc/smarty}/plugins/modifier.count_characters.php (100%) rename {smarty => inc/smarty}/plugins/modifier.count_paragraphs.php (100%) rename {smarty => inc/smarty}/plugins/modifier.count_sentences.php (100%) rename {smarty => inc/smarty}/plugins/modifier.count_words.php (100%) rename {smarty => inc/smarty}/plugins/modifier.csv.php (100%) rename {smarty => inc/smarty}/plugins/modifier.date_format.php (100%) rename {smarty => inc/smarty}/plugins/modifier.debug_print_var.php (100%) rename {smarty => inc/smarty}/plugins/modifier.default.php (100%) rename {smarty => inc/smarty}/plugins/modifier.escape.php (100%) rename {smarty => inc/smarty}/plugins/modifier.indent.php (100%) rename {smarty => inc/smarty}/plugins/modifier.lower.php (100%) rename {smarty => inc/smarty}/plugins/modifier.nl2br.php (100%) rename {smarty => inc/smarty}/plugins/modifier.noteparser.php (100%) rename {smarty => inc/smarty}/plugins/modifier.regex_replace.php (100%) rename {smarty => inc/smarty}/plugins/modifier.replace.php (100%) rename {smarty => inc/smarty}/plugins/modifier.spacify.php (100%) rename {smarty => inc/smarty}/plugins/modifier.string_format.php (100%) rename {smarty => inc/smarty}/plugins/modifier.strip.php (100%) rename {smarty => inc/smarty}/plugins/modifier.strip_tags.php (100%) rename {smarty => inc/smarty}/plugins/modifier.truncate.php (100%) rename {smarty => inc/smarty}/plugins/modifier.upper.php (100%) rename {smarty => inc/smarty}/plugins/modifier.wordwrap.php (100%) rename {smarty => inc/smarty}/plugins/outputfilter.trimwhitespace.php (100%) rename {smarty => inc/smarty}/plugins/shared.escape_special_chars.php (100%) rename {smarty => inc/smarty}/plugins/shared.make_timestamp.php (100%) rename template.php => inc/template.php (100%) delete mode 100644 js/builder.js delete mode 100644 js/controls.js delete mode 100644 js/date-formatting.js delete mode 100644 js/dragdrop.js delete mode 100644 js/effects.js delete mode 100644 js/formatDate.js delete mode 100644 js/gui.js delete mode 100644 js/prototype.js delete mode 100644 js/scriptaculous.js delete mode 100644 js/slider.js delete mode 100644 js/unittest.js delete mode 100644 xml.php diff --git a/ajax.php b/ajax.php index 997eba1..7e16b2f 100644 --- a/ajax.php +++ b/ajax.php @@ -1,14 +1,7 @@ <[!CDATA['; -print_r($_REQUEST); -echo ']]>'; -*/ - $FIELD = preg_replace('/entry\[/','',$_REQUEST['field']); $FIELD = preg_replace('/\W+/','',$FIELD); @@ -46,7 +39,7 @@ function ajax_addnote($dn,$note){ ldap_modify($LDAP_CON,$dn,$entry); - require_once(dirname(__FILE__).'/smarty/plugins/modifier.noteparser.php'); + require_once(dirname(__FILE__).'/inc/smarty/plugins/modifier.noteparser.php'); print smarty_modifier_noteparser($note); } diff --git a/COPYING b/doc/COPYING similarity index 100% rename from COPYING rename to doc/COPYING diff --git a/README b/doc/README similarity index 100% rename from README rename to doc/README diff --git a/TODO b/doc/TODO similarity index 100% rename from TODO rename to doc/TODO diff --git a/ldapab.schema b/doc/docs similarity index 100% rename from ldapab.schema rename to doc/docs diff --git a/slapd.example b/doc/slapd.example similarity index 100% rename from slapd.example rename to doc/slapd.example diff --git a/entries.conf b/entries.conf deleted file mode 100644 index 0809369..0000000 --- a/entries.conf +++ /dev/null @@ -1,20 +0,0 @@ -dn dn -sn name -givenName givenname -title title -o organization -physicalDeliveryOfficeName office -postalAddress street -postalCode zip -l location -telephoneNumber phone -facsimileTelephoneNumber fax -mobile mobile -pager pager -homePhone homephone -homePostalAddress homestreet -photo photo -jpegPhoto photo -labeledURI url -description note -manager manager diff --git a/entry.php b/entry.php index ec73909..e224522 100644 --- a/entry.php +++ b/entry.php @@ -1,141 +1,136 @@ - clean it up (trim, unique, sort) - $_REQUEST['entry'][$field] = array_map('trim',$_REQUEST['entry'][$field]); - $_REQUEST['entry'][$field] = array_unique($_REQUEST['entry'][$field]); - $_REQUEST['entry'][$field] = array_filter($_REQUEST['entry'][$field]); - natcasesort($_REQUEST['entry'][$field]); - } - } - $dn = _saveData(); + clean it up (trim, unique, sort) + $_REQUEST['entry'][$field] = array_map('trim',$_REQUEST['entry'][$field]); + $_REQUEST['entry'][$field] = array_unique($_REQUEST['entry'][$field]); + $_REQUEST['entry'][$field] = array_filter($_REQUEST['entry'][$field]); + natcasesort($_REQUEST['entry'][$field]); + } } + $dn = _saveData(); +} - if(empty($dn)){ - if(!$_REQUEST['mode']=='edit'){ - $smarty->assign('error','No dn was given'); - $template = 'error.tpl'; - } - }elseif(!empty($_REQUEST['del']) && $_REQUEST['del']){ - _delEntry($dn); - }elseif(!_fetchData($dn)){ - $smarty->assign('error',"The requested entry '$dn' was not found"); +if(empty($dn)){ + if(!$_REQUEST['mode']=='edit'){ + $smarty->assign('error','No dn was given'); $template = 'error.tpl'; } - - //prepare templates - $smarty->assign('dn',$dn); - $smarty->assign('managers',$users); - tpl_std(); - tpl_orgs(); - tpl_markers(); - tpl_categories(); - tpl_timezone(); - tpl_country(); - //display templates - if($_REQUEST['mode']=='vcf'){ - $entry = $smarty->get_template_vars('entry'); - $filename = $entry['givenname'].'_'.$entry['name'].'.vcf'; - header("Content-Disposition: attachment; filename=\"$filename\""); - header("Content-type: text/x-vcard; name=\"$filename\"; charset=utf-8"); - $smarty->display($template); - }else{ - header('Content-Type: text/html; charset=utf-8'); - $smarty->display($template); +}elseif(!empty($_REQUEST['del']) && $_REQUEST['del']){ + _delEntry($dn); +}elseif(!_fetchData($dn)){ + $smarty->assign('error',"The requested entry '$dn' was not found"); + $template = 'error.tpl'; +} + +//prepare templates +$smarty->assign('dn',$dn); +$smarty->assign('managers',$users); +tpl_std(); +//display templates +if($_REQUEST['mode']=='vcf'){ + $entry = $smarty->get_template_vars('entry'); + $filename = $entry['givenname'].'_'.$entry['name'].'.vcf'; + header("Content-Disposition: attachment; filename=\"$filename\""); + header("Content-type: text/x-vcard; name=\"$filename\"; charset=utf-8"); + $smarty->display($template); +}else{ + header('Content-Type: text/html; charset=utf-8'); + $smarty->display($template); +} + +//-------------------------------------------------------------- + +/** + * fetches the Data from the LDAP directory and assigns it to + * the global smarty object using tpl_entry() + */ +function _fetchData($dn){ + global $LDAP_CON; + global $conf; + global $smarty; + global $users; //contains the users for manager role + + $sr = ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)'); + if(!ldap_count_entries($LDAP_CON,$sr)){ + return false; } + $result = ldap_get_binentries($LDAP_CON, $sr); + $entry = $result[0]; - //-------------------------------------------------------------- - - /** - * fetches the Data from the LDAP directory and assigns it to - * the global smarty object using tpl_entry() - */ - function _fetchData($dn){ - global $LDAP_CON; - global $conf; - global $smarty; - global $users; //contains the users for manager role - - $sr = ldap_search($LDAP_CON,$dn,'(objectClass=inetOrgPerson)'); - if(!ldap_count_entries($LDAP_CON,$sr)){ - return false; - } - $result = ldap_get_binentries($LDAP_CON, $sr); - $entry = $result[0]; - - //remove dn from entry when copy - if(!empty($_REQUEST['mode']) && $_REQUEST['mode'] == 'copy'){ - $entry['dn']=''; - } + //remove dn from entry when copy + if(!empty($_REQUEST['mode']) && $_REQUEST['mode'] == 'copy'){ + $entry['dn']=''; + } - //assign entry to template: - tpl_entry($entry); + //assign entry to template: + tpl_entry($entry); /*print '
';
 print_r($entry);
 print '
';*/ - // make username from dn for manager: - if (empty($entry['manager'])) { $entry['manager']=array(""); } - if (empty($users[$entry['manager'][0]])) { $users[$entry['manager'][0]]=''; } - $smarty->assign('managername',$users[$entry['manager'][0]]); - return true; + // make username from dn for manager: + if (empty($entry['manager'])) { $entry['manager']=array(""); } + if (empty($users[$entry['manager'][0]])) { $users[$entry['manager'][0]]=''; } + $smarty->assign('managername',$users[$entry['manager'][0]]); + return true; +} + +/** + * saves the data from $_REQUEST['entry'] to the LDAP directory + * + * returns given or constructed dn + */ +function _saveData(){ + global $LDAP_CON; + global $conf; + global $FIELDS; + global $OCLASSES; + + $entry = $_REQUEST['entry']; + $dn = $_REQUEST['dn']; + //construct new dn + $now = time(); + $newdn = 'uid='.$now; + if (empty($_REQUEST['type'])) { $_REQUEST['type']='public'; } + if($_REQUEST['type'] == 'private'){ + $newdn .= ', '.$conf['privatebook'].', '.$_SESSION['ldapab']['binddn']; + }else{ + $newdn .= ', '.$conf['publicbook']; } - - /** - * saves the data from $_REQUEST['entry'] to the LDAP directory - * - * returns given or constructed dn - */ - function _saveData(){ - global $LDAP_CON; - global $conf; - global $FIELDS; - global $OCLASSES; - - $entry = $_REQUEST['entry']; - $dn = $_REQUEST['dn']; - //construct new dn - $now = time(); - $newdn = 'uid='.$now; - if (empty($_REQUEST['type'])) { $_REQUEST['type']='public'; } - if($_REQUEST['type'] == 'private'){ - $newdn .= ', '.$conf['privatebook'].', '.$_SESSION['ldapab']['binddn']; - }else{ - $newdn .= ', '.$conf['publicbook']; - } - $entry['displayname'] = $entry['givenname'].' '.$entry['name'];; - $entry = prepare_ldap_entry($entry); + $entry['displayname'] = $entry['givenname'].' '.$entry['name'];; + $entry = prepare_ldap_entry($entry); /* print '
';
@@ -143,68 +138,68 @@ print_r($entry);
 print '
'; */ - if(empty($dn)){ - //new entry - $entry['uid'][] = $now; - $r = ldap_add($LDAP_CON,$newdn,$entry); - tpl_ldaperror(); - return $newdn; - }else{ - // update the objectClasses - ldap_store_objectclasses($dn,$OCLASSES); - unset($entry['objectclass']); - - //modify entry attribute by attribute - this ensure we don't delete unknown stuff - foreach (array_values($FIELDS) as $key){ - if($key == 'dn'){ + if(empty($dn)){ + //new entry + $entry['uid'][] = $now; + $r = ldap_add($LDAP_CON,$newdn,$entry); + tpl_ldaperror(); + return $newdn; + }else{ + // update the objectClasses + ldap_store_objectclasses($dn,$OCLASSES); + unset($entry['objectclass']); + + //modify entry attribute by attribute - this ensure we don't delete unknown stuff + foreach (array_values($FIELDS) as $key){ + if($key == 'dn'){ + continue; + }elseif(empty($entry[$key])){ + // field is empty -> handle deletion (except for photo unless deletion triggered) + if (empty($_REQUEST['delphoto'])) { $_REQUEST['delphoto']=0; } + if($key == 'jpegPhoto' && !$_REQUEST['delphoto']){ continue; - }elseif(empty($entry[$key])){ - // field is empty -> handle deletion (except for photo unless deletion triggered) - if (empty($_REQUEST['delphoto'])) { $_REQUEST['delphoto']=0; } - if($key == 'jpegPhoto' && !$_REQUEST['delphoto']){ - continue; - } - unset($del); - $del[$key]=array(); - $r = @ldap_mod_replace($LDAP_CON,$dn,$del); - tpl_ldaperror("del $key"); - }else{ - unset($add); - $add[$key]=$entry[$key]; - $r = @ldap_mod_replace($LDAP_CON,$dn,$add); - tpl_ldaperror("mod $key"); } + unset($del); + $del[$key]=array(); + $r = @ldap_mod_replace($LDAP_CON,$dn,$del); + tpl_ldaperror("del $key"); + }else{ + unset($add); + $add[$key]=$entry[$key]; + $r = @ldap_mod_replace($LDAP_CON,$dn,$add); + tpl_ldaperror("mod $key"); } - return $dn; } + return $dn; } - - /** - * does as the name says - delete the whole entry - */ - function _delEntry($dn){ - global $LDAP_CON; - if(ldap_full_delete($LDAP_CON,$dn,true)){ - header("Location: index.php"); - exit; - } +} + +/** + * does as the name says - delete the whole entry + */ +function _delEntry($dn){ + global $LDAP_CON; + if(ldap_full_delete($LDAP_CON,$dn,true)){ + header("Location: index.php"); + exit; } - - /** - * gets the binary data from an uploaded file - */ - function _getUploadData(){ - $file = $_FILES['photoupload']; - - if (is_uploaded_file($file['tmp_name'])) { - if(preg_match('=image/p?jpe?g=',$file['type'])){ - $fh = fopen($file['tmp_name'],'r'); - $data = fread($fh,$file['size']); - fclose($fh); - unlink($file['tmp_name']); - return $data; - } +} + +/** + * gets the binary data from an uploaded file + */ +function _getUploadData(){ + $file = $_FILES['photoupload']; + + if (is_uploaded_file($file['tmp_name'])) { + if(preg_match('=image/p?jpe?g=',$file['type'])){ + $fh = fopen($file['tmp_name'],'r'); + $data = fread($fh,$file['size']); + fclose($fh); + unlink($file['tmp_name']); + return $data; } - return ''; } + return ''; +} diff --git a/help.php b/help.php index dd933da..3efcf4d 100644 --- a/help.php +++ b/help.php @@ -1,11 +1,11 @@ -display('help.tpl'); +//prepare templates +tpl_std(); +//display templates +header('Content-Type: text/html; charset=utf-8'); +$smarty->display('help.tpl'); ?> diff --git a/img.php b/img.php index eeb4471..27a49b6 100644 --- a/img.php +++ b/img.php @@ -1,16 +1,16 @@ - diff --git a/import.php b/import.php index c26e85c..de4d3a2 100644 --- a/import.php +++ b/import.php @@ -1,162 +1,126 @@ fromFile($_FILES['userfile']['tmp_name']); - }elseif(preg_match('/^addressbook\.xml$/i', $_FILES['userfile']['name'])){ - //parse Zaurus Addressbook - $contacts = XML_unserialize(@join('',@file($_FILES['userfile']['tmp_name']))); - }else{ - $error = "Only *.vcf or addressbook.xml are accepted"; - } +$error = ''; +if(isset($_FILES['userfile'])){ + if (is_uploaded_file($_FILES['userfile']['tmp_name'])){ + if(preg_match('/\.vcf$/i', $_FILES['userfile']['name'])){ + //parse VCF + $vcfparser = new Contact_Vcard_Parse(); + $vcards = $vcfparser->fromFile($_FILES['userfile']['tmp_name']); }else{ - switch($_FILES['userfile']['error']){ - case 0: //no error; possible file attack! - $error = "There was a problem with your upload."; - break; - case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini - $error = "The file you are trying to upload is too big."; - break; - case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form - $error = "The file you are trying to upload is too big."; - break; - case 3: //uploaded file was only partially uploaded - $error = "The file you are trying upload was only partially uploaded."; - break; - case 4: //no file was uploaded - $error = "You must select a VCF file for upload."; - break; - default: //a default error, just in case! :) - $error = "There was a problem with your upload."; - break; - } - } - } - - //prepare templates for all found entries - $list = ''; - if(count($vcards)){ - foreach ($vcards as $vcard){ - $entry = vcard_entry($vcard); - $smarty->clear_all_assign(); - tpl_std(); - $smarty->assign('entry',$entry); - $list .= $smarty->fetch('import_entry.tpl'); + $error = "Only *.vcf accepted"; } - }elseif(count($contacts)){ - foreach ($contacts['AddressBook']['Contacts']['Contact'] as $contact){ - if (!is_array($contact)) continue; - $entry = zaurus_entry($contact); - $smarty->clear_all_assign(); - tpl_std(); - $smarty->assign('entry',$entry); - $list .= $smarty->fetch('import_entry.tpl'); + }else{ + switch($_FILES['userfile']['error']){ + case 0: //no error; possible file attack! + $error = "There was a problem with your upload."; + break; + case 1: //uploaded file exceeds the upload_max_filesize directive in php.ini + $error = "The file you are trying to upload is too big."; + break; + case 2: //uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the html form + $error = "The file you are trying to upload is too big."; + break; + case 3: //uploaded file was only partially uploaded + $error = "The file you are trying upload was only partially uploaded."; + break; + case 4: //no file was uploaded + $error = "You must select a VCF file for upload."; + break; + default: //a default error, just in case! :) + $error = "There was a problem with your upload."; + break; } } +} - //prepare templates - tpl_std(); - tpl_orgs(); - tpl_markers(); - $smarty->assign('error',$error); - $smarty->assign('list',$list); - //display templates - $smarty->display('header.tpl'); - $smarty->display('import.tpl'); - $smarty->display('footer.tpl'); - +//prepare templates for all found entries +$list = ''; +if(count($vcards)){ + foreach ($vcards as $vcard){ + $entry = vcard_entry($vcard); + $smarty->clear_all_assign(); + tpl_std(); + $smarty->assign('entry',$entry); + $list .= $smarty->fetch('import_entry.tpl'); + } +} -function zaurus_entry($cnct){ - $entry['name'] = $cnct['LastName']; - $entry['givenname'] = trim($cnct['FirstName'].' '.$cnct['MiddleName']); - $entry['title'] = $cnct['JobTitle']; - $entry['organization'] = $cnct['Company']; - $entry['office'] = $cnct['Office']; - $entry['note'] = $cnct['Notes']; - $entry['mail'] = split(' ',$cnct['Emails']); - $entry['street'] = $cnct['BusinessStreet']; - $entry['location'] = $cnct['BusinessCity']; - $entry['zip'] = $cnct['BusinessZip']; - $entry['homestreet'] = $cnct['HomeStreet']."\n". //str - $cnct['HomeZip']." ". //plz - $cnct['HomeCity']; //ort - $entry['homephone'] = $cnct['HomePhone']; - $entry['phone'] = $cnct['BusinessPhone']; - $entry['fax'] = empty($cnct['BusinessFax']) ? $cnct['HomeFax'] : $cnct['BusinessFax']; - $entry['mobile'] = empty($cnct['HomeMobile']) ? $cnct['BusinessMobile'] : $cnct['HomeMobile']; - $entry['fax'] = empty($cnct['BusinessFax']) ? $cnct['HomeFax'] : $cnct['BusinessFax']; +//prepare templates +tpl_std(); +tpl_orgs(); +tpl_markers(); +$smarty->assign('error',$error); +$smarty->assign('list',$list); +//display templates +$smarty->display('header.tpl'); +$smarty->display('import.tpl'); +$smarty->display('footer.tpl'); - return $entry; -} function vcard_entry($vcf){ - $entry['name'] = $vcf['N'][0]['value'][0][0]; - $entry['givenname'] = trim($vcf['N'][0]['value'][1][0].' '.$vcf['N'][0]['value'][2][0]); - $entry['title'] = $vcf['N'][0]['value'][3][0]; - $entry['organization'] = $vcf['ORG'][0]['value'][0][0]; - $entry['office'] = $vcf['ORG'][0]['value'][1][0]; - $entry['note'] = $vcf['NOTE'][0]['value'][0][0]; - $entry['url'] = $vcf['URL'][0]['value'][0][0]; - $bday = $vcf['BDAY'][0]['value'][0][0]; - $entry['anniversary'] = substr($bday,0,4).'-'.substr($bday,4,2).'-'.substr($bday,6,2); +$entry['name'] = $vcf['N'][0]['value'][0][0]; +$entry['givenname'] = trim($vcf['N'][0]['value'][1][0].' '.$vcf['N'][0]['value'][2][0]); +$entry['title'] = $vcf['N'][0]['value'][3][0]; +$entry['organization'] = $vcf['ORG'][0]['value'][0][0]; +$entry['office'] = $vcf['ORG'][0]['value'][1][0]; +$entry['note'] = $vcf['NOTE'][0]['value'][0][0]; +$entry['url'] = $vcf['URL'][0]['value'][0][0]; +$bday = $vcf['BDAY'][0]['value'][0][0]; +$entry['anniversary'] = substr($bday,0,4).'-'.substr($bday,4,2).'-'.substr($bday,6,2); - foreach($vcf['TEL'] as $tel){ - if( empty($entry['phone']) && - array_search('WORK',$tel['param']['TYPE']) !== FALSE && +foreach($vcf['TEL'] as $tel){ + if( empty($entry['phone']) && + array_search('WORK',$tel['param']['TYPE']) !== FALSE && + array_search('VOICE',$tel['param']['TYPE']) !== FALSE){ + // Work phone + $entry['phone'] = $tel['value'][0][0]; + }elseif(empty($entry['fax']) && + array_search('FAX',$tel['param']['TYPE']) !== FALSE){ + $entry['fax'] = $tel['value'][0][0]; + }elseif(empty($entry['mobile']) && + array_search('CELL',$tel['param']['TYPE']) !== FALSE){ + $entry['mobile'] = $tel['value'][0][0]; + }elseif(empty($entry['pager']) && + array_search('PAGER',$tel['param']['TYPE']) !== FALSE){ + $entry['pager'] = $tel['value'][0][0]; + }elseif(empty($entry['homephone']) && + array_search('HOME',$tel['param']['TYPE']) !== FALSE && array_search('VOICE',$tel['param']['TYPE']) !== FALSE){ - // Work phone - $entry['phone'] = $tel['value'][0][0]; - }elseif(empty($entry['fax']) && - array_search('FAX',$tel['param']['TYPE']) !== FALSE){ - $entry['fax'] = $tel['value'][0][0]; - }elseif(empty($entry['mobile']) && - array_search('CELL',$tel['param']['TYPE']) !== FALSE){ - $entry['mobile'] = $tel['value'][0][0]; - }elseif(empty($entry['pager']) && - array_search('PAGER',$tel['param']['TYPE']) !== FALSE){ - $entry['pager'] = $tel['value'][0][0]; - }elseif(empty($entry['homephone']) && - array_search('HOME',$tel['param']['TYPE']) !== FALSE && - array_search('VOICE',$tel['param']['TYPE']) !== FALSE){ - $entry['homephone'] = $tel['value'][0][0]; - } - } - foreach($vcf['EMAIL'] as $mail){ - $entry['mail'][] = $mail['value'][0][0]; + $entry['homephone'] = $tel['value'][0][0]; } - foreach($vcf['ADR'] as $adr){ - if(array_search('HOME',$adr['param']['TYPE']) !== FALSE){ - $entry['homestreet'] = $adr['value'][2][0]."\n". //str - $adr['value'][5][0]." ". //plz - $adr['value'][3][0]; //ort +} +foreach($vcf['EMAIL'] as $mail){ + $entry['mail'][] = $mail['value'][0][0]; +} +foreach($vcf['ADR'] as $adr){ + if(array_search('HOME',$adr['param']['TYPE']) !== FALSE){ + $entry['homestreet'] = $adr['value'][2][0]."\n". //str + $adr['value'][5][0]." ". //plz + $adr['value'][3][0]; //ort - }elseif(array_search('WORK',$adr['param']['TYPE']) !== FALSE){ - $entry['street'] = $adr['value'][2][0]; - $entry['location'] = $adr['value'][3][0]; - $entry['zip'] = $adr['value'][5][0]; - } + }elseif(array_search('WORK',$adr['param']['TYPE']) !== FALSE){ + $entry['street'] = $adr['value'][2][0]; + $entry['location'] = $adr['value'][3][0]; + $entry['zip'] = $adr['value'][5][0]; } +} /* - print '
';
-  print_r($entry);
-  print '
'; +print '
';
+print_r($entry);
+print '
'; */ - return $entry; +return $entry; } diff --git a/Contact_Vcard_Parse.php b/inc/Contact_Vcard_Parse.php similarity index 100% rename from Contact_Vcard_Parse.php rename to inc/Contact_Vcard_Parse.php diff --git a/config.php b/inc/config.php similarity index 100% rename from config.php rename to inc/config.php diff --git a/fields.php b/inc/fields.php similarity index 100% rename from fields.php rename to inc/fields.php diff --git a/functions.php b/inc/functions.php similarity index 100% rename from functions.php rename to inc/functions.php diff --git a/importVCF.php b/inc/importVCF.php similarity index 100% rename from importVCF.php rename to inc/importVCF.php diff --git a/init.php b/inc/init.php similarity index 66% rename from init.php rename to inc/init.php index 3130292..ad5c900 100644 --- a/init.php +++ b/inc/init.php @@ -1,10 +1,10 @@ compile_dir = './cache'; + $smarty->compile_dir = dirname(__FILE__).'/../cache'; $smarty->use_sub_dirs = 0; - $smarty->template_dir = './templates'; + $smarty->template_dir = dirname(__FILE__).'/../templates'; $smarty->force_compile = $conf['smartycompile']; ?> diff --git a/lang/ca.php b/inc/lang/ca.php similarity index 100% rename from lang/ca.php rename to inc/lang/ca.php diff --git a/lang/de.php b/inc/lang/de.php similarity index 100% rename from lang/de.php rename to inc/lang/de.php diff --git a/lang/en.php b/inc/lang/en.php similarity index 100% rename from lang/en.php rename to inc/lang/en.php diff --git a/lang/fr.php b/inc/lang/fr.php similarity index 100% rename from lang/fr.php rename to inc/lang/fr.php diff --git a/lang/it.php b/inc/lang/it.php similarity index 100% rename from lang/it.php rename to inc/lang/it.php diff --git a/lang/nl.php b/inc/lang/nl.php similarity index 100% rename from lang/nl.php rename to inc/lang/nl.php diff --git a/smarty/Config_File.class.php b/inc/smarty/Config_File.class.php similarity index 100% rename from smarty/Config_File.class.php rename to inc/smarty/Config_File.class.php diff --git a/smarty/Smarty.class.php b/inc/smarty/Smarty.class.php similarity index 100% rename from smarty/Smarty.class.php rename to inc/smarty/Smarty.class.php diff --git a/smarty/Smarty_Compiler.class.php b/inc/smarty/Smarty_Compiler.class.php similarity index 100% rename from smarty/Smarty_Compiler.class.php rename to inc/smarty/Smarty_Compiler.class.php diff --git a/smarty/debug.tpl b/inc/smarty/debug.tpl similarity index 100% rename from smarty/debug.tpl rename to inc/smarty/debug.tpl diff --git a/smarty/internals/core.assemble_plugin_filepath.php b/inc/smarty/internals/core.assemble_plugin_filepath.php similarity index 100% rename from smarty/internals/core.assemble_plugin_filepath.php rename to inc/smarty/internals/core.assemble_plugin_filepath.php diff --git a/smarty/internals/core.assign_smarty_interface.php b/inc/smarty/internals/core.assign_smarty_interface.php similarity index 100% rename from smarty/internals/core.assign_smarty_interface.php rename to inc/smarty/internals/core.assign_smarty_interface.php diff --git a/smarty/internals/core.create_dir_structure.php b/inc/smarty/internals/core.create_dir_structure.php similarity index 100% rename from smarty/internals/core.create_dir_structure.php rename to inc/smarty/internals/core.create_dir_structure.php diff --git a/smarty/internals/core.display_debug_console.php b/inc/smarty/internals/core.display_debug_console.php similarity index 100% rename from smarty/internals/core.display_debug_console.php rename to inc/smarty/internals/core.display_debug_console.php diff --git a/smarty/internals/core.get_include_path.php b/inc/smarty/internals/core.get_include_path.php similarity index 100% rename from smarty/internals/core.get_include_path.php rename to inc/smarty/internals/core.get_include_path.php diff --git a/smarty/internals/core.get_microtime.php b/inc/smarty/internals/core.get_microtime.php similarity index 100% rename from smarty/internals/core.get_microtime.php rename to inc/smarty/internals/core.get_microtime.php diff --git a/smarty/internals/core.get_php_resource.php b/inc/smarty/internals/core.get_php_resource.php similarity index 100% rename from smarty/internals/core.get_php_resource.php rename to inc/smarty/internals/core.get_php_resource.php diff --git a/smarty/internals/core.is_secure.php b/inc/smarty/internals/core.is_secure.php similarity index 100% rename from smarty/internals/core.is_secure.php rename to inc/smarty/internals/core.is_secure.php diff --git a/smarty/internals/core.is_trusted.php b/inc/smarty/internals/core.is_trusted.php similarity index 100% rename from smarty/internals/core.is_trusted.php rename to inc/smarty/internals/core.is_trusted.php diff --git a/smarty/internals/core.load_plugins.php b/inc/smarty/internals/core.load_plugins.php similarity index 100% rename from smarty/internals/core.load_plugins.php rename to inc/smarty/internals/core.load_plugins.php diff --git a/smarty/internals/core.load_resource_plugin.php b/inc/smarty/internals/core.load_resource_plugin.php similarity index 100% rename from smarty/internals/core.load_resource_plugin.php rename to inc/smarty/internals/core.load_resource_plugin.php diff --git a/smarty/internals/core.process_cached_inserts.php b/inc/smarty/internals/core.process_cached_inserts.php similarity index 100% rename from smarty/internals/core.process_cached_inserts.php rename to inc/smarty/internals/core.process_cached_inserts.php diff --git a/smarty/internals/core.process_compiled_include.php b/inc/smarty/internals/core.process_compiled_include.php similarity index 100% rename from smarty/internals/core.process_compiled_include.php rename to inc/smarty/internals/core.process_compiled_include.php diff --git a/smarty/internals/core.read_cache_file.php b/inc/smarty/internals/core.read_cache_file.php similarity index 100% rename from smarty/internals/core.read_cache_file.php rename to inc/smarty/internals/core.read_cache_file.php diff --git a/smarty/internals/core.rm_auto.php b/inc/smarty/internals/core.rm_auto.php similarity index 100% rename from smarty/internals/core.rm_auto.php rename to inc/smarty/internals/core.rm_auto.php diff --git a/smarty/internals/core.rmdir.php b/inc/smarty/internals/core.rmdir.php similarity index 100% rename from smarty/internals/core.rmdir.php rename to inc/smarty/internals/core.rmdir.php diff --git a/smarty/internals/core.run_insert_handler.php b/inc/smarty/internals/core.run_insert_handler.php similarity index 100% rename from smarty/internals/core.run_insert_handler.php rename to inc/smarty/internals/core.run_insert_handler.php diff --git a/smarty/internals/core.smarty_include_php.php b/inc/smarty/internals/core.smarty_include_php.php similarity index 100% rename from smarty/internals/core.smarty_include_php.php rename to inc/smarty/internals/core.smarty_include_php.php diff --git a/smarty/internals/core.write_cache_file.php b/inc/smarty/internals/core.write_cache_file.php similarity index 100% rename from smarty/internals/core.write_cache_file.php rename to inc/smarty/internals/core.write_cache_file.php diff --git a/smarty/internals/core.write_compiled_include.php b/inc/smarty/internals/core.write_compiled_include.php similarity index 100% rename from smarty/internals/core.write_compiled_include.php rename to inc/smarty/internals/core.write_compiled_include.php diff --git a/smarty/internals/core.write_compiled_resource.php b/inc/smarty/internals/core.write_compiled_resource.php similarity index 100% rename from smarty/internals/core.write_compiled_resource.php rename to inc/smarty/internals/core.write_compiled_resource.php diff --git a/smarty/internals/core.write_file.php b/inc/smarty/internals/core.write_file.php similarity index 100% rename from smarty/internals/core.write_file.php rename to inc/smarty/internals/core.write_file.php diff --git a/smarty/plugins/block.textformat.php b/inc/smarty/plugins/block.textformat.php similarity index 100% rename from smarty/plugins/block.textformat.php rename to inc/smarty/plugins/block.textformat.php diff --git a/smarty/plugins/compiler.assign.php b/inc/smarty/plugins/compiler.assign.php similarity index 100% rename from smarty/plugins/compiler.assign.php rename to inc/smarty/plugins/compiler.assign.php diff --git a/smarty/plugins/function.assign.php b/inc/smarty/plugins/function.assign.php similarity index 100% rename from smarty/plugins/function.assign.php rename to inc/smarty/plugins/function.assign.php diff --git a/smarty/plugins/function.assign_debug_info.php b/inc/smarty/plugins/function.assign_debug_info.php similarity index 100% rename from smarty/plugins/function.assign_debug_info.php rename to inc/smarty/plugins/function.assign_debug_info.php diff --git a/smarty/plugins/function.config_load.php b/inc/smarty/plugins/function.config_load.php similarity index 100% rename from smarty/plugins/function.config_load.php rename to inc/smarty/plugins/function.config_load.php diff --git a/smarty/plugins/function.counter.php b/inc/smarty/plugins/function.counter.php similarity index 100% rename from smarty/plugins/function.counter.php rename to inc/smarty/plugins/function.counter.php diff --git a/smarty/plugins/function.cycle.php b/inc/smarty/plugins/function.cycle.php similarity index 100% rename from smarty/plugins/function.cycle.php rename to inc/smarty/plugins/function.cycle.php diff --git a/smarty/plugins/function.debug.php b/inc/smarty/plugins/function.debug.php similarity index 100% rename from smarty/plugins/function.debug.php rename to inc/smarty/plugins/function.debug.php diff --git a/smarty/plugins/function.eval.php b/inc/smarty/plugins/function.eval.php similarity index 100% rename from smarty/plugins/function.eval.php rename to inc/smarty/plugins/function.eval.php diff --git a/smarty/plugins/function.fetch.php b/inc/smarty/plugins/function.fetch.php similarity index 100% rename from smarty/plugins/function.fetch.php rename to inc/smarty/plugins/function.fetch.php diff --git a/smarty/plugins/function.html_checkboxes.php b/inc/smarty/plugins/function.html_checkboxes.php similarity index 100% rename from smarty/plugins/function.html_checkboxes.php rename to inc/smarty/plugins/function.html_checkboxes.php diff --git a/smarty/plugins/function.html_image.php b/inc/smarty/plugins/function.html_image.php similarity index 100% rename from smarty/plugins/function.html_image.php rename to inc/smarty/plugins/function.html_image.php diff --git a/smarty/plugins/function.html_options.php b/inc/smarty/plugins/function.html_options.php similarity index 100% rename from smarty/plugins/function.html_options.php rename to inc/smarty/plugins/function.html_options.php diff --git a/smarty/plugins/function.html_radios.php b/inc/smarty/plugins/function.html_radios.php similarity index 100% rename from smarty/plugins/function.html_radios.php rename to inc/smarty/plugins/function.html_radios.php diff --git a/smarty/plugins/function.html_select_date.php b/inc/smarty/plugins/function.html_select_date.php similarity index 100% rename from smarty/plugins/function.html_select_date.php rename to inc/smarty/plugins/function.html_select_date.php diff --git a/smarty/plugins/function.html_select_time.php b/inc/smarty/plugins/function.html_select_time.php similarity index 100% rename from smarty/plugins/function.html_select_time.php rename to inc/smarty/plugins/function.html_select_time.php diff --git a/smarty/plugins/function.html_table.php b/inc/smarty/plugins/function.html_table.php similarity index 100% rename from smarty/plugins/function.html_table.php rename to inc/smarty/plugins/function.html_table.php diff --git a/smarty/plugins/function.mailto.php b/inc/smarty/plugins/function.mailto.php similarity index 100% rename from smarty/plugins/function.mailto.php rename to inc/smarty/plugins/function.mailto.php diff --git a/smarty/plugins/function.math.php b/inc/smarty/plugins/function.math.php similarity index 100% rename from smarty/plugins/function.math.php rename to inc/smarty/plugins/function.math.php diff --git a/smarty/plugins/function.popup.php b/inc/smarty/plugins/function.popup.php similarity index 100% rename from smarty/plugins/function.popup.php rename to inc/smarty/plugins/function.popup.php diff --git a/smarty/plugins/function.popup_init.php b/inc/smarty/plugins/function.popup_init.php similarity index 100% rename from smarty/plugins/function.popup_init.php rename to inc/smarty/plugins/function.popup_init.php diff --git a/smarty/plugins/modifier.capitalize.php b/inc/smarty/plugins/modifier.capitalize.php similarity index 100% rename from smarty/plugins/modifier.capitalize.php rename to inc/smarty/plugins/modifier.capitalize.php diff --git a/smarty/plugins/modifier.cat.php b/inc/smarty/plugins/modifier.cat.php similarity index 100% rename from smarty/plugins/modifier.cat.php rename to inc/smarty/plugins/modifier.cat.php diff --git a/smarty/plugins/modifier.count_characters.php b/inc/smarty/plugins/modifier.count_characters.php similarity index 100% rename from smarty/plugins/modifier.count_characters.php rename to inc/smarty/plugins/modifier.count_characters.php diff --git a/smarty/plugins/modifier.count_paragraphs.php b/inc/smarty/plugins/modifier.count_paragraphs.php similarity index 100% rename from smarty/plugins/modifier.count_paragraphs.php rename to inc/smarty/plugins/modifier.count_paragraphs.php diff --git a/smarty/plugins/modifier.count_sentences.php b/inc/smarty/plugins/modifier.count_sentences.php similarity index 100% rename from smarty/plugins/modifier.count_sentences.php rename to inc/smarty/plugins/modifier.count_sentences.php diff --git a/smarty/plugins/modifier.count_words.php b/inc/smarty/plugins/modifier.count_words.php similarity index 100% rename from smarty/plugins/modifier.count_words.php rename to inc/smarty/plugins/modifier.count_words.php diff --git a/smarty/plugins/modifier.csv.php b/inc/smarty/plugins/modifier.csv.php similarity index 100% rename from smarty/plugins/modifier.csv.php rename to inc/smarty/plugins/modifier.csv.php diff --git a/smarty/plugins/modifier.date_format.php b/inc/smarty/plugins/modifier.date_format.php similarity index 100% rename from smarty/plugins/modifier.date_format.php rename to inc/smarty/plugins/modifier.date_format.php diff --git a/smarty/plugins/modifier.debug_print_var.php b/inc/smarty/plugins/modifier.debug_print_var.php similarity index 100% rename from smarty/plugins/modifier.debug_print_var.php rename to inc/smarty/plugins/modifier.debug_print_var.php diff --git a/smarty/plugins/modifier.default.php b/inc/smarty/plugins/modifier.default.php similarity index 100% rename from smarty/plugins/modifier.default.php rename to inc/smarty/plugins/modifier.default.php diff --git a/smarty/plugins/modifier.escape.php b/inc/smarty/plugins/modifier.escape.php similarity index 100% rename from smarty/plugins/modifier.escape.php rename to inc/smarty/plugins/modifier.escape.php diff --git a/smarty/plugins/modifier.indent.php b/inc/smarty/plugins/modifier.indent.php similarity index 100% rename from smarty/plugins/modifier.indent.php rename to inc/smarty/plugins/modifier.indent.php diff --git a/smarty/plugins/modifier.lower.php b/inc/smarty/plugins/modifier.lower.php similarity index 100% rename from smarty/plugins/modifier.lower.php rename to inc/smarty/plugins/modifier.lower.php diff --git a/smarty/plugins/modifier.nl2br.php b/inc/smarty/plugins/modifier.nl2br.php similarity index 100% rename from smarty/plugins/modifier.nl2br.php rename to inc/smarty/plugins/modifier.nl2br.php diff --git a/smarty/plugins/modifier.noteparser.php b/inc/smarty/plugins/modifier.noteparser.php similarity index 100% rename from smarty/plugins/modifier.noteparser.php rename to inc/smarty/plugins/modifier.noteparser.php diff --git a/smarty/plugins/modifier.regex_replace.php b/inc/smarty/plugins/modifier.regex_replace.php similarity index 100% rename from smarty/plugins/modifier.regex_replace.php rename to inc/smarty/plugins/modifier.regex_replace.php diff --git a/smarty/plugins/modifier.replace.php b/inc/smarty/plugins/modifier.replace.php similarity index 100% rename from smarty/plugins/modifier.replace.php rename to inc/smarty/plugins/modifier.replace.php diff --git a/smarty/plugins/modifier.spacify.php b/inc/smarty/plugins/modifier.spacify.php similarity index 100% rename from smarty/plugins/modifier.spacify.php rename to inc/smarty/plugins/modifier.spacify.php diff --git a/smarty/plugins/modifier.string_format.php b/inc/smarty/plugins/modifier.string_format.php similarity index 100% rename from smarty/plugins/modifier.string_format.php rename to inc/smarty/plugins/modifier.string_format.php diff --git a/smarty/plugins/modifier.strip.php b/inc/smarty/plugins/modifier.strip.php similarity index 100% rename from smarty/plugins/modifier.strip.php rename to inc/smarty/plugins/modifier.strip.php diff --git a/smarty/plugins/modifier.strip_tags.php b/inc/smarty/plugins/modifier.strip_tags.php similarity index 100% rename from smarty/plugins/modifier.strip_tags.php rename to inc/smarty/plugins/modifier.strip_tags.php diff --git a/smarty/plugins/modifier.truncate.php b/inc/smarty/plugins/modifier.truncate.php similarity index 100% rename from smarty/plugins/modifier.truncate.php rename to inc/smarty/plugins/modifier.truncate.php diff --git a/smarty/plugins/modifier.upper.php b/inc/smarty/plugins/modifier.upper.php similarity index 100% rename from smarty/plugins/modifier.upper.php rename to inc/smarty/plugins/modifier.upper.php diff --git a/smarty/plugins/modifier.wordwrap.php b/inc/smarty/plugins/modifier.wordwrap.php similarity index 100% rename from smarty/plugins/modifier.wordwrap.php rename to inc/smarty/plugins/modifier.wordwrap.php diff --git a/smarty/plugins/outputfilter.trimwhitespace.php b/inc/smarty/plugins/outputfilter.trimwhitespace.php similarity index 100% rename from smarty/plugins/outputfilter.trimwhitespace.php rename to inc/smarty/plugins/outputfilter.trimwhitespace.php diff --git a/smarty/plugins/shared.escape_special_chars.php b/inc/smarty/plugins/shared.escape_special_chars.php similarity index 100% rename from smarty/plugins/shared.escape_special_chars.php rename to inc/smarty/plugins/shared.escape_special_chars.php diff --git a/smarty/plugins/shared.make_timestamp.php b/inc/smarty/plugins/shared.make_timestamp.php similarity index 100% rename from smarty/plugins/shared.make_timestamp.php rename to inc/smarty/plugins/shared.make_timestamp.php diff --git a/template.php b/inc/template.php similarity index 100% rename from template.php rename to inc/template.php diff --git a/index.php b/index.php index 857e69e..5bd4fca 100644 --- a/index.php +++ b/index.php @@ -1,5 +1,6 @@ -"; - } catch(e) {} - var element = parentElement.firstChild || null; - - // see if browser added wrapping tags - if(element && (element.tagName != elementName)) - element = element.getElementsByTagName(elementName)[0]; - - // fallback to createElement approach - if(!element) element = document.createElement(elementName); - - // abort if nothing could be created - if(!element) return; - - // attributes (or text) - if(arguments[1]) - if(this._isStringOrNumber(arguments[1]) || - (arguments[1] instanceof Array)) { - this._children(element, arguments[1]); - } else { - var attrs = this._attributes(arguments[1]); - if(attrs.length) { - try { // prevent IE "feature": http://dev.rubyonrails.org/ticket/2707 - parentElement.innerHTML = "<" +elementName + " " + - attrs + ">"; - } catch(e) {} - element = parentElement.firstChild || null; - // workaround firefox 1.0.X bug - if(!element) { - element = document.createElement(elementName); - for(attr in arguments[1]) - element[attr == 'class' ? 'className' : attr] = arguments[1][attr]; - } - if(element.tagName != elementName) - element = parentElement.getElementsByTagName(elementName)[0]; - } - } - - // text, or array of children - if(arguments[2]) - this._children(element, arguments[2]); - - return element; - }, - _text: function(text) { - return document.createTextNode(text); - }, - _attributes: function(attributes) { - var attrs = []; - for(attribute in attributes) - attrs.push((attribute=='className' ? 'class' : attribute) + - '="' + attributes[attribute].toString().escapeHTML() + '"'); - return attrs.join(" "); - }, - _children: function(element, children) { - if(typeof children=='object') { // array can hold nodes and text - children.flatten().each( function(e) { - if(typeof e=='object') - element.appendChild(e) - else - if(Builder._isStringOrNumber(e)) - element.appendChild(Builder._text(e)); - }); - } else - if(Builder._isStringOrNumber(children)) - element.appendChild(Builder._text(children)); - }, - _isStringOrNumber: function(param) { - return(typeof param=='string' || typeof param=='number'); - } -} \ No newline at end of file diff --git a/js/controls.js b/js/controls.js deleted file mode 100644 index 3307f2e..0000000 --- a/js/controls.js +++ /dev/null @@ -1,770 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005 Ivan Krstic (http://blogs.law.harvard.edu/ivan) -// (c) 2005 Jon Tirsen (http://www.tirsen.com) -// Contributors: -// Richard Livsey -// Rahul Bhargava -// Rob Wills -// -// See scriptaculous.js for full license. - -// Autocompleter.Base handles all the autocompletion functionality -// that's independent of the data source for autocompletion. This -// includes drawing the autocompletion menu, observing keyboard -// and mouse events, and similar. -// -// Specific autocompleters need to provide, at the very least, -// a getUpdatedChoices function that will be invoked every time -// the text inside the monitored textbox changes. This method -// should get the text for which to provide autocompletion by -// invoking this.getToken(), NOT by directly accessing -// this.element.value. This is to allow incremental tokenized -// autocompletion. Specific auto-completion logic (AJAX, etc) -// belongs in getUpdatedChoices. -// -// Tokenized incremental autocompletion is enabled automatically -// when an autocompleter is instantiated with the 'tokens' option -// in the options parameter, e.g.: -// new Ajax.Autocompleter('id','upd', '/url/', { tokens: ',' }); -// will incrementally autocomplete with a comma as the token. -// Additionally, ',' in the above example can be replaced with -// a token array, e.g. { tokens: [',', '\n'] } which -// enables autocompletion on multiple tokens. This is most -// useful when one of the tokens is \n (a newline), as it -// allows smart autocompletion after linebreaks. - -var Autocompleter = {} -Autocompleter.Base = function() {}; -Autocompleter.Base.prototype = { - baseInitialize: function(element, update, options) { - this.element = $(element); - this.update = $(update); - this.hasFocus = false; - this.changed = false; - this.active = false; - this.index = 0; - this.entryCount = 0; - - if (this.setOptions) - this.setOptions(options); - else - this.options = options || {}; - - this.options.paramName = this.options.paramName || this.element.name; - this.options.tokens = this.options.tokens || []; - this.options.frequency = this.options.frequency || 0.4; - this.options.minChars = this.options.minChars || 1; - this.options.onShow = this.options.onShow || - function(element, update){ - if(!update.style.position || update.style.position=='absolute') { - update.style.position = 'absolute'; - Position.clone(element, update, {setHeight: false, offsetTop: element.offsetHeight}); - } - Effect.Appear(update,{duration:0.15}); - }; - this.options.onHide = this.options.onHide || - function(element, update){ new Effect.Fade(update,{duration:0.15}) }; - - if (typeof(this.options.tokens) == 'string') - this.options.tokens = new Array(this.options.tokens); - - this.observer = null; - - this.element.setAttribute('autocomplete','off'); - - Element.hide(this.update); - - Event.observe(this.element, "blur", this.onBlur.bindAsEventListener(this)); - Event.observe(this.element, "keypress", this.onKeyPress.bindAsEventListener(this)); - }, - - show: function() { - if(Element.getStyle(this.update, 'display')=='none') this.options.onShow(this.element, this.update); - if(!this.iefix && - (navigator.appVersion.indexOf('MSIE')>0) && - (navigator.userAgent.indexOf('Opera')<0) && - (Element.getStyle(this.update, 'position')=='absolute')) { - new Insertion.After(this.update, - ''); - this.iefix = $(this.update.id+'_iefix'); - } - if(this.iefix) setTimeout(this.fixIEOverlapping.bind(this), 50); - }, - - fixIEOverlapping: function() { - Position.clone(this.update, this.iefix); - this.iefix.style.zIndex = 1; - this.update.style.zIndex = 2; - Element.show(this.iefix); - }, - - hide: function() { - this.stopIndicator(); - if(Element.getStyle(this.update, 'display')!='none') this.options.onHide(this.element, this.update); - if(this.iefix) Element.hide(this.iefix); - }, - - startIndicator: function() { - if(this.options.indicator) Element.show(this.options.indicator); - }, - - stopIndicator: function() { - if(this.options.indicator) Element.hide(this.options.indicator); - }, - - onKeyPress: function(event) { - if(this.active) - switch(event.keyCode) { - case Event.KEY_TAB: - case Event.KEY_RETURN: - this.selectEntry(); - Event.stop(event); - case Event.KEY_ESC: - this.hide(); - this.active = false; - Event.stop(event); - return; - case Event.KEY_LEFT: - case Event.KEY_RIGHT: - return; - case Event.KEY_UP: - this.markPrevious(); - this.render(); - if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); - return; - case Event.KEY_DOWN: - this.markNext(); - this.render(); - if(navigator.appVersion.indexOf('AppleWebKit')>0) Event.stop(event); - return; - } - else - if(event.keyCode==Event.KEY_TAB || event.keyCode==Event.KEY_RETURN) - return; - - this.changed = true; - this.hasFocus = true; - - if(this.observer) clearTimeout(this.observer); - this.observer = - setTimeout(this.onObserverEvent.bind(this), this.options.frequency*1000); - }, - - onHover: function(event) { - var element = Event.findElement(event, 'LI'); - if(this.index != element.autocompleteIndex) - { - this.index = element.autocompleteIndex; - this.render(); - } - Event.stop(event); - }, - - onClick: function(event) { - var element = Event.findElement(event, 'LI'); - this.index = element.autocompleteIndex; - this.selectEntry(); - this.hide(); - }, - - onBlur: function(event) { - // needed to make click events working - setTimeout(this.hide.bind(this), 250); - this.hasFocus = false; - this.active = false; - }, - - render: function() { - if(this.entryCount > 0) { - for (var i = 0; i < this.entryCount; i++) - this.index==i ? - Element.addClassName(this.getEntry(i),"selected") : - Element.removeClassName(this.getEntry(i),"selected"); - - if(this.hasFocus) { - this.show(); - this.active = true; - } - } else { - this.active = false; - this.hide(); - } - }, - - markPrevious: function() { - if(this.index > 0) this.index-- - else this.index = this.entryCount-1; - }, - - markNext: function() { - if(this.index < this.entryCount-1) this.index++ - else this.index = 0; - }, - - getEntry: function(index) { - return this.update.firstChild.childNodes[index]; - }, - - getCurrentEntry: function() { - return this.getEntry(this.index); - }, - - selectEntry: function() { - this.active = false; - this.updateElement(this.getCurrentEntry()); - }, - - updateElement: function(selectedElement) { - if (this.options.updateElement) { - this.options.updateElement(selectedElement); - return; - } - var value = ''; - if (this.options.select) { - var nodes = document.getElementsByClassName(this.options.select, selectedElement) || []; - if(nodes.length>0) value = Element.collectTextNodes(nodes[0], this.options.select); - } else - value = Element.collectTextNodesIgnoreClass(selectedElement, 'informal'); - - var lastTokenPos = this.findLastToken(); - if (lastTokenPos != -1) { - var newValue = this.element.value.substr(0, lastTokenPos + 1); - var whitespace = this.element.value.substr(lastTokenPos + 1).match(/^\s+/); - if (whitespace) - newValue += whitespace[0]; - this.element.value = newValue + value; - } else { - this.element.value = value; - } - this.element.focus(); - - if (this.options.afterUpdateElement) - this.options.afterUpdateElement(this.element, selectedElement); - }, - - updateChoices: function(choices) { - if(!this.changed && this.hasFocus) { - this.update.innerHTML = choices; - Element.cleanWhitespace(this.update); - Element.cleanWhitespace(this.update.firstChild); - - if(this.update.firstChild && this.update.firstChild.childNodes) { - this.entryCount = - this.update.firstChild.childNodes.length; - for (var i = 0; i < this.entryCount; i++) { - var entry = this.getEntry(i); - entry.autocompleteIndex = i; - this.addObservers(entry); - } - } else { - this.entryCount = 0; - } - - this.stopIndicator(); - - this.index = 0; - this.render(); - } - }, - - addObservers: function(element) { - Event.observe(element, "mouseover", this.onHover.bindAsEventListener(this)); - Event.observe(element, "click", this.onClick.bindAsEventListener(this)); - }, - - onObserverEvent: function() { - this.changed = false; - if(this.getToken().length>=this.options.minChars) { - this.startIndicator(); - this.getUpdatedChoices(); - } else { - this.active = false; - this.hide(); - } - }, - - getToken: function() { - var tokenPos = this.findLastToken(); - if (tokenPos != -1) - var ret = this.element.value.substr(tokenPos + 1).replace(/^\s+/,'').replace(/\s+$/,''); - else - var ret = this.element.value; - - return /\n/.test(ret) ? '' : ret; - }, - - findLastToken: function() { - var lastTokenPos = -1; - - for (var i=0; i lastTokenPos) - lastTokenPos = thisTokenPos; - } - return lastTokenPos; - } -} - -Ajax.Autocompleter = Class.create(); -Object.extend(Object.extend(Ajax.Autocompleter.prototype, Autocompleter.Base.prototype), { - initialize: function(element, update, url, options) { - this.baseInitialize(element, update, options); - this.options.asynchronous = true; - this.options.onComplete = this.onComplete.bind(this); - this.options.defaultParams = this.options.parameters || null; - this.url = url; - }, - - getUpdatedChoices: function() { - entry = encodeURIComponent(this.options.paramName) + '=' + - encodeURIComponent(this.getToken()); - - this.options.parameters = this.options.callback ? - this.options.callback(this.element, entry) : entry; - - if(this.options.defaultParams) - this.options.parameters += '&' + this.options.defaultParams; - - new Ajax.Request(this.url, this.options); - }, - - onComplete: function(request) { - this.updateChoices(request.responseText); - } - -}); - -// The local array autocompleter. Used when you'd prefer to -// inject an array of autocompletion options into the page, rather -// than sending out Ajax queries, which can be quite slow sometimes. -// -// The constructor takes four parameters. The first two are, as usual, -// the id of the monitored textbox, and id of the autocompletion menu. -// The third is the array you want to autocomplete from, and the fourth -// is the options block. -// -// Extra local autocompletion options: -// - choices - How many autocompletion choices to offer -// -// - partialSearch - If false, the autocompleter will match entered -// text only at the beginning of strings in the -// autocomplete array. Defaults to true, which will -// match text at the beginning of any *word* in the -// strings in the autocomplete array. If you want to -// search anywhere in the string, additionally set -// the option fullSearch to true (default: off). -// -// - fullSsearch - Search anywhere in autocomplete array strings. -// -// - partialChars - How many characters to enter before triggering -// a partial match (unlike minChars, which defines -// how many characters are required to do any match -// at all). Defaults to 2. -// -// - ignoreCase - Whether to ignore case when autocompleting. -// Defaults to true. -// -// It's possible to pass in a custom function as the 'selector' -// option, if you prefer to write your own autocompletion logic. -// In that case, the other options above will not apply unless -// you support them. - -Autocompleter.Local = Class.create(); -Autocompleter.Local.prototype = Object.extend(new Autocompleter.Base(), { - initialize: function(element, update, array, options) { - this.baseInitialize(element, update, options); - this.options.array = array; - }, - - getUpdatedChoices: function() { - this.updateChoices(this.options.selector(this)); - }, - - setOptions: function(options) { - this.options = Object.extend({ - choices: 10, - partialSearch: true, - partialChars: 2, - ignoreCase: true, - fullSearch: false, - selector: function(instance) { - var ret = []; // Beginning matches - var partial = []; // Inside matches - var entry = instance.getToken(); - var count = 0; - - for (var i = 0; i < instance.options.array.length && - ret.length < instance.options.choices ; i++) { - - var elem = instance.options.array[i]; - var foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase()) : - elem.indexOf(entry); - - while (foundPos != -1) { - if (foundPos == 0 && elem.length != entry.length) { - ret.push("
  • " + elem.substr(0, entry.length) + "" + - elem.substr(entry.length) + "
  • "); - break; - } else if (entry.length >= instance.options.partialChars && - instance.options.partialSearch && foundPos != -1) { - if (instance.options.fullSearch || /\s/.test(elem.substr(foundPos-1,1))) { - partial.push("
  • " + elem.substr(0, foundPos) + "" + - elem.substr(foundPos, entry.length) + "" + elem.substr( - foundPos + entry.length) + "
  • "); - break; - } - } - - foundPos = instance.options.ignoreCase ? - elem.toLowerCase().indexOf(entry.toLowerCase(), foundPos + 1) : - elem.indexOf(entry, foundPos + 1); - - } - } - if (partial.length) - ret = ret.concat(partial.slice(0, instance.options.choices - ret.length)) - return ""; - } - }, options || {}); - } -}); - -// AJAX in-place editor -// -// see documentation on http://wiki.script.aculo.us/scriptaculous/show/Ajax.InPlaceEditor - -// Use this if you notice weird scrolling problems on some browsers, -// the DOM might be a bit confused when this gets called so do this -// waits 1 ms (with setTimeout) until it does the activation -Field.scrollFreeActivate = function(field) { - setTimeout(function() { - Field.activate(field); - }, 1); -} - -Ajax.InPlaceEditor = Class.create(); -Ajax.InPlaceEditor.defaultHighlightColor = "#FFFF99"; -Ajax.InPlaceEditor.prototype = { - initialize: function(element, url, options) { - this.url = url; - this.element = $(element); - - this.options = Object.extend({ - okButton: true, - okText: "ok", - cancelLink: true, - cancelText: "cancel", - savingText: "Saving...", - clickToEditText: "Click to edit", - okText: "ok", - rows: 1, - onComplete: function(transport, element) { - new Effect.Highlight(element, {startcolor: this.options.highlightcolor}); - }, - onFailure: function(transport) { - alert("Error communicating with the server: " + transport.responseText.stripTags()); - }, - callback: function(form) { - return Form.serialize(form); - }, - handleLineBreaks: true, - loadingText: 'Loading...', - savingClassName: 'inplaceeditor-saving', - loadingClassName: 'inplaceeditor-loading', - formClassName: 'inplaceeditor-form', - highlightcolor: Ajax.InPlaceEditor.defaultHighlightColor, - highlightendcolor: "#FFFFFF", - externalControl: null, - submitOnBlur: false, - ajaxOptions: {} - }, options || {}); - - if(!this.options.formId && this.element.id) { - this.options.formId = this.element.id + "-inplaceeditor"; - if ($(this.options.formId)) { - // there's already a form with that name, don't specify an id - this.options.formId = null; - } - } - - if (this.options.externalControl) { - this.options.externalControl = $(this.options.externalControl); - } - - this.originalBackground = Element.getStyle(this.element, 'background-color'); - if (!this.originalBackground) { - this.originalBackground = "transparent"; - } - - this.element.title = this.options.clickToEditText; - - this.onclickListener = this.enterEditMode.bindAsEventListener(this); - this.mouseoverListener = this.enterHover.bindAsEventListener(this); - this.mouseoutListener = this.leaveHover.bindAsEventListener(this); - Event.observe(this.element, 'click', this.onclickListener); - Event.observe(this.element, 'mouseover', this.mouseoverListener); - Event.observe(this.element, 'mouseout', this.mouseoutListener); - if (this.options.externalControl) { - Event.observe(this.options.externalControl, 'click', this.onclickListener); - Event.observe(this.options.externalControl, 'mouseover', this.mouseoverListener); - Event.observe(this.options.externalControl, 'mouseout', this.mouseoutListener); - } - }, - enterEditMode: function(evt) { - if (this.saving) return; - if (this.editing) return; - this.editing = true; - this.onEnterEditMode(); - if (this.options.externalControl) { - Element.hide(this.options.externalControl); - } - Element.hide(this.element); - this.createForm(); - this.element.parentNode.insertBefore(this.form, this.element); - Field.scrollFreeActivate(this.editField); - // stop the event to avoid a page refresh in Safari - if (evt) { - Event.stop(evt); - } - return false; - }, - createForm: function() { - this.form = document.createElement("form"); - this.form.id = this.options.formId; - Element.addClassName(this.form, this.options.formClassName) - this.form.onsubmit = this.onSubmit.bind(this); - - this.createEditField(); - - if (this.options.textarea) { - var br = document.createElement("br"); - this.form.appendChild(br); - } - - if (this.options.okButton) { - okButton = document.createElement("input"); - okButton.type = "submit"; - okButton.value = this.options.okText; - this.form.appendChild(okButton); - } - - if (this.options.cancelLink) { - cancelLink = document.createElement("a"); - cancelLink.href = "#"; - cancelLink.appendChild(document.createTextNode(this.options.cancelText)); - cancelLink.onclick = this.onclickCancel.bind(this); - this.form.appendChild(cancelLink); - } - }, - hasHTMLLineBreaks: function(string) { - if (!this.options.handleLineBreaks) return false; - return string.match(/
    /i); - }, - convertHTMLLineBreaks: function(string) { - return string.replace(/
    /gi, "\n").replace(//gi, "\n").replace(/<\/p>/gi, "\n").replace(/

    /gi, ""); - }, - createEditField: function() { - var text; - if(this.options.loadTextURL) { - text = this.options.loadingText; - } else { - text = this.getText(); - } - - var obj = this; - - if (this.options.rows == 1 && !this.hasHTMLLineBreaks(text)) { - this.options.textarea = false; - var textField = document.createElement("input"); - textField.obj = this; - textField.type = "text"; - textField.name = "value"; - textField.value = text; - textField.style.backgroundColor = this.options.highlightcolor; - var size = this.options.size || this.options.cols || 0; - if (size != 0) textField.size = size; - if (this.options.submitOnBlur) - textField.onblur = this.onSubmit.bind(this); - this.editField = textField; - } else { - this.options.textarea = true; - var textArea = document.createElement("textarea"); - textArea.obj = this; - textArea.name = "value"; - textArea.value = this.convertHTMLLineBreaks(text); - textArea.rows = this.options.rows; - textArea.cols = this.options.cols || 40; - if (this.options.submitOnBlur) - textArea.onblur = this.onSubmit.bind(this); - this.editField = textArea; - } - - if(this.options.loadTextURL) { - this.loadExternalText(); - } - this.form.appendChild(this.editField); - }, - getText: function() { - return this.element.innerHTML; - }, - loadExternalText: function() { - Element.addClassName(this.form, this.options.loadingClassName); - this.editField.disabled = true; - new Ajax.Request( - this.options.loadTextURL, - Object.extend({ - asynchronous: true, - onComplete: this.onLoadedExternalText.bind(this) - }, this.options.ajaxOptions) - ); - }, - onLoadedExternalText: function(transport) { - Element.removeClassName(this.form, this.options.loadingClassName); - this.editField.disabled = false; - this.editField.value = transport.responseText.stripTags(); - }, - onclickCancel: function() { - this.onComplete(); - this.leaveEditMode(); - return false; - }, - onFailure: function(transport) { - this.options.onFailure(transport); - if (this.oldInnerHTML) { - this.element.innerHTML = this.oldInnerHTML; - this.oldInnerHTML = null; - } - return false; - }, - onSubmit: function() { - // onLoading resets these so we need to save them away for the Ajax call - var form = this.form; - var value = this.editField.value; - - // do this first, sometimes the ajax call returns before we get a chance to switch on Saving... - // which means this will actually switch on Saving... *after* we've left edit mode causing Saving... - // to be displayed indefinitely - this.onLoading(); - - new Ajax.Updater( - { - success: this.element, - // don't update on failure (this could be an option) - failure: null - }, - this.url, - Object.extend({ - parameters: this.options.callback(form, value), - onComplete: this.onComplete.bind(this), - onFailure: this.onFailure.bind(this) - }, this.options.ajaxOptions) - ); - // stop the event to avoid a page refresh in Safari - if (arguments.length > 1) { - Event.stop(arguments[0]); - } - return false; - }, - onLoading: function() { - this.saving = true; - this.removeForm(); - this.leaveHover(); - this.showSaving(); - }, - showSaving: function() { - this.oldInnerHTML = this.element.innerHTML; - this.element.innerHTML = this.options.savingText; - Element.addClassName(this.element, this.options.savingClassName); - this.element.style.backgroundColor = this.originalBackground; - Element.show(this.element); - }, - removeForm: function() { - if(this.form) { - if (this.form.parentNode) Element.remove(this.form); - this.form = null; - } - }, - enterHover: function() { - if (this.saving) return; - this.element.style.backgroundColor = this.options.highlightcolor; - if (this.effect) { - this.effect.cancel(); - } - Element.addClassName(this.element, this.options.hoverClassName) - }, - leaveHover: function() { - if (this.options.backgroundColor) { - this.element.style.backgroundColor = this.oldBackground; - } - Element.removeClassName(this.element, this.options.hoverClassName) - if (this.saving) return; - this.effect = new Effect.Highlight(this.element, { - startcolor: this.options.highlightcolor, - endcolor: this.options.highlightendcolor, - restorecolor: this.originalBackground - }); - }, - leaveEditMode: function() { - Element.removeClassName(this.element, this.options.savingClassName); - this.removeForm(); - this.leaveHover(); - this.element.style.backgroundColor = this.originalBackground; - Element.show(this.element); - if (this.options.externalControl) { - Element.show(this.options.externalControl); - } - this.editing = false; - this.saving = false; - this.oldInnerHTML = null; - this.onLeaveEditMode(); - }, - onComplete: function(transport) { - this.leaveEditMode(); - this.options.onComplete.bind(this)(transport, this.element); - }, - onEnterEditMode: function() {}, - onLeaveEditMode: function() {}, - dispose: function() { - if (this.oldInnerHTML) { - this.element.innerHTML = this.oldInnerHTML; - } - this.leaveEditMode(); - Event.stopObserving(this.element, 'click', this.onclickListener); - Event.stopObserving(this.element, 'mouseover', this.mouseoverListener); - Event.stopObserving(this.element, 'mouseout', this.mouseoutListener); - if (this.options.externalControl) { - Event.stopObserving(this.options.externalControl, 'click', this.onclickListener); - Event.stopObserving(this.options.externalControl, 'mouseover', this.mouseoverListener); - Event.stopObserving(this.options.externalControl, 'mouseout', this.mouseoutListener); - } - } -}; - -// Delayed observer, like Form.Element.Observer, -// but waits for delay after last key input -// Ideal for live-search fields - -Form.Element.DelayedObserver = Class.create(); -Form.Element.DelayedObserver.prototype = { - initialize: function(element, delay, callback) { - this.delay = delay || 0.5; - this.element = $(element); - this.callback = callback; - this.timer = null; - this.lastValue = $F(this.element); - Event.observe(this.element,'keyup',this.delayedListener.bindAsEventListener(this)); - }, - delayedListener: function(event) { - if(this.lastValue == $F(this.element)) return; - if(this.timer) clearTimeout(this.timer); - this.timer = setTimeout(this.onTimerEvent.bind(this), this.delay * 1000); - this.lastValue = $F(this.element); - }, - onTimerEvent: function() { - this.timer = null; - this.callback(this.element, $F(this.element)); - } -}; diff --git a/js/date-formatting.js b/js/date-formatting.js deleted file mode 100644 index b2848a1..0000000 --- a/js/date-formatting.js +++ /dev/null @@ -1,253 +0,0 @@ -/* - * A Javascript date chooser. - * Copyright (C) 2004 Baron Schwartz - * - * 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. - * - * This program is distributed in the hope that it will be useful, but WITHOUT - * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS - * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more - * details. - * - * You should have received a copy of the GNU General Public License along with - * this program; if not, write to the Free Software Foundation, Inc., 59 Temple - * Place, Suite 330, Boston, MA 02111-1307 USA - */ - -Date.formatFunctions = {count:0}; - -Date.prototype.dateFormat = function(format) { - if (Date.formatFunctions[format] == null) { - Date.createNewFormat(format); - } - var func = Date.formatFunctions[format]; - return eval("this." + func + "();"); -} - -Date.createNewFormat = function(format) { - var funcName = "format" + Date.formatFunctions.count++; - Date.formatFunctions[format] = funcName; - var code = "Date.prototype." + funcName + " = function(){return "; - var special = false; - var char = ''; - for (var i = 0; i < format.length; ++i) { - char = format.charAt(i); - if (!special && char == "\\") { - special = true; - } - else if (special) { - special = false; - code += "'" + String.escape(char) + "' + "; - } - else { - code += Date.getFormatCode(char); - } - } - eval(code.substring(0, code.length - 3) + ";}"); -} - -Date.getFormatCode = function(character) { - switch (character) { - case "d": - return "String.leftPad(this.getDate(), 2, '0') + "; - case "D": - return "Date.dayNames[this.getDay()].substring(0, 3) + "; - case "j": - return "this.getDate() + "; - case "l": - return "Date.dayNames[this.getDay()] + "; - case "S": - return "this.getSuffix() + "; - case "w": - return "this.getDay() + "; - case "z": - return "this.getDayOfYear() + "; - case "W": - return "this.getWeekOfYear() + "; - case "F": - return "Date.monthNames[this.getMonth()] + "; - case "m": - return "String.leftPad(this.getMonth() + 1, 2, '0') + "; - case "M": - return "Date.monthNames[this.getMonth()].substring(0, 3) + "; - case "n": - return "(this.getMonth() + 1) + "; - case "t": - return "this.getDaysInMonth() + "; - case "L": - return "(this.isLeapYear() ? 1 : 0) + "; - case "Y": - return "this.getFullYear() + "; - case "y": - return "('' + this.getFullYear()).substring(2, 4) + "; - case "a": - return "(this.getHours() < 12 ? 'am' : 'pm') + "; - case "A": - return "(this.getHours() < 12 ? 'AM' : 'PM') + "; - case "g": - return "((this.getHours() %12) ? this.getHours() % 12 : 12) + "; - case "G": - return "this.getHours() + "; - case "h": - return "String.leftPad((this.getHours() %12) ? this.getHours() % 12 : 12, 2, '0') + "; - case "H": - return "String.leftPad(this.getHours(), 2, '0') + "; - case "i": - return "String.leftPad(this.getMinutes(), 2, '0') + "; - case "s": - return "String.leftPad(this.getSeconds(), 2, '0') + "; - case "O": - return "this.getGMTOffset() + "; - case "T": - return "this.getTimezone() + "; - case "Z": - return "(this.getTimezoneOffset() * -60) + "; - default: - return "'" + String.escape(character) + "' + "; - } -} - -Date.prototype.getTimezone = function() { - return this.toString().replace( - /^.*? ([A-Z]{3}) [0-9]{4}.*$/, "$1").replace( - /^.*?\(([A-Z])[a-z]+ ([A-Z])[a-z]+ ([A-Z])[a-z]+\)$/, "$1$2$3"); -} - -Date.prototype.getGMTOffset = function() { - return (this.getTimezoneOffset() > 0 ? "-" : "+") - + String.leftPad(Math.floor(this.getTimezoneOffset() / 60), 2, "0") - + String.leftPad(this.getTimezoneOffset() % 60, 2, "0"); -} - -Date.prototype.getDayOfYear = function() { - var num = 0; - Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; - for (var i = 0; i < this.getMonth(); ++i) { - num += Date.daysInMonth[i]; - } - return num + this.getDate() - 1; -} - -Date.prototype.getWeekOfYear = function() { - // Skip to Thursday of this week - var now = this.getDayOfYear() + (4 - this.getDay()); - // Find the first Thursday of the year - var jan1 = new Date(this.getFullYear(), 0, 1); - var then = (7 - jan1.getDay() + 4); - document.write(then); - return String.leftPad(((now - then) / 7) + 1, 2, "0"); -} - -Date.prototype.isLeapYear = function() { - var year = this.getFullYear(); - return ((year & 3) == 0 && (year % 100 || (year % 400 == 0 && year))); -} - -Date.prototype.getFirstDayOfMonth = function() { - var day = (this.getDay() - (this.getDate() - 1)) % 7; - return (day < 0) ? (day + 7) : day; -} - -Date.prototype.getLastDayOfMonth = function() { - var day = (this.getDay() + (Date.daysInMonth[this.getMonth()] - this.getDate())) % 7; - return (day < 0) ? (day + 7) : day; -} - -Date.prototype.getDaysInMonth = function() { - Date.daysInMonth[1] = this.isLeapYear() ? 29 : 28; - return Date.daysInMonth[this.getMonth()]; -} - -Date.prototype.getSuffix = function() { - switch (this.getDate()) { - case 1: - case 21: - case 31: - return "st"; - case 2: - case 22: - return "nd"; - case 3: - case 23: - return "rd"; - default: - return "th"; - } -} - -String.escape = function(string) { - return string.replace(/('|\\)/g, "\\$1"); -} - -String.leftPad = function (val, size, char) { - var result = new String(val); - if (char == null) { - char = " "; - } - while (result.length < size) { - result = char + result; - } - return result; -} - -Date.daysInMonth = [31,28,31,30,31,30,31,31,30,31,30,31]; -Date.monthNames = - ["January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December"]; -Date.dayNames = - ["Sunday", - "Monday", - "Tuesday", - "Wednesday", - "Thursday", - "Friday", - "Saturday"]; -Date.patterns = { - ISO8601LongPattern:"Y-m-d H:i:s", - ISO8601ShortPattern:"Y-m-d", - ShortDatePattern: "n/j/Y", - LongDatePattern: "l, F d, Y", - FullDateTimePattern: "l, F d, Y g:i:s A", - MonthDayPattern: "F d", - ShortTimePattern: "g:i A", - LongTimePattern: "g:i:s A", - SortableDateTimePattern: "Y-m-d\\TH:i:s", - UniversalSortableDateTimePattern: "Y-m-d H:i:sO", - YearMonthPattern: "F, Y"}; - -Date.parseIsoDate = function(dateString) { - var result = new Date(); - var re = /^(\d\d\d\d)-(\d\d)-(\d\d)( (\d\d):(\d\d):(\d\d))?$/; - var match = dateString.match(re); - if (match != null) { - if (match[5] != null && match[5] != '') { - result = new Date( - parseInt(match[1], 10), - parseInt(match[2], 10) - 1, - parseInt(match[3], 10), - parseInt(match[5], 10), - parseInt(match[6], 10), - parseInt(match[7], 10)); - } - else { - result = new Date( - parseInt(match[1], 10), - parseInt(match[2], 10) - 1, - parseInt(match[3], 10)); - } - } - return result; -} diff --git a/js/dragdrop.js b/js/dragdrop.js deleted file mode 100644 index 818ef5e..0000000 --- a/js/dragdrop.js +++ /dev/null @@ -1,585 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// See scriptaculous.js for full license. - -/*--------------------------------------------------------------------------*/ - -var Droppables = { - drops: [], - - remove: function(element) { - this.drops = this.drops.reject(function(d) { return d.element==$(element) }); - }, - - add: function(element) { - element = $(element); - var options = Object.extend({ - greedy: true, - hoverclass: null - }, arguments[1] || {}); - - // cache containers - if(options.containment) { - options._containers = []; - var containment = options.containment; - if((typeof containment == 'object') && - (containment.constructor == Array)) { - containment.each( function(c) { options._containers.push($(c)) }); - } else { - options._containers.push($(containment)); - } - } - - if(options.accept) options.accept = [options.accept].flatten(); - - Element.makePositioned(element); // fix IE - options.element = element; - - this.drops.push(options); - }, - - isContained: function(element, drop) { - var parentNode = element.parentNode; - return drop._containers.detect(function(c) { return parentNode == c }); - }, - - isAffected: function(point, element, drop) { - return ( - (drop.element!=element) && - ((!drop._containers) || - this.isContained(element, drop)) && - ((!drop.accept) || - (Element.classNames(element).detect( - function(v) { return drop.accept.include(v) } ) )) && - Position.within(drop.element, point[0], point[1]) ); - }, - - deactivate: function(drop) { - if(drop.hoverclass) - Element.removeClassName(drop.element, drop.hoverclass); - this.last_active = null; - }, - - activate: function(drop) { - if(drop.hoverclass) - Element.addClassName(drop.element, drop.hoverclass); - this.last_active = drop; - }, - - show: function(point, element) { - if(!this.drops.length) return; - - if(this.last_active) this.deactivate(this.last_active); - this.drops.each( function(drop) { - if(Droppables.isAffected(point, element, drop)) { - if(drop.onHover) - drop.onHover(element, drop.element, Position.overlap(drop.overlap, drop.element)); - if(drop.greedy) { - Droppables.activate(drop); - throw $break; - } - } - }); - }, - - fire: function(event, element) { - if(!this.last_active) return; - Position.prepare(); - - if (this.isAffected([Event.pointerX(event), Event.pointerY(event)], element, this.last_active)) - if (this.last_active.onDrop) - this.last_active.onDrop(element, this.last_active.element, event); - }, - - reset: function() { - if(this.last_active) - this.deactivate(this.last_active); - } -} - -var Draggables = { - drags: [], - observers: [], - - register: function(draggable) { - if(this.drags.length == 0) { - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.updateDrag.bindAsEventListener(this); - this.eventKeypress = this.keyPress.bindAsEventListener(this); - - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - Event.observe(document, "keypress", this.eventKeypress); - } - this.drags.push(draggable); - }, - - unregister: function(draggable) { - this.drags = this.drags.reject(function(d) { return d==draggable }); - if(this.drags.length == 0) { - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - Event.stopObserving(document, "keypress", this.eventKeypress); - } - }, - - activate: function(draggable) { - window.focus(); // allows keypress events if window isn't currently focused, fails for Safari - this.activeDraggable = draggable; - }, - - deactivate: function(draggbale) { - this.activeDraggable = null; - }, - - updateDrag: function(event) { - if(!this.activeDraggable) return; - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - // Mozilla-based browsers fire successive mousemove events with - // the same coordinates, prevent needless redrawing (moz bug?) - if(this._lastPointer && (this._lastPointer.inspect() == pointer.inspect())) return; - this._lastPointer = pointer; - this.activeDraggable.updateDrag(event, pointer); - }, - - endDrag: function(event) { - if(!this.activeDraggable) return; - this._lastPointer = null; - this.activeDraggable.endDrag(event); - this.activeDraggable = null; - }, - - keyPress: function(event) { - if(this.activeDraggable) - this.activeDraggable.keyPress(event); - }, - - addObserver: function(observer) { - this.observers.push(observer); - this._cacheObserverCallbacks(); - }, - - removeObserver: function(element) { // element instead of observer fixes mem leaks - this.observers = this.observers.reject( function(o) { return o.element==element }); - this._cacheObserverCallbacks(); - }, - - notify: function(eventName, draggable, event) { // 'onStart', 'onEnd', 'onDrag' - if(this[eventName+'Count'] > 0) - this.observers.each( function(o) { - if(o[eventName]) o[eventName](eventName, draggable, event); - }); - }, - - _cacheObserverCallbacks: function() { - ['onStart','onEnd','onDrag'].each( function(eventName) { - Draggables[eventName+'Count'] = Draggables.observers.select( - function(o) { return o[eventName]; } - ).length; - }); - } -} - -/*--------------------------------------------------------------------------*/ - -var Draggable = Class.create(); -Draggable.prototype = { - initialize: function(element) { - var options = Object.extend({ - handle: false, - starteffect: function(element) { - new Effect.Opacity(element, {duration:0.2, from:1.0, to:0.7}); - }, - reverteffect: function(element, top_offset, left_offset) { - var dur = Math.sqrt(Math.abs(top_offset^2)+Math.abs(left_offset^2))*0.02; - element._revert = new Effect.Move(element, { x: -left_offset, y: -top_offset, duration: dur}); - }, - endeffect: function(element) { - new Effect.Opacity(element, {duration:0.2, from:0.7, to:1.0}); - }, - zindex: 1000, - revert: false, - snap: false // false, or xy or [x,y] or function(x,y){ return [x,y] } - }, arguments[1] || {}); - - this.element = $(element); - - if(options.handle && (typeof options.handle == 'string')) - this.handle = Element.childrenWithClassName(this.element, options.handle)[0]; - if(!this.handle) this.handle = $(options.handle); - if(!this.handle) this.handle = this.element; - - Element.makePositioned(this.element); // fix IE - - this.delta = this.currentDelta(); - this.options = options; - this.dragging = false; - - this.eventMouseDown = this.initDrag.bindAsEventListener(this); - Event.observe(this.handle, "mousedown", this.eventMouseDown); - - Draggables.register(this); - }, - - destroy: function() { - Event.stopObserving(this.handle, "mousedown", this.eventMouseDown); - Draggables.unregister(this); - }, - - currentDelta: function() { - return([ - parseInt(Element.getStyle(this.element,'left') || '0'), - parseInt(Element.getStyle(this.element,'top') || '0')]); - }, - - initDrag: function(event) { - if(Event.isLeftClick(event)) { - // abort on form elements, fixes a Firefox issue - var src = Event.element(event); - if(src.tagName && ( - src.tagName=='INPUT' || - src.tagName=='SELECT' || - src.tagName=='BUTTON' || - src.tagName=='TEXTAREA')) return; - - if(this.element._revert) { - this.element._revert.cancel(); - this.element._revert = null; - } - - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var pos = Position.cumulativeOffset(this.element); - this.offset = [0,1].map( function(i) { return (pointer[i] - pos[i]) }); - - Draggables.activate(this); - Event.stop(event); - } - }, - - startDrag: function(event) { - this.dragging = true; - - if(this.options.zindex) { - this.originalZ = parseInt(Element.getStyle(this.element,'z-index') || 0); - this.element.style.zIndex = this.options.zindex; - } - - if(this.options.ghosting) { - this._clone = this.element.cloneNode(true); - Position.absolutize(this.element); - this.element.parentNode.insertBefore(this._clone, this.element); - } - - Draggables.notify('onStart', this, event); - if(this.options.starteffect) this.options.starteffect(this.element); - }, - - updateDrag: function(event, pointer) { - if(!this.dragging) this.startDrag(event); - Position.prepare(); - Droppables.show(pointer, this.element); - Draggables.notify('onDrag', this, event); - this.draw(pointer); - if(this.options.change) this.options.change(this); - - // fix AppleWebKit rendering - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); - Event.stop(event); - }, - - finishDrag: function(event, success) { - this.dragging = false; - - if(this.options.ghosting) { - Position.relativize(this.element); - Element.remove(this._clone); - this._clone = null; - } - - if(success) Droppables.fire(event, this.element); - Draggables.notify('onEnd', this, event); - - var revert = this.options.revert; - if(revert && typeof revert == 'function') revert = revert(this.element); - - var d = this.currentDelta(); - if(revert && this.options.reverteffect) { - this.options.reverteffect(this.element, - d[1]-this.delta[1], d[0]-this.delta[0]); - } else { - this.delta = d; - } - - if(this.options.zindex) - this.element.style.zIndex = this.originalZ; - - if(this.options.endeffect) - this.options.endeffect(this.element); - - Draggables.deactivate(this); - Droppables.reset(); - }, - - keyPress: function(event) { - if(!event.keyCode==Event.KEY_ESC) return; - this.finishDrag(event, false); - Event.stop(event); - }, - - endDrag: function(event) { - if(!this.dragging) return; - this.finishDrag(event, true); - Event.stop(event); - }, - - draw: function(point) { - var pos = Position.cumulativeOffset(this.element); - var d = this.currentDelta(); - pos[0] -= d[0]; pos[1] -= d[1]; - - var p = [0,1].map(function(i){ return (point[i]-pos[i]-this.offset[i]) }.bind(this)); - - if(this.options.snap) { - if(typeof this.options.snap == 'function') { - p = this.options.snap(p[0],p[1]); - } else { - if(this.options.snap instanceof Array) { - p = p.map( function(v, i) { - return Math.round(v/this.options.snap[i])*this.options.snap[i] }.bind(this)) - } else { - p = p.map( function(v) { - return Math.round(v/this.options.snap)*this.options.snap }.bind(this)) - } - }} - - var style = this.element.style; - if((!this.options.constraint) || (this.options.constraint=='horizontal')) - style.left = p[0] + "px"; - if((!this.options.constraint) || (this.options.constraint=='vertical')) - style.top = p[1] + "px"; - if(style.visibility=="hidden") style.visibility = ""; // fix gecko rendering - } -} - -/*--------------------------------------------------------------------------*/ - -var SortableObserver = Class.create(); -SortableObserver.prototype = { - initialize: function(element, observer) { - this.element = $(element); - this.observer = observer; - this.lastValue = Sortable.serialize(this.element); - }, - - onStart: function() { - this.lastValue = Sortable.serialize(this.element); - }, - - onEnd: function() { - Sortable.unmark(); - if(this.lastValue != Sortable.serialize(this.element)) - this.observer(this.element) - } -} - -var Sortable = { - sortables: new Array(), - - options: function(element){ - element = $(element); - return this.sortables.detect(function(s) { return s.element == element }); - }, - - destroy: function(element){ - element = $(element); - this.sortables.findAll(function(s) { return s.element == element }).each(function(s){ - Draggables.removeObserver(s.element); - s.droppables.each(function(d){ Droppables.remove(d) }); - s.draggables.invoke('destroy'); - }); - this.sortables = this.sortables.reject(function(s) { return s.element == element }); - }, - - create: function(element) { - element = $(element); - var options = Object.extend({ - element: element, - tag: 'li', // assumes li children, override with tag: 'tagname' - dropOnEmpty: false, - tree: false, // fixme: unimplemented - overlap: 'vertical', // one of 'vertical', 'horizontal' - constraint: 'vertical', // one of 'vertical', 'horizontal', false - containment: element, // also takes array of elements (or id's); or false - handle: false, // or a CSS class - only: false, - hoverclass: null, - ghosting: false, - format: null, - onChange: Prototype.emptyFunction, - onUpdate: Prototype.emptyFunction - }, arguments[1] || {}); - - // clear any old sortable with same element - this.destroy(element); - - // build options for the draggables - var options_for_draggable = { - revert: true, - ghosting: options.ghosting, - constraint: options.constraint, - handle: options.handle }; - - if(options.starteffect) - options_for_draggable.starteffect = options.starteffect; - - if(options.reverteffect) - options_for_draggable.reverteffect = options.reverteffect; - else - if(options.ghosting) options_for_draggable.reverteffect = function(element) { - element.style.top = 0; - element.style.left = 0; - }; - - if(options.endeffect) - options_for_draggable.endeffect = options.endeffect; - - if(options.zindex) - options_for_draggable.zindex = options.zindex; - - // build options for the droppables - var options_for_droppable = { - overlap: options.overlap, - containment: options.containment, - hoverclass: options.hoverclass, - onHover: Sortable.onHover, - greedy: !options.dropOnEmpty - } - - // fix for gecko engine - Element.cleanWhitespace(element); - - options.draggables = []; - options.droppables = []; - - // make it so - - // drop on empty handling - if(options.dropOnEmpty) { - Droppables.add(element, - {containment: options.containment, onHover: Sortable.onEmptyHover, greedy: false}); - options.droppables.push(element); - } - - (this.findElements(element, options) || []).each( function(e) { - // handles are per-draggable - var handle = options.handle ? - Element.childrenWithClassName(e, options.handle)[0] : e; - options.draggables.push( - new Draggable(e, Object.extend(options_for_draggable, { handle: handle }))); - Droppables.add(e, options_for_droppable); - options.droppables.push(e); - }); - - // keep reference - this.sortables.push(options); - - // for onupdate - Draggables.addObserver(new SortableObserver(element, options.onUpdate)); - - }, - - // return all suitable-for-sortable elements in a guaranteed order - findElements: function(element, options) { - if(!element.hasChildNodes()) return null; - var elements = []; - $A(element.childNodes).each( function(e) { - if(e.tagName && e.tagName.toUpperCase()==options.tag.toUpperCase() && - (!options.only || (Element.hasClassName(e, options.only)))) - elements.push(e); - if(options.tree) { - var grandchildren = this.findElements(e, options); - if(grandchildren) elements.push(grandchildren); - } - }); - - return (elements.length>0 ? elements.flatten() : null); - }, - - onHover: function(element, dropon, overlap) { - if(overlap>0.5) { - Sortable.mark(dropon, 'before'); - if(dropon.previousSibling != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, dropon); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } else { - Sortable.mark(dropon, 'after'); - var nextElement = dropon.nextSibling || null; - if(nextElement != element) { - var oldParentNode = element.parentNode; - element.style.visibility = "hidden"; // fix gecko rendering - dropon.parentNode.insertBefore(element, nextElement); - if(dropon.parentNode!=oldParentNode) - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon.parentNode).onChange(element); - } - } - }, - - onEmptyHover: function(element, dropon) { - if(element.parentNode!=dropon) { - var oldParentNode = element.parentNode; - dropon.appendChild(element); - Sortable.options(oldParentNode).onChange(element); - Sortable.options(dropon).onChange(element); - } - }, - - unmark: function() { - if(Sortable._marker) Element.hide(Sortable._marker); - }, - - mark: function(dropon, position) { - // mark on ghosting only - var sortable = Sortable.options(dropon.parentNode); - if(sortable && !sortable.ghosting) return; - - if(!Sortable._marker) { - Sortable._marker = $('dropmarker') || document.createElement('DIV'); - Element.hide(Sortable._marker); - Element.addClassName(Sortable._marker, 'dropmarker'); - Sortable._marker.style.position = 'absolute'; - document.getElementsByTagName("body").item(0).appendChild(Sortable._marker); - } - var offsets = Position.cumulativeOffset(dropon); - Sortable._marker.style.left = offsets[0] + 'px'; - Sortable._marker.style.top = offsets[1] + 'px'; - - if(position=='after') - if(sortable.overlap == 'horizontal') - Sortable._marker.style.left = (offsets[0]+dropon.clientWidth) + 'px'; - else - Sortable._marker.style.top = (offsets[1]+dropon.clientHeight) + 'px'; - - Element.show(Sortable._marker); - }, - - serialize: function(element) { - element = $(element); - var sortableOptions = this.options(element); - var options = Object.extend({ - tag: sortableOptions.tag, - only: sortableOptions.only, - name: element.id, - format: sortableOptions.format || /^[^_]*_(.*)$/ - }, arguments[1] || {}); - return $(this.findElements(element, options) || []).map( function(item) { - return (encodeURIComponent(options.name) + "[]=" + - encodeURIComponent(item.id.match(options.format) ? item.id.match(options.format)[1] : '')); - }).join("&"); - } -} \ No newline at end of file diff --git a/js/effects.js b/js/effects.js deleted file mode 100644 index d3940a8..0000000 --- a/js/effects.js +++ /dev/null @@ -1,903 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// Contributors: -// Justin Palmer (http://encytemedia.com/) -// Mark Pilgrim (http://diveintomark.org/) -// Martin Bialasinki -// -// See scriptaculous.js for full license. - -/* ------------- element ext -------------- */ - -// converts rgb() and #xxx to #xxxxxx format, -// returns self (or first argument) if not convertable -String.prototype.parseColor = function() { - var color = '#'; - if(this.slice(0,4) == 'rgb(') { - var cols = this.slice(4,this.length-1).split(','); - var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3); - } else { - if(this.slice(0,1) == '#') { - if(this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase(); - if(this.length==7) color = this.toLowerCase(); - } - } - return(color.length==7 ? color : (arguments[0] || this)); -} - -Element.collectTextNodes = function(element) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - (node.hasChildNodes() ? Element.collectTextNodes(node) : '')); - }).flatten().join(''); -} - -Element.collectTextNodesIgnoreClass = function(element, className) { - return $A($(element).childNodes).collect( function(node) { - return (node.nodeType==3 ? node.nodeValue : - ((node.hasChildNodes() && !Element.hasClassName(node,className)) ? - Element.collectTextNodes(node) : '')); - }).flatten().join(''); -} - -Element.setStyle = function(element, style) { - element = $(element); - for(k in style) element.style[k.camelize()] = style[k]; -} - -Element.setContentZoom = function(element, percent) { - Element.setStyle(element, {fontSize: (percent/100) + 'em'}); - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); -} - -Element.getOpacity = function(element){ - var opacity; - if (opacity = Element.getStyle(element, 'opacity')) - return parseFloat(opacity); - if (opacity = (Element.getStyle(element, 'filter') || '').match(/alpha\(opacity=(.*)\)/)) - if(opacity[1]) return parseFloat(opacity[1]) / 100; - return 1.0; -} - -Element.setOpacity = function(element, value){ - element= $(element); - if (value == 1){ - Element.setStyle(element, { opacity: - (/Gecko/.test(navigator.userAgent) && !/Konqueror|Safari|KHTML/.test(navigator.userAgent)) ? - 0.999999 : null }); - if(/MSIE/.test(navigator.userAgent)) - Element.setStyle(element, {filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'')}); - } else { - if(value < 0.00001) value = 0; - Element.setStyle(element, {opacity: value}); - if(/MSIE/.test(navigator.userAgent)) - Element.setStyle(element, - { filter: Element.getStyle(element,'filter').replace(/alpha\([^\)]*\)/gi,'') + - 'alpha(opacity='+value*100+')' }); - } -} - -Element.getInlineOpacity = function(element){ - return $(element).style.opacity || ''; -} - -Element.childrenWithClassName = function(element, className) { - return $A($(element).getElementsByTagName('*')).select( - function(c) { return Element.hasClassName(c, className) }); -} - -Array.prototype.call = function() { - var args = arguments; - this.each(function(f){ f.apply(this, args) }); -} - -/*--------------------------------------------------------------------------*/ - -var Effect = { - tagifyText: function(element) { - var tagifyStyle = 'position:relative'; - if(/MSIE/.test(navigator.userAgent)) tagifyStyle += ';zoom:1'; - element = $(element); - $A(element.childNodes).each( function(child) { - if(child.nodeType==3) { - child.nodeValue.toArray().each( function(character) { - element.insertBefore( - Builder.node('span',{style: tagifyStyle}, - character == ' ' ? String.fromCharCode(160) : character), - child); - }); - Element.remove(child); - } - }); - }, - multiple: function(element, effect) { - var elements; - if(((typeof element == 'object') || - (typeof element == 'function')) && - (element.length)) - elements = element; - else - elements = $(element).childNodes; - - var options = Object.extend({ - speed: 0.1, - delay: 0.0 - }, arguments[2] || {}); - var masterDelay = options.delay; - - $A(elements).each( function(element, index) { - new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay })); - }); - }, - PAIRS: { - 'slide': ['SlideDown','SlideUp'], - 'blind': ['BlindDown','BlindUp'], - 'appear': ['Appear','Fade'] - }, - toggle: function(element, effect) { - element = $(element); - effect = (effect || 'appear').toLowerCase(); - var options = Object.extend({ - queue: { position:'end', scope:(element.id || 'global') } - }, arguments[2] || {}); - Effect[Element.visible(element) ? - Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options); - } -}; - -var Effect2 = Effect; // deprecated - -/* ------------- transitions ------------- */ - -Effect.Transitions = {} - -Effect.Transitions.linear = function(pos) { - return pos; -} -Effect.Transitions.sinoidal = function(pos) { - return (-Math.cos(pos*Math.PI)/2) + 0.5; -} -Effect.Transitions.reverse = function(pos) { - return 1-pos; -} -Effect.Transitions.flicker = function(pos) { - return ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4; -} -Effect.Transitions.wobble = function(pos) { - return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5; -} -Effect.Transitions.pulse = function(pos) { - return (Math.floor(pos*10) % 2 == 0 ? - (pos*10-Math.floor(pos*10)) : 1-(pos*10-Math.floor(pos*10))); -} -Effect.Transitions.none = function(pos) { - return 0; -} -Effect.Transitions.full = function(pos) { - return 1; -} - -/* ------------- core effects ------------- */ - -Effect.ScopedQueue = Class.create(); -Object.extend(Object.extend(Effect.ScopedQueue.prototype, Enumerable), { - initialize: function() { - this.effects = []; - this.interval = null; - }, - _each: function(iterator) { - this.effects._each(iterator); - }, - add: function(effect) { - var timestamp = new Date().getTime(); - - var position = (typeof effect.options.queue == 'string') ? - effect.options.queue : effect.options.queue.position; - - switch(position) { - case 'front': - // move unstarted effects after this effect - this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) { - e.startOn += effect.finishOn; - e.finishOn += effect.finishOn; - }); - break; - case 'end': - // start effect after last queued effect has finished - timestamp = this.effects.pluck('finishOn').max() || timestamp; - break; - } - - effect.startOn += timestamp; - effect.finishOn += timestamp; - this.effects.push(effect); - if(!this.interval) - this.interval = setInterval(this.loop.bind(this), 40); - }, - remove: function(effect) { - this.effects = this.effects.reject(function(e) { return e==effect }); - if(this.effects.length == 0) { - clearInterval(this.interval); - this.interval = null; - } - }, - loop: function() { - var timePos = new Date().getTime(); - this.effects.invoke('loop', timePos); - } -}); - -Effect.Queues = { - instances: $H(), - get: function(queueName) { - if(typeof queueName != 'string') return queueName; - - if(!this.instances[queueName]) - this.instances[queueName] = new Effect.ScopedQueue(); - - return this.instances[queueName]; - } -} -Effect.Queue = Effect.Queues.get('global'); - -Effect.DefaultOptions = { - transition: Effect.Transitions.sinoidal, - duration: 1.0, // seconds - fps: 25.0, // max. 25fps due to Effect.Queue implementation - sync: false, // true for combining - from: 0.0, - to: 1.0, - delay: 0.0, - queue: 'parallel' -} - -Effect.Base = function() {}; -Effect.Base.prototype = { - position: null, - start: function(options) { - this.options = Object.extend(Object.extend({},Effect.DefaultOptions), options || {}); - this.currentFrame = 0; - this.state = 'idle'; - this.startOn = this.options.delay*1000; - this.finishOn = this.startOn + (this.options.duration*1000); - this.event('beforeStart'); - if(!this.options.sync) - Effect.Queues.get(typeof this.options.queue == 'string' ? - 'global' : this.options.queue.scope).add(this); - }, - loop: function(timePos) { - if(timePos >= this.startOn) { - if(timePos >= this.finishOn) { - this.render(1.0); - this.cancel(); - this.event('beforeFinish'); - if(this.finish) this.finish(); - this.event('afterFinish'); - return; - } - var pos = (timePos - this.startOn) / (this.finishOn - this.startOn); - var frame = Math.round(pos * this.options.fps * this.options.duration); - if(frame > this.currentFrame) { - this.render(pos); - this.currentFrame = frame; - } - } - }, - render: function(pos) { - if(this.state == 'idle') { - this.state = 'running'; - this.event('beforeSetup'); - if(this.setup) this.setup(); - this.event('afterSetup'); - } - if(this.state == 'running') { - if(this.options.transition) pos = this.options.transition(pos); - pos *= (this.options.to-this.options.from); - pos += this.options.from; - this.position = pos; - this.event('beforeUpdate'); - if(this.update) this.update(pos); - this.event('afterUpdate'); - } - }, - cancel: function() { - if(!this.options.sync) - Effect.Queues.get(typeof this.options.queue == 'string' ? - 'global' : this.options.queue.scope).remove(this); - this.state = 'finished'; - }, - event: function(eventName) { - if(this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this); - if(this.options[eventName]) this.options[eventName](this); - }, - inspect: function() { - return '#'; - } -} - -Effect.Parallel = Class.create(); -Object.extend(Object.extend(Effect.Parallel.prototype, Effect.Base.prototype), { - initialize: function(effects) { - this.effects = effects || []; - this.start(arguments[1]); - }, - update: function(position) { - this.effects.invoke('render', position); - }, - finish: function(position) { - this.effects.each( function(effect) { - effect.render(1.0); - effect.cancel(); - effect.event('beforeFinish'); - if(effect.finish) effect.finish(position); - effect.event('afterFinish'); - }); - } -}); - -Effect.Opacity = Class.create(); -Object.extend(Object.extend(Effect.Opacity.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - // make this work on IE on elements without 'layout' - if(/MSIE/.test(navigator.userAgent) && (!this.element.hasLayout)) - Element.setStyle(this.element, {zoom: 1}); - var options = Object.extend({ - from: Element.getOpacity(this.element) || 0.0, - to: 1.0 - }, arguments[1] || {}); - this.start(options); - }, - update: function(position) { - Element.setOpacity(this.element, position); - } -}); - -Effect.Move = Class.create(); -Object.extend(Object.extend(Effect.Move.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - var options = Object.extend({ - x: 0, - y: 0, - mode: 'relative' - }, arguments[1] || {}); - this.start(options); - }, - setup: function() { - // Bug in Opera: Opera returns the "real" position of a static element or - // relative element that does not have top/left explicitly set. - // ==> Always set top and left for position relative elements in your stylesheets - // (to 0 if you do not need them) - Element.makePositioned(this.element); - this.originalLeft = parseFloat(Element.getStyle(this.element,'left') || '0'); - this.originalTop = parseFloat(Element.getStyle(this.element,'top') || '0'); - if(this.options.mode == 'absolute') { - // absolute movement, so we need to calc deltaX and deltaY - this.options.x = this.options.x - this.originalLeft; - this.options.y = this.options.y - this.originalTop; - } - }, - update: function(position) { - Element.setStyle(this.element, { - left: this.options.x * position + this.originalLeft + 'px', - top: this.options.y * position + this.originalTop + 'px' - }); - } -}); - -// for backwards compatibility -Effect.MoveBy = function(element, toTop, toLeft) { - return new Effect.Move(element, - Object.extend({ x: toLeft, y: toTop }, arguments[3] || {})); -}; - -Effect.Scale = Class.create(); -Object.extend(Object.extend(Effect.Scale.prototype, Effect.Base.prototype), { - initialize: function(element, percent) { - this.element = $(element) - var options = Object.extend({ - scaleX: true, - scaleY: true, - scaleContent: true, - scaleFromCenter: false, - scaleMode: 'box', // 'box' or 'contents' or {} with provided values - scaleFrom: 100.0, - scaleTo: percent - }, arguments[2] || {}); - this.start(options); - }, - setup: function() { - this.restoreAfterFinish = this.options.restoreAfterFinish || false; - this.elementPositioning = Element.getStyle(this.element,'position'); - - this.originalStyle = {}; - ['top','left','width','height','fontSize'].each( function(k) { - this.originalStyle[k] = this.element.style[k]; - }.bind(this)); - - this.originalTop = this.element.offsetTop; - this.originalLeft = this.element.offsetLeft; - - var fontSize = Element.getStyle(this.element,'font-size') || '100%'; - ['em','px','%'].each( function(fontSizeType) { - if(fontSize.indexOf(fontSizeType)>0) { - this.fontSize = parseFloat(fontSize); - this.fontSizeType = fontSizeType; - } - }.bind(this)); - - this.factor = (this.options.scaleTo - this.options.scaleFrom)/100; - - this.dims = null; - if(this.options.scaleMode=='box') - this.dims = [this.element.offsetHeight, this.element.offsetWidth]; - if(/^content/.test(this.options.scaleMode)) - this.dims = [this.element.scrollHeight, this.element.scrollWidth]; - if(!this.dims) - this.dims = [this.options.scaleMode.originalHeight, - this.options.scaleMode.originalWidth]; - }, - update: function(position) { - var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position); - if(this.options.scaleContent && this.fontSize) - Element.setStyle(this.element, {fontSize: this.fontSize * currentScale + this.fontSizeType }); - this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale); - }, - finish: function(position) { - if (this.restoreAfterFinish) Element.setStyle(this.element, this.originalStyle); - }, - setDimensions: function(height, width) { - var d = {}; - if(this.options.scaleX) d.width = width + 'px'; - if(this.options.scaleY) d.height = height + 'px'; - if(this.options.scaleFromCenter) { - var topd = (height - this.dims[0])/2; - var leftd = (width - this.dims[1])/2; - if(this.elementPositioning == 'absolute') { - if(this.options.scaleY) d.top = this.originalTop-topd + 'px'; - if(this.options.scaleX) d.left = this.originalLeft-leftd + 'px'; - } else { - if(this.options.scaleY) d.top = -topd + 'px'; - if(this.options.scaleX) d.left = -leftd + 'px'; - } - } - Element.setStyle(this.element, d); - } -}); - -Effect.Highlight = Class.create(); -Object.extend(Object.extend(Effect.Highlight.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || {}); - this.start(options); - }, - setup: function() { - // Prevent executing on elements not in the layout flow - if(Element.getStyle(this.element, 'display')=='none') { this.cancel(); return; } - // Disable background image during the effect - this.oldStyle = { - backgroundImage: Element.getStyle(this.element, 'background-image') }; - Element.setStyle(this.element, {backgroundImage: 'none'}); - if(!this.options.endcolor) - this.options.endcolor = Element.getStyle(this.element, 'background-color').parseColor('#ffffff'); - if(!this.options.restorecolor) - this.options.restorecolor = Element.getStyle(this.element, 'background-color'); - // init color calculations - this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this)); - this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this)); - }, - update: function(position) { - Element.setStyle(this.element,{backgroundColor: $R(0,2).inject('#',function(m,v,i){ - return m+(Math.round(this._base[i]+(this._delta[i]*position)).toColorPart()); }.bind(this)) }); - }, - finish: function() { - Element.setStyle(this.element, Object.extend(this.oldStyle, { - backgroundColor: this.options.restorecolor - })); - } -}); - -Effect.ScrollTo = Class.create(); -Object.extend(Object.extend(Effect.ScrollTo.prototype, Effect.Base.prototype), { - initialize: function(element) { - this.element = $(element); - this.start(arguments[1] || {}); - }, - setup: function() { - Position.prepare(); - var offsets = Position.cumulativeOffset(this.element); - if(this.options.offset) offsets[1] += this.options.offset; - var max = window.innerHeight ? - window.height - window.innerHeight : - document.body.scrollHeight - - (document.documentElement.clientHeight ? - document.documentElement.clientHeight : document.body.clientHeight); - this.scrollStart = Position.deltaY; - this.delta = (offsets[1] > max ? max : offsets[1]) - this.scrollStart; - }, - update: function(position) { - Position.prepare(); - window.scrollTo(Position.deltaX, - this.scrollStart + (position*this.delta)); - } -}); - -/* ------------- combination effects ------------- */ - -Effect.Fade = function(element) { - var oldOpacity = Element.getInlineOpacity(element); - var options = Object.extend({ - from: Element.getOpacity(element) || 1.0, - to: 0.0, - afterFinishInternal: function(effect) { with(Element) { - if(effect.options.to!=0) return; - hide(effect.element); - setStyle(effect.element, {opacity: oldOpacity}); }} - }, arguments[1] || {}); - return new Effect.Opacity(element,options); -} - -Effect.Appear = function(element) { - var options = Object.extend({ - from: (Element.getStyle(element, 'display') == 'none' ? 0.0 : Element.getOpacity(element) || 0.0), - to: 1.0, - beforeSetup: function(effect) { with(Element) { - setOpacity(effect.element, effect.options.from); - show(effect.element); }} - }, arguments[1] || {}); - return new Effect.Opacity(element,options); -} - -Effect.Puff = function(element) { - element = $(element); - var oldStyle = { opacity: Element.getInlineOpacity(element), position: Element.getStyle(element, 'position') }; - return new Effect.Parallel( - [ new Effect.Scale(element, 200, - { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 } ) ], - Object.extend({ duration: 1.0, - beforeSetupInternal: function(effect) { with(Element) { - setStyle(effect.effects[0].element, {position: 'absolute'}); }}, - afterFinishInternal: function(effect) { with(Element) { - hide(effect.effects[0].element); - setStyle(effect.effects[0].element, oldStyle); }} - }, arguments[1] || {}) - ); -} - -Effect.BlindUp = function(element) { - element = $(element); - Element.makeClipping(element); - return new Effect.Scale(element, 0, - Object.extend({ scaleContent: false, - scaleX: false, - restoreAfterFinish: true, - afterFinishInternal: function(effect) { with(Element) { - [hide, undoClipping].call(effect.element); }} - }, arguments[1] || {}) - ); -} - -Effect.BlindDown = function(element) { - element = $(element); - var oldHeight = Element.getStyle(element, 'height'); - var elementDimensions = Element.getDimensions(element); - return new Effect.Scale(element, 100, - Object.extend({ scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { with(Element) { - makeClipping(effect.element); - setStyle(effect.element, {height: '0px'}); - show(effect.element); - }}, - afterFinishInternal: function(effect) { with(Element) { - undoClipping(effect.element); - setStyle(effect.element, {height: oldHeight}); - }} - }, arguments[1] || {}) - ); -} - -Effect.SwitchOff = function(element) { - element = $(element); - var oldOpacity = Element.getInlineOpacity(element); - return new Effect.Appear(element, { - duration: 0.4, - from: 0, - transition: Effect.Transitions.flicker, - afterFinishInternal: function(effect) { - new Effect.Scale(effect.element, 1, { - duration: 0.3, scaleFromCenter: true, - scaleX: false, scaleContent: false, restoreAfterFinish: true, - beforeSetup: function(effect) { with(Element) { - [makePositioned,makeClipping].call(effect.element); - }}, - afterFinishInternal: function(effect) { with(Element) { - [hide,undoClipping,undoPositioned].call(effect.element); - setStyle(effect.element, {opacity: oldOpacity}); - }} - }) - } - }); -} - -Effect.DropOut = function(element) { - element = $(element); - var oldStyle = { - top: Element.getStyle(element, 'top'), - left: Element.getStyle(element, 'left'), - opacity: Element.getInlineOpacity(element) }; - return new Effect.Parallel( - [ new Effect.Move(element, {x: 0, y: 100, sync: true }), - new Effect.Opacity(element, { sync: true, to: 0.0 }) ], - Object.extend( - { duration: 0.5, - beforeSetup: function(effect) { with(Element) { - makePositioned(effect.effects[0].element); }}, - afterFinishInternal: function(effect) { with(Element) { - [hide, undoPositioned].call(effect.effects[0].element); - setStyle(effect.effects[0].element, oldStyle); }} - }, arguments[1] || {})); -} - -Effect.Shake = function(element) { - element = $(element); - var oldStyle = { - top: Element.getStyle(element, 'top'), - left: Element.getStyle(element, 'left') }; - return new Effect.Move(element, - { x: 20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: 40, y: 0, duration: 0.1, afterFinishInternal: function(effect) { - new Effect.Move(effect.element, - { x: -20, y: 0, duration: 0.05, afterFinishInternal: function(effect) { with(Element) { - undoPositioned(effect.element); - setStyle(effect.element, oldStyle); - }}}) }}) }}) }}) }}) }}); -} - -Effect.SlideDown = function(element) { - element = $(element); - Element.cleanWhitespace(element); - // SlideDown need to have the content of the element wrapped in a container element with fixed height! - var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); - var elementDimensions = Element.getDimensions(element); - return new Effect.Scale(element, 100, Object.extend({ - scaleContent: false, - scaleX: false, - scaleFrom: 0, - scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width}, - restoreAfterFinish: true, - afterSetup: function(effect) { with(Element) { - makePositioned(effect.element); - makePositioned(effect.element.firstChild); - if(window.opera) setStyle(effect.element, {top: ''}); - makeClipping(effect.element); - setStyle(effect.element, {height: '0px'}); - show(element); }}, - afterUpdateInternal: function(effect) { with(Element) { - setStyle(effect.element.firstChild, {bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, - afterFinishInternal: function(effect) { with(Element) { - undoClipping(effect.element); - undoPositioned(effect.element.firstChild); - undoPositioned(effect.element); - setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} - }, arguments[1] || {}) - ); -} - -Effect.SlideUp = function(element) { - element = $(element); - Element.cleanWhitespace(element); - var oldInnerBottom = Element.getStyle(element.firstChild, 'bottom'); - return new Effect.Scale(element, 0, - Object.extend({ scaleContent: false, - scaleX: false, - scaleMode: 'box', - scaleFrom: 100, - restoreAfterFinish: true, - beforeStartInternal: function(effect) { with(Element) { - makePositioned(effect.element); - makePositioned(effect.element.firstChild); - if(window.opera) setStyle(effect.element, {top: ''}); - makeClipping(effect.element); - show(element); }}, - afterUpdateInternal: function(effect) { with(Element) { - setStyle(effect.element.firstChild, {bottom: - (effect.dims[0] - effect.element.clientHeight) + 'px' }); }}, - afterFinishInternal: function(effect) { with(Element) { - [hide, undoClipping].call(effect.element); - undoPositioned(effect.element.firstChild); - undoPositioned(effect.element); - setStyle(effect.element.firstChild, {bottom: oldInnerBottom}); }} - }, arguments[1] || {}) - ); -} - -// Bug in opera makes the TD containing this element expand for a instance after finish -Effect.Squish = function(element) { - return new Effect.Scale(element, window.opera ? 1 : 0, - { restoreAfterFinish: true, - beforeSetup: function(effect) { with(Element) { - makeClipping(effect.element); }}, - afterFinishInternal: function(effect) { with(Element) { - hide(effect.element); - undoClipping(effect.element); }} - }); -} - -Effect.Grow = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransistion: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.full - }, arguments[1] || {}); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: Element.getInlineOpacity(element) }; - - var dims = Element.getDimensions(element); - var initialMoveX, initialMoveY; - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - initialMoveX = initialMoveY = moveX = moveY = 0; - break; - case 'top-right': - initialMoveX = dims.width; - initialMoveY = moveY = 0; - moveX = -dims.width; - break; - case 'bottom-left': - initialMoveX = moveX = 0; - initialMoveY = dims.height; - moveY = -dims.height; - break; - case 'bottom-right': - initialMoveX = dims.width; - initialMoveY = dims.height; - moveX = -dims.width; - moveY = -dims.height; - break; - case 'center': - initialMoveX = dims.width / 2; - initialMoveY = dims.height / 2; - moveX = -dims.width / 2; - moveY = -dims.height / 2; - break; - } - - return new Effect.Move(element, { - x: initialMoveX, - y: initialMoveY, - duration: 0.01, - beforeSetup: function(effect) { with(Element) { - hide(effect.element); - makeClipping(effect.element); - makePositioned(effect.element); - }}, - afterFinishInternal: function(effect) { - new Effect.Parallel( - [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }), - new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }), - new Effect.Scale(effect.element, 100, { - scaleMode: { originalHeight: dims.height, originalWidth: dims.width }, - sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true}) - ], Object.extend({ - beforeSetup: function(effect) { with(Element) { - setStyle(effect.effects[0].element, {height: '0px'}); - show(effect.effects[0].element); }}, - afterFinishInternal: function(effect) { with(Element) { - [undoClipping, undoPositioned].call(effect.effects[0].element); - setStyle(effect.effects[0].element, oldStyle); }} - }, options) - ) - } - }); -} - -Effect.Shrink = function(element) { - element = $(element); - var options = Object.extend({ - direction: 'center', - moveTransistion: Effect.Transitions.sinoidal, - scaleTransition: Effect.Transitions.sinoidal, - opacityTransition: Effect.Transitions.none - }, arguments[1] || {}); - var oldStyle = { - top: element.style.top, - left: element.style.left, - height: element.style.height, - width: element.style.width, - opacity: Element.getInlineOpacity(element) }; - - var dims = Element.getDimensions(element); - var moveX, moveY; - - switch (options.direction) { - case 'top-left': - moveX = moveY = 0; - break; - case 'top-right': - moveX = dims.width; - moveY = 0; - break; - case 'bottom-left': - moveX = 0; - moveY = dims.height; - break; - case 'bottom-right': - moveX = dims.width; - moveY = dims.height; - break; - case 'center': - moveX = dims.width / 2; - moveY = dims.height / 2; - break; - } - - return new Effect.Parallel( - [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }), - new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}), - new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }) - ], Object.extend({ - beforeStartInternal: function(effect) { with(Element) { - [makePositioned, makeClipping].call(effect.effects[0].element) }}, - afterFinishInternal: function(effect) { with(Element) { - [hide, undoClipping, undoPositioned].call(effect.effects[0].element); - setStyle(effect.effects[0].element, oldStyle); }} - }, options) - ); -} - -Effect.Pulsate = function(element) { - element = $(element); - var options = arguments[1] || {}; - var oldOpacity = Element.getInlineOpacity(element); - var transition = options.transition || Effect.Transitions.sinoidal; - var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos)) }; - reverser.bind(transition); - return new Effect.Opacity(element, - Object.extend(Object.extend({ duration: 3.0, from: 0, - afterFinishInternal: function(effect) { Element.setStyle(effect.element, {opacity: oldOpacity}); } - }, options), {transition: reverser})); -} - -Effect.Fold = function(element) { - element = $(element); - var oldStyle = { - top: element.style.top, - left: element.style.left, - width: element.style.width, - height: element.style.height }; - Element.makeClipping(element); - return new Effect.Scale(element, 5, Object.extend({ - scaleContent: false, - scaleX: false, - afterFinishInternal: function(effect) { - new Effect.Scale(element, 1, { - scaleContent: false, - scaleY: false, - afterFinishInternal: function(effect) { with(Element) { - [hide, undoClipping].call(effect.element); - setStyle(effect.element, oldStyle); - }} }); - }}, arguments[1] || {})); -} diff --git a/js/formatDate.js b/js/formatDate.js deleted file mode 100644 index 11c6197..0000000 --- a/js/formatDate.js +++ /dev/null @@ -1,290 +0,0 @@ -Array.prototype.exists = function (x) { - for (var i = 0; i < this.length; i++) { - if (this[i] == x) return true; - } - return false; -} - -Date.prototype.formatDate = function (input,time) { - // formatDate : - // a PHP date like function, for formatting date strings - // See: http://www.php.net/date - // - // input : format string - // time : epoch time (seconds, and optional) - // - // if time is not passed, formatting is based on - // the current "this" date object's set time. - // - // supported: - // a, A, B, d, D, F, g, G, h, H, i, j, l (lowercase L), L, - // m, M, n, O, r, s, S, t, U, w, W, y, Y, z - // - // unsupported: - // I (capital i), T, Z - - var switches = ["a", "A", "B", "d", "D", "F", "g", "G", "h", "H", - "i", "j", "l", "L", "m", "M", "n", "O", "r", "s", - "S", "t", "U", "w", "W", "y", "Y", "z"]; - var daysLong = ["Sunday", "Monday", "Tuesday", "Wednesday", - "Thursday", "Friday", "Saturday"]; - var daysShort = ["Sun", "Mon", "Tue", "Wed", - "Thu", "Fri", "Sat"]; - var monthsShort = ["Jan", "Feb", "Mar", "Apr", - "May", "Jun", "Jul", "Aug", "Sep", - "Oct", "Nov", "Dec"]; - var monthsLong = ["January", "February", "March", "April", - "May", "June", "July", "August", "September", - "October", "November", "December"]; - var daysSuffix = ["st", "nd", "rd", "th", "th", "th", "th", // 1st - 7th - "th", "th", "th", "th", "th", "th", "th", // 8th - 14th - "th", "th", "th", "th", "th", "th", "st", // 15th - 21st - "nd", "rd", "th", "th", "th", "th", "th", // 22nd - 28th - "th", "th", "st"]; // 29th - 31st - - function a() { - // Lowercase Ante meridiem and Post meridiem - return self.getHours() > 11? "pm" : "am"; - } - function A() { - // Uppercase Ante meridiem and Post meridiem - return self.getHours() > 11? "PM" : "AM"; - } - - function B(){ - // Swatch internet time. code simply grabbed from ppk, - // since I was feeling lazy: - // http://www.xs4all.nl/~ppk/js/beat.html - var off = (self.getTimezoneOffset() + 60)*60; - var theSeconds = (self.getHours() * 3600) + - (self.getMinutes() * 60) + - self.getSeconds() + off; - var beat = Math.floor(theSeconds/86.4); - if (beat > 1000) beat -= 1000; - if (beat < 0) beat += 1000; - if ((""+beat).length == 1) beat = "00"+beat; - if ((""+beat).length == 2) beat = "0"+beat; - return beat; - } - - function d() { - // Day of the month, 2 digits with leading zeros - return new String(self.getDate()).length == 1? - "0"+self.getDate() : self.getDate(); - } - function D() { - // A textual representation of a day, three letters - return daysShort[self.getDay()]; - } - function F() { - // A full textual representation of a month - return monthsLong[self.getMonth()]; - } - function g() { - // 12-hour format of an hour without leading zeros - return self.getHours() > 12? self.getHours()-12 : self.getHours(); - } - function G() { - // 24-hour format of an hour without leading zeros - return self.getHours(); - } - function h() { - // 12-hour format of an hour with leading zeros - if (self.getHours() > 12) { - var s = new String(self.getHours()-12); - return s.length == 1? - "0"+ (self.getHours()-12) : self.getHours()-12; - } else { - var s = new String(self.getHours()); - return s.length == 1? - "0"+self.getHours() : self.getHours(); - } - } - function H() { - // 24-hour format of an hour with leading zeros - return new String(self.getHours()).length == 1? - "0"+self.getHours() : self.getHours(); - } - function i() { - // Minutes with leading zeros - return new String(self.getMinutes()).length == 1? - "0"+self.getMinutes() : self.getMinutes(); - } - function j() { - // Day of the month without leading zeros - return self.getDate(); - } - function l() { - // A full textual representation of the day of the week - return daysLong[self.getDay()]; - } - function L() { - // leap year or not. 1 if leap year, 0 if not. - // the logic should match iso's 8601 standard. - var y_ = Y(); - if ( - (y_ % 4 == 0 && y_ % 100 != 0) || - (y_ % 4 == 0 && y_ % 100 == 0 && y_ % 400 == 0) - ) { - return 1; - } else { - return 0; - } - } - function m() { - // Numeric representation of a month, with leading zeros - return self.getMonth() < 9? - "0"+(self.getMonth()+1) : - self.getMonth()+1; - } - function M() { - // A short textual representation of a month, three letters - return monthsShort[self.getMonth()]; - } - function n() { - // Numeric representation of a month, without leading zeros - return self.getMonth()+1; - } - function O() { - // Difference to Greenwich time (GMT) in hours - var os = Math.abs(self.getTimezoneOffset()); - var h = ""+Math.floor(os/60); - var m = ""+(os%60); - h.length == 1? h = "0"+h:1; - m.length == 1? m = "0"+m:1; - return self.getTimezoneOffset() < 0 ? "+"+h+m : "-"+h+m; - } - function r() { - // RFC 822 formatted date - var r; // result - // Thu , 21 Dec 2000 - r = D() + ", " + j() + " " + M() + " " + Y() + - // 16 : 01 : 07 +0200 - " " + H() + ":" + i() + ":" + s() + " " + O(); - return r; - } - function S() { - // English ordinal suffix for the day of the month, 2 characters - return daysSuffix[self.getDate()-1]; - } - function s() { - // Seconds, with leading zeros - return new String(self.getSeconds()).length == 1? - "0"+self.getSeconds() : self.getSeconds(); - } - function t() { - - // thanks to Matt Bannon for some much needed code-fixes here! - var daysinmonths = [null,31,28,31,30,31,30,31,31,30,31,30,31]; - if (L()==1 && n()==2) return 29; // leap day - return daysinmonths[n()]; - } - function U() { - // Seconds since the Unix Epoch (January 1 1970 00:00:00 GMT) - return Math.round(self.getTime()/1000); - } - function W() { - // Weeknumber, as per ISO specification: - // http://www.cl.cam.ac.uk/~mgk25/iso-time.html - - // if the day is three days before newyears eve, - // there's a chance it's "week 1" of next year. - // here we check for that. - var beforeNY = 364+L() - z(); - var afterNY = z(); - var weekday = w()!=0?w()-1:6; // makes sunday (0), into 6. - if (beforeNY <= 2 && weekday <= 2-beforeNY) { - return 1; - } - // similarly, if the day is within threedays of newyears - // there's a chance it belongs in the old year. - var ny = new Date("January 1 " + Y() + " 00:00:00"); - var nyDay = ny.getDay()!=0?ny.getDay()-1:6; - if ( - (afterNY <= 2) && - (nyDay >=4) && - (afterNY >= (6-nyDay)) - ) { - // Since I'm not sure we can just always return 53, - // i call the function here again, using the last day - // of the previous year, as the date, and then just - // return that week. - var prevNY = new Date("December 31 " + (Y()-1) + " 00:00:00"); - return prevNY.formatDate("W"); - } - - // week 1, is the week that has the first thursday in it. - // note that this value is not zero index. - if (nyDay <= 3) { - // first day of the year fell on a thursday, or earlier. - return 1 + Math.floor( ( z() + nyDay ) / 7 ); - } else { - // first day of the year fell on a friday, or later. - return 1 + Math.floor( ( z() - ( 7 - nyDay ) ) / 7 ); - } - } - function w() { - // Numeric representation of the day of the week - return self.getDay(); - } - - function Y() { - // A full numeric representation of a year, 4 digits - - // we first check, if getFullYear is supported. if it - // is, we just use that. ppks code is nice, but wont - // work with dates outside 1900-2038, or something like that - if (self.getFullYear) { - var newDate = new Date("January 1 2001 00:00:00 +0000"); - var x = newDate .getFullYear(); - if (x == 2001) { - // i trust the method now - return self.getFullYear(); - } - } - // else, do this: - // codes thanks to ppk: - // http://www.xs4all.nl/~ppk/js/introdate.html - var x = self.getYear(); - var y = x % 100; - y += (y < 38) ? 2000 : 1900; - return y; - } - function y() { - // A two-digit representation of a year - var y = Y()+""; - return y.substring(y.length-2,y.length); - } - function z() { - // The day of the year, zero indexed! 0 through 366 - var t = new Date("January 1 " + Y() + " 00:00:00"); - var diff = self.getTime() - t.getTime(); - return Math.floor(diff/1000/60/60/24); - } - - var self = this; - if (time) { - // save time - var prevTime = self.getTime(); - self.setTime(time); - } - - var ia = input.split(""); - var ij = 0; - while (ia[ij]) { - if (ia[ij] == "\\") { - // this is our way of allowing users to escape stuff - ia.splice(ij,1); - } else { - if (switches.exists(ia[ij])) { - ia[ij] = eval(ia[ij] + "()"); - } - } - ij++; - } - // reset time, back to what it was - if (prevTime) { - self.setTime(prevTime); - } - return ia.join(""); -} diff --git a/js/gui.js b/js/gui.js deleted file mode 100644 index c048c99..0000000 --- a/js/gui.js +++ /dev/null @@ -1,148 +0,0 @@ - -function tedit_showEditor(dn){ - // if the editor already exists cancel it - if($('tedit_editor') !== null){ - tedit_cleanUp(); - return; - } - - var tags = $('tedit_out').innerHTML; - tags = tags.replace(/>[ \n\r]+, '; - editor += '

    '; - editor += 'save
    '; - editor += 'cancel'; - editor += ''; - - Element.hide('tedit_out'); - new Insertion.Top($('tedit_insert'), editor); - - new Ajax.Autocompleter('tedit_edit','tedit_completion', 'ajax.php', {paramName: 'taglookup', tokens: ','}); - - Event.observe('tedit_save', 'click', function(){ tedit_saveChanges(dn) }, false); - Event.observe('tedit_cancel', 'click', tedit_cleanUp, false); - $('tedit_edit').focus(); -} - -function tedit_cleanUp(){ - Element.remove('tedit_editor'); - Element.show('tedit_out'); -} - -function tedit_saveChanges(dn){ - var content = encodeURI($F('tedit_edit')); - dn = encodeURI(dn); - - $('tedit_editor').innerHTML = "Saving..."; - - var success = function(resp){tedit_complete(resp)}; - var failure = function(resp){tedit_failed(resp)}; - var pars = 'settags='+dn+'&tags='+content; - - var ajax = new Ajax.Request('ajax.php', {method:'post',postBody:pars,onSuccess:success,onFailure:failure}); -} - -function tedit_complete(resp){ - $('tedit_out').innerHTML = resp.responseText; - tedit_cleanUp(); -} - -function tedit_failed(resp){ - tedit_cleanUp(); - alert("Saving failed."); -} - - - -// -------------------------------------------------------------------- - -/** - * Create the editor component - */ -function nedit_showEditor(type,dn,name){ - // if the editor already exists cancel it - if($('nedit_editor') !== null){ - nedit_cleanUp(); - return; - } - - var editor = '
    '; - editor += ''; - - editor += 'save
    '; - editor += 'cancel'; - editor += '
    '; - - new Insertion.Top($('nedit_insert'), editor); - - Event.observe('nedit_save', 'click', function(){ nedit_saveChanges(dn) }, false); - Event.observe('nedit_cancel', 'click', nedit_cleanUp, false); - $('nedit_edit').focus(); -}; - -function nedit_cleanUp(){ - Element.remove('nedit_editor'); -} - -function nedit_saveChanges(dn){ - var content = encodeURI($F('nedit_edit')); - dn = encodeURI(dn); - - $('nedit_editor').innerHTML = "Saving..."; - - var success = function(resp){nedit_complete(resp)}; - var failure = function(resp){nedit_failed(resp)}; - var pars = 'addnote='+dn+'¬e='+content; - - var ajax = new Ajax.Request('ajax.php', {method:'post',postBody:pars,onSuccess:success,onFailure:failure}); -} - -function nedit_complete(resp){ - nedit_cleanUp(); - $('nedit_insert').innerHTML = resp.responseText; -} - -function nedit_failed(resp){ - nedit_cleanUp(); - alert("Saving failed."); -} - - - -/** - * initializes all the JS GUI-Stuff - */ -function init(){ - if($('taglookup') !== null) - new Ajax.Autocompleter('taglookup','tagresult', 'ajax.php', {paramName: 'taglookup', tokens: ','}); - if($('tageditlookup') !== null) - new Ajax.Autocompleter('tageditlookup','tageditresult', 'ajax.php', {paramName: 'taglookup', tokens: ','}); - - if($('searchfield') !== null) - $('searchfield').focus(); - - if($('firstfield') !== null) - $('firstfield').focus(); -} - -Event.observe(window, 'load', init, false); - diff --git a/js/prototype.js b/js/prototype.js deleted file mode 100644 index e9ccd3c..0000000 --- a/js/prototype.js +++ /dev/null @@ -1,1785 +0,0 @@ -/* Prototype JavaScript framework, version 1.4.0 - * (c) 2005 Sam Stephenson - * - * THIS FILE IS AUTOMATICALLY GENERATED. When sending patches, please diff - * against the source tree, available from the Prototype darcs repository. - * - * Prototype is freely distributable under the terms of an MIT-style license. - * - * For details, see the Prototype web site: http://prototype.conio.net/ - * -/*--------------------------------------------------------------------------*/ - -var Prototype = { - Version: '1.4.0', - ScriptFragment: '(?:)((\n|\r|.)*?)(?:<\/script>)', - - emptyFunction: function() {}, - K: function(x) {return x} -} - -var Class = { - create: function() { - return function() { - this.initialize.apply(this, arguments); - } - } -} - -var Abstract = new Object(); - -Object.extend = function(destination, source) { - for (property in source) { - destination[property] = source[property]; - } - return destination; -} - -Object.inspect = function(object) { - try { - if (object == undefined) return 'undefined'; - if (object == null) return 'null'; - return object.inspect ? object.inspect() : object.toString(); - } catch (e) { - if (e instanceof RangeError) return '...'; - throw e; - } -} - -Function.prototype.bind = function() { - var __method = this, args = $A(arguments), object = args.shift(); - return function() { - return __method.apply(object, args.concat($A(arguments))); - } -} - -Function.prototype.bindAsEventListener = function(object) { - var __method = this; - return function(event) { - return __method.call(object, event || window.event); - } -} - -Object.extend(Number.prototype, { - toColorPart: function() { - var digits = this.toString(16); - if (this < 16) return '0' + digits; - return digits; - }, - - succ: function() { - return this + 1; - }, - - times: function(iterator) { - $R(0, this, true).each(iterator); - return this; - } -}); - -var Try = { - these: function() { - var returnValue; - - for (var i = 0; i < arguments.length; i++) { - var lambda = arguments[i]; - try { - returnValue = lambda(); - break; - } catch (e) {} - } - - return returnValue; - } -} - -/*--------------------------------------------------------------------------*/ - -var PeriodicalExecuter = Class.create(); -PeriodicalExecuter.prototype = { - initialize: function(callback, frequency) { - this.callback = callback; - this.frequency = frequency; - this.currentlyExecuting = false; - - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - if (!this.currentlyExecuting) { - try { - this.currentlyExecuting = true; - this.callback(); - } finally { - this.currentlyExecuting = false; - } - } - } -} - -/*--------------------------------------------------------------------------*/ - -function $() { - var elements = new Array(); - - for (var i = 0; i < arguments.length; i++) { - var element = arguments[i]; - if (typeof element == 'string') - element = document.getElementById(element); - - if (arguments.length == 1) - return element; - - elements.push(element); - } - - return elements; -} -Object.extend(String.prototype, { - stripTags: function() { - return this.replace(/<\/?[^>]+>/gi, ''); - }, - - stripScripts: function() { - return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), ''); - }, - - extractScripts: function() { - var matchAll = new RegExp(Prototype.ScriptFragment, 'img'); - var matchOne = new RegExp(Prototype.ScriptFragment, 'im'); - return (this.match(matchAll) || []).map(function(scriptTag) { - return (scriptTag.match(matchOne) || ['', ''])[1]; - }); - }, - - evalScripts: function() { - return this.extractScripts().map(eval); - }, - - escapeHTML: function() { - var div = document.createElement('div'); - var text = document.createTextNode(this); - div.appendChild(text); - return div.innerHTML; - }, - - unescapeHTML: function() { - var div = document.createElement('div'); - div.innerHTML = this.stripTags(); - return div.childNodes[0] ? div.childNodes[0].nodeValue : ''; - }, - - toQueryParams: function() { - var pairs = this.match(/^\??(.*)$/)[1].split('&'); - return pairs.inject({}, function(params, pairString) { - var pair = pairString.split('='); - params[pair[0]] = pair[1]; - return params; - }); - }, - - toArray: function() { - return this.split(''); - }, - - camelize: function() { - var oStringList = this.split('-'); - if (oStringList.length == 1) return oStringList[0]; - - var camelizedString = this.indexOf('-') == 0 - ? oStringList[0].charAt(0).toUpperCase() + oStringList[0].substring(1) - : oStringList[0]; - - for (var i = 1, len = oStringList.length; i < len; i++) { - var s = oStringList[i]; - camelizedString += s.charAt(0).toUpperCase() + s.substring(1); - } - - return camelizedString; - }, - - inspect: function() { - return "'" + this.replace('\\', '\\\\').replace("'", '\\\'') + "'"; - } -}); - -String.prototype.parseQuery = String.prototype.toQueryParams; - -var $break = new Object(); -var $continue = new Object(); - -var Enumerable = { - each: function(iterator) { - var index = 0; - try { - this._each(function(value) { - try { - iterator(value, index++); - } catch (e) { - if (e != $continue) throw e; - } - }); - } catch (e) { - if (e != $break) throw e; - } - }, - - all: function(iterator) { - var result = true; - this.each(function(value, index) { - result = result && !!(iterator || Prototype.K)(value, index); - if (!result) throw $break; - }); - return result; - }, - - any: function(iterator) { - var result = true; - this.each(function(value, index) { - if (result = !!(iterator || Prototype.K)(value, index)) - throw $break; - }); - return result; - }, - - collect: function(iterator) { - var results = []; - this.each(function(value, index) { - results.push(iterator(value, index)); - }); - return results; - }, - - detect: function (iterator) { - var result; - this.each(function(value, index) { - if (iterator(value, index)) { - result = value; - throw $break; - } - }); - return result; - }, - - findAll: function(iterator) { - var results = []; - this.each(function(value, index) { - if (iterator(value, index)) - results.push(value); - }); - return results; - }, - - grep: function(pattern, iterator) { - var results = []; - this.each(function(value, index) { - var stringValue = value.toString(); - if (stringValue.match(pattern)) - results.push((iterator || Prototype.K)(value, index)); - }) - return results; - }, - - include: function(object) { - var found = false; - this.each(function(value) { - if (value == object) { - found = true; - throw $break; - } - }); - return found; - }, - - inject: function(memo, iterator) { - this.each(function(value, index) { - memo = iterator(memo, value, index); - }); - return memo; - }, - - invoke: function(method) { - var args = $A(arguments).slice(1); - return this.collect(function(value) { - return value[method].apply(value, args); - }); - }, - - max: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value >= (result || value)) - result = value; - }); - return result; - }, - - min: function(iterator) { - var result; - this.each(function(value, index) { - value = (iterator || Prototype.K)(value, index); - if (value <= (result || value)) - result = value; - }); - return result; - }, - - partition: function(iterator) { - var trues = [], falses = []; - this.each(function(value, index) { - ((iterator || Prototype.K)(value, index) ? - trues : falses).push(value); - }); - return [trues, falses]; - }, - - pluck: function(property) { - var results = []; - this.each(function(value, index) { - results.push(value[property]); - }); - return results; - }, - - reject: function(iterator) { - var results = []; - this.each(function(value, index) { - if (!iterator(value, index)) - results.push(value); - }); - return results; - }, - - sortBy: function(iterator) { - return this.collect(function(value, index) { - return {value: value, criteria: iterator(value, index)}; - }).sort(function(left, right) { - var a = left.criteria, b = right.criteria; - return a < b ? -1 : a > b ? 1 : 0; - }).pluck('value'); - }, - - toArray: function() { - return this.collect(Prototype.K); - }, - - zip: function() { - var iterator = Prototype.K, args = $A(arguments); - if (typeof args.last() == 'function') - iterator = args.pop(); - - var collections = [this].concat(args).map($A); - return this.map(function(value, index) { - iterator(value = collections.pluck(index)); - return value; - }); - }, - - inspect: function() { - return '#'; - } -} - -Object.extend(Enumerable, { - map: Enumerable.collect, - find: Enumerable.detect, - select: Enumerable.findAll, - member: Enumerable.include, - entries: Enumerable.toArray -}); -var $A = Array.from = function(iterable) { - if (!iterable) return []; - if (iterable.toArray) { - return iterable.toArray(); - } else { - var results = []; - for (var i = 0; i < iterable.length; i++) - results.push(iterable[i]); - return results; - } -} - -Object.extend(Array.prototype, Enumerable); - -Array.prototype._reverse = Array.prototype.reverse; - -Object.extend(Array.prototype, { - _each: function(iterator) { - for (var i = 0; i < this.length; i++) - iterator(this[i]); - }, - - clear: function() { - this.length = 0; - return this; - }, - - first: function() { - return this[0]; - }, - - last: function() { - return this[this.length - 1]; - }, - - compact: function() { - return this.select(function(value) { - return value != undefined || value != null; - }); - }, - - flatten: function() { - return this.inject([], function(array, value) { - return array.concat(value.constructor == Array ? - value.flatten() : [value]); - }); - }, - - without: function() { - var values = $A(arguments); - return this.select(function(value) { - return !values.include(value); - }); - }, - - indexOf: function(object) { - for (var i = 0; i < this.length; i++) - if (this[i] == object) return i; - return -1; - }, - - reverse: function(inline) { - return (inline !== false ? this : this.toArray())._reverse(); - }, - - shift: function() { - var result = this[0]; - for (var i = 0; i < this.length - 1; i++) - this[i] = this[i + 1]; - this.length--; - return result; - }, - - inspect: function() { - return '[' + this.map(Object.inspect).join(', ') + ']'; - } -}); -var Hash = { - _each: function(iterator) { - for (key in this) { - var value = this[key]; - if (typeof value == 'function') continue; - - var pair = [key, value]; - pair.key = key; - pair.value = value; - iterator(pair); - } - }, - - keys: function() { - return this.pluck('key'); - }, - - values: function() { - return this.pluck('value'); - }, - - merge: function(hash) { - return $H(hash).inject($H(this), function(mergedHash, pair) { - mergedHash[pair.key] = pair.value; - return mergedHash; - }); - }, - - toQueryString: function() { - return this.map(function(pair) { - return pair.map(encodeURIComponent).join('='); - }).join('&'); - }, - - inspect: function() { - return '#'; - } -} - -function $H(object) { - var hash = Object.extend({}, object || {}); - Object.extend(hash, Enumerable); - Object.extend(hash, Hash); - return hash; -} -ObjectRange = Class.create(); -Object.extend(ObjectRange.prototype, Enumerable); -Object.extend(ObjectRange.prototype, { - initialize: function(start, end, exclusive) { - this.start = start; - this.end = end; - this.exclusive = exclusive; - }, - - _each: function(iterator) { - var value = this.start; - do { - iterator(value); - value = value.succ(); - } while (this.include(value)); - }, - - include: function(value) { - if (value < this.start) - return false; - if (this.exclusive) - return value < this.end; - return value <= this.end; - } -}); - -var $R = function(start, end, exclusive) { - return new ObjectRange(start, end, exclusive); -} - -var Ajax = { - getTransport: function() { - return Try.these( - function() {return new ActiveXObject('Msxml2.XMLHTTP')}, - function() {return new ActiveXObject('Microsoft.XMLHTTP')}, - function() {return new XMLHttpRequest()} - ) || false; - }, - - activeRequestCount: 0 -} - -Ajax.Responders = { - responders: [], - - _each: function(iterator) { - this.responders._each(iterator); - }, - - register: function(responderToAdd) { - if (!this.include(responderToAdd)) - this.responders.push(responderToAdd); - }, - - unregister: function(responderToRemove) { - this.responders = this.responders.without(responderToRemove); - }, - - dispatch: function(callback, request, transport, json) { - this.each(function(responder) { - if (responder[callback] && typeof responder[callback] == 'function') { - try { - responder[callback].apply(responder, [request, transport, json]); - } catch (e) {} - } - }); - } -}; - -Object.extend(Ajax.Responders, Enumerable); - -Ajax.Responders.register({ - onCreate: function() { - Ajax.activeRequestCount++; - }, - - onComplete: function() { - Ajax.activeRequestCount--; - } -}); - -Ajax.Base = function() {}; -Ajax.Base.prototype = { - setOptions: function(options) { - this.options = { - method: 'post', - asynchronous: true, - parameters: '' - } - Object.extend(this.options, options || {}); - }, - - responseIsSuccess: function() { - return this.transport.status == undefined - || this.transport.status == 0 - || (this.transport.status >= 200 && this.transport.status < 300); - }, - - responseIsFailure: function() { - return !this.responseIsSuccess(); - } -} - -Ajax.Request = Class.create(); -Ajax.Request.Events = - ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete']; - -Ajax.Request.prototype = Object.extend(new Ajax.Base(), { - initialize: function(url, options) { - this.transport = Ajax.getTransport(); - this.setOptions(options); - this.request(url); - }, - - request: function(url) { - var parameters = this.options.parameters || ''; - if (parameters.length > 0) parameters += '&_='; - - try { - this.url = url; - if (this.options.method == 'get' && parameters.length > 0) - this.url += (this.url.match(/\?/) ? '&' : '?') + parameters; - - Ajax.Responders.dispatch('onCreate', this, this.transport); - - this.transport.open(this.options.method, this.url, - this.options.asynchronous); - - if (this.options.asynchronous) { - this.transport.onreadystatechange = this.onStateChange.bind(this); - setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10); - } - - this.setRequestHeaders(); - - var body = this.options.postBody ? this.options.postBody : parameters; - this.transport.send(this.options.method == 'post' ? body : null); - - } catch (e) { - this.dispatchException(e); - } - }, - - setRequestHeaders: function() { - var requestHeaders = - ['X-Requested-With', 'XMLHttpRequest', - 'X-Prototype-Version', Prototype.Version]; - - if (this.options.method == 'post') { - requestHeaders.push('Content-type', - 'application/x-www-form-urlencoded'); - - /* Force "Connection: close" for Mozilla browsers to work around - * a bug where XMLHttpReqeuest sends an incorrect Content-length - * header. See Mozilla Bugzilla #246651. - */ - if (this.transport.overrideMimeType) - requestHeaders.push('Connection', 'close'); - } - - if (this.options.requestHeaders) - requestHeaders.push.apply(requestHeaders, this.options.requestHeaders); - - for (var i = 0; i < requestHeaders.length; i += 2) - this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]); - }, - - onStateChange: function() { - var readyState = this.transport.readyState; - if (readyState != 1) - this.respondToReadyState(this.transport.readyState); - }, - - header: function(name) { - try { - return this.transport.getResponseHeader(name); - } catch (e) {} - }, - - evalJSON: function() { - try { - return eval(this.header('X-JSON')); - } catch (e) {} - }, - - evalResponse: function() { - try { - return eval(this.transport.responseText); - } catch (e) { - this.dispatchException(e); - } - }, - - respondToReadyState: function(readyState) { - var event = Ajax.Request.Events[readyState]; - var transport = this.transport, json = this.evalJSON(); - - if (event == 'Complete') { - try { - (this.options['on' + this.transport.status] - || this.options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')] - || Prototype.emptyFunction)(transport, json); - } catch (e) { - this.dispatchException(e); - } - - if ((this.header('Content-type') || '').match(/^text\/javascript/i)) - this.evalResponse(); - } - - try { - (this.options['on' + event] || Prototype.emptyFunction)(transport, json); - Ajax.Responders.dispatch('on' + event, this, transport, json); - } catch (e) { - this.dispatchException(e); - } - - /* Avoid memory leak in MSIE: clean up the oncomplete event handler */ - if (event == 'Complete') - this.transport.onreadystatechange = Prototype.emptyFunction; - }, - - dispatchException: function(exception) { - (this.options.onException || Prototype.emptyFunction)(this, exception); - Ajax.Responders.dispatch('onException', this, exception); - } -}); - -Ajax.Updater = Class.create(); - -Object.extend(Object.extend(Ajax.Updater.prototype, Ajax.Request.prototype), { - initialize: function(container, url, options) { - this.containers = { - success: container.success ? $(container.success) : $(container), - failure: container.failure ? $(container.failure) : - (container.success ? null : $(container)) - } - - this.transport = Ajax.getTransport(); - this.setOptions(options); - - var onComplete = this.options.onComplete || Prototype.emptyFunction; - this.options.onComplete = (function(transport, object) { - this.updateContent(); - onComplete(transport, object); - }).bind(this); - - this.request(url); - }, - - updateContent: function() { - var receiver = this.responseIsSuccess() ? - this.containers.success : this.containers.failure; - var response = this.transport.responseText; - - if (!this.options.evalScripts) - response = response.stripScripts(); - - if (receiver) { - if (this.options.insertion) { - new this.options.insertion(receiver, response); - } else { - Element.update(receiver, response); - } - } - - if (this.responseIsSuccess()) { - if (this.onComplete) - setTimeout(this.onComplete.bind(this), 10); - } - } -}); - -Ajax.PeriodicalUpdater = Class.create(); -Ajax.PeriodicalUpdater.prototype = Object.extend(new Ajax.Base(), { - initialize: function(container, url, options) { - this.setOptions(options); - this.onComplete = this.options.onComplete; - - this.frequency = (this.options.frequency || 2); - this.decay = (this.options.decay || 1); - - this.updater = {}; - this.container = container; - this.url = url; - - this.start(); - }, - - start: function() { - this.options.onComplete = this.updateComplete.bind(this); - this.onTimerEvent(); - }, - - stop: function() { - this.updater.onComplete = undefined; - clearTimeout(this.timer); - (this.onComplete || Prototype.emptyFunction).apply(this, arguments); - }, - - updateComplete: function(request) { - if (this.options.decay) { - this.decay = (request.responseText == this.lastText ? - this.decay * this.options.decay : 1); - - this.lastText = request.responseText; - } - this.timer = setTimeout(this.onTimerEvent.bind(this), - this.decay * this.frequency * 1000); - }, - - onTimerEvent: function() { - this.updater = new Ajax.Updater(this.container, this.url, this.options); - } -}); -document.getElementsByClassName = function(className, parentElement) { - var children = ($(parentElement) || document.body).getElementsByTagName('*'); - return $A(children).inject([], function(elements, child) { - if (child.className.match(new RegExp("(^|\\s)" + className + "(\\s|$)"))) - elements.push(child); - return elements; - }); -} - -/*--------------------------------------------------------------------------*/ - -if (!window.Element) { - var Element = new Object(); -} - -Object.extend(Element, { - visible: function(element) { - return $(element).style.display != 'none'; - }, - - toggle: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - Element[Element.visible(element) ? 'hide' : 'show'](element); - } - }, - - hide: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = 'none'; - } - }, - - show: function() { - for (var i = 0; i < arguments.length; i++) { - var element = $(arguments[i]); - element.style.display = ''; - } - }, - - remove: function(element) { - element = $(element); - element.parentNode.removeChild(element); - }, - - update: function(element, html) { - $(element).innerHTML = html.stripScripts(); - setTimeout(function() {html.evalScripts()}, 10); - }, - - getHeight: function(element) { - element = $(element); - return element.offsetHeight; - }, - - classNames: function(element) { - return new Element.ClassNames(element); - }, - - hasClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).include(className); - }, - - addClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).add(className); - }, - - removeClassName: function(element, className) { - if (!(element = $(element))) return; - return Element.classNames(element).remove(className); - }, - - // removes whitespace-only text node children - cleanWhitespace: function(element) { - element = $(element); - for (var i = 0; i < element.childNodes.length; i++) { - var node = element.childNodes[i]; - if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) - Element.remove(node); - } - }, - - empty: function(element) { - return $(element).innerHTML.match(/^\s*$/); - }, - - scrollTo: function(element) { - element = $(element); - var x = element.x ? element.x : element.offsetLeft, - y = element.y ? element.y : element.offsetTop; - window.scrollTo(x, y); - }, - - getStyle: function(element, style) { - element = $(element); - var value = element.style[style.camelize()]; - if (!value) { - if (document.defaultView && document.defaultView.getComputedStyle) { - var css = document.defaultView.getComputedStyle(element, null); - value = css ? css.getPropertyValue(style) : null; - } else if (element.currentStyle) { - value = element.currentStyle[style.camelize()]; - } - } - - if (window.opera && ['left', 'top', 'right', 'bottom'].include(style)) - if (Element.getStyle(element, 'position') == 'static') value = 'auto'; - - return value == 'auto' ? null : value; - }, - - setStyle: function(element, style) { - element = $(element); - for (name in style) - element.style[name.camelize()] = style[name]; - }, - - getDimensions: function(element) { - element = $(element); - if (Element.getStyle(element, 'display') != 'none') - return {width: element.offsetWidth, height: element.offsetHeight}; - - // All *Width and *Height properties give 0 on elements with display none, - // so enable the element temporarily - var els = element.style; - var originalVisibility = els.visibility; - var originalPosition = els.position; - els.visibility = 'hidden'; - els.position = 'absolute'; - els.display = ''; - var originalWidth = element.clientWidth; - var originalHeight = element.clientHeight; - els.display = 'none'; - els.position = originalPosition; - els.visibility = originalVisibility; - return {width: originalWidth, height: originalHeight}; - }, - - makePositioned: function(element) { - element = $(element); - var pos = Element.getStyle(element, 'position'); - if (pos == 'static' || !pos) { - element._madePositioned = true; - element.style.position = 'relative'; - // Opera returns the offset relative to the positioning context, when an - // element is position relative but top and left have not been defined - if (window.opera) { - element.style.top = 0; - element.style.left = 0; - } - } - }, - - undoPositioned: function(element) { - element = $(element); - if (element._madePositioned) { - element._madePositioned = undefined; - element.style.position = - element.style.top = - element.style.left = - element.style.bottom = - element.style.right = ''; - } - }, - - makeClipping: function(element) { - element = $(element); - if (element._overflow) return; - element._overflow = element.style.overflow; - if ((Element.getStyle(element, 'overflow') || 'visible') != 'hidden') - element.style.overflow = 'hidden'; - }, - - undoClipping: function(element) { - element = $(element); - if (element._overflow) return; - element.style.overflow = element._overflow; - element._overflow = undefined; - } -}); - -var Toggle = new Object(); -Toggle.display = Element.toggle; - -/*--------------------------------------------------------------------------*/ - -Abstract.Insertion = function(adjacency) { - this.adjacency = adjacency; -} - -Abstract.Insertion.prototype = { - initialize: function(element, content) { - this.element = $(element); - this.content = content.stripScripts(); - - if (this.adjacency && this.element.insertAdjacentHTML) { - try { - this.element.insertAdjacentHTML(this.adjacency, this.content); - } catch (e) { - if (this.element.tagName.toLowerCase() == 'tbody') { - this.insertContent(this.contentFromAnonymousTable()); - } else { - throw e; - } - } - } else { - this.range = this.element.ownerDocument.createRange(); - if (this.initializeRange) this.initializeRange(); - this.insertContent([this.range.createContextualFragment(this.content)]); - } - - setTimeout(function() {content.evalScripts()}, 10); - }, - - contentFromAnonymousTable: function() { - var div = document.createElement('div'); - div.innerHTML = '' + this.content + '
    '; - return $A(div.childNodes[0].childNodes[0].childNodes); - } -} - -var Insertion = new Object(); - -Insertion.Before = Class.create(); -Insertion.Before.prototype = Object.extend(new Abstract.Insertion('beforeBegin'), { - initializeRange: function() { - this.range.setStartBefore(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, this.element); - }).bind(this)); - } -}); - -Insertion.Top = Class.create(); -Insertion.Top.prototype = Object.extend(new Abstract.Insertion('afterBegin'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(true); - }, - - insertContent: function(fragments) { - fragments.reverse(false).each((function(fragment) { - this.element.insertBefore(fragment, this.element.firstChild); - }).bind(this)); - } -}); - -Insertion.Bottom = Class.create(); -Insertion.Bottom.prototype = Object.extend(new Abstract.Insertion('beforeEnd'), { - initializeRange: function() { - this.range.selectNodeContents(this.element); - this.range.collapse(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.appendChild(fragment); - }).bind(this)); - } -}); - -Insertion.After = Class.create(); -Insertion.After.prototype = Object.extend(new Abstract.Insertion('afterEnd'), { - initializeRange: function() { - this.range.setStartAfter(this.element); - }, - - insertContent: function(fragments) { - fragments.each((function(fragment) { - this.element.parentNode.insertBefore(fragment, - this.element.nextSibling); - }).bind(this)); - } -}); - -/*--------------------------------------------------------------------------*/ - -Element.ClassNames = Class.create(); -Element.ClassNames.prototype = { - initialize: function(element) { - this.element = $(element); - }, - - _each: function(iterator) { - this.element.className.split(/\s+/).select(function(name) { - return name.length > 0; - })._each(iterator); - }, - - set: function(className) { - this.element.className = className; - }, - - add: function(classNameToAdd) { - if (this.include(classNameToAdd)) return; - this.set(this.toArray().concat(classNameToAdd).join(' ')); - }, - - remove: function(classNameToRemove) { - if (!this.include(classNameToRemove)) return; - this.set(this.select(function(className) { - return className != classNameToRemove; - }).join(' ')); - }, - - toString: function() { - return this.toArray().join(' '); - } -} - -Object.extend(Element.ClassNames.prototype, Enumerable); -var Field = { - clear: function() { - for (var i = 0; i < arguments.length; i++) - $(arguments[i]).value = ''; - }, - - focus: function(element) { - $(element).focus(); - }, - - present: function() { - for (var i = 0; i < arguments.length; i++) - if ($(arguments[i]).value == '') return false; - return true; - }, - - select: function(element) { - $(element).select(); - }, - - activate: function(element) { - element = $(element); - element.focus(); - if (element.select) - element.select(); - } -} - -/*--------------------------------------------------------------------------*/ - -var Form = { - serialize: function(form) { - var elements = Form.getElements($(form)); - var queryComponents = new Array(); - - for (var i = 0; i < elements.length; i++) { - var queryComponent = Form.Element.serialize(elements[i]); - if (queryComponent) - queryComponents.push(queryComponent); - } - - return queryComponents.join('&'); - }, - - getElements: function(form) { - form = $(form); - var elements = new Array(); - - for (tagName in Form.Element.Serializers) { - var tagElements = form.getElementsByTagName(tagName); - for (var j = 0; j < tagElements.length; j++) - elements.push(tagElements[j]); - } - return elements; - }, - - getInputs: function(form, typeName, name) { - form = $(form); - var inputs = form.getElementsByTagName('input'); - - if (!typeName && !name) - return inputs; - - var matchingInputs = new Array(); - for (var i = 0; i < inputs.length; i++) { - var input = inputs[i]; - if ((typeName && input.type != typeName) || - (name && input.name != name)) - continue; - matchingInputs.push(input); - } - - return matchingInputs; - }, - - disable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.blur(); - element.disabled = 'true'; - } - }, - - enable: function(form) { - var elements = Form.getElements(form); - for (var i = 0; i < elements.length; i++) { - var element = elements[i]; - element.disabled = ''; - } - }, - - findFirstElement: function(form) { - return Form.getElements(form).find(function(element) { - return element.type != 'hidden' && !element.disabled && - ['input', 'select', 'textarea'].include(element.tagName.toLowerCase()); - }); - }, - - focusFirstElement: function(form) { - Field.activate(Form.findFirstElement(form)); - }, - - reset: function(form) { - $(form).reset(); - } -} - -Form.Element = { - serialize: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) { - var key = encodeURIComponent(parameter[0]); - if (key.length == 0) return; - - if (parameter[1].constructor != Array) - parameter[1] = [parameter[1]]; - - return parameter[1].map(function(value) { - return key + '=' + encodeURIComponent(value); - }).join('&'); - } - }, - - getValue: function(element) { - element = $(element); - var method = element.tagName.toLowerCase(); - var parameter = Form.Element.Serializers[method](element); - - if (parameter) - return parameter[1]; - } -} - -Form.Element.Serializers = { - input: function(element) { - switch (element.type.toLowerCase()) { - case 'submit': - case 'hidden': - case 'password': - case 'text': - return Form.Element.Serializers.textarea(element); - case 'checkbox': - case 'radio': - return Form.Element.Serializers.inputSelector(element); - } - return false; - }, - - inputSelector: function(element) { - if (element.checked) - return [element.name, element.value]; - }, - - textarea: function(element) { - return [element.name, element.value]; - }, - - select: function(element) { - return Form.Element.Serializers[element.type == 'select-one' ? - 'selectOne' : 'selectMany'](element); - }, - - selectOne: function(element) { - var value = '', opt, index = element.selectedIndex; - if (index >= 0) { - opt = element.options[index]; - value = opt.value; - if (!value && !('value' in opt)) - value = opt.text; - } - return [element.name, value]; - }, - - selectMany: function(element) { - var value = new Array(); - for (var i = 0; i < element.length; i++) { - var opt = element.options[i]; - if (opt.selected) { - var optValue = opt.value; - if (!optValue && !('value' in opt)) - optValue = opt.text; - value.push(optValue); - } - } - return [element.name, value]; - } -} - -/*--------------------------------------------------------------------------*/ - -var $F = Form.Element.getValue; - -/*--------------------------------------------------------------------------*/ - -Abstract.TimedObserver = function() {} -Abstract.TimedObserver.prototype = { - initialize: function(element, frequency, callback) { - this.frequency = frequency; - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - this.registerCallback(); - }, - - registerCallback: function() { - setInterval(this.onTimerEvent.bind(this), this.frequency * 1000); - }, - - onTimerEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - } -} - -Form.Element.Observer = Class.create(); -Form.Element.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.Observer = Class.create(); -Form.Observer.prototype = Object.extend(new Abstract.TimedObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); - -/*--------------------------------------------------------------------------*/ - -Abstract.EventObserver = function() {} -Abstract.EventObserver.prototype = { - initialize: function(element, callback) { - this.element = $(element); - this.callback = callback; - - this.lastValue = this.getValue(); - if (this.element.tagName.toLowerCase() == 'form') - this.registerFormCallbacks(); - else - this.registerCallback(this.element); - }, - - onElementEvent: function() { - var value = this.getValue(); - if (this.lastValue != value) { - this.callback(this.element, value); - this.lastValue = value; - } - }, - - registerFormCallbacks: function() { - var elements = Form.getElements(this.element); - for (var i = 0; i < elements.length; i++) - this.registerCallback(elements[i]); - }, - - registerCallback: function(element) { - if (element.type) { - switch (element.type.toLowerCase()) { - case 'checkbox': - case 'radio': - Event.observe(element, 'click', this.onElementEvent.bind(this)); - break; - case 'password': - case 'text': - case 'textarea': - case 'select-one': - case 'select-multiple': - Event.observe(element, 'change', this.onElementEvent.bind(this)); - break; - } - } - } -} - -Form.Element.EventObserver = Class.create(); -Form.Element.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.Element.getValue(this.element); - } -}); - -Form.EventObserver = Class.create(); -Form.EventObserver.prototype = Object.extend(new Abstract.EventObserver(), { - getValue: function() { - return Form.serialize(this.element); - } -}); -if (!window.Event) { - var Event = new Object(); -} - -Object.extend(Event, { - KEY_BACKSPACE: 8, - KEY_TAB: 9, - KEY_RETURN: 13, - KEY_ESC: 27, - KEY_LEFT: 37, - KEY_UP: 38, - KEY_RIGHT: 39, - KEY_DOWN: 40, - KEY_DELETE: 46, - - element: function(event) { - return event.target || event.srcElement; - }, - - isLeftClick: function(event) { - return (((event.which) && (event.which == 1)) || - ((event.button) && (event.button == 1))); - }, - - pointerX: function(event) { - return event.pageX || (event.clientX + - (document.documentElement.scrollLeft || document.body.scrollLeft)); - }, - - pointerY: function(event) { - return event.pageY || (event.clientY + - (document.documentElement.scrollTop || document.body.scrollTop)); - }, - - stop: function(event) { - if (event.preventDefault) { - event.preventDefault(); - event.stopPropagation(); - } else { - event.returnValue = false; - event.cancelBubble = true; - } - }, - - // find the first node with the given tagName, starting from the - // node the event was triggered on; traverses the DOM upwards - findElement: function(event, tagName) { - var element = Event.element(event); - while (element.parentNode && (!element.tagName || - (element.tagName.toUpperCase() != tagName.toUpperCase()))) - element = element.parentNode; - return element; - }, - - observers: false, - - _observeAndCache: function(element, name, observer, useCapture) { - if (!this.observers) this.observers = []; - if (element.addEventListener) { - this.observers.push([element, name, observer, useCapture]); - element.addEventListener(name, observer, useCapture); - } else if (element.attachEvent) { - this.observers.push([element, name, observer, useCapture]); - element.attachEvent('on' + name, observer); - } - }, - - unloadCache: function() { - if (!Event.observers) return; - for (var i = 0; i < Event.observers.length; i++) { - Event.stopObserving.apply(this, Event.observers[i]); - Event.observers[i][0] = null; - } - Event.observers = false; - }, - - observe: function(element, name, observer, useCapture) { - var element = $(element); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.attachEvent)) - name = 'keydown'; - - this._observeAndCache(element, name, observer, useCapture); - }, - - stopObserving: function(element, name, observer, useCapture) { - var element = $(element); - useCapture = useCapture || false; - - if (name == 'keypress' && - (navigator.appVersion.match(/Konqueror|Safari|KHTML/) - || element.detachEvent)) - name = 'keydown'; - - if (element.removeEventListener) { - element.removeEventListener(name, observer, useCapture); - } else if (element.detachEvent) { - element.detachEvent('on' + name, observer); - } - } -}); - -/* prevent memory leaks in IE */ -Event.observe(window, 'unload', Event.unloadCache, false); -var Position = { - // set to true if needed, warning: firefox performance problems - // NOT neeeded for page scrolling, only if draggable contained in - // scrollable elements - includeScrollOffsets: false, - - // must be called before calling withinIncludingScrolloffset, every time the - // page is scrolled - prepare: function() { - this.deltaX = window.pageXOffset - || document.documentElement.scrollLeft - || document.body.scrollLeft - || 0; - this.deltaY = window.pageYOffset - || document.documentElement.scrollTop - || document.body.scrollTop - || 0; - }, - - realOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.scrollTop || 0; - valueL += element.scrollLeft || 0; - element = element.parentNode; - } while (element); - return [valueL, valueT]; - }, - - cumulativeOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - } while (element); - return [valueL, valueT]; - }, - - positionedOffset: function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - element = element.offsetParent; - if (element) { - p = Element.getStyle(element, 'position'); - if (p == 'relative' || p == 'absolute') break; - } - } while (element); - return [valueL, valueT]; - }, - - offsetParent: function(element) { - if (element.offsetParent) return element.offsetParent; - if (element == document.body) return element; - - while ((element = element.parentNode) && element != document.body) - if (Element.getStyle(element, 'position') != 'static') - return element; - - return document.body; - }, - - // caches x/y coordinate pair to use with overlap - within: function(element, x, y) { - if (this.includeScrollOffsets) - return this.withinIncludingScrolloffsets(element, x, y); - this.xcomp = x; - this.ycomp = y; - this.offset = this.cumulativeOffset(element); - - return (y >= this.offset[1] && - y < this.offset[1] + element.offsetHeight && - x >= this.offset[0] && - x < this.offset[0] + element.offsetWidth); - }, - - withinIncludingScrolloffsets: function(element, x, y) { - var offsetcache = this.realOffset(element); - - this.xcomp = x + offsetcache[0] - this.deltaX; - this.ycomp = y + offsetcache[1] - this.deltaY; - this.offset = this.cumulativeOffset(element); - - return (this.ycomp >= this.offset[1] && - this.ycomp < this.offset[1] + element.offsetHeight && - this.xcomp >= this.offset[0] && - this.xcomp < this.offset[0] + element.offsetWidth); - }, - - // within must be called directly before - overlap: function(mode, element) { - if (!mode) return 0; - if (mode == 'vertical') - return ((this.offset[1] + element.offsetHeight) - this.ycomp) / - element.offsetHeight; - if (mode == 'horizontal') - return ((this.offset[0] + element.offsetWidth) - this.xcomp) / - element.offsetWidth; - }, - - clone: function(source, target) { - source = $(source); - target = $(target); - target.style.position = 'absolute'; - var offsets = this.cumulativeOffset(source); - target.style.top = offsets[1] + 'px'; - target.style.left = offsets[0] + 'px'; - target.style.width = source.offsetWidth + 'px'; - target.style.height = source.offsetHeight + 'px'; - }, - - page: function(forElement) { - var valueT = 0, valueL = 0; - - var element = forElement; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - - // Safari fix - if (element.offsetParent==document.body) - if (Element.getStyle(element,'position')=='absolute') break; - - } while (element = element.offsetParent); - - element = forElement; - do { - valueT -= element.scrollTop || 0; - valueL -= element.scrollLeft || 0; - } while (element = element.parentNode); - - return [valueL, valueT]; - }, - - clone: function(source, target) { - var options = Object.extend({ - setLeft: true, - setTop: true, - setWidth: true, - setHeight: true, - offsetTop: 0, - offsetLeft: 0 - }, arguments[2] || {}) - - // find page position of source - source = $(source); - var p = Position.page(source); - - // find coordinate system to use - target = $(target); - var delta = [0, 0]; - var parent = null; - // delta [0,0] will do fine with position: fixed elements, - // position:absolute needs offsetParent deltas - if (Element.getStyle(target,'position') == 'absolute') { - parent = Position.offsetParent(target); - delta = Position.page(parent); - } - - // correct by body offsets (fixes Safari) - if (parent == document.body) { - delta[0] -= document.body.offsetLeft; - delta[1] -= document.body.offsetTop; - } - - // set position - if(options.setLeft) target.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px'; - if(options.setTop) target.style.top = (p[1] - delta[1] + options.offsetTop) + 'px'; - if(options.setWidth) target.style.width = source.offsetWidth + 'px'; - if(options.setHeight) target.style.height = source.offsetHeight + 'px'; - }, - - absolutize: function(element) { - element = $(element); - if (element.style.position == 'absolute') return; - Position.prepare(); - - var offsets = Position.positionedOffset(element); - var top = offsets[1]; - var left = offsets[0]; - var width = element.clientWidth; - var height = element.clientHeight; - - element._originalLeft = left - parseFloat(element.style.left || 0); - element._originalTop = top - parseFloat(element.style.top || 0); - element._originalWidth = element.style.width; - element._originalHeight = element.style.height; - - element.style.position = 'absolute'; - element.style.top = top + 'px';; - element.style.left = left + 'px';; - element.style.width = width + 'px';; - element.style.height = height + 'px';; - }, - - relativize: function(element) { - element = $(element); - if (element.style.position == 'relative') return; - Position.prepare(); - - element.style.position = 'relative'; - var top = parseFloat(element.style.top || 0) - (element._originalTop || 0); - var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0); - - element.style.top = top + 'px'; - element.style.left = left + 'px'; - element.style.height = element._originalHeight; - element.style.width = element._originalWidth; - } -} - -// Safari returns margins on body which is incorrect if the child is absolutely -// positioned. For performance reasons, redefine Position.cumulativeOffset for -// KHTML/WebKit only. -if (/Konqueror|Safari|KHTML/.test(navigator.userAgent)) { - Position.cumulativeOffset = function(element) { - var valueT = 0, valueL = 0; - do { - valueT += element.offsetTop || 0; - valueL += element.offsetLeft || 0; - if (element.offsetParent == document.body) - if (Element.getStyle(element, 'position') == 'absolute') break; - - element = element.offsetParent; - } while (element); - - return [valueL, valueT]; - } -} \ No newline at end of file diff --git a/js/scriptaculous.js b/js/scriptaculous.js deleted file mode 100644 index dac1228..0000000 --- a/js/scriptaculous.js +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -var Scriptaculous = { - Version: '1.5.1', - require: function(libraryName) { - // inserting via DOM fails in Safari 2.0, so brute force approach - document.write(''); - }, - load: function() { - if((typeof Prototype=='undefined') || - parseFloat(Prototype.Version.split(".")[0] + "." + - Prototype.Version.split(".")[1]) < 1.4) - throw("script.aculo.us requires the Prototype JavaScript framework >= 1.4.0"); - - $A(document.getElementsByTagName("script")).findAll( function(s) { - return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/)) - }).each( function(s) { - var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,''); - var includes = s.src.match(/\?.*load=([a-z,]*)/); - (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider').split(',').each( - function(include) { Scriptaculous.require(path+include+'.js') }); - }); - } -} - -Scriptaculous.load(); \ No newline at end of file diff --git a/js/slider.js b/js/slider.js deleted file mode 100644 index fdd0bcc..0000000 --- a/js/slider.js +++ /dev/null @@ -1,283 +0,0 @@ -// Copyright (c) 2005 Marty Haught, Thomas Fuchs -// -// See http://script.aculo.us for more info -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -if(!Control) var Control = {}; -Control.Slider = Class.create(); - -// options: -// axis: 'vertical', or 'horizontal' (default) -// -// callbacks: -// onChange(value) -// onSlide(value) -Control.Slider.prototype = { - initialize: function(handle, track, options) { - var slider = this; - - if(handle instanceof Array) { - this.handles = handle.collect( function(e) { return $(e) }); - } else { - this.handles = [$(handle)]; - } - - this.track = $(track); - this.options = options || {}; - - this.axis = this.options.axis || 'horizontal'; - this.increment = this.options.increment || 1; - this.step = parseInt(this.options.step || '1'); - this.range = this.options.range || $R(0,1); - - this.value = 0; // assure backwards compat - this.values = this.handles.map( function() { return 0 }); - this.spans = this.options.spans ? this.options.spans.map(function(s){ return $(s) }) : false; - this.options.startSpan = $(this.options.startSpan || null); - this.options.endSpan = $(this.options.endSpan || null); - - this.restricted = this.options.restricted || false; - - this.maximum = this.options.maximum || this.range.end; - this.minimum = this.options.minimum || this.range.start; - - // Will be used to align the handle onto the track, if necessary - this.alignX = parseInt(this.options.alignX || '0'); - this.alignY = parseInt(this.options.alignY || '0'); - - this.trackLength = this.maximumOffset() - this.minimumOffset(); - this.handleLength = this.isVertical() ? this.handles[0].offsetHeight : this.handles[0].offsetWidth; - - this.active = false; - this.dragging = false; - this.disabled = false; - - if(this.options.disabled) this.setDisabled(); - - // Allowed values array - this.allowedValues = this.options.values ? this.options.values.sortBy(Prototype.K) : false; - if(this.allowedValues) { - this.minimum = this.allowedValues.min(); - this.maximum = this.allowedValues.max(); - } - - this.eventMouseDown = this.startDrag.bindAsEventListener(this); - this.eventMouseUp = this.endDrag.bindAsEventListener(this); - this.eventMouseMove = this.update.bindAsEventListener(this); - - // Initialize handles in reverse (make sure first handle is active) - this.handles.each( function(h,i) { - i = slider.handles.length-1-i; - slider.setValue(parseFloat( - (slider.options.sliderValue instanceof Array ? - slider.options.sliderValue[i] : slider.options.sliderValue) || - slider.range.start), i); - Element.makePositioned(h); // fix IE - Event.observe(h, "mousedown", slider.eventMouseDown); - }); - - Event.observe(this.track, "mousedown", this.eventMouseDown); - Event.observe(document, "mouseup", this.eventMouseUp); - Event.observe(document, "mousemove", this.eventMouseMove); - - this.initialized = true; - }, - dispose: function() { - var slider = this; - Event.stopObserving(this.track, "mousedown", this.eventMouseDown); - Event.stopObserving(document, "mouseup", this.eventMouseUp); - Event.stopObserving(document, "mousemove", this.eventMouseMove); - this.handles.each( function(h) { - Event.stopObserving(h, "mousedown", slider.eventMouseDown); - }); - }, - setDisabled: function(){ - this.disabled = true; - }, - setEnabled: function(){ - this.disabled = false; - }, - getNearestValue: function(value){ - if(this.allowedValues){ - if(value >= this.allowedValues.max()) return(this.allowedValues.max()); - if(value <= this.allowedValues.min()) return(this.allowedValues.min()); - - var offset = Math.abs(this.allowedValues[0] - value); - var newValue = this.allowedValues[0]; - this.allowedValues.each( function(v) { - var currentOffset = Math.abs(v - value); - if(currentOffset <= offset){ - newValue = v; - offset = currentOffset; - } - }); - return newValue; - } - if(value > this.range.end) return this.range.end; - if(value < this.range.start) return this.range.start; - return value; - }, - setValue: function(sliderValue, handleIdx){ - if(!this.active) { - this.activeHandle = this.handles[handleIdx]; - this.activeHandleIdx = handleIdx; - this.updateStyles(); - } - handleIdx = handleIdx || this.activeHandleIdx || 0; - if(this.initialized && this.restricted) { - if((handleIdx>0) && (sliderValuethis.values[handleIdx+1])) - sliderValue = this.values[handleIdx+1]; - } - sliderValue = this.getNearestValue(sliderValue); - this.values[handleIdx] = sliderValue; - this.value = this.values[0]; // assure backwards compat - - this.handles[handleIdx].style[this.isVertical() ? 'top' : 'left'] = - this.translateToPx(sliderValue); - - this.drawSpans(); - if(!this.dragging || !this.event) this.updateFinished(); - }, - setValueBy: function(delta, handleIdx) { - this.setValue(this.values[handleIdx || this.activeHandleIdx || 0] + delta, - handleIdx || this.activeHandleIdx || 0); - }, - translateToPx: function(value) { - return Math.round( - ((this.trackLength-this.handleLength)/(this.range.end-this.range.start)) * - (value - this.range.start)) + "px"; - }, - translateToValue: function(offset) { - return ((offset/(this.trackLength-this.handleLength) * - (this.range.end-this.range.start)) + this.range.start); - }, - getRange: function(range) { - var v = this.values.sortBy(Prototype.K); - range = range || 0; - return $R(v[range],v[range+1]); - }, - minimumOffset: function(){ - return(this.isVertical() ? this.alignY : this.alignX); - }, - maximumOffset: function(){ - return(this.isVertical() ? - this.track.offsetHeight - this.alignY : this.track.offsetWidth - this.alignX); - }, - isVertical: function(){ - return (this.axis == 'vertical'); - }, - drawSpans: function() { - var slider = this; - if(this.spans) - $R(0, this.spans.length-1).each(function(r) { slider.setSpan(slider.spans[r], slider.getRange(r)) }); - if(this.options.startSpan) - this.setSpan(this.options.startSpan, - $R(0, this.values.length>1 ? this.getRange(0).min() : this.value )); - if(this.options.endSpan) - this.setSpan(this.options.endSpan, - $R(this.values.length>1 ? this.getRange(this.spans.length-1).max() : this.value, this.maximum)); - }, - setSpan: function(span, range) { - if(this.isVertical()) { - span.style.top = this.translateToPx(range.start); - span.style.height = this.translateToPx(range.end - range.start); - } else { - span.style.left = this.translateToPx(range.start); - span.style.width = this.translateToPx(range.end - range.start); - } - }, - updateStyles: function() { - this.handles.each( function(h){ Element.removeClassName(h, 'selected') }); - Element.addClassName(this.activeHandle, 'selected'); - }, - startDrag: function(event) { - if(Event.isLeftClick(event)) { - if(!this.disabled){ - this.active = true; - - var handle = Event.element(event); - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - if(handle==this.track) { - var offsets = Position.cumulativeOffset(this.track); - this.event = event; - this.setValue(this.translateToValue( - (this.isVertical() ? pointer[1]-offsets[1] : pointer[0]-offsets[0])-(this.handleLength/2) - )); - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } else { - // find the handle (prevents issues with Safari) - while((this.handles.indexOf(handle) == -1) && handle.parentNode) - handle = handle.parentNode; - - this.activeHandle = handle; - this.activeHandleIdx = this.handles.indexOf(this.activeHandle); - this.updateStyles(); - - var offsets = Position.cumulativeOffset(this.activeHandle); - this.offsetX = (pointer[0] - offsets[0]); - this.offsetY = (pointer[1] - offsets[1]); - } - } - Event.stop(event); - } - }, - update: function(event) { - if(this.active) { - if(!this.dragging) this.dragging = true; - this.draw(event); - // fix AppleWebKit rendering - if(navigator.appVersion.indexOf('AppleWebKit')>0) window.scrollBy(0,0); - Event.stop(event); - } - }, - draw: function(event) { - var pointer = [Event.pointerX(event), Event.pointerY(event)]; - var offsets = Position.cumulativeOffset(this.track); - pointer[0] -= this.offsetX + offsets[0]; - pointer[1] -= this.offsetY + offsets[1]; - this.event = event; - this.setValue(this.translateToValue( this.isVertical() ? pointer[1] : pointer[0] )); - if(this.initialized && this.options.onSlide) - this.options.onSlide(this.values.length>1 ? this.values : this.value, this); - }, - endDrag: function(event) { - if(this.active && this.dragging) { - this.finishDrag(event, true); - Event.stop(event); - } - this.active = false; - this.dragging = false; - }, - finishDrag: function(event, success) { - this.active = false; - this.dragging = false; - this.updateFinished(); - }, - updateFinished: function() { - if(this.initialized && this.options.onChange) - this.options.onChange(this.values.length>1 ? this.values : this.value, this); - this.event = null; - } -} \ No newline at end of file diff --git a/js/unittest.js b/js/unittest.js deleted file mode 100644 index 20941ad..0000000 --- a/js/unittest.js +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright (c) 2005 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us) -// (c) 2005 Jon Tirsen (http://www.tirsen.com) -// (c) 2005 Michael Schuerig (http://www.schuerig.de/michael/) -// -// See scriptaculous.js for full license. - -// experimental, Firefox-only -Event.simulateMouse = function(element, eventName) { - var options = Object.extend({ - pointerX: 0, - pointerY: 0, - buttons: 0 - }, arguments[2] || {}); - var oEvent = document.createEvent("MouseEvents"); - oEvent.initMouseEvent(eventName, true, true, document.defaultView, - options.buttons, options.pointerX, options.pointerY, options.pointerX, options.pointerY, - false, false, false, false, 0, $(element)); - - if(this.mark) Element.remove(this.mark); - this.mark = document.createElement('div'); - this.mark.appendChild(document.createTextNode(" ")); - document.body.appendChild(this.mark); - this.mark.style.position = 'absolute'; - this.mark.style.top = options.pointerY + "px"; - this.mark.style.left = options.pointerX + "px"; - this.mark.style.width = "5px"; - this.mark.style.height = "5px;"; - this.mark.style.borderTop = "1px solid red;" - this.mark.style.borderLeft = "1px solid red;" - - if(this.step) - alert('['+new Date().getTime().toString()+'] '+eventName+'/'+Test.Unit.inspect(options)); - - $(element).dispatchEvent(oEvent); -}; - -// Note: Due to a fix in Firefox 1.0.5/6 that probably fixed "too much", this doesn't work in 1.0.6 or DP2. -// You need to downgrade to 1.0.4 for now to get this working -// See https://bugzilla.mozilla.org/show_bug.cgi?id=289940 for the fix that fixed too much -Event.simulateKey = function(element, eventName) { - var options = Object.extend({ - ctrlKey: false, - altKey: false, - shiftKey: false, - metaKey: false, - keyCode: 0, - charCode: 0 - }, arguments[2] || {}); - - var oEvent = document.createEvent("KeyEvents"); - oEvent.initKeyEvent(eventName, true, true, window, - options.ctrlKey, options.altKey, options.shiftKey, options.metaKey, - options.keyCode, options.charCode ); - $(element).dispatchEvent(oEvent); -}; - -Event.simulateKeys = function(element, command) { - for(var i=0; i ' + - (typeof obj[property] == "string" ? - '"' + obj[property] + '"' : - obj[property])); - } - - return ("'" + obj + "' #" + typeof obj + - ": {" + info.join(", ") + "}"); -} - -Test.Unit.Logger = Class.create(); -Test.Unit.Logger.prototype = { - initialize: function(log) { - this.log = $(log); - if (this.log) { - this._createLogTable(); - } - }, - start: function(testName) { - if (!this.log) return; - this.testName = testName; - this.lastLogLine = document.createElement('tr'); - this.statusCell = document.createElement('td'); - this.nameCell = document.createElement('td'); - this.nameCell.appendChild(document.createTextNode(testName)); - this.messageCell = document.createElement('td'); - this.lastLogLine.appendChild(this.statusCell); - this.lastLogLine.appendChild(this.nameCell); - this.lastLogLine.appendChild(this.messageCell); - this.loglines.appendChild(this.lastLogLine); - }, - finish: function(status, summary) { - if (!this.log) return; - this.lastLogLine.className = status; - this.statusCell.innerHTML = status; - this.messageCell.innerHTML = this._toHTML(summary); - }, - message: function(message) { - if (!this.log) return; - this.messageCell.innerHTML = this._toHTML(message); - }, - summary: function(summary) { - if (!this.log) return; - this.logsummary.innerHTML = this._toHTML(summary); - }, - _createLogTable: function() { - this.log.innerHTML = - '
    ' + - '' + - '' + - '' + - '
    StatusTestMessage
    '; - this.logsummary = $('logsummary') - this.loglines = $('loglines'); - }, - _toHTML: function(txt) { - return txt.escapeHTML().replace(/\n/g,"
    "); - } -} - -Test.Unit.Runner = Class.create(); -Test.Unit.Runner.prototype = { - initialize: function(testcases) { - this.options = Object.extend({ - testLog: 'testlog' - }, arguments[1] || {}); - this.options.resultsURL = this.parseResultsURLQueryParameter(); - if (this.options.testLog) { - this.options.testLog = $(this.options.testLog) || null; - } - if(this.options.tests) { - this.tests = []; - for(var i = 0; i < this.options.tests.length; i++) { - if(/^test/.test(this.options.tests[i])) { - this.tests.push(new Test.Unit.Testcase(this.options.tests[i], testcases[this.options.tests[i]], testcases["setup"], testcases["teardown"])); - } - } - } else { - if (this.options.test) { - this.tests = [new Test.Unit.Testcase(this.options.test, testcases[this.options.test], testcases["setup"], testcases["teardown"])]; - } else { - this.tests = []; - for(var testcase in testcases) { - if(/^test/.test(testcase)) { - this.tests.push(new Test.Unit.Testcase(testcase, testcases[testcase], testcases["setup"], testcases["teardown"])); - } - } - } - } - this.currentTest = 0; - this.logger = new Test.Unit.Logger(this.options.testLog); - setTimeout(this.runTests.bind(this), 1000); - }, - parseResultsURLQueryParameter: function() { - return window.location.search.parseQuery()["resultsURL"]; - }, - // Returns: - // "ERROR" if there was an error, - // "FAILURE" if there was a failure, or - // "SUCCESS" if there was neither - getResult: function() { - var hasFailure = false; - for(var i=0;i 0) { - return "ERROR"; - } - if (this.tests[i].failures > 0) { - hasFailure = true; - } - } - if (hasFailure) { - return "FAILURE"; - } else { - return "SUCCESS"; - } - }, - postResults: function() { - if (this.options.resultsURL) { - new Ajax.Request(this.options.resultsURL, - { method: 'get', parameters: 'result=' + this.getResult(), asynchronous: false }); - } - }, - runTests: function() { - var test = this.tests[this.currentTest]; - if (!test) { - // finished! - this.postResults(); - this.logger.summary(this.summary()); - return; - } - if(!test.isWaiting) { - this.logger.start(test.name); - } - test.run(); - if(test.isWaiting) { - this.logger.message("Waiting for " + test.timeToWait + "ms"); - setTimeout(this.runTests.bind(this), test.timeToWait || 1000); - } else { - this.logger.finish(test.status(), test.summary()); - this.currentTest++; - // tail recursive, hopefully the browser will skip the stackframe - this.runTests(); - } - }, - summary: function() { - var assertions = 0; - var failures = 0; - var errors = 0; - var messages = []; - for(var i=0;i 0) return 'failed'; - if (this.errors > 0) return 'error'; - return 'passed'; - }, - assert: function(expression) { - var message = arguments[1] || 'assert: got "' + Test.Unit.inspect(expression) + '"'; - try { expression ? this.pass() : - this.fail(message); } - catch(e) { this.error(e); } - }, - assertEqual: function(expected, actual) { - var message = arguments[2] || "assertEqual"; - try { (expected == actual) ? this.pass() : - this.fail(message + ': expected "' + Test.Unit.inspect(expected) + - '", actual "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNotEqual: function(expected, actual) { - var message = arguments[2] || "assertNotEqual"; - try { (expected != actual) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(actual) + '"'); } - catch(e) { this.error(e); } - }, - assertNull: function(obj) { - var message = arguments[1] || 'assertNull' - try { (obj==null) ? this.pass() : - this.fail(message + ': got "' + Test.Unit.inspect(obj) + '"'); } - catch(e) { this.error(e); } - }, - assertHidden: function(element) { - var message = arguments[1] || 'assertHidden'; - this.assertEqual("none", element.style.display, message); - }, - assertNotNull: function(object) { - var message = arguments[1] || 'assertNotNull'; - this.assert(object != null, message); - }, - assertInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertInstanceOf'; - try { - (actual instanceof expected) ? this.pass() : - this.fail(message + ": object was not an instance of the expected type"); } - catch(e) { this.error(e); } - }, - assertNotInstanceOf: function(expected, actual) { - var message = arguments[2] || 'assertNotInstanceOf'; - try { - !(actual instanceof expected) ? this.pass() : - this.fail(message + ": object was an instance of the not expected type"); } - catch(e) { this.error(e); } - }, - _isVisible: function(element) { - element = $(element); - if(!element.parentNode) return true; - this.assertNotNull(element); - if(element.style && Element.getStyle(element, 'display') == 'none') - return false; - - return this._isVisible(element.parentNode); - }, - assertNotVisible: function(element) { - this.assert(!this._isVisible(element), Test.Unit.inspect(element) + " was not hidden and didn't have a hidden parent either. " + ("" || arguments[1])); - }, - assertVisible: function(element) { - this.assert(this._isVisible(element), Test.Unit.inspect(element) + " was not visible. " + ("" || arguments[1])); - } -} - -Test.Unit.Testcase = Class.create(); -Object.extend(Object.extend(Test.Unit.Testcase.prototype, Test.Unit.Assertions.prototype), { - initialize: function(name, test, setup, teardown) { - Test.Unit.Assertions.prototype.initialize.bind(this)(); - this.name = name; - this.test = test || function() {}; - this.setup = setup || function() {}; - this.teardown = teardown || function() {}; - this.isWaiting = false; - this.timeToWait = 1000; - }, - wait: function(time, nextPart) { - this.isWaiting = true; - this.test = nextPart; - this.timeToWait = time; - }, - run: function() { - try { - try { - if (!this.isWaiting) this.setup.bind(this)(); - this.isWaiting = false; - this.test.bind(this)(); - } finally { - if(!this.isWaiting) { - this.teardown.bind(this)(); - } - } - } - catch(e) { this.error(e); } - } -}); \ No newline at end of file diff --git a/login.php b/login.php index 524d75f..7df3d52 100644 --- a/login.php +++ b/login.php @@ -3,7 +3,7 @@ * Do the login/logout process */ -require_once('init.php'); +require_once('inc/init.php'); $msg = $lang['msg_login']; if(isset($_REQUEST['username'])){ diff --git a/orgs.php b/orgs.php index 6e79970..0f6426c 100644 --- a/orgs.php +++ b/orgs.php @@ -1,5 +1,5 @@ parse($xml); - $xml_parser->destruct(); - return $data; -} -################################################################################### -# XML_serialize: serializes any PHP data structure into XML -# Takes one parameter: the data to serialize. Must be an array. -################################################################################### -function & XML_serialize(&$data, $level = 0, $prior_key = NULL){ - #assumes a hash, keys are the tag names - $xml_parts = ''; - while(list($key, $value) = each($data)){ - if(!strpos($key, ' attr')){ #if it's not an attribute - #... we don't treat attributes by themselves. - #note that implies that for an empty element that has attributes, you still - #need to set the element to NULL - - $attributes = array(); - if(array_key_exists("$key attr", $data)){ #if there's an attribute for this element - while(list($attr_name, $attr_value) = each($data["$key attr"])) - $attributes[] = $attr_name.'="'.htmlspecialchars($attr_value).'"'; - reset($data["$key attr"]); - } - - if(is_array($value) and array_key_exists(0, $value)){ - #numeric array (note that you can't have numeric keys at two levels in a row) - $xml_parts .= XML_serialize($value, $level, $key); - }else{ - if($prior_key) $key = $prior_key; - #(i.e. if we're in a numeric array, replace the number with the actual tag) - - $xml_parts .= str_repeat("\t", $level).'<'.$key; - if($attributes) $xml_parts .= ' '.join(' ',$attributes); - - if(is_null($value)) - $xml_parts .= " />\r\n"; - elseif(!is_array($value)) - $xml_parts .= '>'.htmlspecialchars($value)."\r\n"; - else - $xml_parts .= ">\r\n".XML_serialize($value, $level+1).str_repeat("\t", $level)."\r\n"; - } - } - } - reset($data); - if($level == 0) return "\r\n".$xml_parts; - return $xml_parts; -} -################################################################################### -# XML class: utility class to be used with PHP's XML handling functions -################################################################################### -class XML { - var $parser; #a reference to the XML parser - var $document; #the entire XML structure built up so far - var $parent; #a pointer to the current parent - the parent will be an array - var $stack; #a stack of the most recent parent at each nesting level - var $last_opened_tag; #keeps track of the last tag opened. - - function XML(){ - $this->parser = &xml_parser_create(); - xml_parser_set_option(&$this->parser, XML_OPTION_CASE_FOLDING, 0); - xml_set_object(&$this->parser, &$this); - xml_set_element_handler(&$this->parser, 'open','close'); - xml_set_character_data_handler(&$this->parser, 'data'); - } - function destruct(){ - xml_parser_free(&$this->parser); - } - function & parse(&$data){ - $this->document = array(); - $this->parent = &$this->document; - $this->stack = array(); - return xml_parse(&$this->parser, &$data, true) ? $this->document : NULL; - } - function open(&$parser, $tag, $attributes){ - $this->data = array(); #stores temporary cdata - $this->last_opened_tag = $tag; - if(is_array($this->parent) and array_key_exists($tag,$this->parent)){ #if you've seen this tag before - if(is_array($this->parent[$tag]) and array_key_exists(0,$this->parent[$tag])){ #if the keys are numeric - #this is the third or later instance of $tag we've come across - $key = count_numeric_items($this->parent[$tag]); - }else{ - #this is the second instance of $tag that we've seen - #shift around - if(array_key_exists("$tag attr",$this->parent)){ - $arr = array('0 attr'=>&$this->parent["$tag attr"], &$this->parent[$tag]); unset($this->parent["$tag attr"]); - }else{ - $arr = array(&$this->parent[$tag]); - } - $this->parent[$tag] = &$arr; - $key = 1; - } - $this->parent = &$this->parent[$tag]; - }else{ - $key = $tag; - } - if($attributes) - $this->parent["$key attr"] = $attributes; - - $this->parent[$key] = NULL; #it turns out you can take a reference to NULL :) - $this->parent = &$this->parent[$key]; - $this->stack[] = &$this->parent; - } - function data(&$parser, $data){ - if($this->last_opened_tag != NULL) #you don't need to store whitespace in between tags - $this->data[] = $data; - } - function close(&$parser, $tag){ - static $just_closed = false; - if($this->last_opened_tag == $tag){ - if($this->data) - $this->parent = join('',$this->data); - $this->last_opened_tag = NULL; - } - array_pop($this->stack); - if($this->stack) - $this->parent = &$this->stack[count($this->stack)-1]; - } -} -function count_numeric_items(&$array){ - return is_array($array) ? count(array_filter(array_keys($array), 'is_numeric')) : 0; -} -?> \ No newline at end of file -- 2.39.2