]> ruin.nu Git - ndwebbie.git/commitdiff
Converted calls page, also using jquery.
authorMichael Andreen <harv@ruin.nu>
Thu, 3 Jul 2008 11:55:14 +0000 (13:55 +0200)
committerMichael Andreen <harv@ruin.nu>
Thu, 3 Jul 2008 11:55:14 +0000 (13:55 +0200)
13 files changed:
NDWeb/Pages/Calls.pm [deleted file]
database/group_roles.sql
lib/NDWeb.pm
lib/NDWeb/Controller/Calls.pm [new file with mode: 0644]
lib/NDWeb/Controller/Forum.pm
root/lib/site/html.tt2
root/lib/site/leftbar.tt2
root/src/calls/edit.tt2 [new file with mode: 0644]
root/src/calls/list.tt2 [new file with mode: 0644]
root/static/js/jquery-1.2.6.min.js [new file with mode: 0644]
root/static/js/misc.js [deleted file]
t/controller_Calls.t [new file with mode: 0644]
templates/calls.tmpl [deleted file]

diff --git a/NDWeb/Pages/Calls.pm b/NDWeb/Pages/Calls.pm
deleted file mode 100644 (file)
index 6e51754..0000000
+++ /dev/null
@@ -1,296 +0,0 @@
-#**************************************************************************
-#   Copyright (C) 2006 by Michael Andreen <harvATruinDOTnu>               *
-#                                                                         *
-#   This program is free software; you can redistribute it and/or modify  *
-#   it under the terms of the GNU General Public License as published by  *
-#   the Free Software Foundation; either version 2 of the License, or     *
-#   (at your option) any later version.                                   *
-#                                                                         *
-#   This program is distributed in the hope that it will be useful,       *
-#   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
-#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
-#   GNU General Public License for more details.                          *
-#                                                                         *
-#   You should have received a copy of the GNU General Public License     *
-#   along with this program; if not, write to the                         *
-#   Free Software Foundation, Inc.,                                       *
-#   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.         *
-#**************************************************************************/
-package NDWeb::Pages::Calls;
-use strict;
-use warnings;
-use NDWeb::Forum;
-use ND::Include;
-use CGI qw/:standard/;
-use NDWeb::Include;
-
-use base qw/NDWeb::XMLPage/;
-
-$NDWeb::Page::PAGES{calls} = __PACKAGE__;
-
-sub render_body {
-       my $self = shift;
-       my ($BODY) = @_;
-       $self->{TITLE} = 'Defense Calls';
-       my $DBH = $self->{DBH};
-
-       return $self->noAccess unless $self->isDC;
-
-       my $call;
-       my $thread;
-       if (defined param('call') && param('call') =~ /^(\d+)$/){
-               my $query = $DBH->prepare(q{
-                       SELECT c.id, coords(p.x,p.y,p.z), c.landing_tick, c.info, covered, open, dc.username AS dc, u.defense_points,c.member,u.planet, u.username AS member, u.sms,c.ftid
-                       FROM calls c 
-                       JOIN users u ON c.member = u.uid
-                       LEFT OUTER JOIN users dc ON c.dc = dc.uid
-                       JOIN current_planet_stats p ON u.planet = p.id
-                       WHERE c.id = ?});
-               $call = $DBH->selectrow_hashref($query,undef,$1);
-
-               $thread = $DBH->selectrow_hashref(q{SELECT ftid AS id, subject FROM forum_threads
-                       where ftid = $1},undef,$call->{ftid}) or warn $DBH->errstr;
-       }
-       if ($call && defined param('cmd')){
-               if (param('cmd') eq 'Submit'){
-                       $DBH->begin_work;
-                       if (param('ctick')){
-                               if ($DBH->do(q{UPDATE calls SET landing_tick = ? WHERE id = ?}
-                                               ,undef,param('tick'),$call->{id})){
-                                       $call->{landing_tick} = param('tick');
-                                       def_log $ND::UID,$call->{id},"Updated landing tick to [B] $call->{landing_tick} [/B]";
-                               }else{
-                                       warn $DBH->errstr;
-                               }
-                       }
-                       if (param('cinfo')){
-                               if ($DBH->do(q{UPDATE calls SET info = ? WHERE id = ?}
-                                               ,undef,param('info'),$call->{id})){
-                                       $call->{info} = param('info');
-                                       def_log $ND::UID,$call->{id},"Updated info";
-                               }else{
-                                       warn $DBH->errstr;
-                               }
-                       }
-                       $DBH->commit or warn $DBH->errstr;
-               }elsif(param('cmd') =~ /^(Cover|Uncover|Ignore|Open|Take) call$/){
-                       my $extra_vars = '';
-                       if (param('cmd') eq 'Cover call'){
-                               $extra_vars = ", covered = TRUE, open = FALSE";
-                       }elsif (param('cmd') eq 'Uncover call'){
-                               $extra_vars = ", covered = FALSE, open = TRUE";
-                       }elsif (param('cmd') eq 'Ignore call'){
-                               $extra_vars = ", covered = FALSE, open = FALSE";
-                       }elsif (param('cmd') eq 'Open call'){
-                               $extra_vars = ", covered = FALSE, open = TRUE";
-                       }
-                       if ($DBH->do(qq{UPDATE calls SET dc = ? $extra_vars WHERE id = ?},
-                                       ,undef,$ND::UID,$call->{id})){
-                               $call->{covered} = (param('cmd') eq 'Cover call');
-                               $call->{open} = (param('cmd') =~ /^(Uncover|Open) call$/);
-                               $call->{DC} = $self->{USER};
-                               def_log $ND::UID,$call->{id},'Changed status to: [B]'.param('cmd').'[/B]';
-                       }else{
-                               warn $DBH->errstr;
-                       }
-               }elsif(param('cmd') eq 'Remove'){
-                       $DBH->begin_work;
-                       my $query = $DBH->prepare(q{DELETE FROM incomings WHERE id = ? AND call = ?});
-                       for my $param (param()){
-                               if ($param =~ /^change:(\d+)$/){
-                                       if($query->execute($1,$call->{id})){
-                                               def_log $ND::UID,$call->{id},"Deleted fleet: [B] $1 [/B]";
-                                       }else{
-                                               warn $DBH->errstr;
-                                       }
-                               }
-                       }
-                       $DBH->commit or warn $DBH->errstr;
-               }elsif(param('cmd') eq 'Change'){
-                       $DBH->begin_work;
-                       my $query = $DBH->prepare(q{UPDATE incomings SET shiptype = ? WHERE id = ? AND call = ?});
-                       for my $param (param()){
-                               if ($param =~ /^change:(\d+)$/){
-                                       my $shiptype = escapeHTML(param("shiptype:$1"));
-                                       if($query->execute($shiptype,$1,$call->{id})){
-                                               def_log $ND::UID,$call->{id},"set fleet: [B] $1 [/B] to: [B] $shiptype [/B]";
-                                       }else{
-                                               warn $DBH->errstr;
-                                       }
-                               }
-                       }
-                       $DBH->commit or warn $DBH->errstr;
-               }
-               if (defined $thread and param('cmd') eq 'forumpost'){
-                       addForumPost($DBH,$thread,$ND::UID,param('message'));
-               }
-       }
-
-       if ($call){
-               $BODY->param(Call => $call->{id});
-               $BODY->param(Coords => $call->{coords});
-               $BODY->param(DefensePoints => $call->{defense_points});
-               $BODY->param(LandingTick => $call->{landing_tick});
-               $BODY->param(ETA => $call->{landing_tick}-$self->{TICK});
-               $BODY->param(Info => $call->{info});
-               $BODY->param(DC => $call->{dc});
-               $BODY->param(Member => $call->{member});
-               $BODY->param(SMS => $call->{sms});
-               $BODY->param(Thread => viewForumThread $thread);
-               if ($call->{covered}){
-                       $BODY->param(Cover => 'Uncover');
-               }else{
-                       $BODY->param(Cover => 'Cover');
-               }
-               if ($call->{open} && !$call->{covered}){
-                       $BODY->param(Ignore => 'Ignore');
-               }else{
-                       $BODY->param(Ignore => 'Open');
-               }
-
-               my $outgoings = $DBH->prepare(q{ 
-                       SELECT i.id,i.mission, i.name, i.tick,eta
-                               , i.amount, coords(x,y,z) AS target
-                       FROM fleets i
-                       LEFT OUTER JOIN (planets
-                               NATURAL JOIN planet_stats) t ON i.target = t.id
-                                       AND t.tick = ( SELECT MAX(tick) FROM planet_stats)
-                       WHERE  i.sender = $1 
-                               AND (i.tick > $2 - 14 OR i.mission = 'Full fleet')
-                       ORDER BY i.tick,x,y,z
-               });
-               my $ships = $DBH->prepare('SELECT ship,amount FROM fleet_ships WHERE id = ? ORDER BY num');
-               $outgoings->execute($call->{planet},$call->{landing_tick});
-               my @fleets;
-               while (my $fleet = $outgoings->fetchrow_hashref){
-                       if (defined $fleet->{back} &&
-                                       $fleet->{back} == $call->{landing_tick}){
-                               $fleet->{Fleetcatch} = 1;
-                       }
-                       $ships->execute($fleet->{id});
-                       my @ships;
-                       while (my $ship = $ships->fetchrow_hashref){
-                               push @ships,$ship;
-                       }
-                       $fleet->{Ships} = \@ships;
-                       push @fleets, $fleet;
-               }
-               $BODY->param(Fleets => \@fleets);
-
-               my $defenders = $DBH->prepare(q{ 
-                       SELECT i.id,i.mission, i.name, i.tick,eta
-                               , i.amount, coords(x,y,z) AS sender
-                       FROM fleets i
-                       LEFT OUTER JOIN (planets
-                               NATURAL JOIN planet_stats) s ON i.sender = s.id
-                                       AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
-                       WHERE i.target = ?
-                               AND i.tick = ? AND i.mission = 'Defend'
-                       ORDER BY i.tick,x,y,z
-               });
-
-               $defenders->execute($call->{planet},$call->{landing_tick}) or warn $DBH->errstr;
-               my @defenders;
-               while (my $fleet = $defenders->fetchrow_hashref){
-                       $fleet->{CLASS} = $fleet->{mission};
-                       $ships->execute($fleet->{id});
-                       my @ships;
-                       while (my $ship = $ships->fetchrow_hashref){
-                               push @ships,$ship;
-                       }
-                       $fleet->{Ships} = \@ships;
-                       push @defenders, $fleet;
-               }
-               $BODY->param(Defenders => \@defenders);
-
-               my $attackers = $DBH->prepare(q{
-                       SELECT coords(p.x,p.y,p.z), p.planet_status, p.race,i.eta,i.amount,i.fleet,i.shiptype,p.relationship,p.alliance,i.id,p.id AS planet
-                       FROM incomings i
-                       JOIN current_planet_stats p ON i.sender = p.id
-                       WHERE i.call = ?
-                       ORDER BY p.x,p.y,p.z
-               });
-               $attackers->execute($call->{id});
-               my @attackers;
-               while(my $attacker = $attackers->fetchrow_hashref){
-                       $outgoings->execute($attacker->{planet},$call->{landing_tick});
-                       my @missions;
-                       while (my $mission = $outgoings->fetchrow_hashref){
-                               $mission->{eta} = '?' if not defined $mission->{eta};
-                               $mission->{amount} = '?' if not defined $mission->{amount};
-                               $mission->{CLASS} = $mission->{mission};
-                               my @ships;
-                               $ships->execute($mission->{id});
-                               while (my $ship = $ships->fetchrow_hashref){
-                                       push @ships,$ship;
-                               }
-                               push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
-                               $mission->{ships} = \@ships;
-                               push @missions,$mission;
-                       }
-                       delete $attacker->{planet};
-                       $attacker->{missions} = \@missions;
-                       push @attackers,$attacker;
-               }
-               $BODY->param(Attackers => \@attackers);
-       }else{
-               my $where = 'open AND c.landing_tick-6 > tick()';
-               if (defined param('show')){
-                       if (param('show') eq 'covered'){
-                               $where = 'covered';
-                       }elsif (param('show') eq 'all'){
-                               $where = 'true';
-                       }elsif (param('show') eq 'uncovered'){
-                               $where = 'not covered';
-                       }
-               }
-               my $pointlimits = $DBH->prepare(q{SELECT value :: int FROM misc WHERE id = ?});
-               my ($minpoints) = $DBH->selectrow_array($pointlimits,undef,'DEFMIN');
-               my ($maxpoints) = $DBH->selectrow_array($pointlimits,undef,'DEFMAX');
-
-               my $query = $DBH->prepare(qq{
-                       SELECT id,coords(x,y,z),defense_points,landing_tick,dc,curreta,fleets,
-                               TRIM('/' FROM concat(DISTINCT race||' /')) AS race, TRIM('/' FROM concat(amount||' /')) AS amount,
-                               TRIM('/' FROM concat(DISTINCT eta||' /')) AS eta, TRIM('/' FROM concat(DISTINCT shiptype||' /')) AS shiptype,
-                               TRIM('/' FROM concat(DISTINCT alliance ||' /')) AS alliance,
-                               TRIM('/' FROM concat(coords||' /')) AS attackers 
-                       FROM (SELECT c.id, p.x,p.y,p.z, u.defense_points, c.landing_tick, dc.username AS dc,
-                               (c.landing_tick - tick()) AS curreta,p2.race, i.amount, i.eta, i.shiptype, p2.alliance,
-                               coords(p2.x,p2.y,p2.z), COUNT(DISTINCT f.id) AS fleets
-                       FROM calls c 
-                       JOIN incomings i ON i.call = c.id
-                       JOIN users u ON c.member = u.uid
-                       JOIN current_planet_stats p ON u.planet = p.id
-                       JOIN current_planet_stats p2 ON i.sender = p2.id
-                       LEFT OUTER JOIN users dc ON c.dc = dc.uid
-                       LEFT OUTER JOIN fleets f ON f.target = u.planet AND f.tick = c.landing_tick AND f.back = f.tick + f.eta - 1
-                       WHERE $where
-                       GROUP BY c.id, p.x,p.y,p.z, c.landing_tick, u.defense_points,dc.username,p2.race,i.amount,i.eta,i.shiptype,p2.alliance,p2.x,p2.y,p2.z) a
-                       GROUP BY id, x,y,z,landing_tick, defense_points,dc,curreta,fleets
-                       ORDER BY landing_tick DESC
-                       })or warn $DBH->errstr;
-               $query->execute or warn $DBH->errstr;
-               my @calls;
-               my $tick = $self->{TICK};
-               while (my $call = $query->fetchrow_hashref){
-                       if ($call->{defense_points} < $minpoints){
-                               $call->{DefPrio} = 'LowestPrio';
-                       }elsif ($call->{defense_points} < $maxpoints){
-                               $call->{DefPrio} = 'MediumPrio';
-                       }else{
-                               $call->{DefPrio} = 'HighestPrio';
-                       }
-                       while ($tick - 24 > $call->{landing_tick}){
-                               $tick -= 24;
-                               push @calls,{};
-                       }
-                       $call->{attackers} =~ s{(\d+:\d+:\d+)}{<a href="/check?coords=$1">$1</a>}g;
-                       $call->{dcstyle} = 'Hostile' unless defined $call->{dc};
-                       $call->{shiptype} = $call->{shiptype};
-                       push @calls, $call;
-               }
-               $BODY->param(Calls => \@calls);
-       }
-       return $BODY;
-}
-1;
index 16e0c4e499d859499ec3abd8b9a38bae9ba0fe3a..088af44ebdde9598e48e4c2510d90564757b7492 100644 (file)
@@ -22,6 +22,8 @@ INSERT INTO roles VALUES('graphs_intel');
 INSERT INTO roles VALUES('members');
 INSERT INTO roles VALUES('members_points_nolimit');
 INSERT INTO roles VALUES('covop');
+INSERT INTO roles VALUES('calls_list');
+INSERT INTO roles VALUES('calls_edit');
 
 INSERT INTO group_roles (gid,role) VALUES(2,'member_menu');
 INSERT INTO group_roles (gid,role) VALUES(2,'attack_menu');
@@ -29,6 +31,8 @@ INSERT INTO group_roles (gid,role) VALUES(2,'members');
 INSERT INTO group_roles (gid,role) VALUES(2,'covop');
 
 INSERT INTO group_roles (gid,role) VALUES(6,'dc_menu');
+INSERT INTO group_roles (gid,role) VALUES(6,'calls_list');
+INSERT INTO group_roles (gid,role) VALUES(6,'calls_edit');
 
 INSERT INTO group_roles (gid,role) VALUES(4,'bc_menu');
 
@@ -46,6 +50,8 @@ INSERT INTO group_roles (gid,role) VALUES(1,'admin_users');
 INSERT INTO group_roles (gid,role) VALUES(1,'rankings_planet_intel');
 INSERT INTO group_roles (gid,role) VALUES(1,'alliances_resources');
 INSERT INTO group_roles (gid,role) VALUES(1,'graphs_intel');
+INSERT INTO group_roles (gid,role) VALUES(1,'calls_list');
+INSERT INTO group_roles (gid,role) VALUES(1,'calls_edit');
 
 INSERT INTO group_roles (gid,role) VALUES(3,'dc_menu');
 INSERT INTO group_roles (gid,role) VALUES(3,'bc_menu');
@@ -55,3 +61,5 @@ INSERT INTO group_roles (gid,role) VALUES(3,'admin_users');
 INSERT INTO group_roles (gid,role) VALUES(3,'rankings_planet_intel');
 INSERT INTO group_roles (gid,role) VALUES(3,'alliances_resources');
 INSERT INTO group_roles (gid,role) VALUES(3,'graphs_intel');
+INSERT INTO group_roles (gid,role) VALUES(3,'calls_list');
+INSERT INTO group_roles (gid,role) VALUES(3,'calls_edit');
index b47a9fa278ceea70e3b12aacb1b38cd37aefc53f..df1da1748d850eaa9d37f0250fe5b2c8afdb9fff 100644 (file)
@@ -73,6 +73,10 @@ __PACKAGE__->deny_access_unless('/graphs/alliancevsintel',[qw/graphs_intel/]);
 __PACKAGE__->deny_access_unless('/graphs/avgalliancevsintel',[qw/graphs_intel/]);
 __PACKAGE__->deny_access_unless('/members',[qw/members/]);
 __PACKAGE__->deny_access_unless('/covop',[qw/covop/]);
+__PACKAGE__->deny_access_unless('/calls/list',[qw/calls_list/]);
+__PACKAGE__->deny_access_unless('/calls/postcallcomment',[qw/calls_edit/]);
+__PACKAGE__->deny_access_unless('/calls/postcallupdate',[qw/calls_edit/]);
+__PACKAGE__->deny_access_unless('/calls/postattackerupdate',[qw/calls_edit/]);
 
 =head1 NAME
 
diff --git a/lib/NDWeb/Controller/Calls.pm b/lib/NDWeb/Controller/Calls.pm
new file mode 100644 (file)
index 0000000..cf468a8
--- /dev/null
@@ -0,0 +1,335 @@
+package NDWeb::Controller::Calls;
+
+use strict;
+use warnings;
+use parent 'Catalyst::Controller';
+
+use NDWeb::Include;
+
+=head1 NAME
+
+NDWeb::Controller::Calls - Catalyst Controller
+
+=head1 DESCRIPTION
+
+Catalyst Controller.
+
+=head1 METHODS
+
+=cut
+
+
+=head2 index 
+
+=cut
+
+sub index : Path : Args(0) {
+       my ( $self, $c) = @_;
+
+       $c->stash(template => 'calls/list.tt2');
+       $c->forward('list');
+}
+
+sub list : Local {
+       my ( $self, $c, $type ) = @_;
+       my $dbh = $c->model;
+
+       my $where = q{open AND c.landing_tick-6 > tick()};
+       my $order = q{landing_tick DESC, defprio DESC};
+       if (defined $type){
+               if ($type eq 'covered'){
+                       $where = 'covered';
+               }elsif ($type eq 'all'){
+                       $where = 'true';
+               }elsif ($type eq 'uncovered'){
+                       $where = 'not covered';
+               }elsif ($type eq 'recent'){
+                       $where = q{c.landing_tick > tick()};
+                       $order = q{x,y,z};
+               }
+       }
+       my $pointlimits = $dbh->prepare(q{SELECT value :: float FROM misc WHERE id = ?});
+       $c->stash(minprio => $dbh->selectrow_array($pointlimits,undef,'DEFMINPRIO'));
+       $c->stash(maxprio => $dbh->selectrow_array($pointlimits,undef,'DEFMAXPRIO'));
+
+       my $query = $dbh->prepare(qq{
+               SELECT id,coords(x,y,z),planet,landing_tick,dc,curreta,fleets
+                       ,(0.2*(attack_points/a.attack)+ 0.4*(defense_points/a.defense)
+                               + 0.2*(c.size/a.size) + 0.05*(c.score/a.score)
+                               + 0.15*(c.value/a.value))::Numeric(3,2) AS defprio
+                       ,array_accum(race::text) AS race
+                       ,array_accum(amount) AS amount
+                       ,array_accum(eta) AS eta
+                       ,array_accum(shiptype) AS shiptype
+                       ,array_accum(COALESCE(alliance,'?')) AS alliance
+                       ,array_accum(coords) AS attackers
+               FROM (SELECT c.id, p.x,p.y,p.z,p.id AS planet, p.size, p.value, p.score
+                       ,u.defense_points, u.attack_points, c.landing_tick
+                       ,dc.username AS dc, (c.landing_tick - tick()) AS curreta
+                       ,p2.race, i.amount, i.eta, i.shiptype, p2.alliance
+                       ,coords(p2.x,p2.y,p2.z),        COUNT(DISTINCT f.id) AS fleets
+                       FROM calls c 
+                               JOIN users u ON c.member = u.uid
+                               JOIN current_planet_stats p ON u.planet = p.id
+                               LEFT OUTER JOIN incomings i ON i.call = c.id
+                               LEFT OUTER JOIN current_planet_stats p2 ON i.sender = p2.id
+                               LEFT OUTER JOIN users dc ON c.dc = dc.uid
+                               LEFT OUTER JOIN fleets f ON f.target = u.planet 
+                                       AND f.tick = c.landing_tick AND f.back = f.tick + f.eta - 1
+                       WHERE $where
+                       GROUP BY c.id, p.x,p.y,p.z,p.id, p.size, p.score, p.value, c.landing_tick
+                               ,u.defense_points,u.attack_points,dc.username
+                               ,p2.race,i.amount,i.eta,i.shiptype,p2.alliance,p2.x,p2.y,p2.z
+                       ) c
+                       ,(SELECT avg(attack_points) AS attack, avg(defense_points) AS defense
+                               , avg(size) AS size, avg(score) AS score, avg(value) AS value
+                               FROM users u JOIN current_planet_stats p ON p.id = u.planet
+                               WHERE uid IN (SELECT uid FROM groupmembers  where gid = 2)
+                       ) a
+               GROUP BY id, x,y,z,planet,landing_tick, defense_points, attack_points
+                       ,dc,curreta,fleets, c.size, c.score, c.value
+                       , a.attack, a.defense, a.size, a.score, a.value
+               ORDER BY $order
+               });
+       $query->execute;
+       $c->stash(calls => $query->fetchall_arrayref({}));
+}
+
+sub edit : Local {
+       my ( $self, $c, $call) = @_;
+       my $dbh = $c->model;
+
+       $c->forward('findCall');
+       $call = $c->stash->{call};
+
+
+       $c->stash(cover => ($call->{covered} ? 'Uncover' : 'Cover'));
+       if ($call->{open} && !$call->{covered}){
+               $c->stash(ignore => 'Ignore');
+       }else{
+               $c->stash(ignore => 'Open');
+       }
+
+
+       my $outgoings = $dbh->prepare(q{ 
+               SELECT i.id,i.mission, i.name, i.tick,eta
+                       , i.amount, coords(x,y,z) AS coords, t.id AS planet
+               FROM fleets i
+               LEFT OUTER JOIN (planets
+                       NATURAL JOIN planet_stats) t ON i.target = t.id
+                               AND t.tick = ( SELECT MAX(tick) FROM planet_stats)
+               WHERE  i.sender = $1 
+                       AND (i.tick > $2 - 14 OR i.mission = 'Full fleet')
+               ORDER BY i.tick,x,y,z
+       });
+       my $ships = $dbh->prepare(q{SELECT ship,amount FROM fleet_ships
+               WHERE id = ? ORDER BY num
+               });
+       $outgoings->execute($call->{planet},$call->{landing_tick});
+       my @fleets;
+       while (my $fleet = $outgoings->fetchrow_hashref){
+               if (defined $fleet->{back} &&
+                               $fleet->{back} == $call->{landing_tick}){
+                       $fleet->{fleetcatch} = 1;
+               }
+               $ships->execute($fleet->{id});
+               if ($ships->rows != 0){
+                       my @ships;
+                       while (my $ship = $ships->fetchrow_hashref){
+                               push @ships,$ship;
+                       }
+                       $fleet->{ships} = \@ships;
+               }
+               push @fleets, $fleet;
+       }
+       $c->stash(fleets => \@fleets);
+
+       my $defenders = $dbh->prepare(q{ 
+               SELECT DISTINCT ON (i.tick,x,y,z,s.id,i.name,i.amount) i.id,i.mission, i.name, i.tick,eta
+                       , i.amount, coords(x,y,z) AS coords, s.id AS planet
+               FROM fleets i
+               LEFT OUTER JOIN (planets
+                       NATURAL JOIN planet_stats) s ON i.sender = s.id
+                               AND s.tick = ( SELECT MAX(tick) FROM planet_stats)
+               WHERE i.target = ?
+                       AND i.tick = ? AND i.mission = 'Defend'
+               ORDER BY i.tick,x,y,z
+       });
+
+       $defenders->execute($call->{planet},$call->{landing_tick});
+       my @defenders;
+       while (my $fleet = $defenders->fetchrow_hashref){
+               $ships->execute($fleet->{id});
+               if ($ships->rows != 0){
+                       my @ships;
+                       while (my $ship = $ships->fetchrow_hashref){
+                               push @ships,$ship;
+                       }
+                       $fleet->{ships} = \@ships;
+               }
+               push @defenders, $fleet;
+       }
+       $c->stash(defenders => \@defenders);
+
+       my $attackers = $dbh->prepare(q{
+               SELECT coords(p.x,p.y,p.z), p.planet_status, p.race,i.eta,i.amount
+                       ,i.fleet,i.shiptype,p.relationship,p.alliance,i.id,p.id AS planet
+               FROM incomings i
+                       JOIN current_planet_stats p ON i.sender = p.id
+               WHERE i.call = ?
+               ORDER BY p.x,p.y,p.z
+       });
+       $attackers->execute($call->{id});
+       my @attackers;
+       while(my $attacker = $attackers->fetchrow_hashref){
+               $outgoings->execute($attacker->{planet},$call->{landing_tick});
+               my @missions;
+               while (my $mission = $outgoings->fetchrow_hashref){
+                       $ships->execute($mission->{id});
+                       if ($ships->rows != 0){
+                               my @ships;
+                               while (my $ship = $ships->fetchrow_hashref){
+                                       push @ships,$ship;
+                               }
+                               push @ships, {ship => 'No', amount => 'ships'} if @ships == 0;
+                               $mission->{ships} = \@ships;
+                       }
+                       push @missions,$mission;
+               }
+               delete $attacker->{planet};
+               $attacker->{missions} = \@missions;
+               push @attackers,$attacker;
+       }
+       $c->stash(attackers => \@attackers);
+
+       $c->forward('/forum/findPosts',[$call->{ftid}]);
+}
+
+sub postcallcomment : Local {
+       my ($self, $c, $call) = @_;
+
+       $c->forward('findCall');
+       $call = $c->stash->{call};
+
+       $c->forward('/forum/insertPost',[$call->{ftid}]);
+       $c->res->redirect($c->uri_for('edit',$call->{id}));
+}
+
+sub postcallupdate : Local {
+       my ($self, $c, $call) = @_;
+       my $dbh = $c->model;
+
+       $c->forward('findCall');
+       $call = $c->stash->{call};
+
+       my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message)
+               VALUES($2,$1,$3)
+               });
+
+       $dbh->begin_work;
+       if ($c->req->param('cmd') eq 'Submit'){
+               if ($c->req->param('ctick')){
+                       $dbh->do(q{UPDATE calls SET landing_tick = ? WHERE id = ?}
+                               ,undef,$c->req->param('tick'),$call->{id});
+                       $log->execute($c->user->id,$call->{ftid}
+                               ,"Updated landing tick from [B] $call->{landing_tick} [/B]");
+               }
+               if ($c->req->param('cinfo')){
+                       $dbh->do(q{UPDATE calls SET info = ? WHERE id = ?}
+                               ,undef,$c->req->param('info'),$call->{id});
+                       $log->execute($c->user->id,$call->{ftid},"Updated info");
+               }
+       }elsif($c->req->param('cmd') =~ /^(Cover|Uncover|Ignore|Open|Take) call$/){
+               my $extra_vars = '';
+               if ($1 eq 'Cover'){
+                       $extra_vars = ", covered = TRUE, open = FALSE";
+               }elsif ($1 eq 'Uncover'){
+                       $extra_vars = ", covered = FALSE, open = TRUE";
+               }elsif ($1 eq 'Ignore'){
+                       $extra_vars = ", covered = FALSE, open = FALSE";
+               }elsif ($1 eq 'Open'){
+                       $extra_vars = ", covered = FALSE, open = TRUE";
+               }
+               $dbh->do(qq{UPDATE calls SET dc = ? $extra_vars WHERE id = ?},
+                       ,undef,$c->user->id,$call->{id});
+               $log->execute($c->user->id,$call->{ftid}
+                       ,'Changed status to: [B]'.$c->req->param('cmd').'[/B]');
+       }
+       $dbh->commit;
+
+       $c->res->redirect($c->uri_for('edit',$call->{id}));
+}
+
+
+sub postattackerupdate : Local {
+       my ($self, $c, $call) = @_;
+       my $dbh = $c->model;
+
+       $c->forward('findCall');
+       $call = $c->stash->{call};
+
+       my $log = $dbh->prepare(q{INSERT INTO forum_posts (ftid,uid,message)
+               VALUES($2,$1,$3)
+               });
+
+       $dbh->begin_work;
+       if($c->req->param('cmd') eq 'Remove'){
+               my $query = $dbh->prepare(q{DELETE FROM incomings WHERE id = ? AND call = ?});
+               my $inc = $dbh->prepare(q{SELECT sender,eta,amount FROM incomings WHERE id = $1});
+               for my $param ($c->req->param()){
+                       if ($param =~ /^change:(\d+)$/){
+                               my ($planet,$eta,$amount) = $dbh->selectrow_array($inc,undef,$1);
+                               $query->execute($1,$call->{id});
+                               $log->execute($c->user->id,$call->{ftid}
+                                       ,"Deleted fleet: [B] $1 [/B] ($planet:$eta:$amount)");
+                       }
+               }
+       }elsif($c->req->param('cmd') eq 'Change'){
+               my $query = $dbh->prepare(q{UPDATE incomings SET shiptype = ?
+                       WHERE id = ? AND call = ?
+               });
+               for my $param ($c->req->param()){
+                       if ($param =~ /^change:(\d+)$/){
+                               my $shiptype = html_escape($c->req->param("shiptype:$1"));
+                               $query->execute($shiptype,$1,$call->{id});
+                               $log->execute($c->user->id,$call->{ftid}
+                                       ,"set fleet: [B] $1 [/B] to: [B] $shiptype [/B]");
+                       }
+               }
+       }
+       $dbh->commit;
+
+       $c->res->redirect($c->uri_for('edit',$call->{id}));
+}
+
+sub findCall : Private {
+       my ( $self, $c, $call) = @_;
+       my $dbh = $c->model;
+
+       my $query = $dbh->prepare(q{
+               SELECT c.id, coords(p.x,p.y,p.z), c.landing_tick, c.info, covered
+                       ,open, dc.username AS dc, u.defense_points,c.member
+                       ,u.planet, u.username AS member, u.sms,c.ftid
+               FROM calls c 
+               JOIN users u ON c.member = u.uid
+               LEFT OUTER JOIN users dc ON c.dc = dc.uid
+               JOIN current_planet_stats p ON u.planet = p.id
+               WHERE c.id = ?
+               });
+       $call = $dbh->selectrow_hashref($query,undef,$call);
+
+       $c->assert_user_roles(qw/calls_edit/) unless $c->user->id == $call->{member};
+       $c->stash(call => $call);
+}
+
+=head1 AUTHOR
+
+Michael Andreen (harv@ruin.nu)
+
+=head1 LICENSE
+
+GPL 2.0, or later.
+
+=cut
+
+1;
index 4145781c7c2e346a69f5e7b618fd78d258cf259c..0a27acc7547ae88e11d29a4d8685e939e70f447e 100644 (file)
@@ -208,7 +208,13 @@ sub thread : Local {
        my $dbh = $c->model;
 
        $c->forward('findThread');
-       $thread = $c->stash->{thread};
+       $c->forward('findPosts') if $c->stash->{thread};
+       $c->forward('markThreadAsRead') if $c->user_exists;
+}
+
+sub findPosts :Private {
+       my ( $self, $c, $thread ) = @_;
+       my $dbh = $c->model;
 
        my $posts = $dbh->prepare(q{
                SELECT u.username,date_trunc('seconds',fp.time::timestamp) AS time
@@ -221,7 +227,7 @@ sub thread : Local {
                WHERE ft.ftid = $1
                ORDER BY fp.time ASC
                });
-       $posts->execute($c->stash->{thread}->{ftid},$c->stash->{UID});
+       $posts->execute($thread,$c->stash->{UID});
 
        my @posts;
        while (my $post = $posts->fetchrow_hashref){
@@ -230,7 +236,6 @@ sub thread : Local {
        }
 
        $c->stash(posts => \@posts);
-       $c->forward('markThreadAsRead') if $c->user_exists;
 }
 
 
index 91fbff06fa4b668e26e37a4b880cad39c56b3644..4c9f5b5e6c5390c9c396770972de17a7e1e10615 100644 (file)
@@ -7,7 +7,7 @@
        <link rel="stylesheet" type="text/css" href="/static/css/[% user.css or "black" %].css">
        <link rel="icon" type="image/ico" href="/favicon.ico">
        <script type="text/javascript" src="/static/js/raid.js"></script>
-       <script type="text/javascript" src="/static/js/misc.js"></script>
+       <script type="text/javascript" src="/static/js/jquery-1.2.6.min.js"></script>
 </head>
  <body>
 [% content %]
index 62a7bf06b354cbd4d2a791742d805c4c1e99b5f8..6c1aea1dc8bc1b5f8695ddb35e778f79b275069e 100644 (file)
 <p>DC menu</p>
 <ul class="linkbar">
        <li><a href="/defLeeches">Def Leeches</a></li>
-       <li><a href="/calls">Defense calls</a></li>
-       <li><a href="/calls?show=uncovered">Not covered calls</a></li>
-       <li><a href="/calls?show=covered">Covered calls</a></li>
-       <li><a href="/calls?show=all">All calls</a></li>
+       <li><a href="/calls/list">Active calls</a></li>
+       <li><a href="/calls/list/recent">Recent calls</a></li>
+       <li><a href="/calls/list/uncovered">Not covered calls</a></li>
+       <li><a href="/calls/list/covered">Covered calls</a></li>
+       <li><a href="/calls/list/all">All calls</a></li>
 </ul>
 [% END %]
 [% IF c.check_user_roles("intel_menu") %]
diff --git a/root/src/calls/edit.tt2 b/root/src/calls/edit.tt2
new file mode 100644 (file)
index 0000000..14c2175
--- /dev/null
@@ -0,0 +1,140 @@
+[% META title = 'Edit call' %]
+
+[% BLOCK missiontable %]
+<table>
+               <tr><th></th><th>Coords</th><th>Name</th><th>Mission</th><th>Tick</th><th>ETA</th><th>Amount</th></tr>
+       [% FOR m IN missions %]
+               <tr align="center" class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]" onclick="$('#fleet[% m.id %]').toggle()">
+                       <td>
+               [% IF m.ships %]
+                               <b>&dArr;</b>
+               [% END %]
+                       </td><td>
+               [% IF m.planet %]
+                               <a href="[% c.uri_for('/stats/planet', m.planet) %]">[% m.coords %]</a>
+               [% END %]
+                       </td>
+                       <td>[% m.name %]</td>
+                       <td class="[% m.mission %]">[% m.mission %]</td>
+                       <td>[% m.tick %]</td>
+                       <td>[% m.eta %]</td>
+                       <td>[% m.amount %]</td>
+                       [% IF m.fleetcatch %]
+                       <td class="Hostile">FLEETCATCH!!</td>
+                       [% END %]
+               </tr>
+               [% IF m.ships %]
+               <tr id="fleet[% m.id %]" class="missionrow">
+                       <td>
+                       <td colspan="5"><table>
+                       [% FOR s IN m.ships %]
+                               <tr class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+                                       <td>[% s.ship %]</td><td>[% s.amount %]</td>
+                               </tr>
+                       [% END %]
+                       </table></td>
+               </tr>
+               [% END %]
+       [% END %]
+       </table>
+[% END %]
+
+<form action="[% c.uri_for('postcallupdate',call.id) %]" method="post">
+<fieldset> <legend>Call details, call# [% call.id %]</legend>
+<table>
+<tr>
+<td>
+<ul>
+       <li>Current DC: [% call.dc %]</li>
+       <li>Member: [% call.member %] </li>
+       <li>SMS: [% call.sms %] </li>
+       <li>Coords: <a href="[% c.uri_for('/stats/planet', call.planet) %]">[% call.coords %]</a></li>
+       <li>Landing at tick: <br>
+               <input type="text" name="tick" value="[% call.landing_tick %]">
+               <input type="checkbox" name="ctick"></li>
+       <li>Current ETA: [% call.landing_tick - TICK %]</li>
+</ul>
+</td>
+<td>
+       <textarea rows="8" cols="40" name="info">[% call.info %]</textarea>
+</td>
+<td><ul>
+       <li>Change Notes? <input type="checkbox" name="cinfo"></li>
+       <li><input type="submit" name="cmd" value="Submit"></li>
+       <li><input type="submit" name="cmd" value="Take call"></li>
+       <li><input type="submit" name="cmd" value="[% cover %] call"></li>
+       <li><input type="submit" name="cmd" value="[% ignore %] call"></li>
+</ul></td>
+</tr>
+</table>
+</fieldset>
+</form>
+<fieldset><legend>Attackers:</legend>
+<form action="[% c.uri_for('postattackerupdate',call.id) %]" method="post">
+       <table>
+       <tr>
+       <th></th>
+       <th>Coords</th>
+       <th>Planet status</th>
+       <th>Alliance</th>
+       <th>Race</th>
+       <th>Initial ETA</th>
+       <th>Amount</th>
+       <th>Shiptypes</th>
+       <th>Fleet</th>
+       <th>Change/remove?</th>
+       </tr>
+[% FOR a IN attackers %]
+       <tr class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+               <td><input type="button" onclick="$('#attacker[% a.id %]').toggle()" value="&dArr;" title="Show fleets"></td>
+               <td><a href="[% c.uri_for('/stats/planet',a.id) %]">[% a.coords %]</a></td>
+               <td class="[% a.planet_status %]">[% a.planet_status %]</td>
+               <td class="[% a.relationship %]">[% a.alliance %] ([% a.relationship %])</td>
+               <td>[% a.race %]</td>
+               <td>[% a.eta %]</td>
+               <td>[% a.amount %]</td>
+               <td><input class="coord" type="text" name="shiptype:[% a.id %]" value="[% a.shiptype %]"></td>
+               <td>[% a.fleet %]</td>
+               <td><input type="checkbox" name="change:[% a.id %]"></td>
+       </tr>
+       <tr id="attacker[% a.id %]" class="missionrow">
+       <td></td>
+       <td colspan="8">
+       [% PROCESS missiontable missions=a.missions %]
+       </td></tr>
+[% END %]
+       </table>
+       <p>
+       <input type="submit" name="cmd" value="Change">
+       <input type="submit" name="cmd" value="Remove">
+       </p>
+</form>
+</fieldset>
+<fieldset><legend>Member fleet</legend>
+[% PROCESS missiontable missions=fleets %]
+</fieldset>
+<fieldset><legend>Defenders</legend>
+[% PROCESS missiontable missions=defenders %]
+</fieldset>
+
+<div>
+[% FOR post IN posts %]
+<fieldset class="forum-post">
+<legend class="unread:[% post.unread %]"><b>[% post.username %]</b> : [% post.time %]</legend>
+       [% post.message %]
+</fieldset>
+[% END %]
+
+<form action="[% c.uri_for('postcallcomment', call.id) %]" method="post"><fieldset class="forum-post"> <legend>New Reply</legend>
+       <textarea rows="10" cols="60" name="message"></textarea>
+       <input type="submit" value="Submit">
+</fieldset></form>
+</div>
+
+<script type="text/javascript">
+<!--
+$(document).ready(function(){
+       $('.missionrow').hide();
+});
+-->
+</script>
diff --git a/root/src/calls/list.tt2 b/root/src/calls/list.tt2
new file mode 100644 (file)
index 0000000..195560f
--- /dev/null
@@ -0,0 +1,30 @@
+[% META title = 'Defense calls' %]
+<table>
+       <tr><th>Call</th><th>DC</th><th>Def Fleets</th><th>Member (defprio)</th><th>Landing tick</th><th>Races</th><th>Amount</th><th>Shiptypes</th><th>ETA</th><th>Alliance</th><th>Attackers</th></tr>
+[% newday = game.tick %]
+[% FOR call IN calls %]
+       [% WHILE newday - 24 > call.landing_tick %]
+               [%      newday = newday - 24 %]
+       <tr align="center"><td colspan="4">New day</td></tr>
+       [% END %]
+       <tr align="center" class="[% loop.count % 2 == 0 ? 'even' : 'odd' %]">
+               <td class="[% UNLESS call.dc %]Hostile[%END%]"><a href="[% c.uri_for('edit',call.id) %]">[% call.id %]</a></td>
+               <td>[% call.dc %]</td>
+               <td>[% call.fleets %]</td>
+               [% prio = call.defprio < minprio ? 'LowestPrio' :
+                       (call.defprio < maxprio ? 'MediumPrio' : 'HighestPrio') %]
+               <td class="[% prio %]"><a href="[% c.uri_for('/stats/planet',call.planet) %]">
+                       [% call.coords %] ([% call.defprio %])</a></td>
+               <td>[% call.landing_tick %]</td>
+               <td>[% call.race.unique.join('/') %]</td>
+               <td>[% call.amount.join('/') %]</td>
+               <td>[% call.shiptype.unique.join('/') | html %]</td>
+               <td>[% call.curreta %] ([% call.eta.unique.join('/') %])</td>
+               <td>[% call.alliance.unique.join('/') %]</td>
+               <td>[% FOR a IN call.attackers %]
+                       <a href="[% c.uri_for('/stats/find',a) %]">[% a %]</a>
+                       [% UNLESS loop.last %]/[%END%]
+               [%END%]</td>
+       </tr>
+[% END %]
+</table>
diff --git a/root/static/js/jquery-1.2.6.min.js b/root/static/js/jquery-1.2.6.min.js
new file mode 100644 (file)
index 0000000..82b98e1
--- /dev/null
@@ -0,0 +1,32 @@
+/*
+ * jQuery 1.2.6 - New Wave Javascript
+ *
+ * Copyright (c) 2008 John Resig (jquery.com)
+ * Dual licensed under the MIT (MIT-LICENSE.txt)
+ * and GPL (GPL-LICENSE.txt) licenses.
+ *
+ * $Date: 2008-05-24 14:22:17 -0400 (Sat, 24 May 2008) $
+ * $Rev: 5685 $
+ */
+(function(){var _jQuery=window.jQuery,_$=window.$;var jQuery=window.jQuery=window.$=function(selector,context){return new jQuery.fn.init(selector,context);};var quickExpr=/^[^<]*(<(.|\s)+>)[^>]*$|^#(\w+)$/,isSimple=/^.[^:#\[\.]*$/,undefined;jQuery.fn=jQuery.prototype={init:function(selector,context){selector=selector||document;if(selector.nodeType){this[0]=selector;this.length=1;return this;}if(typeof selector=="string"){var match=quickExpr.exec(selector);if(match&&(match[1]||!context)){if(match[1])selector=jQuery.clean([match[1]],context);else{var elem=document.getElementById(match[3]);if(elem){if(elem.id!=match[3])return jQuery().find(selector);return jQuery(elem);}selector=[];}}else
+return jQuery(context).find(selector);}else if(jQuery.isFunction(selector))return jQuery(document)[jQuery.fn.ready?"ready":"load"](selector);return this.setArray(jQuery.makeArray(selector));},jquery:"1.2.6",size:function(){return this.length;},length:0,get:function(num){return num==undefined?jQuery.makeArray(this):this[num];},pushStack:function(elems){var ret=jQuery(elems);ret.prevObject=this;return ret;},setArray:function(elems){this.length=0;Array.prototype.push.apply(this,elems);return this;},each:function(callback,args){return jQuery.each(this,callback,args);},index:function(elem){var ret=-1;return jQuery.inArray(elem&&elem.jquery?elem[0]:elem,this);},attr:function(name,value,type){var options=name;if(name.constructor==String)if(value===undefined)return this[0]&&jQuery[type||"attr"](this[0],name);else{options={};options[name]=value;}return this.each(function(i){for(name in options)jQuery.attr(type?this.style:this,name,jQuery.prop(this,options[name],type,i,name));});},css:function(key,value){if((key=='width'||key=='height')&&parseFloat(value)<0)value=undefined;return this.attr(key,value,"curCSS");},text:function(text){if(typeof text!="object"&&text!=null)return this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(text));var ret="";jQuery.each(text||this,function(){jQuery.each(this.childNodes,function(){if(this.nodeType!=8)ret+=this.nodeType!=1?this.nodeValue:jQuery.fn.text([this]);});});return ret;},wrapAll:function(html){if(this[0])jQuery(html,this[0].ownerDocument).clone().insertBefore(this[0]).map(function(){var elem=this;while(elem.firstChild)elem=elem.firstChild;return elem;}).append(this);return this;},wrapInner:function(html){return this.each(function(){jQuery(this).contents().wrapAll(html);});},wrap:function(html){return this.each(function(){jQuery(this).wrapAll(html);});},append:function(){return this.domManip(arguments,true,false,function(elem){if(this.nodeType==1)this.appendChild(elem);});},prepend:function(){return this.domManip(arguments,true,true,function(elem){if(this.nodeType==1)this.insertBefore(elem,this.firstChild);});},before:function(){return this.domManip(arguments,false,false,function(elem){this.parentNode.insertBefore(elem,this);});},after:function(){return this.domManip(arguments,false,true,function(elem){this.parentNode.insertBefore(elem,this.nextSibling);});},end:function(){return this.prevObject||jQuery([]);},find:function(selector){var elems=jQuery.map(this,function(elem){return jQuery.find(selector,elem);});return this.pushStack(/[^+>] [^+>]/.test(selector)||selector.indexOf("..")>-1?jQuery.unique(elems):elems);},clone:function(events){var ret=this.map(function(){if(jQuery.browser.msie&&!jQuery.isXMLDoc(this)){var clone=this.cloneNode(true),container=document.createElement("div");container.appendChild(clone);return jQuery.clean([container.innerHTML])[0];}else
+return this.cloneNode(true);});var clone=ret.find("*").andSelf().each(function(){if(this[expando]!=undefined)this[expando]=null;});if(events===true)this.find("*").andSelf().each(function(i){if(this.nodeType==3)return;var events=jQuery.data(this,"events");for(var type in events)for(var handler in events[type])jQuery.event.add(clone[i],type,events[type][handler],events[type][handler].data);});return ret;},filter:function(selector){return this.pushStack(jQuery.isFunction(selector)&&jQuery.grep(this,function(elem,i){return selector.call(elem,i);})||jQuery.multiFilter(selector,this));},not:function(selector){if(selector.constructor==String)if(isSimple.test(selector))return this.pushStack(jQuery.multiFilter(selector,this,true));else
+selector=jQuery.multiFilter(selector,this);var isArrayLike=selector.length&&selector[selector.length-1]!==undefined&&!selector.nodeType;return this.filter(function(){return isArrayLike?jQuery.inArray(this,selector)<0:this!=selector;});},add:function(selector){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),typeof selector=='string'?jQuery(selector):jQuery.makeArray(selector))));},is:function(selector){return!!selector&&jQuery.multiFilter(selector,this).length>0;},hasClass:function(selector){return this.is("."+selector);},val:function(value){if(value==undefined){if(this.length){var elem=this[0];if(jQuery.nodeName(elem,"select")){var index=elem.selectedIndex,values=[],options=elem.options,one=elem.type=="select-one";if(index<0)return null;for(var i=one?index:0,max=one?index+1:options.length;i<max;i++){var option=options[i];if(option.selected){value=jQuery.browser.msie&&!option.attributes.value.specified?option.text:option.value;if(one)return value;values.push(value);}}return values;}else
+return(this[0].value||"").replace(/\r/g,"");}return undefined;}if(value.constructor==Number)value+='';return this.each(function(){if(this.nodeType!=1)return;if(value.constructor==Array&&/radio|checkbox/.test(this.type))this.checked=(jQuery.inArray(this.value,value)>=0||jQuery.inArray(this.name,value)>=0);else if(jQuery.nodeName(this,"select")){var values=jQuery.makeArray(value);jQuery("option",this).each(function(){this.selected=(jQuery.inArray(this.value,values)>=0||jQuery.inArray(this.text,values)>=0);});if(!values.length)this.selectedIndex=-1;}else
+this.value=value;});},html:function(value){return value==undefined?(this[0]?this[0].innerHTML:null):this.empty().append(value);},replaceWith:function(value){return this.after(value).remove();},eq:function(i){return this.slice(i,i+1);},slice:function(){return this.pushStack(Array.prototype.slice.apply(this,arguments));},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem);}));},andSelf:function(){return this.add(this.prevObject);},data:function(key,value){var parts=key.split(".");parts[1]=parts[1]?"."+parts[1]:"";if(value===undefined){var data=this.triggerHandler("getData"+parts[1]+"!",[parts[0]]);if(data===undefined&&this.length)data=jQuery.data(this[0],key);return data===undefined&&parts[1]?this.data(parts[0]):data;}else
+return this.trigger("setData"+parts[1]+"!",[parts[0],value]).each(function(){jQuery.data(this,key,value);});},removeData:function(key){return this.each(function(){jQuery.removeData(this,key);});},domManip:function(args,table,reverse,callback){var clone=this.length>1,elems;return this.each(function(){if(!elems){elems=jQuery.clean(args,this.ownerDocument);if(reverse)elems.reverse();}var obj=this;if(table&&jQuery.nodeName(this,"table")&&jQuery.nodeName(elems[0],"tr"))obj=this.getElementsByTagName("tbody")[0]||this.appendChild(this.ownerDocument.createElement("tbody"));var scripts=jQuery([]);jQuery.each(elems,function(){var elem=clone?jQuery(this).clone(true)[0]:this;if(jQuery.nodeName(elem,"script"))scripts=scripts.add(elem);else{if(elem.nodeType==1)scripts=scripts.add(jQuery("script",elem).remove());callback.call(obj,elem);}});scripts.each(evalScript);});}};jQuery.fn.init.prototype=jQuery.fn;function evalScript(i,elem){if(elem.src)jQuery.ajax({url:elem.src,async:false,dataType:"script"});else
+jQuery.globalEval(elem.text||elem.textContent||elem.innerHTML||"");if(elem.parentNode)elem.parentNode.removeChild(elem);}function now(){return+new Date;}jQuery.extend=jQuery.fn.extend=function(){var target=arguments[0]||{},i=1,length=arguments.length,deep=false,options;if(target.constructor==Boolean){deep=target;target=arguments[1]||{};i=2;}if(typeof target!="object"&&typeof target!="function")target={};if(length==i){target=this;--i;}for(;i<length;i++)if((options=arguments[i])!=null)for(var name in options){var src=target[name],copy=options[name];if(target===copy)continue;if(deep&&copy&&typeof copy=="object"&&!copy.nodeType)target[name]=jQuery.extend(deep,src||(copy.length!=null?[]:{}),copy);else if(copy!==undefined)target[name]=copy;}return target;};var expando="jQuery"+now(),uuid=0,windowData={},exclude=/z-?index|font-?weight|opacity|zoom|line-?height/i,defaultView=document.defaultView||{};jQuery.extend({noConflict:function(deep){window.$=_$;if(deep)window.jQuery=_jQuery;return jQuery;},isFunction:function(fn){return!!fn&&typeof fn!="string"&&!fn.nodeName&&fn.constructor!=Array&&/^[\s[]?function/.test(fn+"");},isXMLDoc:function(elem){return elem.documentElement&&!elem.body||elem.tagName&&elem.ownerDocument&&!elem.ownerDocument.body;},globalEval:function(data){data=jQuery.trim(data);if(data){var head=document.getElementsByTagName("head")[0]||document.documentElement,script=document.createElement("script");script.type="text/javascript";if(jQuery.browser.msie)script.text=data;else
+script.appendChild(document.createTextNode(data));head.insertBefore(script,head.firstChild);head.removeChild(script);}},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toUpperCase()==name.toUpperCase();},cache:{},data:function(elem,name,data){elem=elem==window?windowData:elem;var id=elem[expando];if(!id)id=elem[expando]=++uuid;if(name&&!jQuery.cache[id])jQuery.cache[id]={};if(data!==undefined)jQuery.cache[id][name]=data;return name?jQuery.cache[id][name]:id;},removeData:function(elem,name){elem=elem==window?windowData:elem;var id=elem[expando];if(name){if(jQuery.cache[id]){delete jQuery.cache[id][name];name="";for(name in jQuery.cache[id])break;if(!name)jQuery.removeData(elem);}}else{try{delete elem[expando];}catch(e){if(elem.removeAttribute)elem.removeAttribute(expando);}delete jQuery.cache[id];}},each:function(object,callback,args){var name,i=0,length=object.length;if(args){if(length==undefined){for(name in object)if(callback.apply(object[name],args)===false)break;}else
+for(;i<length;)if(callback.apply(object[i++],args)===false)break;}else{if(length==undefined){for(name in object)if(callback.call(object[name],name,object[name])===false)break;}else
+for(var value=object[0];i<length&&callback.call(value,i,value)!==false;value=object[++i]){}}return object;},prop:function(elem,value,type,i,name){if(jQuery.isFunction(value))value=value.call(elem,i);return value&&value.constructor==Number&&type=="curCSS"&&!exclude.test(name)?value+"px":value;},className:{add:function(elem,classNames){jQuery.each((classNames||"").split(/\s+/),function(i,className){if(elem.nodeType==1&&!jQuery.className.has(elem.className,className))elem.className+=(elem.className?" ":"")+className;});},remove:function(elem,classNames){if(elem.nodeType==1)elem.className=classNames!=undefined?jQuery.grep(elem.className.split(/\s+/),function(className){return!jQuery.className.has(classNames,className);}).join(" "):"";},has:function(elem,className){return jQuery.inArray(className,(elem.className||elem).toString().split(/\s+/))>-1;}},swap:function(elem,options,callback){var old={};for(var name in options){old[name]=elem.style[name];elem.style[name]=options[name];}callback.call(elem);for(var name in options)elem.style[name]=old[name];},css:function(elem,name,force){if(name=="width"||name=="height"){var val,props={position:"absolute",visibility:"hidden",display:"block"},which=name=="width"?["Left","Right"]:["Top","Bottom"];function getWH(){val=name=="width"?elem.offsetWidth:elem.offsetHeight;var padding=0,border=0;jQuery.each(which,function(){padding+=parseFloat(jQuery.curCSS(elem,"padding"+this,true))||0;border+=parseFloat(jQuery.curCSS(elem,"border"+this+"Width",true))||0;});val-=Math.round(padding+border);}if(jQuery(elem).is(":visible"))getWH();else
+jQuery.swap(elem,props,getWH);return Math.max(0,val);}return jQuery.curCSS(elem,name,force);},curCSS:function(elem,name,force){var ret,style=elem.style;function color(elem){if(!jQuery.browser.safari)return false;var ret=defaultView.getComputedStyle(elem,null);return!ret||ret.getPropertyValue("color")=="";}if(name=="opacity"&&jQuery.browser.msie){ret=jQuery.attr(style,"opacity");return ret==""?"1":ret;}if(jQuery.browser.opera&&name=="display"){var save=style.outline;style.outline="0 solid black";style.outline=save;}if(name.match(/float/i))name=styleFloat;if(!force&&style&&style[name])ret=style[name];else if(defaultView.getComputedStyle){if(name.match(/float/i))name="float";name=name.replace(/([A-Z])/g,"-$1").toLowerCase();var computedStyle=defaultView.getComputedStyle(elem,null);if(computedStyle&&!color(elem))ret=computedStyle.getPropertyValue(name);else{var swap=[],stack=[],a=elem,i=0;for(;a&&color(a);a=a.parentNode)stack.unshift(a);for(;i<stack.length;i++)if(color(stack[i])){swap[i]=stack[i].style.display;stack[i].style.display="block";}ret=name=="display"&&swap[stack.length-1]!=null?"none":(computedStyle&&computedStyle.getPropertyValue(name))||"";for(i=0;i<swap.length;i++)if(swap[i]!=null)stack[i].style.display=swap[i];}if(name=="opacity"&&ret=="")ret="1";}else if(elem.currentStyle){var camelCase=name.replace(/\-(\w)/g,function(all,letter){return letter.toUpperCase();});ret=elem.currentStyle[name]||elem.currentStyle[camelCase];if(!/^\d+(px)?$/i.test(ret)&&/^\d/.test(ret)){var left=style.left,rsLeft=elem.runtimeStyle.left;elem.runtimeStyle.left=elem.currentStyle.left;style.left=ret||0;ret=style.pixelLeft+"px";style.left=left;elem.runtimeStyle.left=rsLeft;}}return ret;},clean:function(elems,context){var ret=[];context=context||document;if(typeof context.createElement=='undefined')context=context.ownerDocument||context[0]&&context[0].ownerDocument||document;jQuery.each(elems,function(i,elem){if(!elem)return;if(elem.constructor==Number)elem+='';if(typeof elem=="string"){elem=elem.replace(/(<(\w+)[^>]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+"></"+tag+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("<opt")&&[1,"<select multiple='multiple'>","</select>"]||!tags.indexOf("<leg")&&[1,"<fieldset>","</fieldset>"]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"<table>","</table>"]||!tags.indexOf("<tr")&&[2,"<table><tbody>","</tbody></table>"]||(!tags.indexOf("<td")||!tags.indexOf("<th"))&&[3,"<table><tbody><tr>","</tr></tbody></table>"]||!tags.indexOf("<col")&&[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"]||jQuery.browser.msie&&[1,"div<div>","</div>"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf("<table")&&tags.indexOf("<tbody")<0?div.firstChild&&div.firstChild.childNodes:wrap[1]=="<table>"&&tags.indexOf("<tbody")<0?div.childNodes:[];for(var j=tbody.length-1;j>=0;--j)if(jQuery.nodeName(tbody[j],"tbody")&&!tbody[j].childNodes.length)tbody[j].parentNode.removeChild(tbody[j]);if(/^\s/.test(elem))div.insertBefore(context.createTextNode(elem.match(/^\s*/)[0]),div.firstChild);}elem=jQuery.makeArray(div.childNodes);}if(elem.length===0&&(!jQuery.nodeName(elem,"form")&&!jQuery.nodeName(elem,"select")))return;if(elem[0]==undefined||jQuery.nodeName(elem,"form")||elem.options)ret.push(elem);else
+ret=jQuery.merge(ret,elem);});return ret;},attr:function(elem,name,value){if(!elem||elem.nodeType==3||elem.nodeType==8)return undefined;var notxml=!jQuery.isXMLDoc(elem),set=value!==undefined,msie=jQuery.browser.msie;name=notxml&&jQuery.props[name]||name;if(elem.tagName){var special=/href|src|style/.test(name);if(name=="selected"&&jQuery.browser.safari)elem.parentNode.selectedIndex;if(name in elem&&notxml&&!special){if(set){if(name=="type"&&jQuery.nodeName(elem,"input")&&elem.parentNode)throw"type property can't be changed";elem[name]=value;}if(jQuery.nodeName(elem,"form")&&elem.getAttributeNode(name))return elem.getAttributeNode(name).nodeValue;return elem[name];}if(msie&&notxml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&&notxml&&special?elem.getAttribute(name,2):elem.getAttribute(name);return attr===null?undefined:attr;}if(msie&&name=="opacity"){if(set){elem.zoom=1;elem.filter=(elem.filter||"").replace(/alpha\([^)]*\)/,"")+(parseInt(value)+''=="NaN"?"":"alpha(opacity="+value*100+")");}return elem.filter&&elem.filter.indexOf("opacity=")>=0?(parseFloat(elem.filter.match(/opacity=([^)]*)/)[1])/100)+'':"";}name=name.replace(/-([a-z])/ig,function(all,letter){return letter.toUpperCase();});if(set)elem[name]=value;return elem[name];},trim:function(text){return(text||"").replace(/^\s+|\s+$/g,"");},makeArray:function(array){var ret=[];if(array!=null){var i=array.length;if(i==null||array.split||array.setInterval||array.call)ret[0]=array;else
+while(i)ret[--i]=array[i];}return ret;},inArray:function(elem,array){for(var i=0,length=array.length;i<length;i++)if(array[i]===elem)return i;return-1;},merge:function(first,second){var i=0,elem,pos=first.length;if(jQuery.browser.msie){while(elem=second[i++])if(elem.nodeType!=8)first[pos++]=elem;}else
+while(elem=second[i++])first[pos++]=elem;return first;},unique:function(array){var ret=[],done={};try{for(var i=0,length=array.length;i<length;i++){var id=jQuery.data(array[i]);if(!done[id]){done[id]=true;ret.push(array[i]);}}}catch(e){ret=array;}return ret;},grep:function(elems,callback,inv){var ret=[];for(var i=0,length=elems.length;i<length;i++)if(!inv!=!callback(elems[i],i))ret.push(elems[i]);return ret;},map:function(elems,callback){var ret=[];for(var i=0,length=elems.length;i<length;i++){var value=callback(elems[i],i);if(value!=null)ret[ret.length]=value;}return ret.concat.apply([],ret);}});var userAgent=navigator.userAgent.toLowerCase();jQuery.browser={version:(userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/)||[])[1],safari:/webkit/.test(userAgent),opera:/opera/.test(userAgent),msie:/msie/.test(userAgent)&&!/opera/.test(userAgent),mozilla:/mozilla/.test(userAgent)&&!/(compatible|webkit)/.test(userAgent)};var styleFloat=jQuery.browser.msie?"styleFloat":"cssFloat";jQuery.extend({boxModel:!jQuery.browser.msie||document.compatMode=="CSS1Compat",props:{"for":"htmlFor","class":"className","float":styleFloat,cssFloat:styleFloat,styleFloat:styleFloat,readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing"}});jQuery.each({parent:function(elem){return elem.parentNode;},parents:function(elem){return jQuery.dir(elem,"parentNode");},next:function(elem){return jQuery.nth(elem,2,"nextSibling");},prev:function(elem){return jQuery.nth(elem,2,"previousSibling");},nextAll:function(elem){return jQuery.dir(elem,"nextSibling");},prevAll:function(elem){return jQuery.dir(elem,"previousSibling");},siblings:function(elem){return jQuery.sibling(elem.parentNode.firstChild,elem);},children:function(elem){return jQuery.sibling(elem.firstChild);},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.makeArray(elem.childNodes);}},function(name,fn){jQuery.fn[name]=function(selector){var ret=jQuery.map(this,fn);if(selector&&typeof selector=="string")ret=jQuery.multiFilter(selector,ret);return this.pushStack(jQuery.unique(ret));};});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(){var args=arguments;return this.each(function(){for(var i=0,length=args.length;i<length;i++)jQuery(args[i])[original](this);});};});jQuery.each({removeAttr:function(name){jQuery.attr(this,name,"");if(this.nodeType==1)this.removeAttribute(name);},addClass:function(classNames){jQuery.className.add(this,classNames);},removeClass:function(classNames){jQuery.className.remove(this,classNames);},toggleClass:function(classNames){jQuery.className[jQuery.className.has(this,classNames)?"remove":"add"](this,classNames);},remove:function(selector){if(!selector||jQuery.filter(selector,[this]).r.length){jQuery("*",this).add(this).each(function(){jQuery.event.remove(this);jQuery.removeData(this);});if(this.parentNode)this.parentNode.removeChild(this);}},empty:function(){jQuery(">*",this).remove();while(this.firstChild)this.removeChild(this.firstChild);}},function(name,fn){jQuery.fn[name]=function(){return this.each(fn,arguments);};});jQuery.each(["Height","Width"],function(i,name){var type=name.toLowerCase();jQuery.fn[type]=function(size){return this[0]==window?jQuery.browser.opera&&document.body["client"+name]||jQuery.browser.safari&&window["inner"+name]||document.compatMode=="CSS1Compat"&&document.documentElement["client"+name]||document.body["client"+name]:this[0]==document?Math.max(Math.max(document.body["scroll"+name],document.documentElement["scroll"+name]),Math.max(document.body["offset"+name],document.documentElement["offset"+name])):size==undefined?(this.length?jQuery.css(this[0],type):null):this.css(type,size.constructor==String?size:size+"px");};});function num(elem,prop){return elem[0]&&parseInt(jQuery.curCSS(elem[0],prop,true),10)||0;}var chars=jQuery.browser.safari&&parseInt(jQuery.browser.version)<417?"(?:[\\w*_-]|\\\\.)":"(?:[\\w\u0128-\uFFFF*_-]|\\\\.)",quickChild=new RegExp("^>\\s*("+chars+"+)"),quickID=new RegExp("^("+chars+"+)(#)("+chars+"+)"),quickClass=new RegExp("^([#.]?)("+chars+"*)");jQuery.extend({expr:{"":function(a,i,m){return m[2]=="*"||jQuery.nodeName(a,m[2]);},"#":function(a,i,m){return a.getAttribute("id")==m[2];},":":{lt:function(a,i,m){return i<m[3]-0;},gt:function(a,i,m){return i>m[3]-0;},nth:function(a,i,m){return m[3]-0==i;},eq:function(a,i,m){return m[3]-0==i;},first:function(a,i){return i==0;},last:function(a,i,m,r){return i==r.length-1;},even:function(a,i){return i%2==0;},odd:function(a,i){return i%2;},"first-child":function(a){return a.parentNode.getElementsByTagName("*")[0]==a;},"last-child":function(a){return jQuery.nth(a.parentNode.lastChild,1,"previousSibling")==a;},"only-child":function(a){return!jQuery.nth(a.parentNode.lastChild,2,"previousSibling");},parent:function(a){return a.firstChild;},empty:function(a){return!a.firstChild;},contains:function(a,i,m){return(a.textContent||a.innerText||jQuery(a).text()||"").indexOf(m[3])>=0;},visible:function(a){return"hidden"!=a.type&&jQuery.css(a,"display")!="none"&&jQuery.css(a,"visibility")!="hidden";},hidden:function(a){return"hidden"==a.type||jQuery.css(a,"display")=="none"||jQuery.css(a,"visibility")=="hidden";},enabled:function(a){return!a.disabled;},disabled:function(a){return a.disabled;},checked:function(a){return a.checked;},selected:function(a){return a.selected||jQuery.attr(a,"selected");},text:function(a){return"text"==a.type;},radio:function(a){return"radio"==a.type;},checkbox:function(a){return"checkbox"==a.type;},file:function(a){return"file"==a.type;},password:function(a){return"password"==a.type;},submit:function(a){return"submit"==a.type;},image:function(a){return"image"==a.type;},reset:function(a){return"reset"==a.type;},button:function(a){return"button"==a.type||jQuery.nodeName(a,"button");},input:function(a){return/input|select|textarea|button/i.test(a.nodeName);},has:function(a,i,m){return jQuery.find(m[3],a).length;},header:function(a){return/h\d/i.test(a.nodeName);},animated:function(a){return jQuery.grep(jQuery.timers,function(fn){return a==fn.elem;}).length;}}},parse:[/^(\[) *@?([\w-]+) *([!*$^~=]*) *('?"?)(.*?)\4 *\]/,/^(:)([\w-]+)\("?'?(.*?(\(.*?\))?[^(]*?)"?'?\)/,new RegExp("^([:.#]*)("+chars+"+)")],multiFilter:function(expr,elems,not){var old,cur=[];while(expr&&expr!=old){old=expr;var f=jQuery.filter(expr,elems,not);expr=f.t.replace(/^\s*,\s*/,"");cur=not?elems=f.r:jQuery.merge(cur,f.r);}return cur;},find:function(t,context){if(typeof t!="string")return[t];if(context&&context.nodeType!=1&&context.nodeType!=9)return[];context=context||document;var ret=[context],done=[],last,nodeName;while(t&&last!=t){var r=[];last=t;t=jQuery.trim(t);var foundToken=false,re=quickChild,m=re.exec(t);if(m){nodeName=m[1].toUpperCase();for(var i=0;ret[i];i++)for(var c=ret[i].firstChild;c;c=c.nextSibling)if(c.nodeType==1&&(nodeName=="*"||c.nodeName.toUpperCase()==nodeName))r.push(c);ret=r;t=t.replace(re,"");if(t.indexOf(" ")==0)continue;foundToken=true;}else{re=/^([>+~])\s*(\w*)/i;if((m=re.exec(t))!=null){r=[];var merge={};nodeName=m[2].toUpperCase();m=m[1];for(var j=0,rl=ret.length;j<rl;j++){var n=m=="~"||m=="+"?ret[j].nextSibling:ret[j].firstChild;for(;n;n=n.nextSibling)if(n.nodeType==1){var id=jQuery.data(n);if(m=="~"&&merge[id])break;if(!nodeName||n.nodeName.toUpperCase()==nodeName){if(m=="~")merge[id]=true;r.push(n);}if(m=="+")break;}}ret=r;t=jQuery.trim(t.replace(re,""));foundToken=true;}}if(t&&!foundToken){if(!t.indexOf(",")){if(context==ret[0])ret.shift();done=jQuery.merge(done,ret);r=ret=[context];t=" "+t.substr(1,t.length);}else{var re2=quickID;var m=re2.exec(t);if(m){m=[0,m[2],m[3],m[1]];}else{re2=quickClass;m=re2.exec(t);}m[2]=m[2].replace(/\\/g,"");var elem=ret[ret.length-1];if(m[1]=="#"&&elem&&elem.getElementById&&!jQuery.isXMLDoc(elem)){var oid=elem.getElementById(m[2]);if((jQuery.browser.msie||jQuery.browser.opera)&&oid&&typeof oid.id=="string"&&oid.id!=m[2])oid=jQuery('[@id="'+m[2]+'"]',elem)[0];ret=r=oid&&(!m[3]||jQuery.nodeName(oid,m[3]))?[oid]:[];}else{for(var i=0;ret[i];i++){var tag=m[1]=="#"&&m[3]?m[3]:m[1]!=""||m[0]==""?"*":m[2];if(tag=="*"&&ret[i].nodeName.toLowerCase()=="object")tag="param";r=jQuery.merge(r,ret[i].getElementsByTagName(tag));}if(m[1]==".")r=jQuery.classFilter(r,m[2]);if(m[1]=="#"){var tmp=[];for(var i=0;r[i];i++)if(r[i].getAttribute("id")==m[2]){tmp=[r[i]];break;}r=tmp;}ret=r;}t=t.replace(re2,"");}}if(t){var val=jQuery.filter(t,r);ret=r=val.r;t=jQuery.trim(val.t);}}if(t)ret=[];if(ret&&context==ret[0])ret.shift();done=jQuery.merge(done,ret);return done;},classFilter:function(r,m,not){m=" "+m+" ";var tmp=[];for(var i=0;r[i];i++){var pass=(" "+r[i].className+" ").indexOf(m)>=0;if(!not&&pass||not&&!pass)tmp.push(r[i]);}return tmp;},filter:function(t,r,not){var last;while(t&&t!=last){last=t;var p=jQuery.parse,m;for(var i=0;p[i];i++){m=p[i].exec(t);if(m){t=t.substring(m[0].length);m[2]=m[2].replace(/\\/g,"");break;}}if(!m)break;if(m[1]==":"&&m[2]=="not")r=isSimple.test(m[3])?jQuery.filter(m[3],r,true).r:jQuery(r).not(m[3]);else if(m[1]==".")r=jQuery.classFilter(r,m[2],not);else if(m[1]=="["){var tmp=[],type=m[3];for(var i=0,rl=r.length;i<rl;i++){var a=r[i],z=a[jQuery.props[m[2]]||m[2]];if(z==null||/href|src|selected/.test(m[2]))z=jQuery.attr(a,m[2])||'';if((type==""&&!!z||type=="="&&z==m[5]||type=="!="&&z!=m[5]||type=="^="&&z&&!z.indexOf(m[5])||type=="$="&&z.substr(z.length-m[5].length)==m[5]||(type=="*="||type=="~=")&&z.indexOf(m[5])>=0)^not)tmp.push(a);}r=tmp;}else if(m[1]==":"&&m[2]=="nth-child"){var merge={},tmp=[],test=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(m[3]=="even"&&"2n"||m[3]=="odd"&&"2n+1"||!/\D/.test(m[3])&&"0n+"+m[3]||m[3]),first=(test[1]+(test[2]||1))-0,last=test[3]-0;for(var i=0,rl=r.length;i<rl;i++){var node=r[i],parentNode=node.parentNode,id=jQuery.data(parentNode);if(!merge[id]){var c=1;for(var n=parentNode.firstChild;n;n=n.nextSibling)if(n.nodeType==1)n.nodeIndex=c++;merge[id]=true;}var add=false;if(first==0){if(node.nodeIndex==last)add=true;}else if((node.nodeIndex-last)%first==0&&(node.nodeIndex-last)/first>=0)add=true;if(add^not)tmp.push(node);}r=tmp;}else{var fn=jQuery.expr[m[1]];if(typeof fn=="object")fn=fn[m[2]];if(typeof fn=="string")fn=eval("false||function(a,i){return "+fn+";}");r=jQuery.grep(r,function(elem,i){return fn(elem,i,m,r);},not);}}return{r:r,t:t};},dir:function(elem,dir){var matched=[],cur=elem[dir];while(cur&&cur!=document){if(cur.nodeType==1)matched.push(cur);cur=cur[dir];}return matched;},nth:function(cur,result,dir,elem){result=result||1;var num=0;for(;cur;cur=cur[dir])if(cur.nodeType==1&&++num==result)break;return cur;},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType==1&&n!=elem)r.push(n);}return r;}});jQuery.event={add:function(elem,types,handler,data){if(elem.nodeType==3||elem.nodeType==8)return;if(jQuery.browser.msie&&elem.setInterval)elem=window;if(!handler.guid)handler.guid=this.guid++;if(data!=undefined){var fn=handler;handler=this.proxy(fn,function(){return fn.apply(this,arguments);});handler.data=data;}var events=jQuery.data(elem,"events")||jQuery.data(elem,"events",{}),handle=jQuery.data(elem,"handle")||jQuery.data(elem,"handle",function(){if(typeof jQuery!="undefined"&&!jQuery.event.triggered)return jQuery.event.handle.apply(arguments.callee.elem,arguments);});handle.elem=elem;jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];handler.type=parts[1];var handlers=events[type];if(!handlers){handlers=events[type]={};if(!jQuery.event.special[type]||jQuery.event.special[type].setup.call(elem)===false){if(elem.addEventListener)elem.addEventListener(type,handle,false);else if(elem.attachEvent)elem.attachEvent("on"+type,handle);}}handlers[handler.guid]=handler;jQuery.event.global[type]=true;});elem=null;},guid:1,global:{},remove:function(elem,types,handler){if(elem.nodeType==3||elem.nodeType==8)return;var events=jQuery.data(elem,"events"),ret,index;if(events){if(types==undefined||(typeof types=="string"&&types.charAt(0)=="."))for(var type in events)this.remove(elem,type+(types||""));else{if(types.type){handler=types.handler;types=types.type;}jQuery.each(types.split(/\s+/),function(index,type){var parts=type.split(".");type=parts[0];if(events[type]){if(handler)delete events[type][handler.guid];else
+for(handler in events[type])if(!parts[1]||events[type][handler].type==parts[1])delete events[type][handler];for(ret in events[type])break;if(!ret){if(!jQuery.event.special[type]||jQuery.event.special[type].teardown.call(elem)===false){if(elem.removeEventListener)elem.removeEventListener(type,jQuery.data(elem,"handle"),false);else if(elem.detachEvent)elem.detachEvent("on"+type,jQuery.data(elem,"handle"));}ret=null;delete events[type];}}});}for(ret in events)break;if(!ret){var handle=jQuery.data(elem,"handle");if(handle)handle.elem=null;jQuery.removeData(elem,"events");jQuery.removeData(elem,"handle");}}},trigger:function(type,data,elem,donative,extra){data=jQuery.makeArray(data);if(type.indexOf("!")>=0){type=type.slice(0,-1);var exclusive=true;}if(!elem){if(this.global[type])jQuery("*").add([window,document]).trigger(type,data);}else{if(elem.nodeType==3||elem.nodeType==8)return undefined;var val,ret,fn=jQuery.isFunction(elem[type]||null),event=!data[0]||!data[0].preventDefault;if(event){data.unshift({type:type,target:elem,preventDefault:function(){},stopPropagation:function(){},timeStamp:now()});data[0][expando]=true;}data[0].type=type;if(exclusive)data[0].exclusive=true;var handle=jQuery.data(elem,"handle");if(handle)val=handle.apply(elem,data);if((!fn||(jQuery.nodeName(elem,'a')&&type=="click"))&&elem["on"+type]&&elem["on"+type].apply(elem,data)===false)val=false;if(event)data.shift();if(extra&&jQuery.isFunction(extra)){ret=extra.apply(elem,val==null?data:data.concat(val));if(ret!==undefined)val=ret;}if(fn&&donative!==false&&val!==false&&!(jQuery.nodeName(elem,'a')&&type=="click")){this.triggered=true;try{elem[type]();}catch(e){}}this.triggered=false;}return val;},handle:function(event){var val,ret,namespace,all,handlers;event=arguments[0]=jQuery.event.fix(event||window.event);namespace=event.type.split(".");event.type=namespace[0];namespace=namespace[1];all=!namespace&&!event.exclusive;handlers=(jQuery.data(this,"events")||{})[event.type];for(var j in handlers){var handler=handlers[j];if(all||handler.type==namespace){event.handler=handler;event.data=handler.data;ret=handler.apply(this,arguments);if(val!==false)val=ret;if(ret===false){event.preventDefault();event.stopPropagation();}}}return val;},fix:function(event){if(event[expando]==true)return event;var originalEvent=event;event={originalEvent:originalEvent};var props="altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode metaKey newValue originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target timeStamp toElement type view wheelDelta which".split(" ");for(var i=props.length;i;i--)event[props[i]]=originalEvent[props[i]];event[expando]=true;event.preventDefault=function(){if(originalEvent.preventDefault)originalEvent.preventDefault();originalEvent.returnValue=false;};event.stopPropagation=function(){if(originalEvent.stopPropagation)originalEvent.stopPropagation();originalEvent.cancelBubble=true;};event.timeStamp=event.timeStamp||now();if(!event.target)event.target=event.srcElement||document;if(event.target.nodeType==3)event.target=event.target.parentNode;if(!event.relatedTarget&&event.fromElement)event.relatedTarget=event.fromElement==event.target?event.toElement:event.fromElement;if(event.pageX==null&&event.clientX!=null){var doc=document.documentElement,body=document.body;event.pageX=event.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc.clientLeft||0);event.pageY=event.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc.clientTop||0);}if(!event.which&&((event.charCode||event.charCode===0)?event.charCode:event.keyCode))event.which=event.charCode||event.keyCode;if(!event.metaKey&&event.ctrlKey)event.metaKey=event.ctrlKey;if(!event.which&&event.button)event.which=(event.button&1?1:(event.button&2?3:(event.button&4?2:0)));return event;},proxy:function(fn,proxy){proxy.guid=fn.guid=fn.guid||proxy.guid||this.guid++;return proxy;},special:{ready:{setup:function(){bindReady();return;},teardown:function(){return;}},mouseenter:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseover",jQuery.event.special.mouseenter.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseover",jQuery.event.special.mouseenter.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseenter";return jQuery.event.handle.apply(this,arguments);}},mouseleave:{setup:function(){if(jQuery.browser.msie)return false;jQuery(this).bind("mouseout",jQuery.event.special.mouseleave.handler);return true;},teardown:function(){if(jQuery.browser.msie)return false;jQuery(this).unbind("mouseout",jQuery.event.special.mouseleave.handler);return true;},handler:function(event){if(withinElement(event,this))return true;event.type="mouseleave";return jQuery.event.handle.apply(this,arguments);}}}};jQuery.fn.extend({bind:function(type,data,fn){return type=="unload"?this.one(type,data,fn):this.each(function(){jQuery.event.add(this,type,fn||data,fn&&data);});},one:function(type,data,fn){var one=jQuery.event.proxy(fn||data,function(event){jQuery(this).unbind(event,one);return(fn||data).apply(this,arguments);});return this.each(function(){jQuery.event.add(this,type,one,fn&&data);});},unbind:function(type,fn){return this.each(function(){jQuery.event.remove(this,type,fn);});},trigger:function(type,data,fn){return this.each(function(){jQuery.event.trigger(type,data,this,true,fn);});},triggerHandler:function(type,data,fn){return this[0]&&jQuery.event.trigger(type,data,this[0],false,fn);},toggle:function(fn){var args=arguments,i=1;while(i<args.length)jQuery.event.proxy(fn,args[i++]);return this.click(jQuery.event.proxy(fn,function(event){this.lastToggle=(this.lastToggle||0)%i;event.preventDefault();return args[this.lastToggle++].apply(this,arguments)||false;}));},hover:function(fnOver,fnOut){return this.bind('mouseenter',fnOver).bind('mouseleave',fnOut);},ready:function(fn){bindReady();if(jQuery.isReady)fn.call(document,jQuery);else
+jQuery.readyList.push(function(){return fn.call(this,jQuery);});return this;}});jQuery.extend({isReady:false,readyList:[],ready:function(){if(!jQuery.isReady){jQuery.isReady=true;if(jQuery.readyList){jQuery.each(jQuery.readyList,function(){this.call(document);});jQuery.readyList=null;}jQuery(document).triggerHandler("ready");}}});var readyBound=false;function bindReady(){if(readyBound)return;readyBound=true;if(document.addEventListener&&!jQuery.browser.opera)document.addEventListener("DOMContentLoaded",jQuery.ready,false);if(jQuery.browser.msie&&window==top)(function(){if(jQuery.isReady)return;try{document.documentElement.doScroll("left");}catch(error){setTimeout(arguments.callee,0);return;}jQuery.ready();})();if(jQuery.browser.opera)document.addEventListener("DOMContentLoaded",function(){if(jQuery.isReady)return;for(var i=0;i<document.styleSheets.length;i++)if(document.styleSheets[i].disabled){setTimeout(arguments.callee,0);return;}jQuery.ready();},false);if(jQuery.browser.safari){var numStyles;(function(){if(jQuery.isReady)return;if(document.readyState!="loaded"&&document.readyState!="complete"){setTimeout(arguments.callee,0);return;}if(numStyles===undefined)numStyles=jQuery("style, link[rel=stylesheet]").length;if(document.styleSheets.length!=numStyles){setTimeout(arguments.callee,0);return;}jQuery.ready();})();}jQuery.event.add(window,"load",jQuery.ready);}jQuery.each(("blur,focus,load,resize,scroll,unload,click,dblclick,"+"mousedown,mouseup,mousemove,mouseover,mouseout,change,select,"+"submit,keydown,keypress,keyup,error").split(","),function(i,name){jQuery.fn[name]=function(fn){return fn?this.bind(name,fn):this.trigger(name);};});var withinElement=function(event,elem){var parent=event.relatedTarget;while(parent&&parent!=elem)try{parent=parent.parentNode;}catch(error){parent=elem;}return parent==elem;};jQuery(window).bind("unload",function(){jQuery("*").add(document).unbind();});jQuery.fn.extend({_load:jQuery.fn.load,load:function(url,params,callback){if(typeof url!='string')return this._load(url);var off=url.indexOf(" ");if(off>=0){var selector=url.slice(off,url.length);url=url.slice(0,off);}callback=callback||function(){};var type="GET";if(params)if(jQuery.isFunction(params)){callback=params;params=null;}else{params=jQuery.param(params);type="POST";}var self=this;jQuery.ajax({url:url,type:type,dataType:"html",data:params,complete:function(res,status){if(status=="success"||status=="notmodified")self.html(selector?jQuery("<div/>").append(res.responseText.replace(/<script(.|\s)*?\/script>/g,"")).find(selector):res.responseText);self.each(callback,[res.responseText,status,res]);}});return this;},serialize:function(){return jQuery.param(this.serializeArray());},serializeArray:function(){return this.map(function(){return jQuery.nodeName(this,"form")?jQuery.makeArray(this.elements):this;}).filter(function(){return this.name&&!this.disabled&&(this.checked||/select|textarea/i.test(this.nodeName)||/text|hidden|password/i.test(this.type));}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:val.constructor==Array?jQuery.map(val,function(val,i){return{name:elem.name,value:val};}):{name:elem.name,value:val};}).get();}});jQuery.each("ajaxStart,ajaxStop,ajaxComplete,ajaxError,ajaxSuccess,ajaxSend".split(","),function(i,o){jQuery.fn[o]=function(f){return this.bind(o,f);};});var jsc=now();jQuery.extend({get:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data=null;}return jQuery.ajax({type:"GET",url:url,data:data,success:callback,dataType:type});},getScript:function(url,callback){return jQuery.get(url,null,callback,"script");},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json");},post:function(url,data,callback,type){if(jQuery.isFunction(data)){callback=data;data={};}return jQuery.ajax({type:"POST",url:url,data:data,success:callback,dataType:type});},ajaxSetup:function(settings){jQuery.extend(jQuery.ajaxSettings,settings);},ajaxSettings:{url:location.href,global:true,type:"GET",timeout:0,contentType:"application/x-www-form-urlencoded",processData:true,async:true,data:null,username:null,password:null,accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},ajax:function(s){s=jQuery.extend(true,s,jQuery.extend(true,{},jQuery.ajaxSettings,s));var jsonp,jsre=/=\?(&|$)/g,status,data,type=s.type.toUpperCase();if(s.data&&s.processData&&typeof s.data!="string")s.data=jQuery.param(s.data);if(s.dataType=="jsonp"){if(type=="GET"){if(!s.url.match(jsre))s.url+=(s.url.match(/\?/)?"&":"?")+(s.jsonp||"callback")+"=?";}else if(!s.data||!s.data.match(jsre))s.data=(s.data?s.data+"&":"")+(s.jsonp||"callback")+"=?";s.dataType="json";}if(s.dataType=="json"&&(s.data&&s.data.match(jsre)||s.url.match(jsre))){jsonp="jsonp"+jsc++;if(s.data)s.data=(s.data+"").replace(jsre,"="+jsonp+"$1");s.url=s.url.replace(jsre,"="+jsonp+"$1");s.dataType="script";window[jsonp]=function(tmp){data=tmp;success();complete();window[jsonp]=undefined;try{delete window[jsonp];}catch(e){}if(head)head.removeChild(script);};}if(s.dataType=="script"&&s.cache==null)s.cache=false;if(s.cache===false&&type=="GET"){var ts=now();var ret=s.url.replace(/(\?|&)_=.*?(&|$)/,"$1_="+ts+"$2");s.url=ret+((ret==s.url)?(s.url.match(/\?/)?"&":"?")+"_="+ts:"");}if(s.data&&type=="GET"){s.url+=(s.url.match(/\?/)?"&":"?")+s.data;s.data=null;}if(s.global&&!jQuery.active++)jQuery.event.trigger("ajaxStart");var remote=/^(?:\w+:)?\/\/([^\/?#]+)/;if(s.dataType=="script"&&type=="GET"&&remote.test(s.url)&&remote.exec(s.url)[1]!=location.host){var head=document.getElementsByTagName("head")[0];var script=document.createElement("script");script.src=s.url;if(s.scriptCharset)script.charset=s.scriptCharset;if(!jsonp){var done=false;script.onload=script.onreadystatechange=function(){if(!done&&(!this.readyState||this.readyState=="loaded"||this.readyState=="complete")){done=true;success();complete();head.removeChild(script);}};}head.appendChild(script);return undefined;}var requestDone=false;var xhr=window.ActiveXObject?new ActiveXObject("Microsoft.XMLHTTP"):new XMLHttpRequest();if(s.username)xhr.open(type,s.url,s.async,s.username,s.password);else
+xhr.open(type,s.url,s.async);try{if(s.data)xhr.setRequestHeader("Content-Type",s.contentType);if(s.ifModified)xhr.setRequestHeader("If-Modified-Since",jQuery.lastModified[s.url]||"Thu, 01 Jan 1970 00:00:00 GMT");xhr.setRequestHeader("X-Requested-With","XMLHttpRequest");xhr.setRequestHeader("Accept",s.dataType&&s.accepts[s.dataType]?s.accepts[s.dataType]+", */*":s.accepts._default);}catch(e){}if(s.beforeSend&&s.beforeSend(xhr,s)===false){s.global&&jQuery.active--;xhr.abort();return false;}if(s.global)jQuery.event.trigger("ajaxSend",[xhr,s]);var onreadystatechange=function(isTimeout){if(!requestDone&&xhr&&(xhr.readyState==4||isTimeout=="timeout")){requestDone=true;if(ival){clearInterval(ival);ival=null;}status=isTimeout=="timeout"&&"timeout"||!jQuery.httpSuccess(xhr)&&"error"||s.ifModified&&jQuery.httpNotModified(xhr,s.url)&&"notmodified"||"success";if(status=="success"){try{data=jQuery.httpData(xhr,s.dataType,s.dataFilter);}catch(e){status="parsererror";}}if(status=="success"){var modRes;try{modRes=xhr.getResponseHeader("Last-Modified");}catch(e){}if(s.ifModified&&modRes)jQuery.lastModified[s.url]=modRes;if(!jsonp)success();}else
+jQuery.handleError(s,xhr,status);complete();if(s.async)xhr=null;}};if(s.async){var ival=setInterval(onreadystatechange,13);if(s.timeout>0)setTimeout(function(){if(xhr){xhr.abort();if(!requestDone)onreadystatechange("timeout");}},s.timeout);}try{xhr.send(s.data);}catch(e){jQuery.handleError(s,xhr,null,e);}if(!s.async)onreadystatechange();function success(){if(s.success)s.success(data,status);if(s.global)jQuery.event.trigger("ajaxSuccess",[xhr,s]);}function complete(){if(s.complete)s.complete(xhr,status);if(s.global)jQuery.event.trigger("ajaxComplete",[xhr,s]);if(s.global&&!--jQuery.active)jQuery.event.trigger("ajaxStop");}return xhr;},handleError:function(s,xhr,status,e){if(s.error)s.error(xhr,status,e);if(s.global)jQuery.event.trigger("ajaxError",[xhr,s,e]);},active:0,httpSuccess:function(xhr){try{return!xhr.status&&location.protocol=="file:"||(xhr.status>=200&&xhr.status<300)||xhr.status==304||xhr.status==1223||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpNotModified:function(xhr,url){try{var xhrRes=xhr.getResponseHeader("Last-Modified");return xhr.status==304||xhrRes==jQuery.lastModified[url]||jQuery.browser.safari&&xhr.status==undefined;}catch(e){}return false;},httpData:function(xhr,type,filter){var ct=xhr.getResponseHeader("content-type"),xml=type=="xml"||!type&&ct&&ct.indexOf("xml")>=0,data=xml?xhr.responseXML:xhr.responseText;if(xml&&data.documentElement.tagName=="parsererror")throw"parsererror";if(filter)data=filter(data,type);if(type=="script")jQuery.globalEval(data);if(type=="json")data=eval("("+data+")");return data;},param:function(a){var s=[];if(a.constructor==Array||a.jquery)jQuery.each(a,function(){s.push(encodeURIComponent(this.name)+"="+encodeURIComponent(this.value));});else
+for(var j in a)if(a[j]&&a[j].constructor==Array)jQuery.each(a[j],function(){s.push(encodeURIComponent(j)+"="+encodeURIComponent(this));});else
+s.push(encodeURIComponent(j)+"="+encodeURIComponent(jQuery.isFunction(a[j])?a[j]():a[j]));return s.join("&").replace(/%20/g,"+");}});jQuery.fn.extend({show:function(speed,callback){return speed?this.animate({height:"show",width:"show",opacity:"show"},speed,callback):this.filter(":hidden").each(function(){this.style.display=this.oldblock||"";if(jQuery.css(this,"display")=="none"){var elem=jQuery("<"+this.tagName+" />").appendTo("body");this.style.display=elem.css("display");if(this.style.display=="none")this.style.display="block";elem.remove();}}).end();},hide:function(speed,callback){return speed?this.animate({height:"hide",width:"hide",opacity:"hide"},speed,callback):this.filter(":visible").each(function(){this.oldblock=this.oldblock||jQuery.css(this,"display");this.style.display="none";}).end();},_toggle:jQuery.fn.toggle,toggle:function(fn,fn2){return jQuery.isFunction(fn)&&jQuery.isFunction(fn2)?this._toggle.apply(this,arguments):fn?this.animate({height:"toggle",width:"toggle",opacity:"toggle"},fn,fn2):this.each(function(){jQuery(this)[jQuery(this).is(":hidden")?"show":"hide"]();});},slideDown:function(speed,callback){return this.animate({height:"show"},speed,callback);},slideUp:function(speed,callback){return this.animate({height:"hide"},speed,callback);},slideToggle:function(speed,callback){return this.animate({height:"toggle"},speed,callback);},fadeIn:function(speed,callback){return this.animate({opacity:"show"},speed,callback);},fadeOut:function(speed,callback){return this.animate({opacity:"hide"},speed,callback);},fadeTo:function(speed,to,callback){return this.animate({opacity:to},speed,callback);},animate:function(prop,speed,easing,callback){var optall=jQuery.speed(speed,easing,callback);return this[optall.queue===false?"each":"queue"](function(){if(this.nodeType!=1)return false;var opt=jQuery.extend({},optall),p,hidden=jQuery(this).is(":hidden"),self=this;for(p in prop){if(prop[p]=="hide"&&hidden||prop[p]=="show"&&!hidden)return opt.complete.call(this);if(p=="height"||p=="width"){opt.display=jQuery.css(this,"display");opt.overflow=this.style.overflow;}}if(opt.overflow!=null)this.style.overflow="hidden";opt.curAnim=jQuery.extend({},prop);jQuery.each(prop,function(name,val){var e=new jQuery.fx(self,opt,name);if(/toggle|show|hide/.test(val))e[val=="toggle"?hidden?"show":"hide":val](prop);else{var parts=val.toString().match(/^([+-]=)?([\d+-.]+)(.*)$/),start=e.cur(true)||0;if(parts){var end=parseFloat(parts[2]),unit=parts[3]||"px";if(unit!="px"){self.style[name]=(end||1)+unit;start=((end||1)/e.cur(true))*start;self.style[name]=start+unit;}if(parts[1])end=((parts[1]=="-="?-1:1)*end)+start;e.custom(start,end,unit);}else
+e.custom(start,val,"");}});return true;});},queue:function(type,fn){if(jQuery.isFunction(type)||(type&&type.constructor==Array)){fn=type;type="fx";}if(!type||(typeof type=="string"&&!fn))return queue(this[0],type);return this.each(function(){if(fn.constructor==Array)queue(this,type,fn);else{queue(this,type).push(fn);if(queue(this,type).length==1)fn.call(this);}});},stop:function(clearQueue,gotoEnd){var timers=jQuery.timers;if(clearQueue)this.queue([]);this.each(function(){for(var i=timers.length-1;i>=0;i--)if(timers[i].elem==this){if(gotoEnd)timers[i](true);timers.splice(i,1);}});if(!gotoEnd)this.dequeue();return this;}});var queue=function(elem,type,array){if(elem){type=type||"fx";var q=jQuery.data(elem,type+"queue");if(!q||array)q=jQuery.data(elem,type+"queue",jQuery.makeArray(array));}return q;};jQuery.fn.dequeue=function(type){type=type||"fx";return this.each(function(){var q=queue(this,type);q.shift();if(q.length)q[0].call(this);});};jQuery.extend({speed:function(speed,easing,fn){var opt=speed&&speed.constructor==Object?speed:{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&easing.constructor!=Function&&easing};opt.duration=(opt.duration&&opt.duration.constructor==Number?opt.duration:jQuery.fx.speeds[opt.duration])||jQuery.fx.speeds.def;opt.old=opt.complete;opt.complete=function(){if(opt.queue!==false)jQuery(this).dequeue();if(jQuery.isFunction(opt.old))opt.old.call(this);};return opt;},easing:{linear:function(p,n,firstNum,diff){return firstNum+diff*p;},swing:function(p,n,firstNum,diff){return((-Math.cos(p*Math.PI)/2)+0.5)*diff+firstNum;}},timers:[],timerId:null,fx:function(elem,options,prop){this.options=options;this.elem=elem;this.prop=prop;if(!options.orig)options.orig={};}});jQuery.fx.prototype={update:function(){if(this.options.step)this.options.step.call(this.elem,this.now,this);(jQuery.fx.step[this.prop]||jQuery.fx.step._default)(this);if(this.prop=="height"||this.prop=="width")this.elem.style.display="block";},cur:function(force){if(this.elem[this.prop]!=null&&this.elem.style[this.prop]==null)return this.elem[this.prop];var r=parseFloat(jQuery.css(this.elem,this.prop,force));return r&&r>-10000?r:parseFloat(jQuery.curCSS(this.elem,this.prop))||0;},custom:function(from,to,unit){this.startTime=now();this.start=from;this.end=to;this.unit=unit||this.unit||"px";this.now=this.start;this.pos=this.state=0;this.update();var self=this;function t(gotoEnd){return self.step(gotoEnd);}t.elem=this.elem;jQuery.timers.push(t);if(jQuery.timerId==null){jQuery.timerId=setInterval(function(){var timers=jQuery.timers;for(var i=0;i<timers.length;i++)if(!timers[i]())timers.splice(i--,1);if(!timers.length){clearInterval(jQuery.timerId);jQuery.timerId=null;}},13);}},show:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.show=true;this.custom(0,this.cur());if(this.prop=="width"||this.prop=="height")this.elem.style[this.prop]="1px";jQuery(this.elem).show();},hide:function(){this.options.orig[this.prop]=jQuery.attr(this.elem.style,this.prop);this.options.hide=true;this.custom(this.cur(),0);},step:function(gotoEnd){var t=now();if(gotoEnd||t>this.options.duration+this.startTime){this.now=this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;var done=true;for(var i in this.options.curAnim)if(this.options.curAnim[i]!==true)done=false;if(done){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;this.elem.style.display=this.options.display;if(jQuery.css(this.elem,"display")=="none")this.elem.style.display="block";}if(this.options.hide)this.elem.style.display="none";if(this.options.hide||this.options.show)for(var p in this.options.curAnim)jQuery.attr(this.elem.style,p,this.options.orig[p]);}if(done)this.options.complete.call(this.elem);return false;}else{var n=t-this.startTime;this.state=n/this.options.duration;this.pos=jQuery.easing[this.options.easing||(jQuery.easing.swing?"swing":"linear")](this.state,n,0,1,this.options.duration);this.now=this.start+((this.end-this.start)*this.pos);this.update();}return true;}};jQuery.extend(jQuery.fx,{speeds:{slow:600,fast:200,def:400},step:{scrollLeft:function(fx){fx.elem.scrollLeft=fx.now;},scrollTop:function(fx){fx.elem.scrollTop=fx.now;},opacity:function(fx){jQuery.attr(fx.elem.style,"opacity",fx.now);},_default:function(fx){fx.elem.style[fx.prop]=fx.now+fx.unit;}}});jQuery.fn.offset=function(){var left=0,top=0,elem=this[0],results;if(elem)with(jQuery.browser){var parent=elem.parentNode,offsetChild=elem,offsetParent=elem.offsetParent,doc=elem.ownerDocument,safari2=safari&&parseInt(version)<522&&!/adobeair/i.test(userAgent),css=jQuery.curCSS,fixed=css(elem,"position")=="fixed";if(elem.getBoundingClientRect){var box=elem.getBoundingClientRect();add(box.left+Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),box.top+Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));add(-doc.documentElement.clientLeft,-doc.documentElement.clientTop);}else{add(elem.offsetLeft,elem.offsetTop);while(offsetParent){add(offsetParent.offsetLeft,offsetParent.offsetTop);if(mozilla&&!/^t(able|d|h)$/i.test(offsetParent.tagName)||safari&&!safari2)border(offsetParent);if(!fixed&&css(offsetParent,"position")=="fixed")fixed=true;offsetChild=/^body$/i.test(offsetParent.tagName)?offsetChild:offsetParent;offsetParent=offsetParent.offsetParent;}while(parent&&parent.tagName&&!/^body|html$/i.test(parent.tagName)){if(!/^inline|table.*$/i.test(css(parent,"display")))add(-parent.scrollLeft,-parent.scrollTop);if(mozilla&&css(parent,"overflow")!="visible")border(parent);parent=parent.parentNode;}if((safari2&&(fixed||css(offsetChild,"position")=="absolute"))||(mozilla&&css(offsetChild,"position")!="absolute"))add(-doc.body.offsetLeft,-doc.body.offsetTop);if(fixed)add(Math.max(doc.documentElement.scrollLeft,doc.body.scrollLeft),Math.max(doc.documentElement.scrollTop,doc.body.scrollTop));}results={top:top,left:left};}function border(elem){add(jQuery.curCSS(elem,"borderLeftWidth",true),jQuery.curCSS(elem,"borderTopWidth",true));}function add(l,t){left+=parseInt(l,10)||0;top+=parseInt(t,10)||0;}return results;};jQuery.fn.extend({position:function(){var left=0,top=0,results;if(this[0]){var offsetParent=this.offsetParent(),offset=this.offset(),parentOffset=/^body|html$/i.test(offsetParent[0].tagName)?{top:0,left:0}:offsetParent.offset();offset.top-=num(this,'marginTop');offset.left-=num(this,'marginLeft');parentOffset.top+=num(offsetParent,'borderTopWidth');parentOffset.left+=num(offsetParent,'borderLeftWidth');results={top:offset.top-parentOffset.top,left:offset.left-parentOffset.left};}return results;},offsetParent:function(){var offsetParent=this[0].offsetParent;while(offsetParent&&(!/^body|html$/i.test(offsetParent.tagName)&&jQuery.css(offsetParent,'position')=='static'))offsetParent=offsetParent.offsetParent;return jQuery(offsetParent);}});jQuery.each(['Left','Top'],function(i,name){var method='scroll'+name;jQuery.fn[method]=function(val){if(!this[0])return;return val!=undefined?this.each(function(){this==window||this==document?window.scrollTo(!i?val:jQuery(window).scrollLeft(),i?val:jQuery(window).scrollTop()):this[method]=val;}):this[0]==window||this[0]==document?self[i?'pageYOffset':'pageXOffset']||jQuery.boxModel&&document.documentElement[method]||document.body[method]:this[0][method];};});jQuery.each(["Height","Width"],function(i,name){var tl=i?"Left":"Top",br=i?"Right":"Bottom";jQuery.fn["inner"+name]=function(){return this[name.toLowerCase()]()+num(this,"padding"+tl)+num(this,"padding"+br);};jQuery.fn["outer"+name]=function(margin){return this["inner"+name]()+num(this,"border"+tl+"Width")+num(this,"border"+br+"Width")+(margin?num(this,"margin"+tl)+num(this,"margin"+br):0);};});})();
\ No newline at end of file
diff --git a/root/static/js/misc.js b/root/static/js/misc.js
deleted file mode 100644 (file)
index a21f365..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-function toggleVisibility(id) {
-       var obj=document.getElementById(id);
-       if (obj.style.display=='none') {
-               obj.style.display='';
-       }
-       else {
-               obj.style.display='none';
-       }
-}
diff --git a/t/controller_Calls.t b/t/controller_Calls.t
new file mode 100644 (file)
index 0000000..191dba0
--- /dev/null
@@ -0,0 +1,10 @@
+use strict;
+use warnings;
+use Test::More tests => 3;
+
+BEGIN { use_ok 'Catalyst::Test', 'NDWeb' }
+BEGIN { use_ok 'NDWeb::Controller::Calls' }
+
+ok( request('/calls')->is_success, 'Request should succeed' );
+
+
diff --git a/templates/calls.tmpl b/templates/calls.tmpl
deleted file mode 100644 (file)
index b8b114a..0000000
+++ /dev/null
@@ -1,177 +0,0 @@
-<TMPL_IF Call>
-<form action="<TMPL_VAR NAME=PAGE>" method="post">
-<input type="hidden" name="page" value="<TMPL_VAR NAME=PAGE>"/>
-<input type="hidden" name="call" value="<TMPL_VAR NAME=Call>"/>
-<fieldset> <legend>Call details, call# <TMPL_VAR NAME=Call></legend>
-<table>
-<tr>
-<td>
-<ul>
-       <li>Current DC: <TMPL_VAR NAME=DC></li>
-       <li>Member:<TMPL_VAR NAME=Member> </li>
-       <li>SMS:<TMPL_VAR NAME=SMS> </li>
-       <li>Coords: <a href="check?coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Coords></a></li>
-       <li>Defense points: <TMPL_VAR NAME=DefensePoints></li>
-       <li>Landing at tick: <br/>
-               <input type="text" name="tick" value="<TMPL_VAR NAME=LandingTick>"/>
-               <input type="checkbox" name="ctick"/></li>
-       <li>Current ETA: <TMPL_VAR NAME=ETA></li>
-</ul>
-</td>
-<td>
-       <textarea rows="8" cols="40" name="info"><TMPL_VAR NAME=Info></textarea>
-</td>
-<td><ul>
-       <li><input type="text" name="bcalc" value="<TMPL_VAR NAME=BCalc>"/><input type="checkbox" name="cbcalc"/></li>
-       <li>Change Notes? <input type="checkbox" name="cinfo"/></li>
-       <li><input type="submit" name="cmd" value="Submit"/></li>
-       <li><input type="submit" name="cmd" value="Take call"/></li>
-       <li><input type="submit" name="cmd" value="<TMPL_VAR NAME=Cover> call"/></li>
-       <li><input type="submit" name="cmd" value="<TMPL_VAR NAME=Ignore> call"/></li>
-</ul></td>
-</tr>
-</table>
-</fieldset>
-</form>
-<fieldset><legend>Attackers:</legend>
-<form action="<TMPL_VAR NAME=PAGE>" method="post">
-       <input type="hidden" name="page" value="<TMPL_VAR NAME=PAGE>"/>
-       <input type="hidden" name="call" value="<TMPL_VAR NAME=Call>"/>
-       <table>
-       <tr>
-       <th>Coords</th>
-       <th>Planet status</th>
-       <th>Alliance</th>
-       <th>Race</th>
-       <th>Initial ETA</th>
-       <th>Amount</th>
-       <th>Shiptypes</th>
-       <th>Fleet</th>
-       <th>Change/remove?</th>
-       </tr>
-       <TMPL_LOOP Attackers>
-       <tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>" onclick="toggleVisibility('attacker<TMPL_VAR NAME=Id>')">
-               <td><a href="/check?coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Coords></a></td>
-               <td class="<TMPL_VAR NAME=Planet_status>"><TMPL_VAR NAME=Planet_status></td>
-               <td class="<TMPL_VAR NAME=Relationship>"><TMPL_VAR NAME=Alliance> (<TMPL_VAR NAME=Relationship>)</td>
-               <td><TMPL_VAR NAME=Race></td>
-               <td><TMPL_VAR NAME=ETA></td>
-               <td><TMPL_VAR NAME=Amount></td>
-               <td><input class="coord" type="text" name="shiptype:<TMPL_VAR NAME=Id>" value="<TMPL_VAR NAME=Shiptype>"/></td>
-               <td><TMPL_VAR NAME=Fleet></td>
-               <td><input type="checkbox" name="change:<TMPL_VAR NAME=Id>"/></td>
-       </tr>
-       <tr id="attacker<TMPL_VAR NAME=Id>" style="z-index:1; display:none;">
-       <td></td>
-       <td colspan="8">
-       <table>
-               <tr><th>Target</th><th>Name</th><th>Mission</th><th>Tick</th><th>ETA</th><th>Amount</th></tr>
-               <TMPL_LOOP Missions>
-               <tr align="center" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>" onclick="toggleVisibility('fleet<TMPL_VAR NAME=Id>')">
-                       <td><a href="/check?coords=<TMPL_VAR NAME=Target>"><TMPL_VAR NAME=Target></a></td>
-                       <td><TMPL_VAR NAME=Name></td>
-                       <td class="<TMPL_VAR NAME=Class>"><TMPL_VAR NAME=Mission></td><td><TMPL_VAR NAME=Tick></td>
-                       <td><TMPL_VAR NAME=ETA></td><td><TMPL_VAR NAME=Amount></td>
-               </tr>
-               <tr id="fleet<TMPL_VAR NAME=Id>" style="z-index:1; display:none;">
-                       <td/>
-                       <td colspan="5"><table>
-                       <TMPL_LOOP Ships>
-                       <tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-                               <td><TMPL_VAR NAME=Ship></td><td><TMPL_VAR NAME=Amount></td>
-                       </tr>
-                       </TMPL_LOOP>
-                       </table></td>
-               </tr>
-               </TMPL_LOOP>
-       </table>
-       </td></tr>
-       </TMPL_LOOP>
-       </table>
-       <p>
-       <input type="submit" name="cmd" value="Change"/>
-       <input type="submit" name="cmd" value="Remove"/>
-       </p>
-</form>
-</fieldset>
-<fieldset><legend>Member fleet</legend>
-<table>
-       <tr><th>Target</th><th>Name</th><th>Mission</th><th>Tick</th><th>ETA</th><th>Amount</th></tr>
-       <TMPL_LOOP Fleets>
-       <tr align="center" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>" onclick="toggleVisibility('fleet<TMPL_VAR NAME=Id>')">
-               <td><a href="/check?coords=<TMPL_VAR NAME=Target>"><TMPL_VAR NAME=Target></a></td>
-               <td><TMPL_VAR NAME=Name></td>
-               <td class="<TMPL_VAR NAME=Class>"><TMPL_VAR NAME=Mission></td><td><TMPL_VAR NAME=Tick></td>
-               <td><TMPL_VAR NAME=ETA></td><td><TMPL_VAR NAME=Amount></td>
-       </tr>
-       <tr id="fleet<TMPL_VAR NAME=Id>" style="z-index:1; display:none;">
-               <td/>
-               <td colspan="5"><table>
-               <TMPL_LOOP Ships>
-               <tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-                       <td><TMPL_VAR NAME=Ship></td><td><TMPL_VAR NAME=Amount></td>
-               </tr>
-               </TMPL_LOOP>
-               </table></td>
-       </tr>
-       </TMPL_LOOP>
-</table>
-</fieldset>
-<fieldset><legend>Defenders</legend>
-<table>
-       <tr><th>Sender</th><th>Name</th><th>Mission</th><th>Landing Tick</th><th>ETA</th><th>Amount</th></tr>
-       <TMPL_LOOP Defenders>
-       <tr align="center" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>" onclick="toggleVisibility('fleet<TMPL_VAR NAME=Id>')">
-               <td><a href="/check?coords=<TMPL_VAR NAME=Sender>"><TMPL_VAR NAME=Sender></a></td>
-               <td><TMPL_VAR NAME=Name></td>
-               <td class="<TMPL_VAR NAME=Class>"><TMPL_VAR NAME=Mission></td><td><TMPL_VAR NAME=Tick></td>
-               <td><TMPL_VAR NAME=ETA></td><td><TMPL_VAR NAME=Amount></td>
-       </tr>
-       <tr id="fleet<TMPL_VAR NAME=Id>" style="z-index:1; display:none;">
-               <td/>
-               <td colspan="5"><table>
-               <TMPL_LOOP Ships>
-               <tr class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-                       <td><TMPL_VAR NAME=Ship></td><td><TMPL_VAR NAME=Amount></td>
-               </tr>
-               </TMPL_LOOP>
-               </table></td>
-       </tr>
-       </TMPL_LOOP>
-</table>
-</fieldset>
-
-<TMPL_IF Thread>
-<div>
-<TMPL_VAR ESCAPE=NONE NAME=Thread>
-<form action="<TMPL_VAR NAME=PAGE>#NewPosts" method="post"><fieldset class="forum-post"> <legend>New Reply</legend>
-       <textarea rows="10" cols="60" name="message"></textarea>
-       <input type="hidden" name="cmd" value="forumpost"/>
-       <input type="hidden" name="t" value="<TMPL_VAR NAME=Id>"/>
-       <input type="hidden" name="page" value="<TMPL_VAR NAME=PAGE>"/>
-       <input type="hidden" name="call" value="<TMPL_VAR NAME=Call>"/>
-       <br/>
-       <input type="submit" value="Submit"/>
-</fieldset></form>
-</div>
-</TMPL_IF>
-<TMPL_ELSE>
-<table>
-       <tr><th>Call</th><th>DC</th><th>Def Fleets</th><th>Member (def points)</th><th>Landing tick</th><th>Races</th><th>Amount</th><th>Shiptypes</th><th>ETA</th><th>Alliance</th><th>Attackers</th></tr>
-<TMPL_LOOP Calls>
-       <tr align="center" class="<TMPL_IF __odd__>odd<TMPL_ELSE>even</TMPL_IF>">
-               <td class="<TMPL_VAR NAME=DCSTYLE>"><a href="/<TMPL_VAR NAME=PAGE>?call=<TMPL_VAR NAME=Id>"><TMPL_VAR NAME=Id></a></td>
-               <td><TMPL_VAR NAME=DC></td>
-               <td><TMPL_VAR NAME=Fleets></td>
-               <td class='<TMPL_VAR NAME=DefPrio>'><TMPL_IF Id><a href="/check?coords=<TMPL_VAR NAME=Coords>"><TMPL_VAR NAME=Coords> (<TMPL_VAR NAME=Defense_points>)</a><TMPL_ELSE>-New Day-</TMPL_IF></td>
-               <td><TMPL_VAR NAME=Landing_tick></td>
-               <td><TMPL_VAR NAME=Race></td>
-               <td><TMPL_VAR NAME=Amount></td>
-               <td><TMPL_VAR NAME=Shiptype></td>
-               <td><TMPL_VAR NAME=Curreta> (<TMPL_VAR NAME=Eta>)</td>
-               <td><TMPL_VAR NAME=Alliance></td>
-               <td><TMPL_VAR ESCAPE=NONE NAME=Attackers></td>
-       </tr>
-</TMPL_LOOP>
-</table>
-</TMPL_IF>