From 2c60283ba3d201eb0326850bf8342d78dd2bcb2b Mon Sep 17 00:00:00 2001 From: Matthew Wilson Date: Fri, 7 Apr 2006 00:02:45 +0000 Subject: [PATCH] first major round of EMS changes. much more to come late tonight. --- docs/upgrades/upgrade_6.8.7-6.99.0.pl | 216 ++- lib/WebGUI.pm | 6 +- .../Asset/Wobject/EventManagementSystem.pm | 710 +++++++++- lib/WebGUI/Group.pm | 3 + lib/WebGUI/HTMLForm.pm | 2 +- lib/WebGUI/International.pm | 4 +- lib/WebGUI/SQL.pm | 28 + lib/WebGUI/Session/ErrorHandler.pm | 3 + lib/WebGUI/Session/Form.pm | 8 +- lib/WebGUI/Session/Icon.pm | 16 +- .../English/Asset_EventManagementSystem.pm | 42 + .../EventManagementSystem/script/button.js | 158 +++ .../EventManagementSystem/script/buttonbar.js | 98 ++ .../script/dynamicForms.js | 230 +++ .../EventManagementSystem/script/jsdomenu.js | 1243 +++++++++++++++++ .../EventManagementSystem/script/locale_EN.js | 32 + .../script/movtableInc.js | 1127 +++++++++++++++ .../EventManagementSystem/script/tab.js | 115 ++ .../style/common_style.css | 107 ++ .../EventManagementSystem/style/default.css | 42 + .../EventManagementSystem/style/movtable.css | 170 +++ .../style/newyork_style.css | 494 +++++++ .../EventManagementSystem/style/office_xp.css | 186 +++ .../style/office_xp_menu_left.png | Bin 0 -> 136 bytes .../EventManagementSystem/style/win2k.css | 41 + .../EventManagementSystem/style/win2k_ie.css | 69 + .../EventManagementSystem/style/win2k_mz.css | 79 ++ 27 files changed, 5196 insertions(+), 33 deletions(-) create mode 100644 www/extras/wobject/EventManagementSystem/script/button.js create mode 100644 www/extras/wobject/EventManagementSystem/script/buttonbar.js create mode 100644 www/extras/wobject/EventManagementSystem/script/dynamicForms.js create mode 100644 www/extras/wobject/EventManagementSystem/script/jsdomenu.js create mode 100644 www/extras/wobject/EventManagementSystem/script/locale_EN.js create mode 100644 www/extras/wobject/EventManagementSystem/script/movtableInc.js create mode 100644 www/extras/wobject/EventManagementSystem/script/tab.js create mode 100644 www/extras/wobject/EventManagementSystem/style/common_style.css create mode 100644 www/extras/wobject/EventManagementSystem/style/default.css create mode 100644 www/extras/wobject/EventManagementSystem/style/movtable.css create mode 100644 www/extras/wobject/EventManagementSystem/style/newyork_style.css create mode 100644 www/extras/wobject/EventManagementSystem/style/office_xp.css create mode 100644 www/extras/wobject/EventManagementSystem/style/office_xp_menu_left.png create mode 100644 www/extras/wobject/EventManagementSystem/style/win2k.css create mode 100644 www/extras/wobject/EventManagementSystem/style/win2k_ie.css create mode 100644 www/extras/wobject/EventManagementSystem/style/win2k_mz.css diff --git a/docs/upgrades/upgrade_6.8.7-6.99.0.pl b/docs/upgrades/upgrade_6.8.7-6.99.0.pl index 19470e1df..6564acf40 100644 --- a/docs/upgrades/upgrade_6.8.7-6.99.0.pl +++ b/docs/upgrades/upgrade_6.8.7-6.99.0.pl @@ -547,23 +547,197 @@ sub addEMSTemplates { ## Display Template ## my $template = < -

+



- + + + + + + + +
style="display:none"> + +
Switch To Advanced Search
+
Search Keywords:
+ + +
+ +
style="display:none"> + +
Switch To Basic Search
+ + + + +
+Add another Filter Field + + + + +
+ + + + + + + + + - + - +
+ + + + + +
+
+ EOT1 ## Event Template ## @@ -683,6 +857,7 @@ create table EventManagementSystem ( groupToAddEvents varchar(22), groupToApproveEvents varchar(22), globalPrerequisites tinyint default 1, + globalMetadata tinyint default 1, primary key(assetId,revisionDate) ) SQL1 @@ -748,13 +923,42 @@ primary key(prerequisiteEventId) ) SQL6 +my $sql7 = <db->write($sql1); $session->db->write($sql2); $session->db->write($sql3); $session->db->write($sql4); $session->db->write($sql5); $session->db->write($sql6); - + $session->db->write($sql7); + $session->db->write($sql8); } #------------------------------------------------- diff --git a/lib/WebGUI.pm b/lib/WebGUI.pm index be79ee3f4..3da2c011f 100644 --- a/lib/WebGUI.pm +++ b/lib/WebGUI.pm @@ -95,7 +95,11 @@ sub contentHandler { my $t = [Time::HiRes::gettimeofday()]; $output = page($session); $t = Time::HiRes::tv_interval($t) ; - $output =~ s/<\/title>/ : ${t} seconds<\/title>/i; + if ($output =~ /<\/title>/) { + $output =~ s/<\/title>/ : ${t} seconds<\/title>/i; + } else { + $session->output->print("\nPage generated in $t seconds.\n"); + } } else { $output = page($session); } diff --git a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm index 6b6d66f2e..11485c114 100644 --- a/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm +++ b/lib/WebGUI/Asset/Wobject/EventManagementSystem.pm @@ -24,6 +24,227 @@ use WebGUI::Commerce::Item; use WebGUI::Utility; use Data::Dumper; + + +#------------------------------------------------------------------- +sub _getFieldHash { + my $self = shift; + return $self->{_fieldHash} if ($self->{_fieldHash}); + + my %hash; + tie %hash, "Tie::IxHash"; + %hash = ( + "eventName"=>{ + name=>"Event Name", + type=>"text", + compare=>"text", + method=>"text", + columnName=>"title", + tableName=>"p", + initial=>1 + }, + "eventDescription"=>{ + name=>"Description", + type=>"text", + compare=>"text", + method=>"text", + columnName=>"description", + tableName=>"p", + initial=>1 + }, + "maxAttendees"=>{ + name=>"Max Attendees", + type=>"text", + compare=>"numeric", + method=>"integer", + columnName=>"maximumAttendees", + tableName=>"e", + initial=>1 + }, + "seatsAvailable"=>{ + name=>"Seats Available", + type=>"text", + method=>"integer", + compare=>"numeric", + calculated=>1, + initial=>1 + }, + "price"=>{ + name=>"Price", + type=>"text", + compare=>"numeric", + method=>"float", + columnName=>"price", + tableName=>"p", + initial=>1 + }, + "startDate"=>{ + name=>"Starts", + type=>"dateTime", + compare=>"numeric", + method=>"dateTime", + columnName=>"startDate", + tableName=>"e", + initial=>1 + }, + "endDate"=>{ + name=>"Ends", + type=>"dateTime", + compare=>"numeric", + method=>"dateTime", + columnName=>"endDate", + tableName=>"e", + initial=>1 + }, + "requirement"=>{ + name=>"Requirement", + type=>"select", + list=>{''=>'Select One'}, + # list=>$self->_getAllEvents(), + compare=>"boolean", + method=>"selectList", + calculated=>1, + initial=>1 + } + ); + # Add custom metadata fields to the list, matching the types up + # automatically. + my $fieldList = $self->getEventMetaDataArrayRef; + foreach my $field (@{$fieldList}) { + my $dataType = $field->{dataType}; + my $compare = $self->_matchTypes($dataType); + my $type; + if ($dataType =~ /^date/i) { + $type = lcfirst($dataType); + } elsif ($compare eq 'text' || $compare eq 'numeric') { + $type = 'text'; + } else { + $type = 'select'; + } + $hash{$field->{fieldId}} = { + name=>$field->{name}, + type=>$type, + method=>$dataType, + initial=>$field->{autoSearch}, + compare=>$compare, + calculated=>1, + metadata=>1 + }; + if ($hash{$field->{fieldId}}->{type} eq 'select') { + $hash{$field->{fieldId}}->{list} = $self->_matchPairs($field->{possibleValues}); + } + } + $self->{_fieldHash} = \%hash; + return $self->{_fieldHash}; +} + + +#------------------------------------------------------------------- + +sub _matchPairs { + my $self = shift; + my $options = shift; + my %hash; + tie %hash, 'Tie::IxHash'; + $hash{''} = 'Select One'; + foreach (split("\n",$options)) { + my $val = $_; + $val =~ s/\s//g; + $val =~ s/\n//g; + $hash{$val} = $val; + } + return \%hash; +} + +#------------------------------------------------------------------- + +sub _matchTypes { + my $self = shift; + my $dataType = lc(shift); + return 'text' if ( + WebGUI::Utility::isIn($dataType, qw( + codearea + email + htmlarea + phone + text + textarea + url + zipcode + )) + ); + return 'numeric' if ( + WebGUI::Utility::isIn($dataType, qw( + date + datetime + float + integer + interval + )) + ); + return 'boolean' if ( + WebGUI::Utility::isIn($dataType, qw( + checkbox + combo + selectlist + checklist + contenttype + databaselink + fieldtype + group + ldaplink + radio + radiolist + selectbox + selectlist + template + timezone + yesno + )) + ); + return 'text'; +} + +#------------------------------------------------------------------- + +sub buildMenu { + my $self = shift; + my $var = shift; + my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); + my $fields = $self->_getFieldHash(); + my $counter = 0; + my $js = "var filterList = {\n"; + foreach my $fieldId (keys %{$fields}) { + my $field = $fields->{$fieldId}; + $js .= ",\n" if($counter++ > 0); + my $fieldName = $field->{name}; + my $fieldType = $field->{type}; + my $compareType = $field->{compare}; + my $autoSearch = $field->{initial}; + $js .= qq|"$fieldId": {|; + $js .= qq| "name":"$fieldName"|; + $js .= qq| ,"type":"$fieldType"|; + $js .= qq| ,"compare":"$compareType"|; + $js .= qq| ,"autoSearch":"$autoSearch"|; + if($fieldType eq "select") { + my $list = $field->{list}; + my $fieldList = ""; + foreach my $key (keys %{$list}) { + $fieldList .= "," if($fieldList ne ""); + my $value = $list->{$key}; + $value =~ s/"/\"/g; + $fieldList .= qq|"$key":"$value"| + } + $js .= qq| ,"list":{ $fieldList }|; + } + $js .= q| }|; + } + $js .= "\n};\n"; + + $var->{'search.filters.options'} = $js; + $var->{'search.data.url'} = $self->getUrl; +} + #------------------------------------------------------------------- =head2 checkConflicts ( ) @@ -159,6 +380,13 @@ sub definition { label=>$i18n->get('global prerequisite'), hoverHelp=>$i18n->get('global prerequisite description') }, + globalMetadata =>{ + fieldType=>"yesNo", + defaultValue=>1, + tab=>"properties", + label=>$i18n->get('global metadata'), + hoverHelp=>$i18n->get('global metadata description') + }, ); push(@{$definition}, { assetName=>$i18n->get('assetName'), @@ -345,6 +573,64 @@ sub getPrerequisiteEventList { return $self->session->db->buildHashRef($sql); } + +#------------------------------------------------------------------ + +=head2 getEventMetaDataArrayRef ( ) + +Returns an arrayref of hash references of the metadata fields. + +Checks $self->get("globalMetadata") by default; otherwise uses the first parameter. + +=head3 useGlobalMetadata + +Whether or not to use the asset's global setting, and the override. + +=cut + +sub getEventMetaDataArrayRef { + my $self = shift; + my $useGlobalMetadata = shift; + my $productId = shift; + $useGlobalMetadata = ($useGlobalMetadata)?$useGlobalMetadata:$self->get("globalMetadata"); + my $globalWhere = ($useGlobalMetadata == 0 || $useGlobalMetadata == 'false')?" where assetId='".$self->getId."'":''; + return $self->getEventMetaDataFields($productId) if $productId; + return $self->session->db->buildArrayRefOfHashRefs("select * from EventManagementSystem_metaField $globalWhere order by sequenceNumber, assetId"); +} + + +#------------------------------------------------------------------- + +=head2 getEventMetaDataFields ( productId ) + +Returns a hash reference containing all metadata field properties. + +=head3 productId + +Which product to get metadata for. + +=cut + +sub getEventMetaDataFields { + my $self = shift; + my $productId = shift; + my $useGlobalMetadata = shift; + my $globalWhere = ($useGlobalMetadata == 0 || $useGlobalMetadata == 'false')?" where f.assetId='".$self->getId."'":''; + my $sql = "select f.*, d.fieldData + from EventManagementSystem_metaField f + left join EventManagementSystem_metaData d on f.fieldId=d.fieldId and d.productId=".$self->session->db->quote($productId)." $globalWhere order by f.sequenceNumber"; + tie my %hash, 'Tie::IxHash'; + my $sth = $self->session->db->read($sql); + while( my $h = $sth->hashRef) { + foreach(keys %$h) { + $hash{$h->{fieldId}}{$_} = $h->{$_}; + } + } + $sth->finish; + return \%hash; +} + + #------------------------------------------------------------------ =head2 getRequiredEventName ( prerequisiteId ) @@ -647,6 +933,12 @@ sub validateEditEventForm { "maximumAttendees" => $i18n->get("add/edit event maximum attendees"), ); + my $mdFields = $self->getEventMetaDataFields; + foreach my $mdField (keys %{$mdFields}) { + next unless $mdFields->{$mdField}->{required}; + $requiredFields{'metadata_'.$mdField} = $mdFields->{$mdField}->{name}; + } + $errors = $self->checkRequiredFields(\%requiredFields); #Check price greater than zero @@ -767,13 +1059,13 @@ sub www_deleteEvent { return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); #Remove this event as a prerequisite to any other event - $self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=?". + $self->session->db->write("delete from EventManagementSystem_prerequisiteEvents where requiredProductId=?", [$eventId]); $self->deleteOrphans; #Remove the event $self->deleteCollateral('EventManagementSystem_products', 'productId', $eventId); - $self->session->db->write("delete from products where productId=?",[$eventId]); + $self->deleteCollateral('products','productId',$eventId); $self->reorderCollateral('EventManagementSystem_products', 'productId'); return $self->www_manageEvents; @@ -803,6 +1095,30 @@ sub www_deletePrerequisite { #------------------------------------------------------------------- +=head2 www_edit ( ) + +Edit wobject method. + +=cut + +sub www_edit { + my $self = shift; + return $self->session->privilege->insufficient() unless $self->canEdit; + my ($tag) = ($self->get("className") =~ /::(\w+)$/); + my $tag2 = $tag; + $tag =~ s/([a-z])([A-Z])/$1 $2/g; #Separate studly caps + $tag =~ s/([A-Z]+(?![a-z]))/$1 /g; #Separate acronyms + $self->getAdminConsole->setHelp(lc($tag)." add/edit", "Asset_".$tag2); + my $i18n = WebGUI::International->new($self->session,'Asset_Wobject'); + my $addEdit = ($self->session->form->process("func") eq 'add') ? $i18n->get('add') : $i18n->get('edit'); + my $i18n2 = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n2->get('manage event metadata')); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n2->get('manage events')); + return $self->getAdminConsole->render($self->getEditForm->print,$addEdit.' '.$self->getName); +} + +#------------------------------------------------------------------- + =head2 www_editEvent ( errors ) Method to generate form to Add or Edit an events properties including prerequisite assignments and event approval. @@ -918,6 +1234,38 @@ sub www_editEvent { -name => "approved", -value => 0 || $event->{approved} ); + + # add dynamically added metadata fields. + my $meta = {}; + my $fieldList = $self->getEventMetaDataArrayRef; + if ($pid ne 'new') { + $meta = $self->getEventMetaDataFields($pid); + } else { + foreach my $field1 (@{$fieldList}) { + $meta->{$field1->{fieldId}} = $field1; + $meta->{$field1->{fieldId}}->{fieldData} = $field1->{defaultValues}; + } + } + my $i18n3 = WebGUI::International->new($self->session, "Asset"); + foreach my $field (@{$fieldList}) { + my $dataType = $meta->{$field->{fieldId}}{dataType}; + my $options; + # Add a "Select..." option on top of a select list to prevent from + # saving the value on top of the list when no choice is made. + if($dataType eq "selectList") { + $options = {"", $i18n3->get("Select")}; + } + $f->dynamicField( + name=>"metadata_".$meta->{$field->{fieldId}}{fieldId}, + label=>$meta->{$field->{fieldId}}{name}, + hoverHelp=>$meta->{$field->{fieldId}}{label}, + value=>($self->session->form->process("metadata_".$meta->{$field->{fieldId}}{fieldId},$dataType) || $meta->{$field->{fieldId}}{fieldData}), + extras=>qq/title="$meta->{$field->{fieldId}}{label}"/, + possibleValues=>$meta->{$field->{fieldId}}{possibleValues}, + options=>$options, + fieldType=>$dataType + ); + } my $prerequisiteList = $self->getPrerequisiteEventList($pid); if ( scalar(keys %{$prerequisiteList}) > 0) { @@ -977,6 +1325,7 @@ sub www_editEvent { my $output = $f->print; $self->getAdminConsole->setHelp('add/edit event','Asset_EventManagementSystem'); $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'),$i18n->get("manage events")); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n->get('manage event metadata')); my $addEdit = ($pid eq "new" or !$pid) ? $i18n->get('add', 'Asset_Wobject') : $i18n->get('edit', 'Asset_Wobject'); return $self->getAdminConsole->render($output, $addEdit.' '.$i18n->get('event')); } @@ -1005,13 +1354,20 @@ sub www_editEventSave { $pid = $self->setCollateral("EventManagementSystem_products", "productId", { productId => $pid, - startDate => $self->session->datetime->humanToEpoch($self->session->form->get("startDate")), - endDate => $self->session->datetime->humanToEpoch($self->session->form->get("endDate")), + startDate => $self->session->form->process("startDate",'dateTime'), + endDate => $self->session->form->process("endDate",'dateTime'), maximumAttendees => $self->session->form->get("maximumAttendees"), approved => $self->session->form->get("approved") },1,1 ); + #Save the event metadata + my $mdFields = $self->getEventMetaDataFields; + foreach my $mdField (keys %{$mdFields}) { + my $value = $self->session->form->process("metadata_".$mdField,$mdFields->{$mdField}->{dataType}); + $self->session->db->write("insert into EventManagementSystem_metaData values (".$self->session->db->quoteAndJoin([$mdField,$pid,$value]).") on duplicate key update fieldData=".$self->session->db->quote($value)); + } + #Save the standard product data $event = { productId => $pid, @@ -1108,11 +1464,250 @@ sub www_manageEvents { $self->getAdminConsole->setHelp('event management system manage events','Asset_EventManagementSystem'); $self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEvent;pid=new'), $i18n->get('add event')); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n->get('manage event metadata')); return $self->getAdminConsole->render($output, $i18n->get("manage events")); } #------------------------------------------------------------------- +=head2 www_manageEventMetadata ( ) + +Method to display the event metadata management console. + +=cut + +sub www_manageEventMetadata { + my $self = shift; + + return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); + + my $output; + my $metadataFields = $self->getEventMetaDataArrayRef('false'); + my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); + my $count = 0; + my $number = scalar(@{$metadataFields}); + foreach my $row1 (@{$metadataFields}) { + my %row = %{$row1}; + $count++; + $output .= "
". + $self->session->icon->delete('func=deleteEventMetaDataField;fieldId='.$row{fieldId},$self->getUrl,$i18n->get('confirm delete event metadata')). + $self->session->icon->edit('func=editEventMetaDataField;fieldId='.$row{fieldId}, $self->getUrl). + $self->session->icon->moveUp('func=moveEventMetaDataFieldUp;fieldId='.$row{fieldId}, $self->getUrl,($count == 1)?1:0); + $output .= $self->session->icon->moveDown('func=moveEventMetaDataFieldDown;fieldId='.$row{fieldId}, $self->getUrl,($count == $number)?1:0). + " ".$row{name}." ( ".$row{label}." )
"; + } + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEventMetaDataField;fieldId=new'), $i18n->get("add new event metadata field")); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n->get('manage events')); + return $self->getAdminConsole->render($output, $i18n->get("manage event metadata")); +} + +#------------------------------------------------------------------- +sub www_editEventMetaDataField { + my $self = shift; + my $fieldId = shift || $self->session->form->process("fieldId"); + my $error = shift; + return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); + my $i18n2 = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); + my $i18n = WebGUI::International->new($self->session,"WebGUIProfile"); + my $f = WebGUI::HTMLForm->new($self->session, ( + action => $self->getUrl."?func=editEventMetaDataFieldSave;fieldId=".$fieldId + )); + my $data = {}; + if ($error) { + # load submitted data. + $data = { + name => $self->session->form->process("name"), + label => $self->session->form->process("label"), + dataType => $self->session->form->process("dataType",'fieldType'), + visible => $self->session->form->process("visible",'yesNo'), + required => $self->session->form->process("required",'yesNo'), + possibleValues => $self->session->form->process("possibleValues",'textarea'), + defaultValues => $self->session->form->process("defaultValues",'textarea'), + }; + $f->readOnly( + -name => 'error', + -label => 'Error:', + -value => ''.$error.'', + ); + } elsif ($fieldId ne 'new') { + $data = $self->session->db->quickHashRef("select * from EventManagementSystem_metaField where fieldId=?",[$fieldId]); + } else { + # new field defaults + $data = { + name => $i18n2->get('type name here'), + label => $i18n2->get('type label here'), + dataType => 'text', + visible => 0, + required => 0, + autoSearch => 0 + }; + } + $f->text( + -name => "name", + -label => $i18n->get(475), + -hoverHelp => $i18n->get('475 description'),, + -extras=>(($data->{name} eq $i18n2->get('type name here'))?' style="color:#bbbbbb" ':'').' onblur="if(!this.value){this.value=\''.$i18n2->get('type name here').'\';this.style.color=\'#bbbbbb\';}" onfocus="if(this.value == \''.$i18n2->get('type name here').'\'){this.value=\'\';this.style.color=\'\';}"', + -value => $data->{name}, + ); + $f->text( + -name => "label", + -label => $i18n->get(472), + -hoverHelp => $i18n->get('472 description'), + -value => $data->{label}, + -extras=>(($data->{label} eq $i18n2->get('type label here'))?' style="color:#bbbbbb" ':'').' onblur="if(!this.value){this.value=\''.$i18n2->get('type label here').'\';this.style.color=\'#bbbbbb\';}" onfocus="if(this.value == \''.$i18n2->get('type label here').'\'){this.value=\'\';this.style.color=\'\';}"', + ); + $f->yesNo( + -name=>"visible", + -label=>$i18n->get('473a'), + -hoverHelp=>$i18n->get('473a description'), + -value=>$data->{visible} + ); + $f->yesNo( + -name=>"required", + -label=>$i18n->get(474), + -hoverHelp=>$i18n->get('474 description'), + -value=>$data->{required} + ); + my $fieldType = WebGUI::Form::FieldType->new($self->session, + -name=>"dataType", + -label=>$i18n->get(486), + -hoverHelp=>$i18n->get('486 description'), + -value=>ucfirst $data->{dataType}, + -defaultValue=>"Text", + ); + my @profileForms = (); + foreach my $form ( sort @{ $fieldType->get("types") }) { + next if $form eq 'DynamicField'; + my $cmd = join '::', 'WebGUI::Form', $form; + eval "use $cmd"; + my $w = eval {"$cmd"->new($self->session)}; + push @profileForms, $form if $w->get("profileEnabled"); + } + + $fieldType->set("types", \@profileForms); + $f->raw($fieldType->toHtmlWithWrapper()); + $f->textarea( + -name => "possibleValues", + -label => $i18n->get(487), + -hoverHelp => $i18n->get('487 description'), + -value => $data->{possibleValues}, + ); + $f->textarea( + -name => "defaultValues", + -label => $i18n->get(488), + -hoverHelp => $i18n->get('488 description'), + -value => $data->{defaultValues}, + ); + $f->yesNo( + -name => "autoSearch", + -label => 'Initial Search Field', + -hoverHelp => 'Make this appear as a Filter Field on the Advanced Search screen by default', + -value => $data->{autoSearch}, + ); + my %hash; + foreach my $category (@{WebGUI::ProfileCategory->getCategories($self->session)}) { + $hash{$category->getId} = $category->getLabel; + } + $f->submit; + $self->getAdminConsole->setHelp('event management system manage events','Asset_EventManagementSystem'); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEventMetadata'), $i18n2->get('manage event metadata')); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=editEventMetaDataField;fieldId=new'), $i18n2->get("add new event metadata field")); + $self->getAdminConsole->addSubmenuItem($self->getUrl('func=manageEvents'), $i18n->get('manage events')); + return $self->getAdminConsole->render($f->print, $i18n2->get("add new event metadata field")); +} + +#------------------------------------------------------------------- +sub www_editEventMetaDataFieldSave { + my $self = shift; + return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); + my $error = ''; + my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); + foreach ('name','label') { + if ($self->session->form->get($_) eq "" || + $self->session->form->get($_) eq $i18n->get('type name here') || + $self->session->form->get($_) eq $i18n->get('type label here')) { + $error .= sprintf($i18n->get('null field error'),$_)."
"; + } + } + return $self->www_editEventMetaDataField(undef,$error) if $error; + my $newId = $self->setCollateral("EventManagementSystem_metaField", "fieldId",{ + fieldId=>$self->session->form->process('fieldId'), + name => $self->session->form->process("name"), + label => $self->session->form->process("label"), + dataType => $self->session->form->process("dataType",'fieldType'), + visible => $self->session->form->process("visible",'yesNo'), + required => $self->session->form->process("required",'yesNo'), + possibleValues => $self->session->form->process("possibleValues",'textarea'), + defaultValues => $self->session->form->process("defaultValues",'textarea'), + autoSearch => $self->session->form->process("autoSearch",'yesNo') + },1,1); + return $self->www_manageEventMetadata(); +} + + + +#------------------------------------------------------------------- + +=head2 www_moveEventMetaDataFieldDown ( ) + +Method to move an event down one position in display order + +=cut + +sub www_moveEventMetaDataFieldDown { + my $self = shift; + my $eventId = $self->session->form->get("fieldId"); + + return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); + + $self->moveCollateralDown('EventManagementSystem_metaField', 'fieldId', $eventId); + + return $self->www_manageEventMetadata; +} + +#------------------------------------------------------------------- + +=head2 www_moveEventMetaDataFieldUp ( ) + +Method to move an event metdata field up one position in display order + +=cut + +sub www_moveEventMetaDataFieldUp { + my $self = shift; + my $eventId = $self->session->form->get("fieldId"); + + return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); + + $self->moveCollateralUp('EventManagementSystem_metaField', 'fieldId', $eventId); + + return $self->www_manageEventMetadata; +} + + +#------------------------------------------------------------------- + +=head2 www_deleteEventMetaDataField ( ) + +Method to move an event metdata field up one position in display order + +=cut + +sub www_deleteEventMetaDataField { + my $self = shift; + my $eventId = $self->session->form->get("fieldId"); + + return $self->session->privilege->insufficient unless ($self->session->user->isInGroup($self->get("groupToAddEvents"))); + + $self->deleteCollateral('EventManagementSystem_metaField', 'fieldId', $eventId); + $self->reorderCollateral('EventManagementSystem_metaField', 'fieldId'); + $self->deleteCollateral('EventManagementSystem_metaData', 'fieldId', $eventId); # deleteCollateral doesn't care about assetId. + + return $self->www_manageEventMetadata; +} + +#------------------------------------------------------------------- + =head2 www_moveEventDown ( ) Method to move an event down one position in display order @@ -1167,7 +1762,7 @@ sub www_saveRegistration { city => $self->session->form->get("city", "text"), state => $self->session->form->get("state", "text"), zipCode => $self->session->form->get("zipCode", "text"), - country => $self->session->form->get("country", "selectList"), + country => join("\n",$self->session->form->get("country", "selectList")), phone => $self->session->form->get("phoneNumber", "phone"), email => $self->session->form->get("email", "email") },0,0 @@ -1183,7 +1778,6 @@ sub www_saveRegistration { } $counter++; } - #use Data::Dumper; print "
".Dumper($self->session)."
"; return $self->www_view; } @@ -1201,6 +1795,12 @@ sub prepareView { my $templateId = $self->get("displayTemplateId"); my $template = WebGUI::Asset::Template->new($self->session, $templateId); $template->prepare; + my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); + my $language = $i18n->getLanguage(undef,"languageAbbreviation"); + $self->session->style->setScript($self->session->config->get('extrasURL').'/calendar/calendar.js',{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->config->get('extrasURL').'/calendar/lang/calendar-'.$language.'.js',{ type=>'text/javascript' }); + $self->session->style->setScript($self->session->config->get('extrasURL').'/calendar/calendar-setup.js',{ type=>'text/javascript' }); + $self->session->style->setLink($self->session->config->get('extrasURL').'/calendar/calendar-win2k-1.css', { rel=>"stylesheet", type=>"text/css", media=>"all" }); $self->{_viewTemplate} = $template; } @@ -1208,24 +1808,99 @@ sub prepareView { sub view { my $self = shift; my %var; - + my $keywords = $self->session->form->get("searchKeywords"); + my @keys; + push(@keys,$keywords) if $keywords; + unless ($keywords =~ /^".*"$/) { + foreach (split(" ",$keywords)) { + push(@keys,$_) unless $keywords eq $_; + } + } else { + $keywords =~ s/"//g; + @keys = ($keywords); + } + my $searchPhrases; + if (scalar(@keys)) { + $searchPhrases = " and ( "; + my $count = 0; + foreach (@keys) { + $count++; + $searchPhrases .= ' and ' unless $count == 1; + my $val = $self->session->db->quote('%'.$_.'%'); + $searchPhrases .= "(p.title like $val or p.description like $val)"; + } + $searchPhrases .= " )"; + } + if ($self->session->form->get("advSearch")) { + $searchPhrases = ''; + my $fields = $self->_getFieldHash(); + my $counter = 0; + for (my $cfilter = 1; $cfilter < 30; $cfilter++) { + my $value = $self->session->form->get("cfilter_t".$cfilter); + my $fieldId = $self->session->form->get("cfilter_s".$cfilter); + next if ($fieldId eq 'seatsAvailable' || $fieldId eq 'registration'); + if ($value && defined $fields->{$fieldId}) { + my $compare = $self->session->form->get("cfilter_c".$cfilter); + #Format Value with Operator + $value =~ s/%//g; + my $field = $fields->{$fieldId}; + if ($field->{type} =~ /^date/i) { + $value = $self->session->datetime->setToEpoch($value); + } else { + $value = lc($value); + } + if($compare eq "eq") { + $value = "=".$self->session->db->quote($value); + } elsif($compare eq "ne"){ + $value = "<>".$self->session->db->quote($value); + } elsif($compare eq "notlike") { + $value = "not like ".$self->session->db->quote("%".$value."%"); + } elsif($compare eq "starts") { + $value = "like ".$self->session->db->quote($value."%"); + } elsif($compare eq "ends") { + $value = "like ".$self->session->db->quote("%".$value); + } elsif($compare eq "gt") { + $value = "> ".$value; + } elsif($compare eq "lt") { + $value = "< ".$value; + } elsif($compare eq "lte") { + $value = "<= ".$value; + } elsif($compare eq "gte") { + $value = ">= ".$value; + } elsif($compare eq "like") { + $value = " like ".$self->session->db->quote("%".$value."%"); + } + $searchPhrases .= " and" if($counter); + $counter++; + unless ($compare eq 'numeric') { + $searchPhrases .= " lower(".$field->{tableName}.'.'.$field->{columnName}.") ".$value; + } else { + $searchPhrases .= " ".$field->{tableName}.'.'.$field->{columnName}." ".$value; + } + } + } + $searchPhrases &&= " and ( ".$searchPhrases." )"; + } my $i18n = WebGUI::International->new($self->session,'Asset_EventManagementSystem'); # Get the products available for sale for this page - my $sql = "select p.productId, p.title, p.description, p.price, p.templateId, e.approved, e.maximumAttendees + my $sql = "select p.productId, p.title, p.description, p.price, p.templateId, e.approved, e.maximumAttendees, e.startDate, e.endDate from products as p, EventManagementSystem_products as e where p.productId = e.productId and approved=1 - and e.assetId =".$self->session->db->quote($self->get("assetId"))." - and p.productId not in (select distinct(productId) from EventManagementSystem_prerequisites)"; + and e.assetId =".$self->session->db->quote($self->get("assetId")).$searchPhrases; +# ." +# and p.productId not in (select distinct(productId) from EventManagementSystem_prerequisites)"; + $var{'basicSearch.formHeader'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl.'?advSearch=0'}); + $var{'advSearch.formHeader'} = WebGUI::Form::formHeader($self->session,{action=>$self->getUrl.'?advSearch=1'}); + $var{isAdvSearch} = $self->session->form->get('advSearch'); + $var{'search.formFooter'} = WebGUI::Form::formFooter($self->session); + $var{'search.formSubmit'} = WebGUI::Form::submit($self->session, {value=>'Filter'}); my $p = WebGUI::Paginator->new($self->session,$self->getUrl,$self->get("paginateAfter")); $p->setDataByQuery($sql); my $eventData = $p->getPageData; my @events; - #We are getting each events information, passing it to the *events* template and processing it - #The html returned from each events template is returned to the Event Manager Display Template for arranging - #how the events are displayed in relation to one another. foreach my $event (@$eventData) { my %eventFields; @@ -1237,16 +1912,18 @@ sub view { $eventFields{'numberRegistered'} = $numberRegistered; $eventFields{'maximumAttendees'} = $event->{'maximumAttendees'}; $eventFields{'seatsRemaining'} = $event->{'maximumAttendees'} - $numberRegistered; + $eventFields{'startDate.human'} = $self->session->datetime->epochToHuman($event->{'startDate'}); + $eventFields{'endDate.human'} = $self->session->datetime->epochToHuman($event->{'endDate'}); $eventFields{'eventIsFull'} = ($eventFields{'seatsRemaining'} == 0); if ($eventFields{'eventIsFull'}) { - $eventFields{'purchase.label'} = "Sold Out";; + $eventFields{'purchase.label'} = $i18n->get('sold out'); } else { $eventFields{'purchase.url'} = $self->getUrl('func=addToCart;pid='.$event->{'productId'}); $eventFields{'purchase.label'} = $i18n->get('add to cart'); } - push (@events, {'event' => $self->processTemplate(\%eventFields, $event->{'templateId'}) }); + push (@events, {'event' => $self->processTemplate(\%eventFields, $event->{'templateId'}), %eventFields }); } $var{'checkout.url'} = $self->getUrl('op=viewCart'); $var{'checkout.label'} = "Checkout"; @@ -1261,7 +1938,8 @@ sub view { $var{'canManageEvents'} = 0; } $p->appendTemplateVars(\%var); - + $self->buildMenu(\%var); + $var{'ems.wobject.dir'} = $self->session->config->get("extrasURL")."/wobject/EventManagementSystem"; my $templateId = $self->get("displayTemplateId"); return $self->processTemplate(\%var, undef, $self->{_viewTemplate}); } diff --git a/lib/WebGUI/Group.pm b/lib/WebGUI/Group.pm index 19b169645..a51d8e25e 100755 --- a/lib/WebGUI/Group.pm +++ b/lib/WebGUI/Group.pm @@ -788,9 +788,11 @@ sub new { my $self = {}; $self->{_session} = shift; $self->{_groupId} = shift; + return $self->{_session}->{groupData}->{$self->{_groupId}} if $self->{_session}->{groupData}->{$self->{_groupId}}; my $override = shift; bless $self, $class; $self->_create($override) if ($self->{_groupId} eq "new"); + $self->{_session}->{groupData}->{$self->{_groupId}} = $self; return $self; } @@ -1005,6 +1007,7 @@ sub set { my $value = shift; $self->get("groupId") unless ($self->{_group}); # precache group stuff $self->{_group}{$name} = $value; + $self->session->{groupData}->{$self->getId} = undef; $self->session->db->setRow("groups","groupId",{groupId=>$self->getId, $name=>$value, lastUpdated=>$self->session->datetime->time()}); } diff --git a/lib/WebGUI/HTMLForm.pm b/lib/WebGUI/HTMLForm.pm index 8090ca2ce..e2675eae9 100644 --- a/lib/WebGUI/HTMLForm.pm +++ b/lib/WebGUI/HTMLForm.pm @@ -169,7 +169,7 @@ If you want to add anything special to your form like javascript actions, or sty =head3 enctype -The ecapsulation type for this form. This defaults to "multipart/form-data" and should probably never be changed. +The encapsulation type for this form. This defaults to "multipart/form-data" and should probably never be changed. =head3 tableExtras diff --git a/lib/WebGUI/International.pm b/lib/WebGUI/International.pm index dc536121c..356f8a810 100644 --- a/lib/WebGUI/International.pm +++ b/lib/WebGUI/International.pm @@ -87,7 +87,7 @@ sub get { my $output = eval($cmd); $self->session->errorHandler->warn("Couldn't get value from ".$cmd." because ".$@) if ($@); $output = $self->get($id,$namespace,"English") if ($output eq "" && $language ne "English"); - return $output; + return $output || $id; } @@ -210,7 +210,7 @@ sub new { bless( { _session => $session, _namespace => $namespace, - _language => $language, + _language => ($language || $session->user->profileField('language')), },$class); } diff --git a/lib/WebGUI/SQL.pm b/lib/WebGUI/SQL.pm index aa4f34cf8..b6006d69c 100644 --- a/lib/WebGUI/SQL.pm +++ b/lib/WebGUI/SQL.pm @@ -199,6 +199,34 @@ sub buildHashRef { return \%hash; } + +#------------------------------------------------------------------- + +=head2 buildArrayRefOfHashRefs ( sql ) + +Builds an array reference of hash references of data +from a series of rows. Useful for returning many rows at once. + +=head3 sql + +An SQL query. The query must select at least two columns of data, the first being the key for the hash, the second being the value. If the query selects more than two columns, then the last column will be the value and the remaining columns will be joined together by a colon ":" to form a complex key. If the query selects only one column, then the key and the value will be the same. + +=head3 params + +An array reference containing values for any placeholder params used in the SQL query. + +=cut + +sub buildArrayRefOfHashRefs { + my @array; + my $sth = $_[0]->read($_[1],$_[2]); + while (my $data = $sth->hashRef) { + push(@array,$data); + } + $sth->finish; + return \@array; +} + #------------------------------------------------------------------- diff --git a/lib/WebGUI/Session/ErrorHandler.pm b/lib/WebGUI/Session/ErrorHandler.pm index 41c8197fb..1e773ad15 100644 --- a/lib/WebGUI/Session/ErrorHandler.pm +++ b/lib/WebGUI/Session/ErrorHandler.pm @@ -17,6 +17,7 @@ package WebGUI::Session::ErrorHandler; use strict; use Log::Log4perl; +use Data::Dumper; use Apache2::RequestUtil; =head1 NAME @@ -387,6 +388,8 @@ sub showDebug { my $text = $self->session->stow->get('debug_error'); $text =~ s/\n/\
\n/g; my $output = '
'.$text."
\n"; + $text = $self->session->form->paramsHashRef(); + $output .= '
Form Variables:'.Dumper($text)."
\n" if(scalar(keys %{$text})); $text = $self->session->stow->get('debug_warn'); $text =~ s/\n/\
\n/g; $output .= '
'.$text."
\n"; diff --git a/lib/WebGUI/Session/Form.pm b/lib/WebGUI/Session/Form.pm index 9ed96637d..f5c6cbbaa 100644 --- a/lib/WebGUI/Session/Form.pm +++ b/lib/WebGUI/Session/Form.pm @@ -167,11 +167,13 @@ Gets a hash ref of all the params passed in to this class, and their values. Thi sub paramsHashRef { my $self = shift; unless ($self->{_paramsHashRef}) { - my $hash; + my %hash; + tie %hash, "Tie::IxHash"; foreach ($self->param) { - $hash->{$_} = $self->process($_); + my @arr = $self->process($_); + $hash{$_} = (scalar(@arr) > 1)?\@arr:$arr[0]; } - $self->{_paramsHashRef} = $hash; + $self->{_paramsHashRef} = \%hash; } return $self->{_paramsHashRef}; } diff --git a/lib/WebGUI/Session/Icon.pm b/lib/WebGUI/Session/Icon.pm index bd5269dfd..66dce6caa 100644 --- a/lib/WebGUI/Session/Icon.pm +++ b/lib/WebGUI/Session/Icon.pm @@ -362,9 +362,13 @@ sub moveDown { my $self = shift; my $urlParams = shift; my $pageURL = shift || $self->session->url->getRequestedUrl; + my $disabled = shift; my $i18n = WebGUI::International->new($self->session,'Icon'); - my $output = '

'; - $output .= ''.$i18n->get('Move Down').'

'; + my $output = '

'; + $output .= '' unless $disabled; + $output .= ''.$i18n->get('Move Down').''; + $output .= '' unless $disabled; + $output .= '

'; return $output; } @@ -466,9 +470,13 @@ sub moveUp { my $self = shift; my $urlParams = shift; my $pageURL = shift || $self->session->url->getRequestedUrl; + my $disabled = shift; my $i18n = WebGUI::International->new($self->session,'Icon'); - my $output = '

'; - $output .= ''.$i18n->get('Move Up').'

'; + my $output = '

'; + $output .= '' unless $disabled; + $output .= ''.$i18n->get('Move Up').''; + $output .= '' unless $disabled; + $output .= '

'; return $output; } diff --git a/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm b/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm index 340834bf2..de22e5fe3 100644 --- a/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm +++ b/lib/WebGUI/i18n/English/Asset_EventManagementSystem.pm @@ -279,6 +279,18 @@ our $I18N = { ##hashref of hashes context => q|Link to add an event to the event manager|, }, + 'manage event metadata' => { + message => q|Manage Event Metadata|, + lastUpdated => 1138908251, + context => q|Link to manage event metadata|, + }, + + 'add new event metadata field' => { + message => q|Add new Event Metadata Field|, + lastUpdated => 1138908251, + context => q|In Manage Event Metadata screen|, + }, + 'null field error' => { message => q|The %s field cannot be blank.|, lastUpdated => 1138908251, @@ -426,6 +438,36 @@ allows you to edit events, delete events, or change their order.

lastUpdated => 1131394072, }, + 'global metadata' => { + message => q|Use Global Event Metadata|, + lastUpdated => 1140469381, + }, + + 'global metadata description' => { + message => q|Whether or not to use all other Event Management Systems Metadata Fields when assigning metadata to events and searching for events.

The management screen list of metadata fields for this asset will still remain limited to those created by this EMS asset.
|, + lastUpdated => 1140469381, + }, + + 'type name here' => { + message => q|Type Name Here|, + lastUpdated => 1140469381, + }, + + 'type label here' => { + message => q|Type Label Here|, + lastUpdated => 1140469381, + }, + + 'sold out' => { + message => q|Sold Out|, + lastUpdated => 1140469381, + }, + + 'confirm delete event metadata' => { + message => q|Are you certain you want to delete this metadata field? The metadata values for this field will be deleted from all events, including events in other EMS wobjects that are set to use global metadata.|, + lastUpdated => 1140469381, + }, + }; 1; diff --git a/www/extras/wobject/EventManagementSystem/script/button.js b/www/extras/wobject/EventManagementSystem/script/button.js new file mode 100644 index 000000000..ff5f940a7 --- /dev/null +++ b/www/extras/wobject/EventManagementSystem/script/button.js @@ -0,0 +1,158 @@ +/******************************************************************************************** +* BlueShoes Framework; This file is part of the php application framework. +* NOTE: This code is stripped (obfuscated). To get the clean documented code goto +* www.blueshoes.org and register for the free open source *DEVELOPER* version or +* buy the commercial version. +* +* In case you've already got the developer version, then this is one of the few +* packages/classes that is only available to *PAYING* customers. +* To get it go to www.blueshoes.org and buy a commercial version. +* +* @copyright www.blueshoes.org +* @author Samuel Blume +* @author Andrej Arn +*/ +if (!Bs_Objects) {var Bs_Objects = [];};function Bs_Button() { +this._id;this._objectId;this.id;this.group;this._status = 1;this.inactiveStyle = 3;this._imgPathDefault = '/_bsImages/buttons/';this.imgPath;this.imgName;this.height;this.width;this.backgroundColor;this.title;this.caption;this.action;this.cssClassDefault = 'bsBtnDefault';this.cssClassMouseOver = 'bsBtnMouseOver';this.cssClassMouseDown = 'bsBtnMouseDown';this._buttonBar;this.actualizeFromChildren = 0;this._childrenButtonBar;this._isDragAction;this._attachedEvents = new Array;this._constructor = function() { +this._id = Bs_Objects.length;Bs_Objects[this._id] = this;this._objectId = "Bs_Button_"+this._id;} +this.attachEvent = function(fire, e) { +if (typeof(e) == 'undefined') e = 'on';if (typeof(this._attachedEvents[e]) == 'undefined') this._attachedEvents[e] = new Array;this._attachedEvents[e][this._attachedEvents[e].length] = fire;} +this.attachFireOff = function(param) { +} +this.render = function() { +var isGecko = this._isGecko();var out = new Array;var containerStyle = new Array;out[out.length] = '
';var tagType = 'div';out[out.length] = '<' + tagType;out[out.length] = ' id="' + this._getId() + '"';if (typeof(this.title) != 'undefined') { +out[out.length] = ' title="' + this.title + '"';} +out[out.length] = ' unselectable="on"';captionType = typeof(this.caption);if (captionType != 'undefined') { +containerStyle[containerStyle.length] = 'width:auto';} else { +if (typeof(this.width) != 'undefined') containerStyle[containerStyle.length] = 'width:' + this.width + 'px';if (typeof(this.height) != 'undefined') containerStyle[containerStyle.length] = 'height:' + this.height + 'px';} +if (typeof(this.backgroundColor) != 'undefined') containerStyle[containerStyle.length] = 'background-color:' + this.backgroundColor;switch (this._status) { +case 0: +var filter = this._getInactiveStyleFilter();if (typeof(filter) == 'string') { +containerStyle[containerStyle.length] = 'filter:' + filter;} +case 1: +out[out.length] = ' class="' + this.cssClassDefault + '"';break;case 2: +out[out.length] = ' class="' + this.cssClassMouseDown + '"';break;} +out[out.length] = ' style="' + containerStyle.join(';') + '"';out[out.length] = ' onMouseOver="Bs_Objects['+this._id+'].mouseOver(this);"';out[out.length] = ' onMouseOut="Bs_Objects['+this._id+'].mouseOut(this);"';out[out.length] = ' onMouseDown="Bs_Objects['+this._id+'].mouseDown(this);"';out[out.length] = ' onMouseUp="Bs_Objects['+this._id+'].mouseUp(this);"';out[out.length] = '>';if (typeof(this.imgName) != 'undefined') { +var imgFullPath = '';imgFullPath += this._getImgPath();imgFullPath += this.imgName;if (this.imgName.substr(this.imgName.length -4) != '.gif') imgFullPath += '.gif';out[out.length] = ' 18)) out[out.length] = ' style="vertical-align:top;"';out[out.length] = '>';} +captionType = typeof(this.caption);if (captionType != 'undefined') { +if (captionType == 'string') { +out[out.length] = this.caption;} else { +out[out.length] = this.title;} +if (!isGecko) out[out.length] = ' ';} +if ((typeof(this._childrenButtonBar) != 'undefined') && (this.numberOfAttachedEvents('on') == 0)) { +this.group = this._objectId + '_pseudoGroup';var imgFullPath = '';if (this.imgPath) imgFullPath += this._getImgPath();imgFullPath += 'small_black_arrow_down.gif';out[out.length] = '  ';var subBarString = this._childrenButtonBar.render();subBarString = '';out[out.length] = subBarString;} +out[out.length] = '';out[out.length] = '
';return out.join('');} +this.drawOut = function() { +document.writeln(this.render());} +this.drawInto = function(elm) { +if (typeof(elm) == 'string') { +elm = document.getElementById(elm);} +if (elm != null) { +var x = this.render(); //x = x.replace(//, ''); + //x = x.replace(/<\/nobr>/, ''); + x = x.replace(//, ''); + x = x.replace(/<\/nobr>/, '<\/span>'); +elm.innerHTML = x;} +} +this.mouseOver = function(div) { +if (this._status == 2) return;if (this._status == 0) return;if (!this._isGecko()) { +div.className = this.cssClassMouseOver;} +this._fireEvent('over');} +this.mouseOut = function(div) { +if (this._status == 2) return;if (this._status == 0) return;if (!this._isGecko()) { +div.className = this.cssClassDefault;} +this._fireEvent('out');} +this.mouseDown = function(div) { +if (this._status == 0) return;this._isDragAction = false;div.className = this.cssClassMouseDown;} +this.mouseUp = function(div) { +if (this._status == 0) return;var doFireOn = true;var doFireOff = false;if (this._isGecko()) { +div.className = this.cssClassDefault;} else { +div.className = this.cssClassMouseOver;} +if (typeof(this.group) != 'undefined') { +if (this._status == 2) { +this._status = 1;doFireOn = false;doFireOff = true;} else { +div.className = this.cssClassMouseDown;this._status = 2;this._deactivateOtherGroupButtons();} +} +if (this._isDragAction) doFireOn = false;if (doFireOn) { +this._fireEvent('on');} else if (doFireOff) { +this._fireEvent('off');} +} +this.dragStart = function(div) { +if (this._status == 0) return false;this._isDragAction = true;div.className = this.cssClassMouseOver;return false;} +this._deactivateOtherGroupButtons = function() { +if (typeof(this._buttonBar) == 'undefined') return;for (var i=0; i +* @author Andrej Arn +*/ +if (!Bs_Objects) {var Bs_Objects = [];}; + +function Bs_ButtonBar() { + this._id; + this._objectId; + this.imgPath = '/_bsImages/buttons/'; + this.useHelpBar; + this.alignment = 'hor'; + this.ignoreEvents = false; + this.helpBarStyle = "font-family:arial; font-size:11px; height:16px;"; + this._buttons = new Array; + this._parentButton; + this._constructor = function() { + this._id = Bs_Objects.length; + Bs_Objects[this._id] = this; + this._objectId = "Bs_ButtonBar_"+this._id; + } + + this.addButton = function(btn, helpBarText) { + btn._buttonBar = this; + this._buttons[this._buttons.length] = new Array(btn, helpBarText); + } + + this.newGroup = function() { + this._buttons[this._buttons.length] = '|'; + } + + this.render = function() { + var out = new Array; + if (this._isGecko()) { + out[out.length] = '
'; + } else { + out[out.length] = '
'; + } + out[out.length] = '
'; + for (var i=0; i'; + } else { + var btn = this._buttons[i][0]; + var helpBarDiv = false; + if (typeof(this.useHelpBar) == 'string') { + var helpBarDiv = this.useHelpBar; + } else if (this.useHelpBar) { + var helpBarDiv = this._objectId + '_helpBarDiv'; + } + if (helpBarDiv != false) { + btn.attachEvent("document.getElementById('" + helpBarDiv + "').innerHTML = \"" + this._buttons[i][1] + "\";", 'over'); + btn.attachEvent("document.getElementById('" + helpBarDiv + "').innerHTML = \"\";", 'out'); + } + out[out.length] = btn.render(); + } + if (this.alignment != 'hor') { + out[out.length] = '
'; + } + } + out[out.length] = '
'; + if (this.useHelpBar) { + if (this.useHelpBar == 2) { + out[out.length] = '
'; + out[out.length] = ' '; + out[out.length] = '
'; + } else if (this.useHelpBar == true) { + out[out.length] = '
'; + } + } + out[out.length] = '
'; + return out.join(''); + } +this.drawOut = function() { +document.writeln(this.render());} +this.drawInto = function(elm) { +if (typeof(elm) == 'string') { +elm = document.getElementById(elm);} +if (elm) { +elm.innerHTML = this.render();} +} +this._isGecko = function() { +if (navigator.appName == "Microsoft Internet Explorer") return false; var x = navigator.userAgent.match(/gecko/i); +return (x);return false;} +this._constructor();} diff --git a/www/extras/wobject/EventManagementSystem/script/dynamicForms.js b/www/extras/wobject/EventManagementSystem/script/dynamicForms.js new file mode 100644 index 000000000..65ebc9f0e --- /dev/null +++ b/www/extras/wobject/EventManagementSystem/script/dynamicForms.js @@ -0,0 +1,230 @@ +var textCompareList = { + "eq":"equals", + "like":"contains", + "ne":"is not", + "notlike":"not like", + "starts":"starts with", + "ends":"ends with" + }; + +var numericCompareList = { + "eq":"=", + "ne":"is not", + "gt":">", + "lt":"<", + "gte":">=", + "lte":"<=" + }; +var booleanCompareList = { + "eq":"is", + "ne":"is not" + }; +function addField() { + var tb = document.getElementById('filterbody'); + filterCount++; + + var newtr = document.createElement('tr'); + newtr.setAttribute("id","cfilter_id"+filterCount); + //Create right table data + var newtd1 = document.createElement('td'); + newtd1.className="searchDisplay"; + //Add fields to choose from + var newDD = newtd1.appendChild(addFilterSelect()); + + //Create left table data + var newtd2 = document.createElement('td'); + newtd2.className="searchDisplay"; + newtd2.setAttribute("id","cfilter_td_"+filterCount); + //Add default compare select list + var compareSelect = addSelectList('cfilter_c'+filterCount,textCompareList); + compareSelect.className="compare-select"; + newtd2.appendChild(compareSelect); + //Add default filter field + var filterText = addTextField('cfilter_t'+filterCount); + filterText.className="filter-text"; + newtd2.appendChild(filterText); + //Add remove button + var filterButton = addButton('cbutton_'+filterCount,'-'); + filterButton.className="button"; + filterButton.onclick = removeField; + newtd2.appendChild(filterButton); + //Add tds to trs + newtr.appendChild(newtd1); + newtr.appendChild(newtd2); + //Add trs to tbody + tb.appendChild(newtr); + return newDD; +} + + +function getTarget(e) { + var targ; + if (!e) var e = window.event; + if (e.target) targ = e.target; + else if (e.srcElement) targ = e.srcElement; + if (targ.nodeType == 3) // defeat Safari bug + targ = targ.parentNode; + return targ +} + +function getFilterId(button) { + if(button == null) return; + var name = button.name; + var strs = name.split("_"); + var end = strs[1]; + if(isNaN(end)) { + end = end.substring(1,end.length); + } + return end; +} + +function removeField (event) { + var button = getTarget(event); + var filterId = getFilterId(button); + var idName = "cfilter_id"+filterId; + removeElement('filterbody',idName); +} + +function changeField (event) { + var button = getTarget(event); + var filterId = getFilterId(button); + var idName = 'cfilter_s'+filterId+'_id'; + var sel = document.getElementById(idName); + + var field = sel.options[sel.selectedIndex].value; + changeToType(field,filterId); +} + +function changeToType(field,filterId) { + var fieldType = filterList[field]["type"]; + var fieldCompare = filterList[field]["compare"]; + var tr = document.getElementById("cfilter_id"+filterId); + var td = document.getElementById("cfilter_td_"+filterId); + //Remove old td + tr.removeChild(td); + //Create new td + var newtd = document.createElement('td'); + newtd.className="searchDisplay"; + newtd.setAttribute("id","cfilter_td_"+filterId); + + //Add default compare select list + var arr; + if(fieldCompare == "text") { + arr = textCompareList; + } else if(fieldCompare == "numeric") { + arr = numericCompareList; + } else if(fieldCompare == "boolean") { + arr = booleanCompareList; + } + var compareSelect = addSelectList('cfilter_c'+filterId,arr); + compareSelect.className="compare-select"; + newtd.appendChild(compareSelect); + + var filterFieldName = 'cfilter_t'+filterId; + + if(fieldType == "text") { + var filterField = addTextField(filterFieldName); + filterField.className="filter-text"; + newtd.appendChild(filterField); + } else if(fieldType == "select") { + var filterField = addSelectList(filterFieldName,filterList[field]["list"]); + filterField.className="filter-text"; + newtd.appendChild(filterField); + } else if(fieldType == "date") { + var filterField = addTextField(filterFieldName); + //filterField.setAttribute("id",dateFieldId); + filterField.className="filter-text"; + newtd.appendChild(filterField); + } else if(fieldType == "dateTime") { + var filterField = addTextField(filterFieldName); + //filterField.setAttribute("id",dateFieldId); + filterField.className="filter-text"; + newtd.appendChild(filterField); + } + + //Add remove button + var filterButton = addButton('cbutton_'+filterId,'-'); + filterButton.className="button"; + filterButton.onclick = removeField; + newtd.appendChild(filterButton); + + //Add new td to tr + tr.appendChild(newtd); + if(fieldType == "date") { + var dateFieldId = filterFieldName+"_id"; + Calendar.setup({ + "inputField":dateFieldId, + "ifFormat": "%Y-%m-%d", + "showsTime": false, + "timeFormat": "12", + "mondayFirst": false + }); + } + if(fieldType == "dateTime") { + var dateFieldId = filterFieldName+"_id"; + Calendar.setup({ + "inputField":dateFieldId, + "ifFormat": "%Y-%m-%d %H:%M:%S", + "showsTime": true, + "step": 1, + "timeFormat": "12", + "mondayFirst": false + }); + } +} + + + +function addFilterSelect() { + var sel = document.createElement("select"); + sel.setAttribute('name','cfilter_s'+filterCount); + sel.setAttribute('id','cfilter_s'+filterCount+'_id'); + sel.className="filter-select"; + sel.onchange=changeField; + //one way to write a function... you have to write it yourself! + //myOnChange = new Function("e", "location.href=myselect.options[myselect.selectedIndex].value"); + //first option + for (var word in filterList) { + //listString += items[word] + ", "; + var opt = document.createElement("option"); + opt.setAttribute("value",word); + opt.appendChild(document.createTextNode(filterList[word]["name"])); + sel.appendChild(opt); + } + return sel; +} + +function addSelectList(fieldName,array) { + var sel = document.createElement("select"); + sel.setAttribute('name',fieldName); + sel.setAttribute("id",fieldName+"_id"); + for (var word in array) { + var opt = document.createElement("option"); + opt.setAttribute("value",word); + opt.appendChild(document.createTextNode(array[word])); + sel.appendChild(opt); + } + return sel; +} + +function addTextField(fieldName) { + var text = document.createElement("input"); + text.setAttribute('type','text'); + text.setAttribute('name',fieldName); + text.setAttribute("id",fieldName+"_id"); + return text; +} + +function addButton(name,value) { + var button = document.createElement('input'); + button.setAttribute('type','button'); + button.setAttribute('value',value); + button.setAttribute('name',name); + return button; +} + +function removeElement(parent,child) { + var p = document.getElementById(parent); + var c = document.getElementById(child); + p.removeChild(c); +} diff --git a/www/extras/wobject/EventManagementSystem/script/jsdomenu.js b/www/extras/wobject/EventManagementSystem/script/jsdomenu.js new file mode 100644 index 000000000..dc9431018 --- /dev/null +++ b/www/extras/wobject/EventManagementSystem/script/jsdomenu.js @@ -0,0 +1,1243 @@ +/* + + jsDOMenu Version 1.3.1 + Copyright (C) 2003 - 2005 Toh Zhiqiang + Released on 12 February 2005 + jsDOMenu is distributed under the terms of the GNU GPL license + Refer to license.txt for more informatiom + +*/ + +/* +Determine whether the browser is IE5.0. +*/ +function isIE50() { // Private method + return isIE5() && !isIE55(); +} + +/* +Determine whether the browser is IE5.5. +*/ +function isIE55() { // Private method + return navigator.userAgent.indexOf("MSIE 5.5") > -1; +} + +/* +Determine whether the browser is IE5.0 or IE5.5. +*/ +function isIE5() { // Private method + return navigator.userAgent.indexOf("MSIE 5") > -1; +} + +/* +Determine whether the browser is IE6. +*/ +function isIE6() { // Private method + return navigator.userAgent.indexOf("MSIE 6") > -1 && navigator.userAgent.indexOf("Opera") == -1; +} + +/* +Determine whether the browser is IE. +*/ +function isIE() { // Private method + return isIE5() || isIE6(); +} + +/* +Determine whether the browser is Opera. +*/ +function isOpera() { // Private method + return navigator.userAgent.indexOf("Opera") > -1; +} + +/* +Determine whether the browser is Safari. +*/ +function isSafari() { // Private method + return navigator.userAgent.indexOf("Safari") > -1; +} + +/* +Determine if is konqueror +*/ +function isKonqueror() { // Private method + return navigator.userAgent.indexOf("Konqueror") > -1; +} + + +/* +Determine the page render mode. + +0: Quirks mode. +1: Strict mode. +*/ +function getPageMode() { // Private method + if (document.compatMode) { + switch (document.compatMode) { + case "BackCompat": + return 0; + case "CSS1Compat": + return 1; + case "QuirksMode": + return 0; + } + } + else { + if (ie5) { + return 0; + } + if (safari) { + return 1; + } + } + return 0; +} + +/* +Alias for document.getElementById(). +*/ +function getElmId(id) { // Private method + return document.getElementById(id); +} + +/* +Alias for document.createElement(). +*/ +function createElm(tagName) { // Private method + return document.createElement(tagName); +} + +/* +Get the x-coordinate of the cursor position relative to the window. +*/ +function getX(e) { // Private method + if (!e) { + var e = window.event; + } + if (safari) { + return e.clientX - getScrollLeft(); + } + else { + return e.clientX; + } +} + +/* +Get the y-coordinate of the cursor position relative to the window. +*/ +function getY(e) { // Private method + if (!e) { + var e = window.event; + } + if (safari) { + return e.clientY - getScrollTop(); + } + else { + return e.clientY; + } +} + +/* +Get the scrollLeft property. +*/ +function getScrollLeft() { // Private method + switch (pageMode) { + case 0: + return document.body.scrollLeft; + case 1: + if (document.documentElement && document.documentElement.scrollLeft > 0) { + return document.documentElement.scrollLeft; + } + else { + return document.body.scrollLeft; + } + } +} + +/* +Get the scrollTop property. +*/ +function getScrollTop() { // Private method + switch (pageMode) { + case 0: + return document.body.scrollTop; + case 1: + if (document.documentElement && document.documentElement.scrollTop > 0) { + return document.documentElement.scrollTop; + } + else { + return document.body.scrollTop; + } + } +} + +/* +Get the clientHeight property. +*/ +function getClientHeight() { // Private method + switch (pageMode) { + case 0: + return document.body.clientHeight; + case 1: + if (safari) { + return self.innerHeight; + } + else { + if (!opera && document.documentElement && document.documentElement.clientHeight > 0) { + return document.documentElement.clientHeight; + } + else { + return document.body.clientHeight; + } + } + } +} + +/* +Get the clientWidth property. +*/ +function getClientWidth() { // Private method + switch (pageMode) { + case 0: + return document.body.clientWidth; + case 1: + if (safari) { + return self.innerWidth; + } + else { + if (!opera && document.documentElement && document.documentElement.clientWidth > 0) { + return document.documentElement.clientWidth; + } + else { + return document.body.clientWidth; + } + } + } +} + +/* +Convert the string into lower camel case. +*/ +function toCamelCase(input) { // Private method + var inputArray = input.split("-"); + if (inputArray.length == 1) { + return inputArray[0]; + } + else { + var camelCase = inputArray[0]; + for (var i = 1, len = inputArray.length; i < len; i++) { + camelCase += inputArray[i].charAt(0).toUpperCase() + inputArray[i].substring(1); + } + return camelCase; + } +} + +/* +Get the value of the property of the object. +*/ +function getPropVal(obj, propertyName) { // Private method + var propertyValue = obj.style[toCamelCase(propertyName)]; + if (propertyValue) { + return propertyValue; + } + else { + if (document.defaultView && document.defaultView.getComputedStyle) { + return document.defaultView.getComputedStyle(obj, null).getPropertyValue(propertyName); + } + else { + if (obj.currentStyle) { + return obj.currentStyle[toCamelCase(propertyName)]; + } + else { + return null; + } + } + } +} + +/* +Get the integer value of the property of the object. +*/ +function getPropIntVal(obj, propertyName) { // Private method + return parseInt(getPropVal(obj, propertyName)); +} + +/* +Get the left position of the pop-up menu. +*/ +function getMainMenuLeftPos(menuObj, x) { // Private method + if (x + menuObj.offsetWidth <= getClientWidth()) { + return x; + } + else { + return x - menuObj.offsetWidth; + } +} + +/* +Get the top position of the pop-up menu. +*/ +function getMainMenuTopPos(menuObj, y) { // Private method + if (y + menuObj.offsetHeight <= getClientHeight()) { + return y; + } + else { + return y - menuObj.offsetHeight; + } +} + +/* +Get the left position of the submenu. +*/ +function getSubMenuLeftPos(menuObj, x, offset) { // Private method + if (x + menuObj.offsetWidth - 2 <= getClientWidth()) { + return x - 2; + } + else { + return x - menuObj.offsetWidth - offset; + } +} + +/* +Get the top position of the submenu. +*/ +function getSubMenuTopPos(menuObj, y, offset) { // Private method + var top = getPropIntVal(menuObj, btw); + var bottom = getPropIntVal(menuObj, bbw); + if (y + menuObj.offsetHeight <= getClientHeight()) { + if (safari) { + return y - top; + } + else { + return y; + } + } + else { + if (safari) { + return y - menuObj.offsetHeight + offset + bottom; + } + else { + return y - menuObj.offsetHeight + offset + top + bottom; + } + } +} + +/* +Pop up the submenu. +*/ +function popUpSubMenu(menuItemObj) { // Private method + var parentMenuObj = menuItemObj.parent.menuObj; + var menuObj = menuItemObj.subMenu.menuObj; + var x; + var y; + if (parentMenuObj.style.position == "fixed") { + x = parentMenuObj.offsetLeft + parentMenuObj.offsetWidth - getPropIntVal(parentMenuObj, brw); + y = parentMenuObj.offsetTop + menuItemObj.offsetTop + getPropIntVal(parentMenuObj, btw) - getPropIntVal(menuObj, btw); + menuObj.style.position = "absolute"; + menuObj.style.left = getSubMenuLeftPos(menuObj, x, menuItemObj.offsetWidth) + px; + menuObj.style.top = getSubMenuTopPos(menuObj, y, menuItemObj.offsetHeight) + px; + menuObj.style.position = "fixed"; + } + else { + if (parentMenuObj.mode == "static" && !ie50) { + x = menuItemObj.offsetLeft + parentMenuObj.offsetWidth - getPropIntVal(parentMenuObj, blw) - getPropIntVal(parentMenuObj, brw) - getScrollLeft(); + y = menuItemObj.offsetTop - getPropIntVal(menuObj, btw) - getScrollTop(); + if (ie55 || ie6) { + x += getPropIntVal(parentMenuObj, blw); + y += getPropIntVal(parentMenuObj, btw); + } + if (safari) { + x += 8; + y += getPropIntVal(menuObj, btw) + 13; + } + menuObj.style.left = (getSubMenuLeftPos(menuObj, x, menuItemObj.offsetWidth) + getScrollLeft()) + px; + menuObj.style.top = (getSubMenuTopPos(menuObj, y, menuItemObj.offsetHeight) + getScrollTop()) + px; + } + else { + x = parentMenuObj.offsetLeft + parentMenuObj.offsetWidth - getPropIntVal(parentMenuObj, brw) - getScrollLeft(); + y = parentMenuObj.offsetTop + menuItemObj.offsetTop + getPropIntVal(parentMenuObj, btw) - getPropIntVal(menuObj, btw) - getScrollTop(); + menuObj.style.left = (getSubMenuLeftPos(menuObj, x, menuItemObj.offsetWidth) + getScrollLeft()) + px; + menuObj.style.top = (getSubMenuTopPos(menuObj, y, menuItemObj.offsetHeight) + getScrollTop()) + px; + } + } + if (ie && menuObj.mode == "fixed") { + menuObj.initialLeft = parseInt(menuObj.style.left) - getScrollLeft(); + menuObj.initialTop = parseInt(menuObj.style.top) - getScrollTop(); + } + menuObj.style.visibility = "visible"; +} + +/* +Pop up the main menu. +*/ +function popUpMainMenu(menuObj, e) { // Private method + menuObj.style.left = (getMainMenuLeftPos(menuObj, getX(e)) + getScrollLeft()) + px; + menuObj.style.top = (getMainMenuTopPos(menuObj, getY(e)) + getScrollTop()) + px; + var display = popUpMenuObj.menuObj.style.display; + popUpMenuObj.menuObj.style.display = "none"; + popUpMenuObj.menuObj.style.visibility = "visible"; + popUpMenuObj.menuObj.style.display = display; +} + +/* +Refresh the menu items. +*/ +function refreshMenuItems(menuObj) { // Private method + for (var i = 0, len = menuObj.childNodes.length; i < len; i++) { + if (menuObj.childNodes[i].enabled) { + menuObj.childNodes[i].className = menuObj.childNodes[i].itemClassName; + if (menuObj.childNodes[i].subMenu) { + menuObj.childNodes[i].arrowObj.className = menuObj.childNodes[i].arrowClassName; + } + if (menuObj.childNodes[i].iconObj) { + menuObj.childNodes[i].iconObj.className = menuObj.childNodes[i].iconClassName; + } + } + } +} + +/* +Event handler that handles onmouseover event of the menu item. +*/ +function menuItemOver(e) { // Private method + var previousItem = this.parent.previousItem; + if (previousItem) { + if (previousItem.className == previousItem.itemClassNameOver) { + previousItem.className = previousItem.itemClassName; + } + if (previousItem.subMenu) { + previousItem.className = previousItem.itemClassName; + previousItem.arrowObj.className = previousItem.arrowClassName; + if (previousItem.iconObj) { + previousItem.iconObj.className = previousItem.iconClassName; + } + } + var menuObj = getElmId(this.parent.menuObj.id); + for (var i = 0, len = menuObj.childNodes.length; i < len; i++) { + if (menuObj.childNodes[i].enabled && menuObj.childNodes[i].subMenu) { + hideMenus(menuObj.childNodes[i].subMenu.menuObj); + } + } + } + if (this.enabled) { + this.className = this.itemClassNameOver; + if (this.subMenu) { + this.arrowObj.className = this.arrowClassNameOver; + popUpSubMenu(this); + } + if (this.iconObj && this.iconClassNameOver) { + this.iconObj.className = this.iconClassNameOver; + } + } + this.parent.previousItem = this; +} + +/* +Event handler that handles onclick event of the menu item. +*/ +function menuItemClick(e) { // Private method + if (this.enabled && this.actionOnClick) { + var action = this.actionOnClick; + if (action.indexOf("link:") == 0) { + location.href = action.substr(5); + } + else { + if (action.indexOf("code:") == 0) { + eval(action.substr(5)); + } + else { + location.href = action; + } + } + } + if (!e) { + var e = window.event; + e.cancelBubble = true; + } + if (e.stopPropagation) { + e.stopPropagation(); + } + if (this.parent.menuObj.mode == "cursor") { + hideCursorMenus(); + } + if (this.parent.menuObj.mode == "absolute" || this.parent.menuObj.mode == "fixed") { + hideVisibleMenus(); + if (typeof(hideMenuBarMenus) == "function") { + hideMenuBarMenus(); + } + } +} + +/* +Event handler that handles onmouseout event of the menu item. +*/ +function menuItemOut() { // Private method + if (this.enabled) { + if (!(this.subMenu && this.subMenu.menuObj.style.visibility == "visible")) { + this.className = this.itemClassName; + } + if (this.subMenu) { + if (this.subMenu.menuObj.style.visibility == "visible") { + this.arrowObj.className = this.arrowClassNameOver; + if (this.iconObj) { + this.iconObj.className = this.iconClassNameOver; + } + } + } + else { + if (this.iconObj) { + this.iconObj.className = this.iconClassName; + } + } + } +} + +/* +Determine whether any of the tag name/tag id pair in the filter matches the tagName/tagId pair. +*/ +function findMatch(tagName, tagId, filter) { // Private method + for (var i = 0, len = filter.length; i < len; i++) { + var filterArray = filter[i].toLowerCase().split("."); + if ((filterArray[0] == "*" && filterArray[1] == "*") || + (filterArray[0] == "*" && filterArray[1] == tagId) || + (filterArray[0] == tagName && filterArray[1] == "*") || + (filterArray[0] == tagName && filterArray[1] == tagId)) { + return true; + } + } + return false; +} + +/* +Determine whether to show or hide the menu. +*/ +function canShowMenu(tagName, tagId, allExcept, noneExcept) { // Private method + if (allExcept.length > 0) { + return (!findMatch(tagName.toLowerCase(), tagId.toLowerCase(), allExcept)); + } + else { + if (noneExcept.length > 0) { + return findMatch(tagName.toLowerCase(), tagId.toLowerCase(), noneExcept); + } + else { + return true; + } + } +} + +/* +Shows/Hides the pop-up menu. +*/ +function activatePopUpMenu(e) { // Private method + if (!popUpMenuObj) { + return; + } + var state = popUpMenuObj.menuObj.style.visibility; + if (state == "visible") { + for (var i = 1; i <= menuCount; i++) { + var menuObj = getElmId("DOMenu" + i); + if (menuObj.mode == "cursor") { + menuObj.style.visibility = "hidden"; + menuObj.style.left = "0px"; + menuObj.style.top = "0px"; + menuObj.initialLeft = 0; + menuObj.initialTop = 0; + refreshMenuItems(menuObj); + } + } + } + else { + if (!e) { + var e = window.event; + } + setPopUpMenu(getPopUpMenuObj(e));if (popUpMenuObj==null) return;//DAMIANO + var targetElm = (e.target) ? e.target : e.srcElement; + if (targetElm.nodeType == 3) { + targetElm = targetElm.parentNode; + } + if (canShowMenu(targetElm.tagName, targetElm.id, popUpMenuObj.menuObj.allExceptFilter, popUpMenuObj.menuObj.noneExceptFilter)) { + popUpMainMenu(popUpMenuObj.menuObj, e); + } + } +} + +/* +Event handler that handles left click event. +*/ +function leftClickHandler(e) { // Private method + if (getX(e) > getClientWidth() || getY(e) > getClientHeight()) { + return; + } + if (!e) { + var e = window.event; + } + if (e.button && e.button == 2) { + return; + } + hideVisibleMenus(); + if (typeof(hideMenuBarMenus) == "function") { + hideMenuBarMenus(); + } + if (popUpMenuObj==null) setPopUpMenu(getPopUpMenuObj(e));//DAMIANO + if (popUpMenuObj) { + var state = popUpMenuObj.menuObj.style.visibility; + if (state == "visible" && (hideValue == 0 || hideValue == 2)) { + activatePopUpMenu(e); + } + if ((state == "hidden" || state == "") && (showValue == 0 || showValue == 2)) { + activatePopUpMenu(e); + } + } +} + +/* +Event handler that handles right click event. +*/ +function rightClickHandler(e) { // Private method + + if (getX(e) > getClientWidth() || getY(e) > getClientHeight()) { + return; + } + hideVisibleMenus(); + if (typeof(hideMenuBarMenus) == "function") { + hideMenuBarMenus(); + } + + if (!e) { + var e = window.event; + } + if (popUpMenuObj==null) setPopUpMenu(getPopUpMenuObj(e)); //DAMIANO + if (popUpMenuObj) { + var state = popUpMenuObj.menuObj.style.visibility; + if (state == "visible" && (hideValue == 1 || hideValue == 2)) { + activatePopUpMenu(e); + return false; + } + if ((state == "hidden" || state == "") && (showValue == 1 || showValue == 2)) { + activatePopUpMenu(e); + return false; + } + } +} + +/* +Event handler that handles scroll event. +*/ +function scrollHandler() { // Private method + for (var i = 1; i <= menuCount; i++) { + var menuObj = getElmId("DOMenu" + i); + if (ie && menuObj.mode == "fixed") { + menuObj.style.left = (menuObj.initialLeft + getScrollLeft()) + px; + menuObj.style.top = (menuObj.initialTop + getScrollTop()) + px; + } + } + if (typeof(menuBarScrollHandler) == "function") { + menuBarScrollHandler(); + } +} + +/* +Show the icon before the display text. +Arguments: +className : Required. String that specifies the CSS class selector for the icon. +classNameOver : Optional. String that specifies the CSS class selector for the icon when + the cursor is over the menu item. +*/ +function showMenuItemIcon() { // Public method + var iconElm = createElm("span"); + iconElm.id = this.id + "Icon"; + iconElm.className = arguments[0]; + this.insertBefore(iconElm, this.firstChild); + var height; + if (ie) { + height = getPropIntVal(iconElm, "height"); + } + else { + height = iconElm.offsetHeight; + } + iconElm.style.top = Math.floor((this.offsetHeight - height) / 2) + px; + if (ie) { + var left = getPropIntVal(iconElm, "left"); + if (ie55 || ie6) { + iconElm.style.left = (left - getPropIntVal(this, "padding-left")) + px; + } + else { + iconElm.style.left = left + px; + } + } + this.iconClassName = iconElm.className; + if (arguments.length > 1 && arguments[1].length > 0) { + this.iconClassNameOver = arguments[1]; + } + this.iconObj = iconElm; + this.setIconClassName = function(className) { // Public method + this.iconClassName = className; + this.iconObj.className = this.iconClassName; + }; + this.setIconClassNameOver = function(classNameOver) { // Public method + this.iconClassNameOver = classNameOver; + }; +} + +/* +Set the menu object that will show up when the cursor is over the menu item object. +Argument: +menuObj : Required. Menu object that will show up when the cursor is over the + menu item object. +*/ +function setSubMenu(menuObj) { // Public method + var arrowElm = createElm("div"); + arrowElm.id = this.id + "Arrow"; + arrowElm.className = this.arrowClassName; + this.appendChild(arrowElm); + var height; + if (ie) { + height = getPropIntVal(arrowElm, "height"); + } + else { + height = arrowElm.offsetHeight; + } + arrowElm.style.top = Math.floor((this.offsetHeight - height) / 2) + px; + this.subMenu = menuObj; + this.arrowObj = arrowElm; + this.setArrowClassName = function(className) { // Public method + this.arrowClassName = className; + this.arrowObj.className = this.arrowClassName; + }; + this.setArrowClassNameOver = function(classNameOver) { // Public method + this.arrowClassNameOver = classNameOver; + }; + menuObj.menuObj.style.zIndex = this.parent.menuObj.level + 1; + menuObj.menuObj.level = this.parent.menuObj.level + 1; +} + +/* +Add a new menu item to the menu. +Argument: +menuItemObj : Required. Menu item object that is going to be added to the menu object. +*/ +function addMenuItem(menuItemObj) { // Public method + if (menuItemObj.displayText == "-") { + var hrElm = createElm("hr"); + var itemElm = createElm("div"); + itemElm.appendChild(hrElm); + itemElm.id = menuItemObj.id; + if (menuItemObj.className.length > 0) { + itemElm.sepClassName = menuItemObj.className; + } + else { + itemElm.sepClassName = menuItemObj.sepClassName; + } + itemElm.className = itemElm.sepClassName; + this.menuObj.appendChild(itemElm); + itemElm.parent = this; + itemElm.setClassName = function(className) { // Public method + this.sepClassName = className; + this.className = this.sepClassName; + }; + itemElm.onclick = function(e) { // Private method + if (!e) { + var e = window.event; + e.cancelBubble = true; + } + if (e.stopPropagation) { + e.stopPropagation(); + } + }; + itemElm.onmouseover = menuItemOver; + if (menuItemObj.itemName.length > 0) { + this.items[menuItemObj.itemName] = itemElm; + } + else { + this.items[this.items.length] = itemElm; + } + } + else { + var itemElm = createElm("div"); + itemElm.id = menuItemObj.id; + itemElm.actionOnClick = menuItemObj.actionOnClick; + itemElm.enabled = menuItemObj.enabled; + itemElm.itemClassName = menuItemObj.className; + itemElm.itemClassNameOver = menuItemObj.classNameOver; + itemElm.className = itemElm.itemClassName; + itemElm.subMenu = null; + itemElm.arrowClassName = arrowClassName; + itemElm.arrowClassNameOver = arrowClassNameOver; + var textNode = document.createTextNode(menuItemObj.displayText); + itemElm.appendChild(textNode); + this.menuObj.appendChild(itemElm); + itemElm.parent = this; + itemElm.setClassName = function(className) { // Public method + this.itemClassName = className; + this.className = this.itemClassName; + }; + itemElm.setClassNameOver = function(classNameOver) { // Public method + this.itemClassNameOver = classNameOver; + }; + itemElm.setDisplayText = function(text) { // Public method + if (this.childNodes[0].nodeType == 3) { + this.childNodes[0].nodeValue = text; + } + else { + this.childNodes[1].nodeValue = text; + } + }; + itemElm.setSubMenu = setSubMenu; + itemElm.showIcon = showMenuItemIcon; + itemElm.onmouseover = menuItemOver; + itemElm.onclick = menuItemClick; + itemElm.onmouseout = menuItemOut; + if (menuItemObj.itemName.length > 0) { + this.items[menuItemObj.itemName] = itemElm; + } + else { + this.items[this.items.length] = itemElm; + } + } +} + +/* +Create a new menu item object. +Arguments: +displayText : Required. String that specifies the text to be displayed on the menu item. If + displayText = "-", a menu separator will be created instead. +itemName : Optional. String that specifies the name of the menu item. Defaults to "" (no + name). +actionOnClick : Optional. String that specifies the action to be done when the menu item is + being clicked. Defaults to "" (no action). +enabled : Optional. Boolean that specifies whether the menu item is enabled/disabled. + Defaults to true. +className : Optional. String that specifies the CSS class selector for the menu item. + Defaults to "jsdomenuitem". +classNameOver : Optional. String that specifies the CSS class selector for the menu item when + the cursor is over it. Defaults to "jsdomenuitemover". +*/ +function menuItem() { // Public method + this.displayText = arguments[0]; + + this.itemName = ""; + this.actionOnClick = ""; + this.enabled = true; + this.classNameOver = menuItemClassNameOver; + this.sepClassName = sepClassName; + var len = arguments.length; + if (len > 1 && arguments[1].length > 0) { + this.itemName = arguments[1]; + } + if (len > 2 && arguments[2].length > 0) { + this.actionOnClick = arguments[2]; + } + if (len > 3 && typeof(arguments[3]) == "boolean") { + this.enabled = arguments[3]; + } + if (len > 4 && arguments[4].length > 0) { + if (arguments[4] == "-") { + this.className = arguments[4]; + this.sepClassName = arguments[4]; + } + else { + this.className = arguments[4]; + } + } + if (len > 5 && arguments[5].length > 0) { + this.classNameOver = arguments[5]; + } + + if (this.displayText == "-") { + this.id = "menuSep" + (++sepCount); + this.className = sepClassName; + } + else { + this.id = "menuItem" + (++menuItemCount); + if (this.enabled) + this.className = menuItemClassName; + else + this.className = menuItemClassNameDisabled; + } +} + +/* +Create a new menu object. +Arguments: +width : Required. Integer that specifies the width of the menu. +mode : Optional. String that specifies the mode of the menu. Defaults to "cursor". +id : Optional, except when mode = "static". String that specifies the id of + the element that will contain the menu. This argument is required when + mode = "static". +alwaysVisible : Optional. Boolean that specifies whether the menu is always visible. Defaults + to false. +className : Optional. String that specifies the CSS class selector for the menu. Defaults + to "jsdomenudiv". +*/ +function jsDOMenu() { // Public method + this.items = new Array(); + var menuElm; + var len = arguments.length; + if (len > 2 && arguments[2].length > 0 && arguments[1] == "static") { + menuElm = getElmId(arguments[2]); + if (!menuElm) { + return; + } + staticMenuId[staticMenuId.length] = arguments[2]; + } + else { + menuElm = createElm("div"); + menuElm.id = "DOMenu" + (++menuCount); + } + menuElm.level = 10; + menuElm.previousItem = null; + menuElm.allExceptFilter = allExceptFilter; + menuElm.noneExceptFilter = noneExceptFilter; + menuElm.className = menuClassName; + menuElm.mode = menuMode; + menuElm.alwaysVisible = false; + menuElm.initialLeft = 0; + menuElm.initialTop = 0; + if (len > 1 && arguments[1].length > 0) { + switch (arguments[1]) { + case "cursor": + menuElm.style.position = "absolute"; + menuMode.mode = "cursor"; + break; + case "absolute": + menuElm.style.position = "absolute"; + menuElm.mode = "absolute"; + break; + case "fixed": + if (ie) { + menuElm.style.position = "absolute"; + } + else { + menuElm.style.position = "fixed"; + } + menuElm.mode = "fixed"; + break; + case "static": + menuElm.style.position = "static"; + menuElm.mode = "static"; + break; + } + } + if (len > 3 && typeof(arguments[3]) == "boolean") { + menuElm.alwaysVisible = arguments[3]; + } + if (len > 4 && arguments[4].length > 0) { + menuElm.className = arguments[4]; + } + menuElm.style.width = arguments[0] + px; + menuElm.style.left = "0px"; + menuElm.style.top = "0px"; + if (menuElm.mode != "static") { + document.body.appendChild(menuElm); + } + if (!getPropVal(menuElm, blw)) { + menuElm.style.borderWidth = menuBorderWidth + px; + } + this.menuObj = menuElm; + this.addMenuItem = addMenuItem; + this.setClassName = function(className) { // Public method + this.menuObj.className = className; + }; + this.setMode = function(mode) { // Public method + switch (mode) { + case "cursor": + this.menuObj.style.position = "absolute"; + this.menuObj.mode = "cursor"; + break; + case "absolute": + this.menuObj.style.position = "absolute"; + this.menuObj.mode = "absolute"; + this.menuObj.initialLeft = parseInt(this.menuObj.style.left); + this.menuObj.initialTop = parseInt(this.menuObj.style.top); + break; + case "fixed": + if (ie) { + this.menuObj.style.position = "absolute"; + this.menuObj.initialLeft = parseInt(this.menuObj.style.left); + this.menuObj.initialTop = parseInt(this.menuObj.style.top); + } + else { + this.menuObj.style.position = "fixed"; + } + this.menuObj.mode = "fixed"; + break; + } + }; + this.setAlwaysVisible = function(alwaysVisible) { // Public method + if (typeof(alwaysVisible) == "boolean") { + this.menuObj.alwaysVisible = alwaysVisible; + } + }; + this.show = function() { // Public method + this.menuObj.style.visibility = "visible"; + }; + this.hide = function() { // Public method + this.menuObj.style.visibility = "hidden"; + if (this.menuObj.mode == "cursor") { + this.menuObj.style.left = "0px"; + this.menuObj.style.top = "0px"; + this.menuObj.initialLeft = 0; + this.menuObj.initialTop = 0; + } + }; + this.setX = function(x) { // Public method + this.menuObj.initialLeft = x; + this.menuObj.style.left = x + px; + }; + this.setY = function(y) { // Public method + this.menuObj.initialTop = y; + this.menuObj.style.top = y + px; + }; + this.moveTo = function(x, y) { // Public method + this.menuObj.initialLeft = x; + this.menuObj.initialTop = y; + this.menuObj.style.left = x + px; + this.menuObj.style.top = y + px; + }; + this.moveBy = function(x, y) { // Public method + var left = parseInt(this.menuObj.style.left); + var top = parseInt(this.menuObj.style.top); + this.menuObj.initialLeft = left + x; + this.menuObj.initialTop = top + y; + this.menuObj.style.left = (left + x) + px; + this.menuObj.style.top = (top + y) + px; + }; + this.setAllExceptFilter = function(filter) { // Public method + this.menuObj.allExceptFilter = filter; + this.menuObj.noneExceptFilter = new Array(); + }; + this.setNoneExceptFilter = function(filter) { // Public method + this.menuObj.noneExceptFilter = filter; + this.menuObj.allExceptFilter = new Array(); + }; + this.setBorderWidth = function(width) { // Public method + this.menuObj.style.borderWidth = width + px; + }; +} + +/* +Specifies how the pop-up menu shows/hide. +Arguments: +showValue : Required. Integer that specifies how the menu shows. +hideValue : Optional. Integer that specifies how the menu hides. If not specified, the + menu shows/hides in the same manner. + +0: Shows/Hides the menu by left click only. +1: Shows/Hides the menu by right click only. +2: Shows/Hides the menu by left or right click. +*/ +function activatePopUpMenuBy() { // Public method + showValue = typeof(arguments[0]) == "number" && arguments[0] > -1 ? arguments[0] : 0; + if (arguments.length > 1) { + hideValue = typeof(arguments[1]) == "number" && arguments[1] > -1 ? arguments[1] : 0; + } + else { + hideValue = showValue; + } + if (showValue == 1 || showValue == 2 || hideValue == 1 || hideValue == 2) { + document.oncontextmenu = rightClickHandler; + } +} + +/* +Hide all menus, except those with alwaysVisible = true. +*/ +function hideAllMenus() { // Public method + for (var i = 1; i <= menuCount; i++) { + var menuObj = getElmId("DOMenu" + i); + if (!menuObj.alwaysVisible) { + if (menuObj.style.position == "fixed") { + menuObj.style.position == "absolute"; + menuObj.style.visibility = "hidden"; + menuObj.style.position == "fixed"; + } + else { + menuObj.style.visibility = "hidden"; + if (menuObj.mode == "cursor") { + menuObj.style.left = "0px"; + menuObj.style.top = "0px"; + menuObj.initialLeft = 0; + menuObj.initialTop = 0; + } + } + } + refreshMenuItems(menuObj); + } + for (var i = 0, len = staticMenuId.length; i < len; i++) { + refreshMenuItems(getElmId(staticMenuId[i])); + } +} + +/* +Hide all menus with mode = "cursor", except those with alwaysVisible = true. +*/ +function hideCursorMenus() { // Public method + for (var i = 1; i <= menuCount; i++) { + var menuObj = getElmId("DOMenu" + i); + if (menuObj.mode == "cursor" && !menuObj.alwaysVisible) { + menuObj.style.visibility = "hidden"; + menuObj.style.left = "0px"; + menuObj.style.top = "0px"; + menuObj.initialLeft = 0; + menuObj.initialTop = 0; + } + if (menuObj.mode == "cursor") { + refreshMenuItems(menuObj); + } + } +} + +/* +Hide all menus with mode = "absolute" or mode = "fixed" or mode = "static", except those with +alwaysVisible = true. +*/ +function hideVisibleMenus() { // Public method + for (var i = 1; i <= menuCount; i++) { + var menuObj = getElmId("DOMenu" + i); + if ((menuObj.mode == "absolute" || menuObj.mode == "fixed") && !menuObj.alwaysVisible) { + if (menuObj.style.position == "fixed") { + menuObj.style.position = "absolute"; + menuObj.style.visibility = "hidden"; + menuObj.style.position = "fixed"; + } + else { + menuObj.style.visibility = "hidden"; + menuObj.style.left = "0px"; + menuObj.style.top = "0px"; + menuObj.initialLeft = 0; + menuObj.initialTop = 0; + } + } + if (menuObj.mode == "absolute" || menuObj.mode == "fixed") { + refreshMenuItems(menuObj); + } + } + for (var i = 0, len = staticMenuId.length; i < len; i++) { + refreshMenuItems(getElmId(staticMenuId[i])); + } + if (typeof(staticMenuBarId) == "object") { + for (var i = 0, len = staticMenuBarId.length; i < len; i++) { + refreshMenuBarItems(getElmId(staticMenuBarId[i])); + } + } + hideVisibleCallback(); +} + +/* +Hide the menu and all its submenus. +Argument: +menuObj : Required. Menu object that specifies the menu and all its submenus to + be hidden. +*/ +function hideMenus(menuObj) { // Public method + refreshMenuItems(menuObj); + for (var i = 0, len = menuObj.childNodes.length; i < len; i++) { + if (menuObj.childNodes[i].enabled && menuObj.childNodes[i].subMenu) { + hideMenus(menuObj.childNodes[i].subMenu.menuObj); + } + } + if (menuObj.style.position == "fixed") { + menuObj.style.position = "absolute"; + menuObj.style.visibility = "hidden"; + menuObj.style.position = "fixed"; + } + else { + menuObj.style.visibility = "hidden"; + menuObj.style.left = "0px"; + menuObj.style.top = "0px"; + menuObj.initialLeft = 0; + menuObj.initialTop = 0; + } +} + +/* +Set the menu object to be the pop-up menu. +Argument: +menuObj : Required. Menu object that specifies the pop-up menu. +*/ +function setPopUpMenu(menuObj) { // Public method + popUpMenuObj = menuObj; +} + +/* +Check browser compatibility and create the menus. +*/ +function initjsDOMenu() { // Public method + if (document.createElement && document.getElementById) { + createjsDOMenu(); + } +} + +if (typeof(allExceptFilter) == "undefined") { + var allExceptFilter = new Array("A.*", + "BUTTON.*", + "IMG.*", + "INPUT.*", + "OBJECT.*", + "OPTION.*", + "SELECT.*", + "TEXTAREA.*"); // Public field +} + +if (typeof(noneExceptFilter) == "undefined") { + var noneExceptFilter = new Array(); // Public field +} + +if (typeof(menuClassName) == "undefined") { + var menuClassName = "jsdomenudiv"; // Public field +} + +if (typeof(menuItemClassName) == "undefined") { + var menuItemClassName = "jsdomenuitem"; // Public field +} + +if (typeof(menuItemClassNameDisabled) == "undefined") { + var menuItemClassNameDisabled = "jsdomenuitemdisabled"; // Public field +} + +if (typeof(menuItemClassNameOver) == "undefined") { + var menuItemClassNameOver = "jsdomenuitemover"; // Public field +} + +if (typeof(sepClassName) == "undefined") { + var sepClassName = "jsdomenusep"; // Public field +} + +if (typeof(arrowClassName) == "undefined") { + var arrowClassName = "jsdomenuarrow"; // Public field +} + +if (typeof(arrowClassNameOver) == "undefined") { + var arrowClassNameOver = "jsdomenuarrowover"; // Public field +} + +if (typeof(menuMode == "undefined")) { + var menuMode = "cursor"; // Public field +} + +if (typeof(menuBorderWidth) == "undefined") { + var menuBorderWidth = 2; // Public field +} + +var ie50 = isIE50(); // Private field +var ie55 = isIE55(); // Private field +var ie5 = isIE5(); // Private field +var ie6 = isIE6(); // Private field +var ie = isIE(); // Private field +var opera = isOpera(); // Private field +var safari = isSafari(); // Private field +var pageMode = getPageMode(); // Private field +var px = "px"; // Private field +var btw = "border-top-width"; // Private field +var bbw = "border-bottom-width"; // Private field +var blw = "border-left-width"; // Private field +var brw = "border-right-width"; // Private field +var menuCount = 0; // Private field +var menuItemCount = 0; // Private field +var sepCount = 0; // Private field +var popUpMenuObj = null; // Private field +var showValue = 0; // Private field +var hideValue = 0; // Private field +var staticMenuId = new Array(); // Private field +document.onclick = leftClickHandler; +window.onscroll = scrollHandler; diff --git a/www/extras/wobject/EventManagementSystem/script/locale_EN.js b/www/extras/wobject/EventManagementSystem/script/locale_EN.js new file mode 100644 index 000000000..946bd1dc1 --- /dev/null +++ b/www/extras/wobject/EventManagementSystem/script/locale_EN.js @@ -0,0 +1,32 @@ +/***************************************************************** + Page : locale_EN.js + Description : text for english version + Date : 20/04/05 + Authors:Alessandro Viganò (avigano@Movinfo.it) / Filippo Zanardo (fzanardo@MOViNFO.it) + Copyright (C) 2005-2006 MOViNFO + +MovTable 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.1 of the License, or (at your option) any later version. + +MovTable 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 library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************/ + +var getTextStrings= new Array() +getTextStrings["Nascondi Colonna"]="Hide Column" +getTextStrings["Mostra Colonne"]="Show Columns" +getTextStrings["Tutte"]="All" +getTextStrings["Filtro in base a selezione"]="Filter by selection" +getTextStrings["Filtro ad esclusione selezione"]="Filter out selection" +getTextStrings["Rimuovi filtro"]="Remove Filter" +getTextStrings["Ordinamento crescente"]="Ascending Order" +getTextStrings["Ordinamento decrescente"]="Descending order" +getTextStrings["Copia"]="Copy" diff --git a/www/extras/wobject/EventManagementSystem/script/movtableInc.js b/www/extras/wobject/EventManagementSystem/script/movtableInc.js new file mode 100644 index 000000000..ae595cac4 --- /dev/null +++ b/www/extras/wobject/EventManagementSystem/script/movtableInc.js @@ -0,0 +1,1127 @@ +/***************************************************************** + Page : movtableinc.js + Description : main javascript + Date : 20/04/05 + Authors:Alessandro Viganò (avigano@Movinfo.it) / Filippo Zanardo (fzanardo@MOViNFO.it) + Copyright (C) 2005-2006 MOViNFO + +MovTable is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public +modify it under the terms of the GNU General Public +License as published by the Free Software Foundation; either +version 2.1 of the License, or (at your option) any later version. + +MovTable 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 library; if not, write to the Free Software +Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +******************************************************************/ + +var selectedText; +var selectedElem; +var targetElm; +var myTable; +var hiddenCols; +var activeHeaders= null; +var moveColumn=null; +var dragHeaderDiv=null; +var topElement=null; +var topElementByTag=null; +var originalOnSelect; +var eventProcessed=false; + +/** +* Initializing function, to be called on document onload +* +*/ +function sortableInit() +{ + initjsDOMenu(); + myTable=new table(tableClass); + document.onmousedown=mouseDown; +} + +/** +* Function called by jsDOMenu. It creates the dynamic context menus and it passes them back +* +*/ +function getPopUpMenuObj(e) +{ + + targetElm = (e.target) ? e.target : e.srcElement; + + if (targetElm.nodeType==3) //Text Node returned by Konqueror + targetElm=targetElm.parentNode; + if (targetElm.parentNode.tagName=='TH') targetElm=targetElm.parentNode; + + + if (targetElm.tagName=='TD' || targetElm.tagName=='TH') { + selectedText=selectElement(targetElm); + cursorMenu1 = new jsDOMenu(210); + var colID=getColID(targetElm); + //filterurl=baseurl+'&filterByIndexCol='+myTable.columns.getColByID(colID).index+"&filterByIndexRow="+ (getRow(targetElm)-1); + //removeFilter=baseurl+"&removefilter"; + //sorturl=baseurl+'&sortByIndexCol='+myTable.columns.getColByID(colID).index; + //alert(colID); + //alert(myTable.columns.getColByID(colID).id); + if (targetElm.tagName=='TH') { + + hiddenCols=myTable.columns.listInvisible(); + //Controlla se rimane visibile solo 1 colonna + if (JScolhide==1) + if ((myTable.columns.item.length-hiddenCols.length)==1) + cursorMenu1.addMenuItem(new menuItem("Hide Column", "", "",false)); + else + //cursorMenu1.addMenuItem(new menuItem("Nascondi Colonna", "", "code:myTable.columns.item["+getCellIndex(targetElm)+"].hideColumn()")); + cursorMenu1.addMenuItem(new menuItem("Hide Column", "", "code:myTable.columns.getColByID('"+colID+"').hideColumn()")); + + //Controlla se ci sono colonne nascoste + if (myTable.columns.hidden()) { + cursorMenu1.addMenuItem(new menuItem("Show Columns", "mColonne", "code:myTable.columns.listInvisible()")); + columnsMenu= new jsDOMenu(210); + + for (var x=0;x 1) { + columnsMenu.addMenuItem(new menuItem("-")); + columnsMenu.addMenuItem(new menuItem("All","","code:myTable.columns.show()")); + } + + cursorMenu1.items["mColonne"].setSubMenu(columnsMenu); + } + else + cursorMenu1.addMenuItem(new menuItem("Show Columns", "mColonne", "code:myTable.columns.listInvisible()",false)); + + //cursorMenu1.addMenuItem(new menuItem("Debug", "", "code:debug()")); + } + if (targetElm.tagName=='TD') { + var editUrl = ""; + var transferUrl = ""; + var terminateUrl = ""; + var tr = targetElm.parentNode; + var len=tr.childNodes.length; + var lastElem = tr.childNodes[len-1]; + var lastElemLen = lastElem.childNodes.length; + for (var i=0; i < lastElemLen; i++){ + var lastElemNode = lastElem.childNodes[i]; + if(lastElemNode.tagName == "A") { + if(lastElemNode.id.indexOf("edit") > -1) { + editUrl = lastElemNode.href; + }else if(lastElemNode.id.indexOf("transfer") > -1) { + transferUrl = lastElemNode.href; + }else if(lastElemNode.id.indexOf("terminate") > -1) { + terminateUrl = lastElemNode.href; + } + } + } + //alert(editUrl) + //alert(transferUrl); + //alert(terminateUrl); + + if (myTable.columns.getColByID(colID).filterable) + { + cursorMenu1.addMenuItem(new menuItem("Edit Employee", "", editUrl)); + cursorMenu1.addMenuItem(new menuItem("Transfer Employee", "", transferUrl)); + cursorMenu1.addMenuItem(new menuItem("Terminate Employee", "", terminateUrl)); + } + else + { + cursorMenu1.addMenuItem(new menuItem("Edit Employee", "", "",false)); + cursorMenu1.addMenuItem(new menuItem("Transfer Employee", "", "",false)); + cursorMenu1.addMenuItem(new menuItem("Terminate Employee", "", "",false)); + } + //if (filtered) + // cursorMenu1.addMenuItem(new menuItem(getText("Rimuovi filtro"), "", removeFilter)); + //else + // cursorMenu1.addMenuItem(new menuItem(getText("Rimuovi filtro"), "", removeFilter,false)); + cursorMenu1.addMenuItem(new menuItem("-")); + } + + //Sort menu items + if (myTable.columns.getColByID(colID).sortable) { + var colVars = colID.split("_"); + var sortASCurl = "javascript:void(sortFields('"+colVars[1]+"','asc'));"; + var sortDESCurl = "javascript:void(sortFields('"+colVars[1]+"','desc'));"; + cursorMenu1.addMenuItem(new menuItem("Sort Ascending", "",sortASCurl)); + cursorMenu1.addMenuItem(new menuItem("Sort Descending", "",sortDESCurl)); + } + else + { + cursorMenu1.addMenuItem(new menuItem("Sort Ascending", "", "",false)); + cursorMenu1.addMenuItem(new menuItem("Sort Descending", "", "",false)); + } + //cursorMenu1.addMenuItem(new menuItem(getText("Copia"), "", "code:copyElement(selectedText)")); + return cursorMenu1; + } + else + return null; +} + +function debug() +{ + var colOrder=''; + var rows=myTable.table.getElementsByTagName('TBODY')[0].getElementsByTagName('TR'); + var cols=rows[0].getElementsByTagName('TH'); + + for (var x=0;x 0) + element=anchors[0]; + + return element.innerHTML; +} + +/** +* @class Representation of a column +* @param {tableCell} th TH element +* @param {columns} parent columns object +*/ +function column (th,parent) +{ + //FIELDS + + /** + *The column display name + *@type string + */ + this.displayName=columnGetName(th); + + /** + *The HTML element object + *@type HTMLelement + */ + this.element=th; + + /** + *The real field name + *@type string + */ + this.fieldName=this.element.id.slice(9); + + /** + *Original display order index + *@type int + */ + this.index=getCellIndex(th); + + /** + *Reference to columns object + *@type columns + */ + this.parent=parent; + + /** + *Reference to table object + *@type table + */ + this.table=this.parent.parent; + + /** + *Column is sortable + *@type boolean + */ + this.sortable=sortable[this.index]; + + /** + *Column is filterable + *@type boolean + */ + this.filterable=filterable[this.index]; + + /** + *Column is visible + *@type boolean + */ + this.visible=true; + + + //METHODS + this.hideColumn=column_hideColumn; + this.showColumn=column_showColumn; + this.setVisible=column_setVisible; + this.setWidth=column_setWidth; + this.retrieveStatus=column_retrieveStatus; + this.getAbsoluteIndx=column_getAbsoluteIndx; + this.getRelativeIndx=column_getRelativeIndx; + //constructor code + this.retrieveStatus(); +} + +/** +* It return the right cell index, fixing the IE explorer behaviour +* @return {int} The absolute cell index +*/ +function column_getAbsoluteIndx() +{ + if (isIE()) { + var x=0; + while (this.table.rows[0].getElementsByTagName('TH')[x].id != this.element.id) + x++; + return x; + } + else + if (isKonqueror() || isSafari()) + return getKCellIndex(this.element); + else + return this.element.cellIndex; +} + +/** +* It return the relative cell index, as displayed on screen (as IE does) +* @return {int} The relative cell index +*/ +function column_getRelativeIndx() +{ + if (isIE()) + return this.element.cellIndex; + else + { + if (isKonqueror() || isSafari()) + var colIndx=getKCellIndex(this.element); + else + var colIndx=this.element.cellIndex; + + var stop=colIndx; + + for (var x=0;x l'indice è quello originale + var displayIndex= (col != null) ? getCellIndex(col) : this.index; + var rows=this.table.rows; + for (var x=0;x0) + var cols=rows[x].getElementsByTagName('TD'); + else + var cols=rows[x].getElementsByTagName('TH'); + + cols[displayIndex].style.display='none'; + + } + + this.setVisible(false); + if (isKonqueror() || isSafari()) + this.parent.resetSize(); +} + +/** +* Show the column +*/ +function column_showColumn() { + var rows=this.table.rows; + var displayIndex= this.getAbsoluteIndx(); + for (var x=0;x0) + var cols=rows[x].getElementsByTagName('TD'); + else + var cols=rows[x].getElementsByTagName('TH'); + + if (isKonqueror() || isSafari()) + cols[displayIndex].style.display='table-cell'; + else + cols[displayIndex].removeAttribute('style'); + + } + this.setVisible(true); + var colEl= document.createElement("COL"); + this.table.table.getElementsByTagName('colgroup')[0].appendChild(colEl); + + if (isKonqueror() || isSafari()) + this.parent.resetSize(); +} + +/** +* @class Representation of columns +* @param {tableRow} tr TR element +* @param {table} parent table object +*/ +function columns (tr,parent) +{ + //FIELDS + /** + * Collection of column objects + * @type array of column + */ + this.item= new Array(); + /** + * Reference to table object + * @type table + */ + this.parent= parent; + + //METHODS + this.listInvisible=columns_listInvisible; + this.hidden=columns_hidden; + this.show=columns_show; + this.getColByID=columns_getColByID; + this.recol=columns_recol; + this.setOrder=columns_setOrder; + this.resetSize=columns_resetSize; + + //Constructor Code + var cols=tr.getElementsByTagName('TH'); + + for (var x=0;x