From 11149303e8c0c031f5e08c5792930b490ba4a30b Mon Sep 17 00:00:00 2001 From: Michael Andreen Date: Thu, 3 Jul 2008 13:55:14 +0200 Subject: [PATCH] Converted calls page, also using jquery. --- NDWeb/Pages/Calls.pm | 296 ------------------------- database/group_roles.sql | 8 + lib/NDWeb.pm | 4 + lib/NDWeb/Controller/Calls.pm | 335 +++++++++++++++++++++++++++++ lib/NDWeb/Controller/Forum.pm | 11 +- root/lib/site/html.tt2 | 2 +- root/lib/site/leftbar.tt2 | 9 +- root/src/calls/edit.tt2 | 140 ++++++++++++ root/src/calls/list.tt2 | 30 +++ root/static/js/jquery-1.2.6.min.js | 32 +++ root/static/js/misc.js | 9 - t/controller_Calls.t | 10 + templates/calls.tmpl | 177 --------------- 13 files changed, 573 insertions(+), 490 deletions(-) delete mode 100644 NDWeb/Pages/Calls.pm create mode 100644 lib/NDWeb/Controller/Calls.pm create mode 100644 root/src/calls/edit.tt2 create mode 100644 root/src/calls/list.tt2 create mode 100644 root/static/js/jquery-1.2.6.min.js delete mode 100644 root/static/js/misc.js create mode 100644 t/controller_Calls.t delete mode 100644 templates/calls.tmpl diff --git a/NDWeb/Pages/Calls.pm b/NDWeb/Pages/Calls.pm deleted file mode 100644 index 6e51754..0000000 --- a/NDWeb/Pages/Calls.pm +++ /dev/null @@ -1,296 +0,0 @@ -#************************************************************************** -# Copyright (C) 2006 by Michael Andreen * -# * -# 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+)}{$1}g; - $call->{dcstyle} = 'Hostile' unless defined $call->{dc}; - $call->{shiptype} = $call->{shiptype}; - push @calls, $call; - } - $BODY->param(Calls => \@calls); - } - return $BODY; -} -1; diff --git a/database/group_roles.sql b/database/group_roles.sql index 16e0c4e..088af44 100644 --- a/database/group_roles.sql +++ b/database/group_roles.sql @@ -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'); diff --git a/lib/NDWeb.pm b/lib/NDWeb.pm index b47a9fa..df1da17 100644 --- a/lib/NDWeb.pm +++ b/lib/NDWeb.pm @@ -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 index 0000000..cf468a8 --- /dev/null +++ b/lib/NDWeb/Controller/Calls.pm @@ -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; diff --git a/lib/NDWeb/Controller/Forum.pm b/lib/NDWeb/Controller/Forum.pm index 4145781..0a27acc 100644 --- a/lib/NDWeb/Controller/Forum.pm +++ b/lib/NDWeb/Controller/Forum.pm @@ -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; } diff --git a/root/lib/site/html.tt2 b/root/lib/site/html.tt2 index 91fbff0..4c9f5b5 100644 --- a/root/lib/site/html.tt2 +++ b/root/lib/site/html.tt2 @@ -7,7 +7,7 @@ - + [% content %] diff --git a/root/lib/site/leftbar.tt2 b/root/lib/site/leftbar.tt2 index 62a7bf0..6c1aea1 100644 --- a/root/lib/site/leftbar.tt2 +++ b/root/lib/site/leftbar.tt2 @@ -72,10 +72,11 @@

DC menu

[% 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 index 0000000..14c2175 --- /dev/null +++ b/root/src/calls/edit.tt2 @@ -0,0 +1,140 @@ +[% META title = 'Edit call' %] + +[% BLOCK missiontable %] + + + [% FOR m IN missions %] + + + + + + + + [% IF m.fleetcatch %] + + [% END %] + + [% IF m.ships %] + + + + [% END %] + [% END %] +
CoordsNameMissionTickETAAmount
+ [% IF m.ships %] + + [% END %] + + [% IF m.planet %] + [% m.coords %] + [% END %] + [% m.name %][% m.mission %][% m.tick %][% m.eta %][% m.amount %]FLEETCATCH!!
+ + [% FOR s IN m.ships %] + + + + [% END %] +
[% s.ship %][% s.amount %]
+[% END %] + +
+
Call details, call# [% call.id %] + + + + + + +
+
    +
  • Current DC: [% call.dc %]
  • +
  • Member: [% call.member %]
  • +
  • SMS: [% call.sms %]
  • +
  • Coords: [% call.coords %]
  • +
  • Landing at tick:
    + +
  • +
  • Current ETA: [% call.landing_tick - TICK %]
  • +
+
+ +
    +
  • Change Notes?
  • +
  • +
  • +
  • +
  • +
+
+
+
Attackers: +
+ + + + + + + + + + + + + +[% FOR a IN attackers %] + + + + + + + + + + + + + + + +[% END %] +
CoordsPlanet statusAllianceRaceInitial ETAAmountShiptypesFleetChange/remove?
[% a.coords %][% a.planet_status %][% a.alliance %] ([% a.relationship %])[% a.race %][% a.eta %][% a.amount %][% a.fleet %]
+ [% PROCESS missiontable missions=a.missions %] +
+

+ + +

+
+
+
Member fleet +[% PROCESS missiontable missions=fleets %] +
+
Defenders +[% PROCESS missiontable missions=defenders %] +
+ +
+[% FOR post IN posts %] +
+[% post.username %] : [% post.time %] + [% post.message %] +
+[% END %] + +
New Reply + + +
+
+ + diff --git a/root/src/calls/list.tt2 b/root/src/calls/list.tt2 new file mode 100644 index 0000000..195560f --- /dev/null +++ b/root/src/calls/list.tt2 @@ -0,0 +1,30 @@ +[% META title = 'Defense calls' %] + + +[% newday = game.tick %] +[% FOR call IN calls %] + [% WHILE newday - 24 > call.landing_tick %] + [% newday = newday - 24 %] + + [% END %] + + + + + [% prio = call.defprio < minprio ? 'LowestPrio' : + (call.defprio < maxprio ? 'MediumPrio' : 'HighestPrio') %] + + + + + + + + + +[% END %] +
CallDCDef FleetsMember (defprio)Landing tickRacesAmountShiptypesETAAllianceAttackers
New day
[% call.id %][% call.dc %][% call.fleets %] + [% call.coords %] ([% call.defprio %])[% call.landing_tick %][% call.race.unique.join('/') %][% call.amount.join('/') %][% call.shiptype.unique.join('/') | html %][% call.curreta %] ([% call.eta.unique.join('/') %])[% call.alliance.unique.join('/') %][% FOR a IN call.attackers %] + [% a %] + [% UNLESS loop.last %]/[%END%] + [%END%]
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 index 0000000..82b98e1 --- /dev/null +++ b/root/static/js/jquery-1.2.6.min.js @@ -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=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-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]*?)\/>/g,function(all,front,tag){return tag.match(/^(abbr|br|col|img|input|link|meta|param|hr|area|embed)$/i)?all:front+">";});var tags=jQuery.trim(elem).toLowerCase(),div=context.createElement("div");var wrap=!tags.indexOf("",""]||!tags.indexOf("",""]||tags.match(/^<(thead|tbody|tfoot|colg|cap)/)&&[1,"","
"]||!tags.indexOf("",""]||(!tags.indexOf("",""]||!tags.indexOf("",""]||jQuery.browser.msie&&[1,"div
","
"]||[0,"",""];div.innerHTML=wrap[1]+elem+wrap[2];while(wrap[0]--)div=div.lastChild;if(jQuery.browser.msie){var tbody=!tags.indexOf(""&&tags.indexOf("=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&¬xml&&!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&¬xml&&name=="style")return jQuery.attr(elem.style,"cssText",value);if(set)elem.setAttribute(name,""+value);var attr=msie&¬xml&&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*",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 im[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=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=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=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=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("
").append(res.responseText.replace(//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;ithis.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 index a21f365..0000000 --- a/root/static/js/misc.js +++ /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 index 0000000..191dba0 --- /dev/null +++ b/t/controller_Calls.t @@ -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 index b8b114a..0000000 --- a/templates/calls.tmpl +++ /dev/null @@ -1,177 +0,0 @@ - -
- - -
Call details, call# - - - - - - -
-
    -
  • Current DC:
  • -
  • Member:
  • -
  • SMS:
  • -
  • Coords:
  • -
  • Defense points:
  • -
  • Landing at tick:
    - -
  • -
  • Current ETA:
  • -
-
- -
    -
  • -
  • Change Notes?
  • -
  • -
  • -
  • -
  • -
-
-
-
Attackers: -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
CoordsPlanet statusAllianceRaceInitial ETAAmountShiptypesFleetChange/remove?
()
-

- - -

-
-
-
Member fleet - - - - - - - - - - - - - -
TargetNameMissionTickETAAmount
-
-
Defenders - - - - - - - - - - - - - -
SenderNameMissionLanding TickETAAmount
-
- - -
- -
New Reply - - - - - -
- -
-
-
- - - - - - - - - - - - - - - - - - -
CallDCDef FleetsMember (def points)Landing tickRacesAmountShiptypesETAAllianceAttackers
()-New Day- ()
-
-- 2.39.2