Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and need larger font sizes.
***/

/*{{{*/
body {font-size:0.8em;}

#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}

.subtitle {font-size:0.8em;}

.viewer table.listView {font-size:0.95em;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions


The situation I encountered it was when i went into a table and then exited. Then clicked on Tables but it didn't show me the list of tables. - on Mozilla Firefox 2.0.

Fixed (was a state problem)
{{{
string: 1) empty string selects all tournaments
        2) a string that contains no tabulation selects
           the tournament with the same name
        3) a string with a tabulation selects all tournaments
           of a given type (sit&go or regular) that can be played
           using a given currency. The string before the tabulation
           is the name of the currency, the string after the tabulation
           distinguishes between sit&go and regular.

        Examples: 1<tabulation>sit_n_go selects all sit&go tournaments
                  using currency 1.
                  2<tabulation>regular selects all regular tournaments
                  using currency 2
}}}
http://jpoker.aminche.com/hg/jpoker/rev/6854919bce24
Avatar uploading from UserInfo always failed with:
{{{
'Uploading failed: not logged'
}}}

jpoker debugging:
{{{
Cookie
TWISTED_SESSION_33709A7BAC22083C22659129347E4F1D7BDA9230=2ac496f37bb9aa7564234a03d3b4d4ae;
TWISTED_SESSION=7c1ea6ade4c304484b21a04164667f8e
}}}

poker-network debugging:
{{{
2008-08-18 10:10:54+0000 [HTTPChannel,6,127.0.0.1] PokerAvatar serial = 0, name = anonymous
}}}

memcached debugging:
{{{
root@kun:/usr/src# python poker-network/examples/memcache-client 2ac496f37bb9aa7564234a03d3b4d4ae
28
root@kun:/usr/src# python poker-network/examples/memcache-client 7c1ea6ade4c304484b21a04164667f8e
0
}}}

/UPLOAD UNAUTHORIZED
{{{
root@kun:/# curl -b /tmp/cookiejar -c /tmp/cookiejar -v -F filename=@/usr/src/cropped.png http://127.0.0.1:19384/UPLOAD
* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /UPLOAD HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Content-Length: 4693
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------347bb9ea8643
> 
< HTTP/1.1 401 Unauthorized
< Date: Mon, 18 Aug 2008 12:04:44 GMT
< Content-length: 10
< Content-type: text/html
< Server: TwistedWeb/8.1.0
* Added cookie TWISTED_SESSION="3a4ba5044f1ec380e8150d38fdb97f47" for domain 127.0.0.1, path /, expire 0
< Set-Cookie: TWISTED_SESSION=3a4ba5044f1ec380e8150d38fdb97f47; Path=/
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
root@kun:/# cat /tmp/cookiejar 
# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

127.0.0.1	FALSE	/	FALSE	0	TWISTED_SESSION	3a4ba5044f1ec380e8150d38fdb97f47
}}}

/UPLOAD OK
{{{
root@kun:/# curl -c /tmp/cookiejar -v -d '{"type":"PacketLogin", "username":"imageupload", "password":"imageupload"}' http://127.0.0.1:19384/POKER_REST
* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /POKER_REST HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Content-Length: 74
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 200 OK
< Date: Mon, 18 Aug 2008 12:06:42 GMT
< Content-length: 80
< Content-type: text/plain; charset="UTF-8"
< Server: TwistedWeb/8.1.0
* Added cookie TWISTED_SESSION="d581f5ce3555cfec79e2d42e9a830c93" for domain 127.0.0.1, path /, expire 0
< Set-Cookie: TWISTED_SESSION=d581f5ce3555cfec79e2d42e9a830c93; Path=/
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
[{"type": "PacketAuthOk"}, {"type": "PacketSerial", "serial": 39, "cookie": ""}]root@kun:/# 
root@kun:/# cat /tmp/cookiejar 
# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

127.0.0.1	FALSE	/	FALSE	0	TWISTED_SESSION	d581f5ce3555cfec79e2d42e9a830c93
root@kun:/# curl -b /tmp/cookiejar -c /tmp/cookiejar -v -F filename=@/usr/src/cropped.png http://127.0.0.1:19384/UPLOAD
* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /UPLOAD HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Cookie: TWISTED_SESSION=d581f5ce3555cfec79e2d42e9a830c93
> Content-Length: 4693
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------a7778a2cd2b8
> 
< HTTP/1.1 200 OK
< Date: Mon, 18 Aug 2008 12:07:26 GMT
< Content-length: 14
< Content-type: text/plain; charset="UTF-8"
< Server: TwistedWeb/8.1.0
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
image uploadedroot@kun:/# cat /tmp/cookiejar 
# Netscape HTTP Cookie File
# http://curlm.haxx.se/rfc/cookie_spec.html
# This file was generated by libcurl! Edit at your own risk.

127.0.0.1	FALSE	/	FALSE	0	TWISTED_SESSION	d581f5ce3555cfec79e2d42e9a830c93
root@kun:/# 
}}}
{{{
(10:30:42 AM) dachary: it's not just 2h
(10:30:50 AM) dachary: it's a number of other cards
(10:31:02 AM) dachary: hum
(10:31:04 AM) dachary: 2h again
(10:31:41 AM) dachary: 2h is code 0
}}}
http://code.google.com/p/fbug/issues/detail?id=586

It would be great to have an administrative account that can fix problems, boot players and tables, and other such activities.
----
such a user exists but he currently has no dedicated possibilities (such as kicking a user out of the table)
I receive this strange error many times when registering: "Another user is in PLAY state". No one was playing on the table at that point. Even if they did, it should not stop me from registering.
in batch mode, jpoker should show a feedback that suggest that no interaction is possible until Streamode
for example: a semi transparent div, with progress indicator
The bet amount text under chips does not show in internet explorer after player makes a bet.
When using Internet Explorer 8, there is no bet amount after making a bet as well as other actions causing chips to be put in the pot.
Only on mouse over will the amount appear.  However, the pot amount does appear when chips are in the pot.
To create a new bug entry, use the "new bug" menu entry to the right, under the search bar.
also add a jpoker_card for properties common to all cards
I restarted my browser and noticed that my user is still listed in two different tables.

Upon attempting to log back in I receive the following message:
another client already has role PLAY

----
The timeout in these cases is about 30 seconds. I don't know how we can handle this differently. 
- put a breakpoint in jpoker.plugins.table
- only get called once
- put a breakpoint in jpoker.plugins.tableList
- only get called once
- put a breakpoint in jpoker.plugins.userInfo
- only get called once
Type the text for 'Chat log scrollbar should be skinned'
We can use jScrollPane jquery ui plugin for this.
there should be a class for all buttons, so it'll become easier and shorter to style them.
[[Ideas]]
Change the tag of entries to ''Done'' to move them to the list of things that belong to the past.
in a <a> link
http://jpoker.aminche.com/hg/jpoker/rev/89bfc97858b0
http://jpoker.aminche.com/hg/jpoker/rev/181634a3af02
http://jpoker.aminche.com/hg/jpoker/rev/39120991a17b
http://jpoker.aminche.com/hg/jpoker/rev/642321b1d840
http://jpoker.aminche.com/hg/jpoker/rev/7a0166a99eba
http://jpoker.aminche.com/hg/jpoker/rev/67e7c03b8736
http://jpoker.aminche.com/hg/jpoker/rev/589ce2fe0404
http://jpoker.aminche.com/hg/jpoker/rev/052cf6deb1b8
http://jpoker.aminche.com/hg/jpoker/rev/d50073381113
http://jpoker.aminche.com/hg/jpoker-featuredtable
http://jpoker.aminche.com/hg/jpoker-tourneys/rev/ba78ab5cf39a
http://jpoker.aminche.com/hg/jpoker/rev/910b719bfffb
http://jpoker.aminche.com/hg/jpoker/rev/0d13c0634b96
http://jpoker.aminche.com/hg/jpoker-userinfo/rev/fb4a574658a5
http://jpoker.aminche.com/hg/jpoker/rev/4086ec59b02e
http://jpoker.aminche.com/hg/jpoker/rev/d50073381113
http://jpoker.aminche.com/hg/jpoker/rev/57bf739e6653
http://jpoker.aminche.com/hg/jpoker/rev/49a313557118
http://jpoker.aminche.com/hg/jpoker/rev/9d19056c8136
http://jpoker.aminche.com/hg/jpoker/rev/1ad144e96540
To create a new feature request, use the "new feature" menu entry to the right, under the search bar.
Currently, to enter an idea or feedback, one needs to:
- locate the "Feedback" link
- switch to a new page with a different interface and lots of scary text

The current version is good for geeks and dedicated users, but standard users will shy away, if they ever see there is a way to add feedback. Suggestion:

- Make the "Feedback" feature a lot more visible: more people will see it, and it will help people understand this is actually something devs are in need of. For example, it could be moved to the top right of the table on the other side of "Table one" title. A small light bulb icon, flashy color and a text like "Help us! We need your feedback"
- Make sure the feedback entry is simple. The best would be to pop a simple textarea & a "Send" button on the same page (no title, no menu, no text, KISS!).

loic: I will create a button in jpoker that shows a dialog with a title bar + text + link to the idea page + button to submit. The submission will create a file thru dav that will then be merged into the ideas.html tiddlywiki.

xavier: great! :)
http://jpoker.aminche.com/hg/jpoker/rev/c58bcffc34b2
http://jpoker.aminche.com/hg/jpoker-skin/rev/f809afe4c9b1
Powered by [[tiddlytracker|http://garden.dachary.org/tiddlytracker.html]] Copyright Loic Dachary mailto:loic@dachary.org License : [[GNU GPLv3 or Later|http://gnu.org/licenses/gpl.txt]]
- why not be futuristic and change the doctype to HTML5 ? This requires no markup modifications.

/***
|''Name:''|GenerateRssByTagPlugin|
|''Description:''|Only tiddlers with a specific tag are inluded in the RSSFeed. If no tiddlers are selected then works as before. (see ticket #270: http://trac.tiddlywiki.org/tiddlywiki/ticket/270). <br>RssTag: <<option txtRssTag>>|
|''Version:''|1.0.2|
|''Date:''|Apr 20, 2007|
|''Source:''|http://tiddlywiki.bidix.info/#GenerateRssByTagPlugin|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''[[License]]:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.2.0 (Beta 5)|
***/
//{{{
version.extensions.GenerateRssByTagPlugin = {
	major: 1, minor: 0, revision: 2, 
	date: new Date("Apr 20, 2007"),
	source: 'http://tiddlywiki.bidix.info/#PasswordOptionPlugin',
	author: 'BidiX (BidiX (at) bidix (dot) info',
	coreVersion: '2.2.0 (Beta 5)'
};

if (!window.bidix) window.bidix = {}; // bidix namespace

bidix.generateRssByTag = function()
{
	var s = [];
	var d = new Date();
	var u = store.getTiddlerText("SiteUrl");
	// Assemble the header
	s.push("<" + "?xml version=\"1.0\"" + " encoding='UTF-8' " + "?" + ">");
	s.push("<rss version=\"2.0\">");
	s.push("<channel>");
	s.push("<title" + ">" + wikifyPlain("SiteTitle").htmlEncode() + "</title" + ">");
	if(u)
		s.push("<link>" + u.htmlEncode() + "</link>");
	s.push("<description>" + wikifyPlain("SiteSubtitle").htmlEncode() + "</description>");
	s.push("<language>en-us</language>");
	s.push("<copyright>Copyright " + d.getFullYear() + " " + config.options.txtUserName.htmlEncode() + "</copyright>");
	s.push("<pubDate>" + d.toGMTString() + "</pubDate>");
	s.push("<lastBuildDate>" + d.toGMTString() + "</lastBuildDate>");
	s.push("<docs>http://blogs.law.harvard.edu/tech/rss</docs>");
	s.push("<generator>TiddlyWiki " + version.major + "." + version.minor + "." + version.revision + "</generator>");
	// The body
	var tiddlers;
	if (config.options.txtRssTag && store.getTaggedTiddlers(config.options.txtRssTag).length > 0)
		tiddlers = store.getTaggedTiddlers(config.options.txtRssTag,"modified");
	else
		tiddlers = store.getTiddlers("modified","[[excludeLists]]");
	var n = config.numRssItems > tiddlers.length ? 0 : tiddlers.length-config.numRssItems;
	for (var t=tiddlers.length-1; t>=n; t--)
		s.push(tiddlers[t].saveToRss(u));
	// And footer
	s.push("</channel>");
	s.push("</rss>");
	// Save it all
	return s.join("\n");
};

//
// Initializations
//
bidix.generateRss = generateRss; // backup core version
generateRss = bidix.generateRssByTag; // install new one
config.options.txtRssTag = "toRSS"; // default RssTag. use <<option txtRssTag>> to overwritte
merge(config.optionsDesc,{txtRssTag: "Only tiddlers with this tag will be included in the RSS Feed."});
//}}}
that's what happens. Please describe the use case where it is not happening as it should.
/***
| Name|HideWhenPlugin|
| Description|Allows conditional inclusion/exclusion in templates|
| Version|3.0 ($Rev: 1845 $)|
| Date|$Date: 2007-03-16 15:19:22 +1000 (Fri, 16 Mar 2007) $|
| Source|http://mptw.tiddlyspot.com/#HideWhenPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.removeElementWhen = function(test,place) {
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};

merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}}

});

//}}}
I have noticed that after a hand is over and each players hole cards are shown, the card_back2.gif is still visible.  The card backs should disappear as the hole cards are displayed.
To create a new idea, fill <<newTiddler label:"the following form" prompt:"Create a new idea" title:"Short idea description" tag:toRSS tag:Ideas>> and click "done" when finished.
Currently for buttons with hover images, when we move the cursor over the button, the background image disappears until the hover image is loaded
(esp. visible on slower connections). 

Would be nice to do image preloading for dynamically displayed images.


/Chandan
----
it was decided to show a table by default because it's where the action is. It is possible, however, to cook another tiddlywiki with a different default.
http://jpoker.aminche.com/hg/jpoker/rev/2d771913af4e
(02:42:12 PM) saqimtiaz: proppy: did you add this bug: JpokerPluginRestOverride.tiddler should not be copied in non standalone version
(02:42:30 PM) proppy: yep
(02:42:40 PM) saqimtiaz: proppy: dachary asked for this
(02:42:43 PM) proppy: saqimtiaz: it is a non-bug ?
(02:42:47 PM) saqimtiaz: originally it was the way you wanted
(02:43:08 PM) saqimtiaz: it might be worth discussing with Loic.. but this is what he wanted.
(02:43:10 PM) proppy: really because by default it try to point the non standalone version to jspoker.pokersource.info, instead of /REST
(02:43:15 PM) proppy: which sounds kinda wierd
(02:43:20 PM) saqimtiaz: yup, I agree
(02:43:20 PM) proppy: yep, np
(02:43:35 PM) proppy: saqimtiaz: you can remove tag Bugs, and leave only Ideas then
(02:43:36 PM) saqimtiaz: simple fix is to move that tiddler to dir tiddlers-standalone. That's where it was before.
/***
|''Name:''|LegacyStrikeThroughPlugin|
|''Description:''|Support for legacy (pre 2.1) strike through formatting|
|''Version:''|1.0.2|
|''Date:''|Jul 21, 2006|
|''Source:''|http://www.tiddlywiki.com/#LegacyStrikeThroughPlugin|
|''Author:''|MartinBudden (mjbudden (at) gmail (dot) com)|
|''License:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.0|
***/

//{{{
// Ensure that the LegacyStrikeThrough Plugin is only installed once.
if(!version.extensions.LegacyStrikeThroughPlugin) {
version.extensions.LegacyStrikeThroughPlugin = {installed:true};

config.formatters.push(
{
	name: "legacyStrikeByChar",
	match: "==",
	termRegExp: /(==)/mg,
	element: "strike",
	handler: config.formatterHelpers.createElementAndWikify
});

} //# end of "install only once"
//}}}
As far as the server is concerned, a user can register for as many tables as they like [[we considered the idea that the server should limit this for the client|http://pokersource.info/developers/specifications/private.html#%5B%5Bcap%20the%20number%20of%20tournaments%20per%20player%5D%5D]]; however, it makes no sense to implement his kind of control on the server side when the client has the requirements and it may be different for different clients in the future.

Therefore, the client should do something like:
if (inTourney or tourney.registered("two hours out"):
     WARN USER THEY MAY HAVE TWO TABLES AT ONCE IF THEY REGISTER NOW

[[Loic and I discussed this on IRC if you wish to read the discussion|http://pokersource.info/irc/pokersource@irc.freenode.net/2008-08-31.html]]
shoudl be faster.

[[Ideas]]
[[Bugs]]
[[Features]]
[[Done]]
[[WontFix]]
[[WorksForMe]]
[[RC]]
----
[[proppy]]
[[loic]]
[[bkuhn]]
[[rikeko]]
It would be very nice to have the client automatically scale all objects to the size of the browser. Very useful when playing multiple tables or while working on other applications while playing. Resizing the jpoker client to a smaller size in this scenario would be very convenient. It would also be nice to make jpoker detect wide screen monitor formats and display the page objects appropriately to fit a 16:9 format when in full screen mode.  Most people that I know have wide screens these days and we just get annoyed when we are forced to look at pages that are not dynamic.  A good example of this can be viewed at:  

http://windyroad.org/2007/05/18/resolution-independent-web-design/
- user info should not be a table but a dictionary list
- all inputs should use a class, text and submit, so they can be styled properly also for IE browsers
- use labels and ids on inputs on the login page
- there is an empty div in jpoker logout, dont know where it comes from
- in the tablepicker options, instead of being alignes one after the other, inputs and lables should be in a dictionary list
- server status should be a list, not divs.
- the server status css does contain only 5 lines, it should be deleted and its contents put to jpoker_common.css
- the places.html markup should be refactored as lists, a table for just one column is just too much.
- .jpoker_tourney_details .jpoker_tourney_name should be a real title like a H3 for example
- jpoker_ptable_table_info should/ could be a list 
- jpoker_ptable_table may be unnecessary, it contains only the table background. which could also be on the parent div which has a less restrictive size.
- jpoker_ptable_powered_by jpoker_powered_by should be more at the end of the code, not in the middle of pots i guess

* creation of the challenge
** tourneyCreate
*** tourneyGameFilled callback
**** tableJoin
***** PacketPokerTable
** tourneyNotifyStart
*** jpoker tableJoin
**** PacketPokerTable
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
<div id="footer" class="footer" refresh='content' force='true' tiddler='Footer'></div>
</div>
<!--}}}-->
stringify()json2.js (line 201)
stringify()json2.js (line 201)
errorHandler()()jquery.jpoker.js (line 153)
error()()jquery.jpoker.js (line 147)
error()()jquery.jpoker.js (line 642)
error()()jquery.jpoker.js (line 763)
handleError()()jquery-1.2.6.js (line 2845)
onreadystatechange()()jquery-1.2.6.js (line 2775)
[Break on this error] v = stringify(value[k], whitelist);
jpoker/index.html, breakpoint in any macro code and see them called twice. Does not happen in jpoker/poker.html.
Release Critical
/***
|''Name:''|RSSReaderPlugin|
|''Description:''|This plugin provides a RSSReader for TiddlyWiki|
|''Version:''|0.3.0|
|''Date:''|Aug 24, 2006|
|''Source:''|http://tiddlywiki.bidix.info/#RSSReaderPlugin|
|''Documentation:''|http://tiddlywiki.bidix.info/#RSSReaderPluginDoc|
|''Author:''|BidiX (BidiX (at) bidix (dot) info)|
|''Credit:''|BramChen for RssNewsMacro|
|''License:''|[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D ]]|
|''~CoreVersion:''|2.0.0|
|''Browser:''|Firefox 1.5; InternetExplorer 6.0; Safari|
|''Include:''|none|
|''Require:''|none|
***/
//{{{
version.extensions.RSSReaderPlugin = {
	major: 0, minor: 3, revision: 0,
	date: new Date("Aug 24, 2006"),
	author: "BidiX",
	credit: "BramChen for RssNewsMacro",
	source: "http://TiddlyWiki.bidix.info/#RSSReaderPlugin",
	documentation : "http://TiddlyWiki.bidix.info/#RSSReaderPluginDoc",
	author: 'BidiX (BidiX (at) bidix (dot) info',
	license: '[[BSD open source license|http://tiddlywiki.bidix.info/#%5B%5BBSD%20open%20source%20license%5D%5D]]',
	coreVersion: '2.0.0',
	browser: 'Firefox 1.5; InternetExplorer 6.0; Safari'	
};

config.macros.rssReader = {
	dateFormat: "DDD, DD MMM YYYY",
	itemStyle: "display: block;border: 1px solid black;padding: 5px;margin: 5px;", //useed  '@@'+itemStyle+itemText+'@@'
	msg:{
		permissionDenied: "Permission to read preferences was denied.",
		noRSSFeed: "No RSS Feed at this address %0",
		urlNotAccessible: " Access to %0 is not allowed"
	},
	cache: [], 	// url => request
	desc: "noDesc",
	// feedURL: "",
	place:"",
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		var desc = params[0];
		var feedURL = params[1];
		// var toFilter = (params[2] ? params[2] : false);
		var toFilter = false;
		var filterString;
		if (params[2] != undefined) {
			toFilter = true;
			if (params[2].match(/\w+/))
				filterString = params[2];
			else
				filterString = tiddler.title;
		}
		var place = createTiddlyElement(place, "div", "RSSReader");
		wikify("^^<<rssFeedUpdate "+feedURL+" [[" + tiddler.title + "]]>>^^\n",place);
		if (this.cache[feedURL]) {
			this.processResponse(this.cache[feedURL], feedURL, place, desc, toFilter, filterString);
		}
		else {
			this.asyncGet(feedURL, place, desc, toFilter, filterString);
		}
	},

	asyncGet: function (feedURL, place, desc, toFilter, filterString){
		var xmlhttp;
		try {xmlhttp=new XMLHttpRequest();}
		catch (e) {
			try {xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");}
			catch (e) {
				try {xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");}
				catch (e) { displayMessage(e.description?e.description:e.toString());}
			}
		}
		if (!xmlhttp){
			return;
		}
		if (window.netscape){
			try {
				if (document.location.protocol.indexOf("http") == -1) {
 					netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				}
			}
			catch (e) { displayMessage(e.description?e.description:e.toString()); }
		}
		xmlhttp.onreadystatechange=function (){
			if (xmlhttp.readyState==4) {
				if (xmlhttp.status==200 || xmlhttp.status===0) {
					config.macros.rssReader.processResponse(xmlhttp, feedURL, place, desc, toFilter, filterString);
				}
				else {
					displayMessage("Problem retrieving XML data:" + xmlhttp.statusText);
				}
			}
		};
		try {
			xmlhttp.open("GET",feedURL,true);
			if (config.browser.isIE) {
				xmlhttp.send();
			}
			else {
				xmlhttp.send(null);
			}
		}
		catch (e) {
			wikify(e.toString()+this.urlNotAccessible.format([feedURL]), place);
		}
	},
	processResponse: function(xmlhttp, feedURL, place, desc, toFilter, filterString){	
		if (window.netscape){
			try {
				if (document.location.protocol.indexOf("http") == -1) {
					netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
				}
			}
			catch (e) { displayMessage(e.description?e.description:e.toString()); }
		}
		if (xmlhttp.responseXML){
			this.cache[feedURL] = xmlhttp;
			this.genRssNews(xmlhttp.responseXML, place, feedURL, desc, toFilter, filterString);
		}
		else {
			var dom = (new DOMParser()).parseFromString(xmlhttp.responseText, "text/xml"); 
			if (dom) {
				this.cache[feedURL] = xmlhttp;
				this.genRssNews(dom, place, feedURL, desc, toFilter, filterString);
			}
			else {
				wikify("<html>"+xmlhttp.responseText+"</html>", place);
				displayMessage(this.msg.noRSSFeed.format([feedURL]));
			}
		}
	},
	genRssNews: function(xml, place, feedURL, desc, toFilter, filterString){
		// Channel
		var chanelNode = xml.getElementsByTagName('channel').item(0);
		var chanelTitleElement = (chanelNode ? chanelNode.getElementsByTagName('title').item(0) : null);
		var chanelTitle = "";
		if ((chanelTitleElement) && (chanelTitleElement.firstChild)) chanelTitle = chanelTitleElement.firstChild.nodeValue;
		var chanelLinkElement = (chanelNode ? chanelNode.getElementsByTagName('link').item(0) : null);
		var chanelLink = "";
		if (chanelLinkElement) chanelLink = chanelLinkElement.firstChild.nodeValue;
		var titleTxt = "!![["+chanelTitle+"|"+chanelLink+"]]\n";
		var title = createTiddlyElement(place,"div",null,"ChanelTitle",null);
		wikify(titleTxt,title);
		// ItemList
		var itemList = xml.getElementsByTagName('item');
		var article = createTiddlyElement(place,"ul",null,null,null);
		var lastDate;
		var re;
		if (toFilter) 
			re = new RegExp(filterString.escapeRegExp());
		for (var i=0; i<itemList.length; i++){
			var titleElm = itemList[i].getElementsByTagName('title').item(0);
			var titleText = (titleElm ? titleElm.firstChild.nodeValue : '');
			if (toFilter && ! titleText.match(re)) {
				continue;
			}
			var descText = '';
			var isWikitext = false;
			var descElem = itemList[i].getElementsByTagName('wikitext').item(0);
			if (descElem){
				try{
					isWikitext = true;
					descText = "\n"+descElem.firstChild.nodeValue;}
					catch(e){}
			}
			else {
				descElem = itemList[i].getElementsByTagName('encoded').item(0);
				if (descElem){
					try{descText = descElem.firstChild.nodeValue;}
						catch(e){}
					descText = "<html>"+descText+"</html>";
				}
				else {
					descElem = itemList[i].getElementsByTagName('description').item(0);
					if (descElem){
						try{descText = descElem.firstChild.nodeValue;}
						catch(e){}
						descText = descText.replace(/<br \/>/g,'\n');
						if (desc == "asHtml")
							descText = "<html>"+descText+"</html>";
					}
				}
			}
			var linkElm = itemList[i].getElementsByTagName("link").item(0);
			var linkURL = linkElm.firstChild.nodeValue;
			var pubElm = itemList[i].getElementsByTagName('pubDate').item(0);
			var pubDate;
			if (!pubElm) {
				pubElm = itemList[i].getElementsByTagName('date').item(0); // for del.icio.us
				if (pubElm) {
					pubDate = pubElm.firstChild.nodeValue;
					pubDate = this.formatDateString(this.dateFormat, pubDate);
					}
					else {
						pubDate = '0';
					}
				}
			else {
				pubDate = (pubElm ? pubElm.firstChild.nodeValue : 0);
				pubDate = this.formatString(this.dateFormat, pubDate);
			}
			titleText = titleText.replace(/\[|\]/g,'');
			var rssText = '** '+'[[' + titleText + '|' + linkURL + ']]' + '\n' ;
			if ((desc != "noDesc") && descText){
				if (version.extensions.nestedSliders){
					rssText = rssText.replace(/\n/g,' ');
					descText = '+++[...]\n'
						+(isWikitext ? '\n<<rssFeedImportTiddler '+ feedURL + ' [['+titleText+']]>>':'')
						+'@@'+this.itemStyle+descText+'\n@@\n'
						+'===';
					}
				rssText = rssText + descText + '\n\n';
			}
			var story;
			if ((lastDate != pubDate) && ( pubDate != '0')) {
				story = createTiddlyElement(article,"li",null,"RSSItem",pubDate);
				lastDate = pubDate;
			}
			else {
				lastDate = pubDate;
			}
			story = createTiddlyElement(article,"div",null,"RSSItem",null);
			wikify(rssText,story);
		}
	},
	formatString: function(template, theDate){
		var dateString = new Date(theDate);
		template = template.replace(/hh|mm|ss/g,'');
		return dateString.formatString(template);
	},
	formatDateString: function(template, theDate){
		var dateString = new Date(theDate.substr(0,4), theDate.substr(5,2) - 1, theDate.substr(8,2)
			/*,  theDate.substr(11,2), theDate.substr(14,2), theDate.substr(17,2)*/
			);
		return dateString.formatString(template);
	}
	
};
//}}}

//{{{
config.macros.rssFeedUpdate = {
	label: "Update",
	prompt: "Clear the cache and redisplay this RssFeed",
	handler: function(place,macroName,params) {
		var feedURL = params[0];
		var tiddlerTitle = params[1];
		createTiddlyButton(place, this.label, this.prompt, 
			function () {
				if (config.macros.rssReader.cache[feedURL]) {
					config.macros.rssReader.cache[feedURL] = null; 
					//story.refreshTiddler(tiddlerTitle,null, true);
			}
			story.refreshTiddler(tiddlerTitle,null, true);
		return false;});
	}
};
//}}}

//{{{
config.macros.rssFeedImportTiddler = {
	label: "Import",
	prompt: "Import this tiddler in this TiddlyWiki",
	askReplaceMsg: "Tiddler already exists, replace it ?",
	handler: function(place,macroName,params) {
		var  feedUrl = params[0];
		var tiddlerTitle = params[1];
		createTiddlyButton(place, this.label, this.prompt, 
			function () {
				if (feedUrl && config.macros.rssReader.cache[feedUrl]) {
					var tiddler = config.macros.rssFeedImportTiddler.parseRssNews(config.macros.rssReader.cache[feedUrl].responseXML, tiddlerTitle);
					if (tiddler && (! store.getTiddler(tiddlerTitle) || confirm(config.macros.rssFeedImportTiddler.askReplaceMsg))) {
						store.addTiddler(tiddler);
						store.notify(tiddler.title, true);
						store.setDirty(true);
					}
				}
			return false;});
	},
	
	// parse a RssFeed for retrieving a Tiddler with title
	parseRssNews: function(xml, title) {
		// ItemList
		if (document.location.protocol.indexOf("http") == -1) {
			netscape.security.PrivilegeManager.enablePrivilege("UniversalBrowserRead");
		}

		var itemList = xml.getElementsByTagName('item');
		for (var i=0; i<itemList.length; i++){

			var titleElm = itemList[i].getElementsByTagName('title').item(0);
			var titleText = titleElm.firstChild.nodeValue;
			if (titleText == title) {
				//	<tiddlywiki:title>
				//	titleText
				titleText = titleText.htmlDecode();
				//	<tiddlywiki:wikitext>
				var elem = itemList[i].getElementsByTagName('wikitext').item(0);
				var text = elem ? elem.firstChild.nodeValue.htmlDecode() : "";
				//	<tiddlywiki:modifier>
				elem = itemList[i].getElementsByTagName('modifier').item(0);
				var modifier = elem ? elem.firstChild.nodeValue : "";
				//	<tiddlywiki:modified>
				elem = itemList[i].getElementsByTagName('modified').item(0);
				var modified = elem ? Date.convertFromYYYYMMDDHHMM(elem.firstChild.nodeValue) : "";
				//	<tiddlywiki:created>
				elem = itemList[i].getElementsByTagName('created').item(0);
				var created = elem ? Date.convertFromYYYYMMDDHHMM(elem.firstChild.nodeValue) : "";
				//	<tiddlywiki:links>
				//	Links ?
				//	<tiddlywiki:tags>
				elem = itemList[i].getElementsByTagName('tags').item(0);
				var tags = elem ? elem.firstChild.nodeValue.htmlDecode() : "";
				var tiddler = new Tiddler();
				tiddler.assign(titleText,text,modifier,modified,tags,created);
				return tiddler;
			}
		}
		// not found 
		alert("Tiddler \[[" + title +"]] notFound.");
		return null;
	}

};

//}}}

on letspok.com
<<search>><<newTiddler label:"new idea" prompt:"Create a new idea" title:"Short idea description" tag:toRSS tag:Ideas>><<newTiddler label:"new bug" prompt:"Create a new bug entry" title:"Bug Title" tag:toRSS tag:Ideas tag:Bugs>><<newTiddler label:"new feature" prompt:"Create a new feature request entry" title:"Feature description" tag:toRSS tag:Features tag:Ideas>><<closeAll>><<permaview>><<newTiddler>><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options &#187;" "Change TiddlyWiki advanced options">>
and bugs, feature requests
jpoker ideas
http://jspoker.pokersource.info/ideas.html
As of today, TablePicker does not return an empty PacketPokerTable(), but rather a PacketPokerError().  See poker-network pokerpackets.py documentation for details.
/***
| Name|TagglyTaggingPlugin|
| Description|tagglyTagging macro is a replacement for the builtin tagging macro in your ViewTemplate|
| Version|3.1 ($Rev: 2341 $)|
| Date|$Date: 2007-07-05 10:02:27 +1000 (Thu, 05 Jul 2007) $|
| Source|http://mptw.tiddlyspot.com/#TagglyTaggingPlugin|
| Author|Simon Baird <simon.baird@gmail.com>|
| License|http://mptw.tiddlyspot.com/#TheBSDLicense|
!Notes
See http://mptw.tiddlyspot.com/#TagglyTagging
***/
//{{{
config.taggly = {

	// for translations
	lingo: {
		labels: {
			asc:        "\u2191", // down arrow
			desc:       "\u2193", // up arrow
			title:      "title",
			modified:   "modified",
			created:    "created",
			show:       "+",
			hide:       "-",
			normal:     "normal",
			group:      "group",
			commas:     "commas",
			sitemap:    "sitemap",
			numCols:    "cols\u00b1", // plus minus sign
			label:      "Tagged as '%0':",
			excerpts:   "excerpts",
			contents:   "contents",
			sliders:    "sliders",
			noexcerpts: "title only"
		},

		tooltips: {
			title:    "Click to sort by title",
			modified: "Click to sort by modified date",
			created:  "Click to sort by created date",
			show:     "Click to show tagging list",
			hide:     "Click to hide tagging list",
			normal:   "Click to show a normal ungrouped list",
			group:    "Click to show list grouped by tag",
			sitemap:  "Click to show a sitemap style list",
			commas:   "Click to show a comma separated list",
			numCols:  "Click to change number of columns",
			excerpts: "Click to show excerpts",
			contents: "Click to show entire tiddler contents",
			sliders:  "Click to show tiddler contents in sliders",
			noexcerpts: "Click to show entire title only"
		}
	},

	config: {
		showTaggingCounts: true,
		listOpts: {
			// the first one will be the default
			sortBy:     ["title","modified","created"],
			sortOrder:  ["asc","desc"],
			hideState:  ["show","hide"],
			listMode:   ["normal","group","sitemap","commas"],
			numCols:    ["1","2","3","4","5","6"],
			excerpts:   ["noexcerpts","excerpts","contents","sliders"]
		},
		valuePrefix: "taggly.",
		excludeTags: ["excludeLists","excludeTagging"],
		excerptSize: 50,
		excerptMarker: "/%"+"%/"
	},

	getTagglyOpt: function(title,opt) {
		var val = store.getValue(title,this.config.valuePrefix+opt);
		return val ? val : this.config.listOpts[opt][0];
	},

	setTagglyOpt: function(title,opt,value) {
		if (!store.tiddlerExists(title))
			// create it silently
			store.saveTiddler(title,title,config.views.editor.defaultText.format([title]),config.options.txtUserName,new Date(),null);
		// if value is default then remove it to save space
		return store.setValue(title,
			this.config.valuePrefix+opt,
			value == this.config.listOpts[opt][0] ? null : value);
	},

	getNextValue: function(title,opt) {
		var current = this.getTagglyOpt(title,opt);
		var pos = this.config.listOpts[opt].indexOf(current);
		// a little usability enhancement. actually it doesn't work right for grouped or sitemap
		var limit = (opt == "numCols" ? store.getTaggedTiddlers(title).length : this.config.listOpts[opt].length);
		var newPos = (pos + 1) % limit;
		return this.config.listOpts[opt][newPos];
	},

	toggleTagglyOpt: function(title,opt) {
		var newVal = this.getNextValue(title,opt);
		this.setTagglyOpt(title,opt,newVal);
	}, 

	createListControl: function(place,title,type) {
		var lingo = config.taggly.lingo;
		var label;
		var tooltip;
		var onclick;

		if ((type == "title" || type == "modified" || type == "created")) {
			// "special" controls. a little tricky. derived from sortOrder and sortBy
			label = lingo.labels[type];
			tooltip = lingo.tooltips[type];

			if (this.getTagglyOpt(title,"sortBy") == type) {
				label += lingo.labels[this.getTagglyOpt(title,"sortOrder")];
				onclick = function() {
					config.taggly.toggleTagglyOpt(title,"sortOrder");
					return false;
				}
			}
			else {
				onclick = function() {
					config.taggly.setTagglyOpt(title,"sortBy",type);
					config.taggly.setTagglyOpt(title,"sortOrder",config.taggly.config.listOpts.sortOrder[0]);
					return false;
				}
			}
		}
		else {
			// "regular" controls, nice and simple
			label = lingo.labels[type == "numCols" ? type : this.getNextValue(title,type)];
			tooltip = lingo.tooltips[type == "numCols" ? type : this.getNextValue(title,type)];
			onclick = function() {
				config.taggly.toggleTagglyOpt(title,type);
				return false;
			}
		}

		// hide button because commas don't have columns
		if (!(this.getTagglyOpt(title,"listMode") == "commas" && type == "numCols"))
			createTiddlyButton(place,label,tooltip,onclick,type == "hideState" ? "hidebutton" : "button");
	},

	makeColumns: function(orig,numCols) {
		var listSize = orig.length;
		var colSize = listSize/numCols;
		var remainder = listSize % numCols;

		var upperColsize = colSize;
		var lowerColsize = colSize;

		if (colSize != Math.floor(colSize)) {
			// it's not an exact fit so..
			upperColsize = Math.floor(colSize) + 1;
			lowerColsize = Math.floor(colSize);
		}

		var output = [];
		var c = 0;
		for (var j=0;j<numCols;j++) {
			var singleCol = [];
			var thisSize = j < remainder ? upperColsize : lowerColsize;
			for (var i=0;i<thisSize;i++) 
				singleCol.push(orig[c++]);
			output.push(singleCol);
		}

		return output;
	},

	drawTable: function(place,columns,theClass) {
		var newTable = createTiddlyElement(place,"table",null,theClass);
		var newTbody = createTiddlyElement(newTable,"tbody");
		var newTr = createTiddlyElement(newTbody,"tr");
		for (var j=0;j<columns.length;j++) {
			var colOutput = "";
			for (var i=0;i<columns[j].length;i++) 
				colOutput += columns[j][i];
			var newTd = createTiddlyElement(newTr,"td",null,"tagglyTagging"); // todo should not need this class
			wikify(colOutput,newTd);
		}
		return newTable;
	},

	createTagglyList: function(place,title) {
		switch(this.getTagglyOpt(title,"listMode")) {
			case "group":  return this.createTagglyListGrouped(place,title); break;
			case "normal": return this.createTagglyListNormal(place,title,false); break;
			case "commas": return this.createTagglyListNormal(place,title,true); break;
			case "sitemap":return this.createTagglyListSiteMap(place,title); break;
		}
	},

	getTaggingCount: function(title) {
		// thanks to Doug Edmunds
		if (this.config.showTaggingCounts) {
			var tagCount = store.getTaggedTiddlers(title).length;
			if (tagCount > 0)
				return " ("+tagCount+")";
		}
		return "";
	},

	getExcerpt: function(inTiddlerTitle,title,indent) {
    if (!indent)
			indent = 1;
		if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "excerpts") {
			var t = store.getTiddler(title);
			if (t) {
				var text = t.text.replace(/\n/," ");
				var marker = text.indexOf(this.config.excerptMarker);
				if (marker != -1) {
					return " {{excerpt{<nowiki>" + text.substr(0,marker) + "</nowiki>}}}";
				}
				else if (text.length < this.config.excerptSize) {
					return " {{excerpt{<nowiki>" + t.text + "</nowiki>}}}";
				}
				else {
					return " {{excerpt{<nowiki>" + t.text.substr(0,this.config.excerptSize) + "..." + "</nowiki>}}}";
				}
			}
		}
		else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "contents") {
			var t = store.getTiddler(title);
			if (t) {
				return "\n{{contents indent"+indent+"{\n" + t.text + "\n}}}";
			}
		}
		else if (this.getTagglyOpt(inTiddlerTitle,"excerpts") == "sliders") {
			var t = store.getTiddler(title);
			if (t) {
				return "<slider slide>\n{{contents{\n" + t.text + "\n}}}\n</slider>";
			}
		}
		return "";
	},

	notHidden: function(t,inTiddler) {
		if (typeof t == "string") 
			t = store.getTiddler(t);
		return (!t || !t.tags.containsAny(this.config.excludeTags) ||
				(inTiddler && this.config.excludeTags.contains(inTiddler)));
	},

	// this is for normal and commas mode
	createTagglyListNormal: function(place,title,useCommas) {

		var list = store.getTaggedTiddlers(title,this.getTagglyOpt(title,"sortBy"));

		if (this.getTagglyOpt(title,"sortOrder") == "desc")
			list = list.reverse();

		var output = [];
		var first = true;
		for (var i=0;i<list.length;i++) {
			if (this.notHidden(list[i],title)) {
				var countString = this.getTaggingCount(list[i].title);
				var excerpt = this.getExcerpt(title,list[i].title);
				if (useCommas)
					output.push((first ? "" : ", ") + "[[" + list[i].title + "]]" + countString + excerpt);
				else
					output.push("*[[" + list[i].title + "]]" + countString + excerpt + "\n");

				first = false;
			}
		}

		return this.drawTable(place,
			this.makeColumns(output,useCommas ? 1 : parseInt(this.getTagglyOpt(title,"numCols"))),
			useCommas ? "commas" : "normal");
	},

	// this is for the "grouped" mode
	createTagglyListGrouped: function(place,title) {
		var sortBy = this.getTagglyOpt(title,"sortBy");
		var sortOrder = this.getTagglyOpt(title,"sortOrder");

		var list = store.getTaggedTiddlers(title,sortBy);

		if (sortOrder == "desc")
			list = list.reverse();

		var leftOvers = []
		for (var i=0;i<list.length;i++)
			leftOvers.push(list[i].title);

		var allTagsHolder = {};
		for (var i=0;i<list.length;i++) {
			for (var j=0;j<list[i].tags.length;j++) {

				if (list[i].tags[j] != title) { // not this tiddler

					if (this.notHidden(list[i].tags[j],title)) {

						if (!allTagsHolder[list[i].tags[j]])
							allTagsHolder[list[i].tags[j]] = "";

						if (this.notHidden(list[i],title)) {
							allTagsHolder[list[i].tags[j]] += "**[["+list[i].title+"]]"
										+ this.getTaggingCount(list[i].title) + this.getExcerpt(title,list[i].title) + "\n";

							leftOvers.setItem(list[i].title,-1); // remove from leftovers. at the end it will contain the leftovers

						}
					}
				}
			}
		}

		var allTags = [];
		for (var t in allTagsHolder)
			allTags.push(t);

		var sortHelper = function(a,b) {
			if (a == b) return 0;
			if (a < b) return -1;
			return 1;
		};

		allTags.sort(function(a,b) {
			var tidA = store.getTiddler(a);
			var tidB = store.getTiddler(b);
			if (sortBy == "title") return sortHelper(a,b);
			else if (!tidA && !tidB) return 0;
			else if (!tidA) return -1;
			else if (!tidB) return +1;
			else return sortHelper(tidA[sortBy],tidB[sortBy]);
		});

		var leftOverOutput = "";
		for (var i=0;i<leftOvers.length;i++)
			if (this.notHidden(leftOvers[i],title))
				leftOverOutput += "*[["+leftOvers[i]+"]]" + this.getTaggingCount(leftOvers[i]) + this.getExcerpt(title,leftOvers[i]) + "\n";

		var output = [];

		if (sortOrder == "desc")
			allTags.reverse();
		else if (leftOverOutput != "")
			// leftovers first...
			output.push(leftOverOutput);

		for (var i=0;i<allTags.length;i++)
			if (allTagsHolder[allTags[i]] != "")
				output.push("*[["+allTags[i]+"]]" + this.getTaggingCount(allTags[i]) + this.getExcerpt(title,allTags[i]) + "\n" + allTagsHolder[allTags[i]]);

		if (sortOrder == "desc" && leftOverOutput != "")
			// leftovers last...
			output.push(leftOverOutput);

		return this.drawTable(place,
				this.makeColumns(output,parseInt(this.getTagglyOpt(title,"numCols"))),
				"grouped");

	},

	// used to build site map
	treeTraverse: function(title,depth,sortBy,sortOrder) {

		var list = store.getTaggedTiddlers(title,sortBy);
		if (sortOrder == "desc")
			list.reverse();

		var indent = "";
		for (var j=0;j<depth;j++)
			indent += "*"

		var childOutput = "";
		for (var i=0;i<list.length;i++)
			if (list[i].title != title)
				if (this.notHidden(list[i].title,this.config.inTiddler))
					childOutput += this.treeTraverse(list[i].title,depth+1,sortBy,sortOrder);

		if (depth == 0)
			return childOutput;
		else
			return indent + "[["+title+"]]" + this.getTaggingCount(title) + this.getExcerpt(this.config.inTiddler,title,depth) + "\n" + childOutput;
	},

	// this if for the site map mode
	createTagglyListSiteMap: function(place,title) {
		this.config.inTiddler = title; // nasty. should pass it in to traverse probably
		var output = this.treeTraverse(title,0,this.getTagglyOpt(title,"sortBy"),this.getTagglyOpt(title,"sortOrder"));
		return this.drawTable(place,
				this.makeColumns(output.split(/(?=^\*\[)/m),parseInt(this.getTagglyOpt(title,"numCols"))), // regexp magic
				"sitemap"
				);
	},

	macros: {
		tagglyTagging: {
			handler: function (place,macroName,params,wikifier,paramString,tiddler) {
				var refreshContainer = createTiddlyElement(place,"div");
				// do some refresh magic to make it keep the list fresh - thanks Saq
				refreshContainer.setAttribute("refresh","macro");
				refreshContainer.setAttribute("macroName",macroName);
        			refreshContainer.setAttribute("title",tiddler.title);
				this.refresh(refreshContainer);
			},

			refresh: function(place) {
				var title = place.getAttribute("title");
				removeChildren(place);
				if (store.getTaggedTiddlers(title).length > 0) {
					var lingo = config.taggly.lingo;
					config.taggly.createListControl(place,title,"hideState");
					if (config.taggly.getTagglyOpt(title,"hideState") == "show") {
						createTiddlyElement(place,"span",null,"tagglyLabel",lingo.labels.label.format([title]));
						config.taggly.createListControl(place,title,"title");
						config.taggly.createListControl(place,title,"modified");
						config.taggly.createListControl(place,title,"created");
						config.taggly.createListControl(place,title,"listMode");
						config.taggly.createListControl(place,title,"excerpts");
						config.taggly.createListControl(place,title,"numCols");
						config.taggly.createTagglyList(place,title);
					}
				}
			}
		}
	},

	// todo fix these up a bit
	styles: [
"/*{{{*/",
"/* created by TagglyTaggingPlugin */",
".tagglyTagging { padding-top:0.5em; }",
".tagglyTagging li.listTitle { display:none; }",
".tagglyTagging ul {",
"	margin-top:0px; padding-top:0.5em; padding-left:2em;",
"	margin-bottom:0px; padding-bottom:0px;",
"}",
".tagglyTagging { vertical-align: top; margin:0px; padding:0px; }",
".tagglyTagging table { margin:0px; padding:0px; }",
".tagglyTagging .button { visibility:hidden; margin-left:3px; margin-right:3px; }",
".tagglyTagging .button, .tagglyTagging .hidebutton {",
"	color:[[ColorPalette::TertiaryLight]]; font-size:90%;",
"	border:0px; padding-left:0.3em;padding-right:0.3em;",
"}",
".tagglyTagging .button:hover, .hidebutton:hover, ",
".tagglyTagging .button:active, .hidebutton:active  {",
"	border:0px; background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]];",
"}",
".selected .tagglyTagging .button { visibility:visible; }",
".tagglyTagging .hidebutton { color:[[ColorPalette::Background]]; }",
".selected .tagglyTagging .hidebutton { color:[[ColorPalette::TertiaryLight]] }",
".tagglyLabel { color:[[ColorPalette::TertiaryMid]]; font-size:90%; }",
".tagglyTagging ul {padding-top:0px; padding-bottom:0.5em; margin-left:1em; }",
".tagglyTagging ul ul {list-style-type:disc; margin-left:-1em;}",
".tagglyTagging ul ul li {margin-left:0.5em; }",
".editLabel { font-size:90%; padding-top:0.5em; }",
".tagglyTagging .commas { padding-left:1.8em; }",
"/* not technically tagglytagging but will put them here anyway */",
".tagglyTagged li.listTitle { display:none; }",
".tagglyTagged li { display: inline; font-size:90%; }",
".tagglyTagged ul { margin:0px; padding:0px; }",
".excerpt { color:[[ColorPalette::TertiaryDark]]; }",
"div.tagglyTagging table,",
"div.tagglyTagging table tr,",
"td.tagglyTagging",
" {border-style:none!important; }",
".tagglyTagging .contents { border-bottom:2px solid [[ColorPalette::TertiaryPale]]; padding:0 1em 1em 0.5em;",
"  margin-bottom:0.5em; }",
".tagglyTagging .indent1  { margin-left:3em;  }",
".tagglyTagging .indent2  { margin-left:4em;  }",
".tagglyTagging .indent3  { margin-left:5em;  }",
".tagglyTagging .indent4  { margin-left:6em;  }",
".tagglyTagging .indent5  { margin-left:7em;  }",
".tagglyTagging .indent6  { margin-left:8em;  }",
".tagglyTagging .indent7  { margin-left:9em;  }",
".tagglyTagging .indent8  { margin-left:10em; }",
".tagglyTagging .indent9  { margin-left:11em; }",
".tagglyTagging .indent10 { margin-left:12em; }",
"/*}}}*/",
		""].join("\n"),

	init: function() {
		merge(config.macros,this.macros);
		config.shadowTiddlers["TagglyTaggingStyles"] = this.styles;
		store.addNotification("TagglyTaggingStyles",refreshStyles);
	}
};

config.taggly.init();

//}}}

/***
InlineSlidersPlugin
By Saq Imtiaz
http://tw.lewcid.org/sandbox/#InlineSlidersPlugin

// syntax adjusted to not clash with NestedSlidersPlugin

***/
//{{{
config.formatters.unshift( {
	name: "inlinesliders",
	// match: "\\+\\+\\+\\+|\\<slider",
	match: "\\<slider",
	// lookaheadRegExp: /(?:\+\+\+\+|<slider) (.*?)(?:>?)\n((?:.|\n)*?)\n(?:====|<\/slider>)/mg,
	lookaheadRegExp: /(?:<slider) (.*?)(?:>)\n((?:.|\n)*?)\n(?:<\/slider>)/mg,
	handler: function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart ) {
			var btn = createTiddlyButton(w.output,lookaheadMatch[1] + " "+"\u00BB",lookaheadMatch[1],this.onClickSlider,"button sliderButton");
			var panel = createTiddlyElement(w.output,"div",null,"sliderPanel");
			panel.style.display = "none";
			wikify(lookaheadMatch[2],panel);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
   },
   onClickSlider : function(e) {
		if(!e) var e = window.event;
		var n = this.nextSibling;
		n.style.display = (n.style.display=="none") ? "block" : "none";
		return false;
	}
});

//}}}
116. jpoker module: jpoker.plugins.player: /AVATAR (1, 0, 1)
127. jpoker module: jpoker.plugins.userInfo (1, 23, 24)
127. jpoker module: jpoker.plugins.userInfo avatar upload succeed (1, 4, 5)

because /AVATAR doesn't make sense over file:///
See attached screenshot

http://jspoker.pokersource.info/t.jpg
{{{
{"user2properties":{"X26":{"money":400000,"table_serial":723,"name":"BOTBoSwoi","rank":-1},"X27":{"money":-1,"table_serial":-1,"name":"BOTluhurs","rank":3},"X9":{"money":400000,"table_serial":723,"name":"proppy","rank":-1},"X20":{"money":-1,"table_serial":-1,"name":"proppy2","rank":4}},"length":3,"tourney_serial":24,"table2serials":{"X723":[9,26],"-1":[20,27]},"type":"PacketPokerTourneyManager","tourney":{"breaks_interval":3600,"currency_serial":1,"description_long":"Sit and Go 2 players","rank2prize":[840000,360000],"serial":24,"resthost_serial":0,"rebuy_count":0,"state":"running","buy_in":300000,"add_on_count":0,"description_short":"Sit and Go 2 players, Holdem","registered":4,"players_quota":4,"breaks_first":7200,"add_on":0,"start_time":1222693571,"rake":0,"variant":"holdem","players_min":4,"schedule_serial":1,"betting_structure":"level-15-30-no-limit","add_on_delay":60,"name":"sitngo2","finish_time":0,"prize_min":0,"player_timeout":60,"breaks_duration":300,"seats_per_game":2,"bailor_serial":0,"sit_n_go":"y","rebuy_delay":0},"uid__":"jpoker1222693551093"}
}}}
when a player is removed from a tourney table_serial in user2tourney is set to -1
{{{
sql = "update user2tourney set rank = %d, table_serial = -1 where user_serial = %d and tourney_serial = %d" % ( tourney.getRank(serial), serial, tourney.serial )
}}}
but tourneyManager only skip entries that have table_serial = None
{{{
        for row in user2tourney:
            table_serial = row['table_serial']
            if table_serial == None:
                continue
}}}
To reproduce:
* Be in a tourney
* kill your browser
* rejoin the tourney
* as the screen starts to display, click sit-in as quick as you can
* you should get "not enough money" pop up.
(18:54:32) dachary: proppy: TourneyFinish must not stop the tourney object as it currently does in jpoker
(18:54:48) dachary: would you be so kind as to register this as a bug to be fixed while I'm experimenting ?
Type the text for 'Type your idea here (number 1266231523907)'
Type the text for 'Type your idea here (number 1267580792638)'
for the table images instead of single images
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class="tagglyTagging" macro="tagglyTagging"></div>
<div class='tagged' macro='tags'></div>
<div macro="hideWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
<div class='viewer' macro='view text wikified'></div>
</div>
<div macro="showWhen tiddler.tags.containsAny(['css','html','pre','systemConfig']) && !tiddler.text.match('{{'+'{')">
<div class='viewer'><pre macro='view text'></pre></div>
</div>
<div class='tagClear'></div>
<!--}}}-->
/***
|''Name:''|WebDavPlugin|
|''Description:''|Allows a TiddlyWiki to be saved to a WebDav server|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Co-author:''|Loic Dachary|
|''Source:''|http://tw.lewcid.org/#WebDavPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|1.0|
|''Date:''|17/11/2007|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.3|

***/
// /%
//!BEGIN-PLUGIN-CODE
DAV = {
	run : function(type,u,data,cb,params,headers){
		var callback = function(status,params,responseText,url,xhr) {
			url = url.indexOf("nocache=") < 0 ? url : url.substring(0,url.indexOf("nocache=")-1);
			if(params.length){
				params.shift().apply(this,[status,params,responseText,url,xhr]);
			}
		};	
		params = params||[];
		params.unshift(cb);		
		var r = doHttp.apply(this,[type,u,data,null,null,null,callback,params,headers]);
		if (typeof r == "string")
			alert(r);
		return r;
	},
	
	get : function(url,cb,params){
		return DAV.run("GET",url,null,cb,params,null);
	},

	put : function(url,cb,params,data) {
		return DAV.run("PUT",url,data,cb,params,null);
	},

	move : function(url,cb,params,destination) {
		return DAV.run("MOVE",url,null,cb,params,{"Destination":destination,"Overwrite":"T"});
	}, 

	copy : function(url,cb,params,destination) {
		return DAV.run("COPY",url,null,cb,params,{"Destination":destination,"Overwrite":"T","Depth":0});
	},
	
	propfind : function(url,cb,params,prop,depth){	// !!!
		var xml = '<?xml version="1.0" encoding="UTF-8" ?>' +
			'<D:propfind xmlns:D="DAV:">' +
			'<D:prop>'+
			'<D:'+prop+'/>'+
			'</D:prop>'+
			'</D:propfind>';
		return DAV.run("PROPFIND",url,xml,cb,params,{"Content-type":"text/xml","Depth":depth?depth:0});
	},
	
	makeDir : function(url,cb,params){
		return DAV.run("MKCOL",url,null,cb,params,null);
	},

	options : function(url,cb,params){
		return DAV.run("OPTIONS",url,null,cb,params,null);
	},
	
	safeput : function(url,cb,params,data){
		firstcb = function(status,p,responseText,u,xhr){
			if(status)
				DAV.move(u,cb,p,u.replace("-davsavingtemp",""));
			else
				cb.apply(firstcb,arguments);
		};
		return DAV.put(url+"-davsavingtemp",firstcb,params,data);
	}	
};

config.DavSaver = {
	defaultFileName : 'index.html',
	messages : {
		startSaveMessage : 'saving to server...',
		endSaveMessage : 'TiddlyWiki successfuly saved to server',
		overwriteNewerPrompt : 'The remote file has changed since you last loaded or saved it.\nDo you wish to overwrite it?',
		getModDateError : "Could not get last modified date",
		raceError: "Save failed because the remote file is newer than the one you are trying to save"
	},
	errors:{
		raceconflict : 'The save failed because your file is out of date',
		getlastmodified : 'The save was aborted because the last modified date of the file could not be retrieved',
		davenabled : 'The server does not support WebDav',
		saverss : 'There was an error saving the rss file, the save was aborted',
		saveempty: 'There was an error saving the empty file, the save was aborted',
		savemain : 'Save failed! There was an error saving the main TW file',
		savebackup: 'Save failed! There was an error creating a backup file',
		makebackupdir: 'Save failed! The backup directory could not be created'		
	},
	timestamp: new Date().toGMTString(),
	orig_saveChanges: saveChanges,
	saver : null
};

DavSaver = function(){
	
	this.Q = [];	

	this.reset = function(){
		config.DavSaver.saver = null;
	};
	this.runQ = function(){
		if(this.Q.length){
			this.Q.shift().apply(this,arguments);
		}
		else
			this.reset();
	};
	this.posDiv = null;
	this.original = null;
	
	this.getOriginalPath = function(){
		var p = document.location.toString();
		p = convertUriToUTF8(p,config.options.txtFileSystemCharSet);
		var argPos = p.indexOf("?");
		if(argPos != -1)
			p = p.substr(0,argPos);
		var hashPos = p.indexOf("#");
		if(hashPos != -1)
			p = p.substr(0,hashPos);		
		if (p.charAt(p.length-1) == "/")
			p = p + config.DavSaver.defaultFileName;
		return p;
	};
	
	this.originalPath = this.getOriginalPath();
	this.backupPath = null;
	this.emptyPath = null;
	this.rssPath = null;
	this.throwError = function(er){
		clearMessage();
		this.reset();
		alert(config.DavSaver.errors[er]);   //clear message, reset and delete
	};
};

DavSaver.prototype.getOriginal = function(){
	var	callback = function(status,params,original,url,xhr) {
		var that = params[0];
		if(status){
			var p = that.posDiv = locateStoreArea(original);
			if(!p || (p[0] == -1) || (p[1] == -1)) {
				alert(config.messages.invalidFileError.format([url]));
				return;
			}
			that.original = original;
			that.runQ();
		}
		else
			that.throwError('getOriginal');
	};
	
	DAV.get(this.originalPath,callback,[this]);	
};

DavSaver.prototype.checkRace = function(){
	var callback = function(status,params,responseText,url,xhr){
		var that = params[0];
		if(status){
			var lastmod = responseText.match(/<(\w*?):getlastmodified>(.*?)<\/\1:getlastmodified>/)[2];
			if(Date.parse(lastmod) > Date.parse(config.DavSaver.timestamp)){
				if (confirm(config.DavSaver.messages.overwriteNewerPrompt))
					that.runQ();
				else
					that.throwError('raceconflict');
			}
			else	
				that.runQ();
		}
		else
			that.throwError('getlastmodified');
	};
	
	DAV.propfind(this.originalPath,callback,[this],"getlastmodified",0);	
};

DavSaver.prototype.isDavEnabled = function(){
	var callback = function(status,params,responseText,url,xhr){
		that = params[0];
		if(status && !! xhr.getResponseHeader("DAV")){
			that.runQ();
			}
		else
			that.throwError('davenabled');
	};
	DAV.options(this.originalPath,callback,[this]);		
};

DavSaver.prototype.saveRss = function(){
	var callback = function(status,params,responseText,url,xhr){
		var that = params[0];
		if(status){
			displayMessage(config.messages.rssSaved,that.rssPath);
			that.runQ();
		}
		else
			that.throwError('saverss');
	};
	var u = this.originalPath;
	var rssPath = this.rssPath = u.substr(0,u.lastIndexOf(".")) + ".xml";
	DAV.safeput(rssPath,callback,[this],convertUnicodeToUTF8(generateRss()));	
};

DavSaver.prototype.saveEmpty = function(){
	var callback = function(status,params,responseText,url,xhr){
		var that = params[0];
		if(status){
			displayMessage(config.messages.emptySaved,that.emptyPath);
			that.runQ();
		}
		else
			that.throwError('saveempty');
	};
	var u = this.originalPath;
	var emptyPath,p;
	if((p = u.lastIndexOf("/")) != -1)
		emptyPath = u.substr(0,p) + "/empty.html";
	else
		emptyPath = u + ".empty.html";
	this.emptyPath = emptyPath;
	var empty = this.original.substr(0,this.posDiv[0] + startSaveArea.length) + this.original.substr(this.posDiv[1]);
	DAV.safeput(emptyPath,callback,[this],empty);		
};

DavSaver.prototype.saveMain = function(){
	var callback = function(status,params,responseText,url,xhr){
		var that = params[0];
		if(status){
			config.DavSaver.timestamp = xhr.getResponseHeader('Date');
			displayMessage(config.messages.mainSaved,that.originalPath);
			store.setDirty(false);
			that.runQ();
		}
		else
			that.throwError('savemain');		
	};
	var revised = updateOriginal(this.original,this.posDiv);
	DAV.safeput(this.originalPath,callback,[this],revised);
};

DavSaver.prototype.saveBackup = function(){	
	var callback = function(status,params,responseText,url,xhr){
		var that = params[0];
		if(status){
			clearMessage();
			displayMessage(config.messages.backupSaved,that.backupPath);
			that.runQ();
		}
		else
			that.throwError('savebackup');
	};
			
	var backupPath = this.backupPath = getBackupPath(this.originalPath);
	DAV.copy(this.originalPath,callback,[this],this.backupPath);		
};

DavSaver.prototype.makeBackupDir = function(){
	var callback = function(status,params,responseText,url,xhr){
		var that = params[0];
		if(status)
			that.runQ();
		else
			that.throwError('makebackupdir');
	};
	var u = getBackupPath(this.originalPath);
	var backupDirPath = u.substr(0,u.lastIndexOf("/"));
	DAV.makeDir(backupDirPath,callback,[this]); 
};

DavSaver.prototype.save = function(onlyIfDirty,tiddlers){
	if(onlyIfDirty && !store.isDirty())
		return;
	clearMessage();
	displayMessage(config.DavSaver.messages.startSaveMessage);
	var Q = this.Q =[];
	Q.push(this.isDavEnabled);
	Q.push(this.getOriginal);
	Q.push(this.checkRace);
	if (config.options.chkSaveBackups){
		if (config.options.txtBackupFolder!='')
			Q.push(this.makeBackupDir);
		Q.push(this.saveBackup);
	}
	Q.push(this.saveMain);
	if (config.options.chkGenerateAnRssFeed)
		Q.push(this.saveRss);
	if (config.options.chkSaveEmptyTemplate)
		Q.push(this.saveEmpty);
	//Q.push(this.reset);
	this.runQ();
};

window.saveChanges = function(onlyIfDirty,tiddlers)
{	
	var c = config.DavSaver;
	if (document.location.protocol.toString() == "http:"){
		var saver = c.saver = new DavSaver();
		saver.save(onlyIfDirty,tiddlers);		
	}
	else
		return c.orig_saveChanges(onlyIfDirty,tiddlers);
};
//!END-PLUGIN-CODE
// %/
these bugs or features were reported but will not be addressed for some reason

Type the text for '[[table'

{{{
Traceback (most recent call last):

  File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 323, in _runCallbacks

    self.result = callback(self.result, *args, **kw)

  File "/usr/lib/python2.5/site-packages/pokernetwork/pokersite.py", line 210, in <lambda>

    self.deferred.addCallback(lambda result: self.deferRender(request, jsonp, packet))

  File "/usr/lib/python2.5/site-packages/pokernetwork/pokersite.py", line 249, in deferRender

    d.addCallbacks(render, processingFailed)

  File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 185, in addCallbacks

    self._runCallbacks()

--- <exception caught here> ---

  File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 323, in _runCallbacks

    self.result = callback(self.result, *args, **kw)

  File "/usr/lib/python2.5/site-packages/pokernetwork/pokersite.py", line 234, in render

    result_string = str(Packet.JSON.encode(maps))

  File "/var/lib/python-support/python2.5/simplejson/encoder.py", line 357, in encode

    chunks = list(self.iterencode(o))

  File "/var/lib/python-support/python2.5/simplejson/encoder.py", line 299, in _iterencode

    for chunk in self._iterencode_list(o, markers):

  File "/var/lib/python-support/python2.5/simplejson/encoder.py", line 197, in _iterencode_list

    for chunk in self._iterencode(value, markers):

  File "/var/lib/python-support/python2.5/simplejson/encoder.py", line 302, in _iterencode

    for chunk in self._iterencode_dict(o, markers):

  File "/var/lib/python-support/python2.5/simplejson/encoder.py", line 268, in _iterencode_dict

    for chunk in self._iterencode(value, markers):

  File "/var/lib/python-support/python2.5/simplejson/encoder.py", line 287, in _iterencode

    yield encoder(o)

exceptions.UnicodeDecodeError: 'utf8' codec can't decode bytes in position 28-29: unexpected end of 

data
}}}
steps to reproduce:
login
sit
wait for position
logout

action buttons are still shown


http://jpoker.aminche.com/hg/jpoker/rev/5d0be6c17a94



so that redirection or additional action can take place
* check
* bet
* fold

* flop
* turn
* river
to add a scrollbar,
jpoker_tourney_details_players is already used for the border
as a global value
or as a per widget argument
http://jpoker.aminche.com/hg/jpoker/rev/e5a17607e403


http://jpoker.aminche.com/hg/jpoker/rev/4045efdd620c
use jpoker.plugins.table.callback.hand_start instead
use jpoker.errorHandler instead
http://jpoker.aminche.com/hg/jpoker/rev/6c431246686e
http://jpoker.aminche.com/hg/jpoker/rev/56138181367e
http://svn.gna.org/viewcvs/pokersource?rev=4724&view=rev

http://jpoker.aminche.com/hg/jpoker/rev/936b4f815568
http://jpoker.aminche.com/hg/jpoker/rev/f89b206308b6
http://jpoker.aminche.com/hg/jpoker/rev/53240957a3be
http://jpoker.aminche.com/hg/jpoker/rev/ffe3adba71d6
http://jpoker.aminche.com/hg/jpoker/rev/db1cf46ed760
http://jpoker.aminche.com/hg/jpoker/rev/d70f9212ca81
http://jpoker.aminche.com/hg/jpoker/rev/e27d20183faf
http://jpoker.aminche.com/hg/jpoker/rev/b6b114b5bb91
http://jpoker.aminche.com/hg/jpoker/rev/0a1a9c0ea6a8
http://jpoker.aminche.com/hg/jpoker/rev/0774f5b17357
http://jpoker.aminche.com/hg/jpoker/rev/2c14c3517b76
http://jpoker.aminche.com/hg/jpoker/rev/57fa47262f3a
http://jpoker.aminche.com/hg/jpoker/rev/eb27435ebf87
http://jpoker.aminche.com/hg/jpoker/rev/b187cb2770e7
http://jpoker.aminche.com/hg/jpoker/rev/39a6b5c60f74
http://jpoker.aminche.com/hg/jpoker/rev/4e88415c9de5
http://jpoker.aminche.com/hg/jpoker/rev/eb1efe6d34d8
http://jpoker.aminche.com/hg/jpoker/rev/4ce25c1ecd10
http://jpoker.aminche.com/hg/jpoker/rev/e6fee3d22a1f
http://jpoker.aminche.com/hg/jpoker/rev/642cbcfa815e
http://jpoker.aminche.com/hg/jpoker/rev/18444494b9da
http://jpoker.aminche.com/hg/jpoker/rev/e5a2fb4b7819

http://jpoker.aminche.com/hg/jpoker/rev/2a642643faa9
http://jpoker.aminche.com/hg/jpoker/rev/11dac071df71
http://jpoker.aminche.com/hg/jpoker/rev/d02fe1b8e91e
in order to use
{{{
jpoker_player_level_expert.jpoker_sit_out .jpoker_ptable_player_seat_background
}}}
instead of
{{{
.jpoker_table .jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat0_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat1_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat2_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat3_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat4_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat5_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat6_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat7_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat8_background, .jpoker_table
.jpoker_player_level_expert.jpoker_sit_out
.jpoker_ptable_player_seat9_background
}}}
http://jpoker.aminche.com/hg/jpoker/rev/457feeeb6a15
http://jpoker.aminche.com/hg/jpoker/rev/19b682047255

http://jpoker.aminche.com/hg/jpoker/rev/6a221bc6d3b8
http://jpoker.aminche.com/hg/jpoker/rev/82413b36099b
http://jpoker.aminche.com/hg/jpoker/rev/f516e0c2b996
http://jpoker.aminche.com/hg/jpoker/rev/911b6d1fce3f
http://jpoker.aminche.com/hg/jpoker/rev/6bbdb15dafe1
The callback is called by the jquery widget that displays a player with the element of the player and the serial of the player.
This callback could be used to implement a custom layout for the player, such as blue for boys and pink for girls.
http://jpoker.aminche.com/hg/jpoker/rev/5f78e20792dc
http://jpoker.aminche.com/hg/jpoker/rev/b764984bbe98
http://jpoker.aminche.com/hg/jpoker/rev/b764984bbe98
http://jpoker.aminche.com/hg/jpoker/rev/d577f926a52c
http://jpoker.aminche.com/hg/jpoker/rev/2581fb800c25
http://jpoker.aminche.com/hg/jpoker/rev/c437af8bc7ba
http://jpoker.aminche.com/hg/jpoker/rev/4fb70190d2c9
to be called in a server.queueRunning(function(server) { jpoker.server.defaults.reconnectFinish(server); }) in the rejoin function immediately after the getUserInfo()
to be able to track request
implementation: ++i
http://jpoker.aminche.com/hg/jpoker/rev/0c1a16b854aa
http://jpoker.aminche.com/hg/jpoker/rev/e1b44a91720e
http://jpoker.aminche.com/hg/jpoker/rev/7677146046a3
http://jpoker.aminche.com/hg/jpoker/rev/617c31999725
http://jpoker.aminche.com/hg/jpoker/rev/7367b4521e4d
http://jpoker.aminche.com/hg/jpoker/rev/1f07f19ac32e
http://jpoker.aminche.com/hg/jpoker/rev/655c021669cd
http://jpoker.aminche.com/hg/jpoker/rev/e51fc35765f4
http://upstream.jspoker.pokersource.info/rev/6ab38a252e29
http://jpoker.aminche.com/hg/jpoker/rev/5fa24ac12100
http://jpoker.aminche.com/hg/jpoker/rev/b47c6a0a1e8f
http://svn.gna.org/viewcvs/pokersource?rev=4725&view=rev
http://jpoker.aminche.com/hg/jpoker/rev/e69e009cd6d9
http://jpoker.aminche.com/hg/jpoker/rev/8e6033a40938
http://jpoker.aminche.com/hg/jpoker/rev/a81b58360be4
http://jpoker.aminche.com/hg/jpoker/rev/af2aba6abd89
http://jpoker.aminche.com/hg/jpoker/rev/789048665066
http://jpoker.aminche.com/hg/jpoker/rev/4e8d968c1b11
http://jpoker.aminche.com/hg/jpoker/rev/c3b3f45201da
- .jpoker_list for all tabular list (table, tourney)
- .odd .even on tourneydetails table list

currently only action (raise, fold, check, call) have jpoker_button class
rebuy, exit, sit/sitout button are missing it

it should be using img src instead
fixed with http://upstream.jspoker.pokersource.info/rev/1f283e629483


* sounds like a pokerengine issue

[[bkuhn]] notes that this is a major change to pokerengine, and that [[dachary]] probably implemented this way as a simplification of the engine.  Somewhere in pokerengine or pokernetwork could change this, but I think that perhaps the client side should figure this out for now.  It would be quite a research project to figure out what breaks in the server should the engine start to make this distinction.
var _ = $.get.gettext;
at the beginning of the file
http://jpoker.aminche.com/hg/jpoker/rev/4a4d32dddab6
by default shows a dialog with the getplayerplaces info for the user
http://jpoker.aminche.com/hg/jpoker/rev/d12a44732586
http://jpoker.aminche.com/hg/jpoker/rev/812677d3edd4
http://svn.gna.org/viewcvs/pokersource?rev=4494&view=rev
http://jpoker.aminche.com/hg/jpoker/rev/adc5ae25e4f8
http://jpoker.aminche.com/hg/jpoker/rev/63b0835f5218
http://svn.gna.org/viewcvs/pokersource?rev=4539&view=rev
* an anonymous user join the table
* the user log in
* the user can't seat at the table
packet2table(PACKET_POKER_SEAT) return false
because avatar.tables is empty
http://jpoker.aminche.com/hg/jpoker/rev/2d58df353805
only showing the amount of chips for the logged in player for a start
http://jpoker.aminche.com/hg/jpoker/rev/8e771eaececa
it shows in the rebuy dialog box button on trunk
$.jpoker.plugins.playerSelf.rebuy_options.autoResize = false; is a workaround
{{{
Index: jquery.jpoker.js
===================================================================
--- jquery.jpoker.js    (revision 5195)
+++ jquery.jpoker.js    (working copy)
@@ -3432,7 +3432,7 @@
         room: 'expected to be overriden by mockup.js but was not',
        tourney_break: '<div>{label}</div><div>{date}</div>',
        powered_by: '<a title=\'Powered by Pokersource\' href=\'javascript://\' >Powered by Pokersource</a>',
-       chat: '<div class=\'jpoker_chat_input\'><input value=\'chat here\' type=\'text\' width=\'100%\' /></div><div class=\'jpoker_chat_history\'><div class=\'jpoker_chat_history_player\'></div><div class=\'jpoker_chat_history_dealer\'></div></div>',
+       chat: '<div class=\'jpoker_chat_input\'><input value=\'' + _('chat here') + '\' type=\'text\' width=\'100%\' /></div><div class=\'jpoker_chat_history\'><div class=\'jpoker_chat_history_player\'></div><div class=\'jpoker_chat_history_dealer\'></div></div>',
         placeholder: _("connecting to table {name}")
     };
}}}
still only 3 lines in the chat box tho 
maybe put the chat and status boxes next to each other to allow for more vertical space (history)
remove horizontal scrollbar from chat

modify the chat zone so that the chat log + dealer log + input are assembled in a JS template instead of being constrained by the mockup.js layout. The default must be the same structure as it is currently.
{{{ <div>{dealer}{log}</div>{input chat}  }}}



check = PASSEN, fold = PASSEN
[[see capture|bug01.jpg]]

Fold = Passen
Check = Schieben
Call = Mitgehen
Raise = Erhöhen 
when a tourney sitngoX is respawning from tourney_schedule before previous sitngoX is finished
{{{
mysql> select name,serial,state from tourneys;
+----------+--------+-------------+
| name     | serial | state       |
+----------+--------+-------------+
| regular1 |      2 | registering | 
| sitngo2  |      3 | running     | 
| sitngo2  |      4 | registering | 
+----------+--------+-------------+
3 rows in set (0.00 sec)

mysql> select name,serial,tourney_serial from pokertables where tourney_serial != 0;
+----------+--------+----------------+
| name     | serial | tourney_serial |
+----------+--------+----------------+
| sitngo22 |     82 |              4 | 
| sitngo23 |     83 |              5 | 
+----------+--------+----------------+
2 rows in set (0.00 sec)


}}}

Fixed issues:
* playerSelf arrive should hide, visible seat
* playerSelf leave should show, hidden seat
http://upstream.jspoker.pokersource.info/rev/472dc370b15a
Remaining issues:
---* player leave should not show the seat if playerSelf is still seated---
http://upstream.jspoker.pokersource.info/rev/4ef77236b80d
instead of moving the slider to the clicked position
<script>alert()</script> is interpreted by all clients receiving the string
is s/<script>|</script>// enought ?
use .text() instead of .html()
{"players_quota":2,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":1227017147,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"complete","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":39,"description_short":"Sit and Go 2 players, Holdem","registered":1}
(12:42:21 PM) ckudige: I get an exception, but there is no stack trace (even with firebug running)
(12:46:05 PM) ckudige: so he is getting the exception even before he loads the table list or sits at a table ?
(12:46:10 PM) ckudige: (infact even before I can login)
(01:46:31 PM) ckudige: I got this : config.jpoker = { restURL : 'http://private.pokersource.eu/POKER_REST' };
(01:47:05 PM) ckudige: proppy: I also tried this - config.jpoker = { restURL : 'http://jspoker.pokersource.info/POKER_REST' };
(01:47:07 PM) ckudige: same error
(01:55:26 PM) ckudige: brb, debugging ...
{{{
 Object xhr=XMLHttpRequest status=parsererror
uncaught exception: [object Object]
[Break on this error] netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect");
}}}
{{{
(06:32:14 PM) worf|work: si jpoker.sound est vide false ... : pas de son (donc pas appeller ces lignes : $('#jpokerSound').html('<' + jpoker.sound + ' src=\'player_hand.swf\' />');)
(06:32:38 PM) worf|work: et une autre :)
(06:32:57 PM) worf|work: avoir une variable jpoker.sound_base_path
(06:33:15 PM) worf|work: afin que je puisse mettre dedans le domain + chemin vers nos serveurs statiques
(06:34:02 PM) worf|work: donc en gros :
(06:34:02 PM) worf|work: $('#jpokerSound').html('<' + jpoker.sound + ' src=\'' + jpoker.sound_base_path + 'player_hand.swf\' />');
}}}
for IE6 transparency sake
and add the script in the upstream
http://jpoker.aminche.com/hg/jpoker/rev/90a6b77b69f2
If running jpoker client locally from desktop, if a player is seated a table and refreshes, he is no longer logged in and the table is not displayed at all.
@@config.jpoker = { restURL : 'http://jspoker.pokersource.info/POKER_REST' }@@
@@firefox file:///usr/src/jpoker/jpoker/index.html@@
{{{
Response Headers
Date	Fri, 19 Sep 2008 14:30:24 GMT
Server	TwistedWeb/8.0.1
Content-Length	77
Content-Type	text/plain; charset="UTF-8"
Via	1.0 jspoker.pokersource.info, 1.1 jspoker.pokersource.info
Set-Cookie	TWISTED_SESSION_FC1B58ED71E7416A44AFEA6FC8BD0FC65C1C6F11=9784f544750cc5b33fa80ee76f1e7c76; Path=/
Keep-Alive	timeout=15, max=100
Connection	Keep-Alive
}}}
{{{
Request Headers
Host	jspoker.pokersource.info
User-Agent	Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062910 Iceweasel/3.0 (Debian-3.0~rc2-2)
Accept	application/json, text/javascript, */*
Accept-Language	en-us,en;q=0.5
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	300
Connection	keep-alive
Content-Type	application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With	XMLHttpRequest
Content-Length	47
}}}
{{{
Response Headers
Date	Fri, 19 Sep 2008 14:30:24 GMT
Server	TwistedWeb/8.0.1
Content-Length	13526
Content-Type	text/plain; charset="UTF-8"
Via	1.0 jspoker.pokersource.info, 1.1 jspoker.pokersource.info
Keep-Alive	timeout=15, max=99
Connection	Keep-Alive
}}}
{{{
Request Headers
Host	jspoker.pokersource.info
User-Agent	Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062910 Iceweasel/3.0 (Debian-3.0~rc2-2)
Accept	application/json, text/javascript, */*
Accept-Language	en-us,en;q=0.5
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	300
Connection	keep-alive
Content-Type	application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With	XMLHttpRequest
Content-Length	45
Cookie	TWISTED_SESSION_FC1B58ED71E7416A44AFEA6FC8BD0FC65C1C6F11=9784f544750cc5b33fa80ee76f1e7c76
}}}
@@log-in using plugin.login@@
{{{
Response Headers
Date	Fri, 19 Sep 2008 14:33:12 GMT
Server	TwistedWeb/8.0.1
Content-Length	2
Content-Type	text/plain; charset="UTF-8"
Via	1.0 jspoker.pokersource.info, 1.1 jspoker.pokersource.info
Keep-Alive	timeout=15, max=29
Connection	Keep-Alive
}}}
{{{
Request Headers
Host	jspoker.pokersource.info
User-Agent	Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062910 Iceweasel/3.0 (Debian-3.0~rc2-2)
Accept	application/json, text/javascript, */*
Accept-Language	en-us,en;q=0.5
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	300
Connection	keep-alive
Content-Type	application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With	XMLHttpRequest
Content-Length	40
Cookie	TWISTED_SESSION_FC1B58ED71E7416A44AFEA6FC8BD0FC65C1C6F11=9784f544750cc5b33fa80ee76f1e7c76
}}}
@@Ctrl-R to refresh browser window@@
{{{
Response Headers
Date	Fri, 19 Sep 2008 14:33:58 GMT
Server	TwistedWeb/8.0.1
Content-Length	77
Content-Type	text/plain; charset="UTF-8"
Via	1.0 jspoker.pokersource.info, 1.1 jspoker.pokersource.info
Keep-Alive	timeout=15, max=12
Connection	Keep-Alive
}}}
{{{
Request Headers
Host	jspoker.pokersource.info
User-Agent	Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9) Gecko/2008062910 Iceweasel/3.0 (Debian-3.0~rc2-2)
Accept	application/json, text/javascript, */*
Accept-Language	en-us,en;q=0.5
Accept-Encoding	gzip,deflate
Accept-Charset	ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive	300
Connection	keep-alive
Content-Type	application/x-www-form-urlencoded; charset=UTF-8
X-Requested-With	XMLHttpRequest
Content-Length	47
Cookie	TWISTED_SESSION_FC1B58ED71E7416A44AFEA6FC8BD0FC65C1C6F11=9784f544750cc5b33fa80ee76f1e7c76
}}}
@@user is not relogged@@
Dealer: bruno receives 120 (everyone else folded)
Dealer: bruno receives 120 (everyone else folded)

(16:17:10) worf|work: 	    subpacket.start_time = new Date(subpacket.start_time*1000).toLocaleString();
(16:17:11) worf|work:             if (link_pattern && subpacket.state != 'announced') {
(16:17:11) worf|work: 		var link = t.link.supplant({link: link_pattern.supplant({tourney_serial: subpacket.serial}), name: subpacket.description_short});
(16:17:11) worf|work: 		subpacket.description_short = link;
(16:17:12) worf|work: 	    }
Step to reproduce:
* Go to http://jspoker.pokersource.info/jpoker/
* Dismiss disclaimer
* Login
* Click here to get a seat
* Buy in
* Click to sit
* Refresh your browser
* Disclaimer featuring copyright information is shown again
* Dismiss disclaimer
* Buy in is shown with 0 for min/max/step
* Cancel buy in
* Buy in is shown again with accurate information
* Cancel buy in
* Play
http://jpoker.aminche.com/hg/jpoker/rev/94466b521e6b


http://jpoker.aminche.com/hg/jpoker/rev/cb655f1321c8
* show tourney start date in tourneyList in text readable format instead of number of seconds since 1970
using existing #winner div element
which is not used for now:
{{{
            for(var winner = 0; winner < 2; winner++) {
                $('#winner' + winner + id).hide();
            }
}}}

otherwise confusing
http://jpoker.aminche.com/hg/jpoker/rev/e1c4949a4803
http://jpoker.aminche.com/hg/jpoker/rev/d00f5925feb6
http://jpoker.aminche.com/hg/jpoker/rev/2f91a9a37a7c
the pot to which a player is entitled because he went all in is displayed next to the player
the server must send an additional packet with the appropriate information
http://www.perkiset.org/forum/ajax/xmlhttprequest_ie6_ssl_and_12030_error_what_is_the_solution-t442.0.html
suggests to set 
{{{
1. Only use POST if you're actually submitting FORM data (no data but still using POST upsets it, use GET if there's not data or only QUERY data to send).

2. When submitting FORM data, ensure there is no preceding '?' (e.g. ?P1=V1&P2=V2 is wrong, but P1=V1&P2=V2 is fine)

3. If POSTing data, set the HEADer of your request using the following:
    Content-Type: application/x-www-form-urlencoded    (This should also be set when using the GET method)
    Content-Length: (Length of FORM data)
    Content-Disposition: form-data; name="YourAppName"
}}}

My friend tried out jpoker with me.  He had a 1024x768 screen  but still had trouble that needed scrolling:

http://www.canonical.org/~paulv/images/jspoker.png
http://jspoker.pokersource.info/packaging-farm/jpoker/html/build/f8.out
filesystem upgrade needed to chmod /proc which is forbiden in a vserver. The f8 chroot was upgraded elsewhere to fix the issue.
http://jspoker.pokersource.info/jpoker/

test failed
{{{
jpoker module: jpoker.copyright (1, 0, 1)
Died on test #1: TypeError: Null value
}}}

test hang
{{{
jpoker.connection:sendPacket timeout
}}}

tiddlywiki failed
{{{
on  JpokerPlugin↓  3 KBonon  Yes  14ms  Error  Error: TypeError: Null value
}}}
featuredTable doesn't joinTable if PacketPokerTableSelect('my').length = 0 not to conflict with reconnection
however if jpoker.doReconnect = false, the player will not reconnect automaticaly to the table, and featuredTable will do nothing
In firebug, go to the Net tab and disable network monitoring.
go to options and de-activate "Show XML Errors". This is just a way to display errors that happens to show garbage on iceweasel 2.0.0.13 and firebug-1.05
http://jpoker.aminche.com/hg/jpoker/rev/70ae3f3f75a8
http://jpoker.aminche.com/hg/jpoker/rev/20e9144e06d2
http://jpoker.aminche.com/hg/jpoker/rev/6bf792d53bd8
http://jpoker.aminche.com/hg/jpoker/rev/412d62aac7c2
http://jpoker.aminche.com/hg/jpoker/rev/6c206d7c8168
http://jpoker.aminche.com/hg/jpoker/rev/61ef6e33bbad
http://jpoker.aminche.com/hg/jpoker/rev/bf5a814a2949
http://jpoker.aminche.com/hg/jpoker/rev/1e971b74ecad
http://svn.gna.org/viewcvs/pokersource?view=rev&rev=4523
(username > LOGIN > password > SIGN UP -- should be A > C > B > D)
http://jpoker.aminche.com/hg/jpoker/rev/c758ea855b63
http://jpoker.aminche.com/hg/jpoker/rev/e16ac0243898

should not be called if skin_url is defined
http://svn.gna.org/viewcvs/pokersource?rev=4763&view=rev

with or without proxy enabled
{{{
setState loging undefined
sendPacket {"type":"PacketLogin","name":"proppy11","password":""}
sendPacket {"type":"PacketPing"}
queueIncoming {"type":"PacketAuthOk","time__":1220092259612}
queueIncoming {"type":"PacketSerial","serial":4,"cookie":"","time__":1220092259617}
connection handle 0: {"type":"PacketAuthOk","time__":1220092259612}
server.handler {"type":"PacketAuthOk","uid__":"jpoker1220092250243"}
connection handle 0: {"type":"PacketSerial","serial":4,"cookie":"","time__":1220092259617}
server.handler {"type":"PacketSerial","serial":4,"cookie":"","uid__":"jpoker1220092250244"}
setState running login serial received
setState retrieving user info undefined
sendPacket {"type":"PacketPokerGetUserInfo","serial":4}
queueIncoming {"type":"PacketAuthRequest","time__":1220092260819}
connection handle 0: {"type":"PacketAuthRequest","time__":1220092260819}
server.handler {"type":"PacketAuthRequest","uid__":"jpoker1220092250245"}
}}}
{{{
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: handlePacketLogic(0): type = LOGIN(10) name = proppy11, password = 
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerService:  SELECT user2money.currency_serial,user2money.amount,user2money.points,CAST(SUM(user2table.bet) + SUM(user2table.money) AS UNSIGNED) AS in_game         FROM user2money LEFT JOIN (pokertables,user2table)         ON (user2table.user_serial = user2money.user_serial  AND             user2table.table_serial = pokertables.serial AND              user2money.currency_serial = pokertables.currency_serial)          WHERE user2money.user_serial = 4 GROUP BY user2money.currency_serial 
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerService: getUserInfo: type = POKER_USER_INFO(92) serial = 4 name = proppy11, password = , email = , rating = 1000, affiliate = 0, 1=5000000/0/0 
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: sendPacket(0): type = AUTH_OK(8)
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerExplain:explain: type = AUTH_OK(8)
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: sendPacket(4): type = SERIAL(6) serial = 4
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerExplain:explain: type = SERIAL(6) serial = 4
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: user proppy11/4 logged in
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: connection lost for proppy11/4
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerXMLSimplified: render 
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: connection lost for anonymous/0
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerXMLSimplified: render 
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: handlePacketLogic(0): type = POKER_GET_USER_INFO(93) serial = 4
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: sendPacket(0): type = AUTH_REQUEST(11)
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerExplain:explain: type = AUTH_REQUEST(11)
2008-08-30 10:30:59+0000 [HTTPChannel,790,127.0.0.1] PokerAvatar: connection lost for anonymous/0
}}}
{{{
2442 html.push(t.info.supplant({
2443 'registered' : _("{registered} players registered."),
2444 'players_quota' : _("{players_quota} players max.")
2445 }).supplant(packet.tourney)); 
}}}
instead we should call the gettext function _() directly on template before supplanting it
http://jspoker.pokersource.info/packaging-farm/jpoker/html/build/hardy.out
added build essential that was missing
http://jspoker.pokersource.info/upstream/
http://jpoker.aminche.com/hg/jpoker/rev/b4edd4639b62
* cash game table
{"observers":0,"name":"Cayrryns","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,@@"tourney_serial":0@@,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":40}
* tourney table
,{"observers":0,"name":"sitngo21","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"level-15-30-no-limit","currency_serial":0,"muck_timeout":5,"players":2,"waiting":0,@@"tourney_serial":2@@,"seats":2,"player_timeout":60,"type":"PacketPokerTable","id":41}
http://jpoker.aminche.com/hg/jpoker/rev/a67cabc3868d
see jpoker_42_sitngoTourneyList
if seat is much larger than avatar it is confusing
broken as a side effect of the logic change in JoinTable
* due to recent auth mecanism changes
* timeout 
* sit back
* other players see the player as being sit-out although it is sit
(11:40:33 AM) rikeko: proppy: did dachary telle you about my little "problem" with the markup of the dealer history ?
(11:40:58 AM) rikeko: <div class="jpoker_chat_line">
(11:40:59 AM) rikeko: <span class="jpoker_chat_prefix"/>
(11:40:59 AM) rikeko: <span class="jpoker_chat_message">Dealer: dealing</span>
(11:40:59 AM) rikeko: </div>
(11:41:19 AM) rikeko: proppy: why is the word "dealer" not in jpoker_chat_prefix ?
(11:41:41 AM) rikeko: proppy: on the chat side, the names of the chatters are in jpoker_chat_prefix
(11:41:52 AM) rikeko: proppy: which allows to style them differently
(11:42:08 AM) rikeko: proppy: and which makes the whole thing more readable
(11:43:20 AM) rikeko: ok, thank you
(11:44:01 AM) rikeko: proppy: the chat history looks like this :
(11:44:01 AM) rikeko: <div class="jpoker_chat_line">
(11:44:01 AM) rikeko: <span class="jpoker_chat_prefix">myself: </span>
(11:44:01 AM) rikeko: <span class="jpoker_chat_message">Message one</span>
(11:44:02 AM) rikeko: </div>



{{{
root@kun:/usr/src/jpoker-letspok/jpoker/css/images/jpoker_table# ls -1 | grep '\-on'
button-buyIn-on.png
button-call-on.png
button-check-on.png
button-dismiss-on.png
button-download_jpoker_sources-on.png
button-exit-on.png
button-fold-on.png
button-go_back_to_the_tournaments_page-on.png
button-homme-connect-on.png
button-invite-friends-on.png
button-join-monthly-on.png
button-main-on.png
button-raise-on.png
button-rebuy-on.png
button-Redeem-points-for-prizes-on.png
button-send_contact-on.png
button-visit_the_sponsors_website-on.png
header-button_contact-on.png
header-button_help-on.png
header-button_invite-on.png
header-button_myaccount-on.png
header-button_myresults-on.png
header-button_points-on.png
sit-in-on.png
sit-out-on.png
}}}
because of:
cursor.execute("SELECT user2tourney.tourney_serial FROM user2tourney,tourneys WHERE user2tourney.user_serial = %s AND user2tourney.tourney_serial = tourneys.serial AND tourneys.state = 'registering'", serial)
https://gna.org/bugs/?12480


05:56:04 PM) proppy: dachary: is there 9 pots or 10 pots max for a 10 players tables ?
(05:56:14 PM) dachary: proppy: 9
(05:56:37 PM) Tamisoft left the room (quit: "Leaving.").
(05:56:37 PM) dachary: there must be at least 2 players competing over a pot
(05:56:42 PM) proppy:                 this.pots = [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ];
(05:57:00 PM) dachary: it's a mistake
(05:57:06 PM) dachary: there can't be 10 pots
(05:57:10 PM) proppy: Firebug's log limit has been reached. %S entries not shown.Preferences&nbsp;>>>  [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ].length10
(05:57:27 PM) dachary: that would mean 1 player has one pot and no opponent



Some cases display player level, some don't
should be converted to string using exception.message before calling jpoker.error
http://jpoker.aminche.com/hg/jpoker/rev/0322f3714d03
http://jpoker.aminche.com/hg/jpoker/rev/245aabe5fddd
http://jpoker.aminche.com/hg/jpoker/rev/69e3d92ba3ae
http://jpoker.aminche.com/hg/jpoker/rev/02635d973c17'
http://jpoker.aminche.com/hg/jpoker/rev/e2b6ecacf5df


* use user.serial in the hash
** use preferences only when logged
http://jpoker.aminche.com/hg/jpoker/rev/bec7af0ffcc8

http://jpoker.aminche.com/hg/jpoker/rev/7299069e2757

on initiailization gettext is not available


"Login" for example can have different meaning in french, given it's used as a Noun or a Verb.
See:
http://www.gnu.org/software/gettext/manual/gettext.html#Contexts
http://groups.google.com/group/jquery-ui/browse_thread/thread/ea61238c34cb5f33
http://ui.jquery.com/bugs/ticket/3231
http://jpoker.aminche.com/jquery-ui-dialog-test/test.html
for raise/fold/check etc.
not necessary, use reconnectFinish instead
http://jpoker.aminche.com/hg/jpoker/rev/1cbdd3509d63


http://jspoker.pokersource.info/packaging-farm/jpoker/html/build/lenny.out
added build-essentials that was missing
keep show tableDetails on click
add join table on a separate link
http://jspoker.pokersource.info/tests/test-jpoker.html?jpoker module%3A jpoker.plugins.tourneyDetails templates regular registering
strange because date.toLocaleString is used

The login box should not allow input until it is ready to accept the input. Currently I start typing my login
   and a few seconds later, it resets and clears what I typed. I hate it when this happens :)
   (Both IE and FF) 
Loic Dachary mailto:loic@dachary.org
* (11:32:34 AM) dachary: proppy: for some reason the japanese l10n files are always updated when running make all (the french are not)
** proppy: can't reproduce it
{{{
jpoker:/usr/src/jpoker-japan-bug# make all
python test-svg2html.py
...
----------------------------------------------------------------------
Ran 3 tests in 0.130s

OK
python test-svgflatten.py
.
----------------------------------------------------------------------
Ran 1 test in 0.054s

OK
rm -fr tests ; jscoverage jpoker tests
cd tests ; x-www-browser jscoverage.html?test-jpoker.html # replace with jaxer when http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=474050 closed
/bin/sh: x-www-browser: command not found
make: [check] Error 127 (ignored)
cd jpoker ; x-www-browser index.html
/bin/sh: x-www-browser: command not found
make: [all] Error 127 (ignored)
jpoker:/usr/src/jpoker-japan-bug# make i18n
make: Nothing to be done for `i18n'.
}}}
http://jpoker.aminche.com/hg/jpoker/rev/c9290c875567


http://jpoker.aminche.com/hg/jpoker/rev/1508cc26c45f
setLocale need only be called when rejoining a table because it only translates the dealer messages


http://jspoker.pokersource.info/jpoker/ show multiple sng in registering state. Probably a cleanup bug.
The problem is probably still here (server log) but the HOWTO reproduce the bug does not allow to reproduce it at the present time (nov 15 2008).
* run a 4 players sng with seats_per_game = 2
* table 1 breaks
* player go to another table
* the http://jspoker.pokersource.info/bug00.txt occurs
* the associated server log is  http://jspoker.pokersource.info/bug00-server.txt
to differentiate from 'click here to sit out' label

because the server does not implement a lang=xx message to change locale
shows on the seconds hand
fixed by bug fixing the later tourney arrival problem 
click on table four
click on seat 2
buyin
reload
goes back to index.php

There should be a way to disable the call to rejoin() in the reconnect() function for multitable poker sites.
(08:53:49 PM) saqimtiaz1: proppy: onclick in chat field, the text should be cleared
http://upstream.jspoker.pokersource.info/rev/37c073abc3fe
http://jpoker.aminche.com/hg/jpoker/rev/29f8b5a4e7d0
- needs a reset of margins and paddings => not possible, unless there is a surrounding DIV.
- font sizes could be in EM so when you want to change, you only change the base size => needs a surrounding div
- a:link and a:visited are not necessary, as they both are supposed to look the same => ok
- seat backgrounds, seat names, avatars are too verbose
- jpoker_player_rank is not very visible, it should be redesigned
- muck and show button overlay each other
- .jpoker_table .jpoker_ptable_sound_control needs cursor: pointer.
- all the buttons on the table should be designed via de A element, not the parenting div for userfriendliness



to avoid the display of a semi empty page when quitting the table
Given a player name, the server returns the list of tables where this player sits. A search box allows to enter the name of the user. If the user is not found an error is returned. If the player is not sit anywhere.
*  poker-network packets to query & get the result

by rank when completed
by money when running
by name otherwise
did not show in recent versions
----
{{{
sendPacket {"type":"PacketPokerTableSelect","string":""}
sendPacket {"type":"PacketPokerTableSelect","string":""}
server.handler {"players":4,"type":"PacketPokerTableList","packets":[{"observers":0,"name":"One","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":4,"waiting":0,"skin":"default","id":100,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Two","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":101,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Three","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":102,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Four","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":103,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Antigua","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":104,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cairo","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":105,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Mont","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":106,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Nancy","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":107,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Corail","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":108,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Legend","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":109,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Chip","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":110,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Relax","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":111,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Speed","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":112,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Un","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":113,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Deux","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":114,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Trois","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":115,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Quatre","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":116,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Five","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":117,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Six","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":118,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Seven","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":119,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Eight","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":120,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Nine","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":121,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Ten","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":122,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Eleven","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":123,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Twelve","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":124,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Thirty","percent_flop":0,"average_pot":0,"seats":8,"variant":"7stud","hands_per_hour":0,"betting_structure":"ante-10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":125,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Fourty","percent_flop":0,"average_pot":0,"seats":8,"variant":"7stud","hands_per_hour":0,"betting_structure":"ante-5-10-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":126,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Lyearnys","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".02-.04-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":127,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Ingwskel","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".05-.10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":128,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cerrt","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".10-.25-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":129,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Therrd","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".25-.50-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":130,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Issgar","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".50-1-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":131,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Torray","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"1-2-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":132,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Uskeluina","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":133,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Oilde","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"3-6-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":134,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cheper","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"5-10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":135,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Syfar","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":136,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Rhoine","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"30-60-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":137,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Mosolor","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"50-100-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":138,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cayrryns","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":139,"type":"PacketPokerTable","player_timeout":60}],"tables":40}
server.handler {"players":4,"type":"PacketPokerTableList","packets":[{"observers":0,"name":"One","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":4,"waiting":0,"skin":"default","id":100,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Two","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":101,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Three","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":102,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Four","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":103,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Antigua","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":104,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cairo","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":105,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Mont","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":106,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Nancy","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":107,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Corail","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":108,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Legend","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":109,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Chip","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":110,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Relax","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":111,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Speed","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":112,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Un","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":113,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Deux","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":114,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Trois","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":115,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Quatre","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":116,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Five","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":117,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Six","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":118,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Seven","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":119,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Eight","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":120,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Nine","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":121,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Ten","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":122,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Eleven","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":123,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Twelve","percent_flop":0,"average_pot":0,"seats":10,"variant":"omaha8","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":124,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Thirty","percent_flop":0,"average_pot":0,"seats":8,"variant":"7stud","hands_per_hour":0,"betting_structure":"ante-10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":125,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Fourty","percent_flop":0,"average_pot":0,"seats":8,"variant":"7stud","hands_per_hour":0,"betting_structure":"ante-5-10-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":126,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Lyearnys","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".02-.04-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":127,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Ingwskel","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".05-.10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":128,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cerrt","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".10-.25-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":129,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Therrd","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".25-.50-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":130,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Issgar","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":".50-1-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":131,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Torray","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"1-2-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":132,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Uskeluina","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":133,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Oilde","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"3-6-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":134,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cheper","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"5-10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":135,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Syfar","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":136,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Rhoine","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"30-60-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":137,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Mosolor","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"50-100-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":138,"type":"PacketPokerTable","player_timeout":60},{"observers":0,"name":"Cayrryns","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"skin":"default","id":139,"type":"PacketPokerTable","player_timeout":60}],"tables":40}
sendPacket {"type":"PacketPokerExplain","value":255}
sendPacket {"type":"PacketPokerTableJoin","game_id":100}
sendPacket {"type":"PacketPing"}
server.handler {"type":"PacketAck"}
server.handler {"observers":0,"name":"One","percent_flop":0,"average_pot":0,"seats":10,"variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":4,"waiting":0,"skin":"default","id":100,"type":"PacketPokerTable","player_timeout":60}
table.handler {"game_id":100,"message":"Dealer: HOTdirj8 pays 2 blind\n","cookie":"","serial":0,"type":"PacketPokerChat"}
table.handler {"game_id":100,"serial":0,"cookie":"6849644234f90c338ff68246a0018ed1","type":"PacketPokerBatchMode"}
server.handler {"count":1,"game_ids":[100],"length":9,"type":"PacketPokerCurrentGames"}
table.handler {"game_id":100,"message":"Dealer: pre-flop, 2 players\n","cookie":"","serial":0,"type":"PacketPokerChat"}
table.handler {"blind":"late","buy_in_payed":false,"auto_blind_ante":true,"name":"HOTkanzuwigsI","url":"random","auto":false,"seat":3,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":48,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
player.handler {"blind":"late","buy_in_payed":false,"auto_blind_ante":true,"name":"HOTkanzuwigsI","url":"random","auto":false,"seat":3,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":48,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
table.handler {"game_id":100,"type":"PacketPokerSeats","seats":[0,0,0,48,0,0,0,0,0,0]}
table.handler {"money":1000,"cookie":"","game_id":100,"serial":48,"type":"PacketPokerPlayerChips","bet":0}
player.handler {"money":1000,"cookie":"","game_id":100,"serial":48,"type":"PacketPokerPlayerChips","bet":0}
table.handler {"game_id":100,"serial":48,"cookie":"","type":"PacketPokerSit"}
player.handler {"game_id":100,"serial":48,"cookie":"","type":"PacketPokerSit"}
table.handler {"blind":true,"buy_in_payed":false,"auto_blind_ante":true,"name":"HOTdirj8","url":"random","auto":false,"seat":0,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":45,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
player.handler {"blind":true,"buy_in_payed":false,"auto_blind_ante":true,"name":"HOTdirj8","url":"random","auto":false,"seat":0,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":45,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
table.handler {"game_id":100,"type":"PacketPokerSeats","seats":[45,0,0,48,0,0,0,0,0,0]}
table.handler {"blind":true,"buy_in_payed":false,"auto_blind_ante":true,"name":"HOThadji","url":"random","auto":false,"seat":1,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":46,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
player.handler {"blind":true,"buy_in_payed":false,"auto_blind_ante":true,"name":"HOThadji","url":"random","auto":false,"seat":1,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":46,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
table.handler {"game_id":100,"type":"PacketPokerSeats","seats":[45,46,0,48,0,0,0,0,0,0]}
table.handler {"blind":"late","buy_in_payed":false,"auto_blind_ante":true,"name":"HOThocoyzut9","url":"random","auto":false,"seat":2,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":47,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
player.handler {"blind":"late","buy_in_payed":false,"auto_blind_ante":true,"name":"HOThocoyzut9","url":"random","auto":false,"seat":2,"outfit":"random","cookie":"","sit_out_next_turn":false,"sit_out":false,"game_id":100,"serial":47,"wait_for":false,"type":"PacketPokerPlayerArrive","remove_next_turn":false}
table.handler {"game_id":100,"type":"PacketPokerSeats","seats":[45,46,47,48,0,0,0,0,0,0]}
table.handler {"money":1000,"cookie":"","game_id":100,"serial":47,"type":"PacketPokerPlayerChips","bet":0}
player.handler {"money":1000,"cookie":"","game_id":100,"serial":47,"type":"PacketPokerPlayerChips","bet":0}
table.handler {"game_id":100,"serial":47,"cookie":"","type":"PacketPokerSit"}
player.handler {"game_id":100,"serial":47,"cookie":"","type":"PacketPokerSit"}
table.handler {"money":1000,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":0}
player.handler {"money":1000,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":0}
table.handler {"money":1000,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":0}
player.handler {"money":1000,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":0}
table.handler {"players":[45,46],"serial":0,"cookie":"","type":"PacketPokerInGame","game_id":100}
}}}
<<<
{{{
player has no properties
update(Object observers=0 name=One percent_flop=88 average_pot=980, Object game_id=100 serial=45 type=PacketPokerPosition, "jpoker1210101261837")jquery.jpoker.js (line 1511)
wrapper(Object observers=0 name=One percent_flop=88 average_pot=980, Object game_id=100 serial=45 type=PacketPokerPosition)jquery.jpoker.js (line 393)
notify("update", Object game_id=100 serial=45 type=PacketPokerPosition)jquery.jpoker.js (line 380)
notifyUpdate(Object game_id=100 serial=45 type=PacketPokerPosition)jquery.jpoker.js (line 387)
handler(Object mode=queue url=http://127.0.0.1/REST async=true, "100", Object game_id=100 serial=45 type=PacketPokerPosition)jquery.jpoker.js (line 1018)
(no name)(function(), 0)jquery.jpoker.js (line 550)
grep([function()], function(), undefined)jquery.js (line 1187)
handle("100", Object game_id=100 serial=45 type=PacketPokerPosition)jquery.jpoker.js (line 548)
dequeueIncoming()jquery.jpoker.js (line 685)
(no name)()jquery.jpoker.js (line 716)
[Break on this error] if(packet.serial > 0 && player.sit === true && player.seat =...
jquery.jpoker.js (line 1511)
}}}
<<<
{{{
table.handler {"game_id":100,"serial":48,"cookie":"","type":"PacketPokerSitOut"}
player.handler {"game_id":100,"serial":48,"cookie":"","type":"PacketPokerSitOut"}
table.handler {"game_id":100,"serial":45,"cookie":"","type":"PacketPokerSit"}
player.handler {"game_id":100,"serial":45,"cookie":"","type":"PacketPokerSit"}
table.handler {"game_id":100,"serial":46,"cookie":"","type":"PacketPokerSit"}
player.handler {"game_id":100,"serial":46,"cookie":"","type":"PacketPokerSit"}
table.handler {"game_id":100,"serial":47,"cookie":"","type":"PacketPokerSitOut"}
player.handler {"game_id":100,"serial":47,"cookie":"","type":"PacketPokerSitOut"}
table.handler {"game_id":100,"type":"PacketPokerDealer","dealer":0,"previous_dealer":-1}
table.handler {"hand_serial":19,"cookie":"","hands_count":0,"level":0,"game_id":100,"serial":0,"time":0,"type":"PacketPokerStart"}
table.handler {"cards":[],"game_id":100,"serial":0,"cookie":"","type":"PacketPokerBoardCards"}
table.handler {"money":1000,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":0}
player.handler {"money":1000,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":0}
table.handler {"money":1000,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":0}
player.handler {"money":1000,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":0}
table.handler {"type":"PacketPokerChipsPotReset","length":11,"cookie":"","serial":0,"game_id":100}
table.handler {"game_id":100,"serial":45,"type":"PacketPokerPosition","position":0}
player.handler {"game_id":100,"serial":45,"type":"PacketPokerPosition","position":0}
table.handler {"game_id":100,"serial":46,"type":"PacketPokerPosition","position":1}
player.handler {"game_id":100,"serial":46,"type":"PacketPokerPosition","position":1}
table.handler {"dead":0,"amount":100,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerBlind"}
player.handler {"dead":0,"amount":100,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerBlind"}
table.handler {"chips":[100,1],"length":15,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerChipsPlayer2Bet"}
player.handler {"chips":[100,1],"length":15,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerChipsPlayer2Bet"}
table.handler {"money":900,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":100}
player.handler {"money":900,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":100}
table.handler {"game_id":100,"serial":45,"type":"PacketPokerPosition","position":0}
player.handler {"game_id":100,"serial":45,"type":"PacketPokerPosition","position":0}
table.handler {"dead":0,"amount":200,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerBlind"}
player.handler {"dead":0,"amount":200,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerBlind"}
table.handler {"chips":[100,2],"length":15,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerChipsPlayer2Bet"}
player.handler {"chips":[100,2],"length":15,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerChipsPlayer2Bet"}
table.handler {"money":800,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":200}
player.handler {"money":800,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":200}
table.handler {"cards":[255,255],"game_id":100,"serial":45,"cookie":"","type":"PacketPokerPlayerCards"}
player.handler {"cards":[255,255],"game_id":100,"serial":45,"cookie":"","type":"PacketPokerPlayerCards"}
table.handler {"cards":[255,255],"game_id":100,"serial":46,"cookie":"","type":"PacketPokerPlayerCards"}
player.handler {"cards":[255,255],"game_id":100,"serial":46,"cookie":"","type":"PacketPokerPlayerCards"}
table.handler {"game_id":100,"serial":0,"cookie":"","string":"pre-flop","type":"PacketPokerState"}
table.handler {"serials":[45,46],"length":21,"numberOfCards":2,"cookie":"","game_id":100,"serial":0,"type":"PacketPokerDealCards"}
table.handler {"cards":[255,255],"game_id":100,"serial":45,"cookie":"","type":"PacketPokerPlayerCards"}
player.handler {"cards":[255,255],"game_id":100,"serial":45,"cookie":"","type":"PacketPokerPlayerCards"}
table.handler {"cards":[255,255],"game_id":100,"serial":46,"cookie":"","type":"PacketPokerPlayerCards"}
player.handler {"cards":[255,255],"game_id":100,"serial":46,"cookie":"","type":"PacketPokerPlayerCards"}
table.handler {"type":"PacketPokerBeginRound","length":11,"cookie":"","serial":0,"game_id":100}
sendPacket {"type":"PacketPing"}
table.handler {"game_id":100,"serial":46,"type":"PacketPokerPosition","position":1}
player.handler {"game_id":100,"serial":46,"type":"PacketPokerPosition","position":1}
table.handler {"game_id":100,"serial":0,"cookie":"","type":"PacketPokerStreamMode"}
sendPacket {"type":"PacketPing"}
table.handler {"game_id":100,"message":"Dealer: HOTdirj8 raises 4\n","cookie":"","serial":0,"type":"PacketPokerChat"}
table.handler {"game_id":100,"amount":400,"cookie":"6849644234f90c338ff68246a0018ed1","serial":45,"type":"PacketPokerRaise"}
player.handler {"game_id":100,"amount":400,"cookie":"6849644234f90c338ff68246a0018ed1","serial":45,"type":"PacketPokerRaise"}
table.handler {"type":"PacketPokerHighestBetIncrease","length":11,"cookie":"","serial":0,"game_id":100}
table.handler {"chips":[100,4],"length":15,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerChipsPlayer2Bet"}
player.handler {"chips":[100,4],"length":15,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerChipsPlayer2Bet"}
table.handler {"money":400,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":600}
player.handler {"money":400,"cookie":"","game_id":100,"serial":45,"type":"PacketPokerPlayerChips","bet":600}
table.handler {"game_id":100,"serial":46,"type":"PacketPokerPosition","position":1}
player.handler {"game_id":100,"serial":46,"type":"PacketPokerPosition","position":1}
sendPacket {"type":"PacketPing"}
sendPacket {"type":"PacketPing"}
table.handler {"game_id":100,"message":"Dealer: HOThadji raises 4\n","cookie":"","serial":0,"type":"PacketPokerChat"}
table.handler {"game_id":100,"amount":400,"cookie":"6849644234f90c338ff68246a0018ed1","serial":46,"type":"PacketPokerRaise"}
player.handler {"game_id":100,"amount":400,"cookie":"6849644234f90c338ff68246a0018ed1","serial":46,"type":"PacketPokerRaise"}
table.handler {"type":"PacketPokerHighestBetIncrease","length":11,"cookie":"","serial":0,"game_id":100}
table.handler {"chips":[100,4],"length":15,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerChipsPlayer2Bet"}
player.handler {"chips":[100,4],"length":15,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerChipsPlayer2Bet"}
table.handler {"money":200,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":800}
player.handler {"money":200,"cookie":"","game_id":100,"serial":46,"type":"PacketPokerPlayerChips","bet":800}
table.handler {"game_id":100,"serial":45,"type":"PacketPokerPosition","position":0}
player.handler {"game_id":100,"serial":45,"type":"PacketPokerPosition","position":0}
}}}
* the server must implement a GetRank and Rank packets that return the rank and level of a given player
** the GetRank packet specifies the serial and the currency_serial for which the rank and level must be retrieved
** the server will answer with PacketPokerStats which will include "rank" and "level", which will be sent after PacketPokerPlayerArrive
* the client must query the server and display the information and create a CSS tag based on the level (to display stars for instance)
* the activation of the rank display and query in the client must be configurable
!Server Implementation
!!Commits of interest
!Commits of interest
* userstats.py
** [[r4455|http://svn.gna.org/viewcvs/pokersource?rev=4455&view=rev]]
** [[r4456|http://svn.gna.org/viewcvs/pokersource?rev=4456&view=rev]]
** [[r4457|http://svn.gna.org/viewcvs/pokersource?rev=4457&view=rev]]
** [[r4458|http://svn.gna.org/viewcvs/pokersource?rev=4458&view=rev]]
** [[r4477|http://svn.gna.org/viewcvs/pokersource?rev=4477&view=rev]]
** [[r4480|http://svn.gna.org/viewcvs/pokersource?rev=4480&view=rev]]
** [[r4484|http://svn.gna.org/viewcvs/pokersource?rev=4484&view=rev]]
** [[r4488|http://svn.gna.org/viewcvs/pokersource?rev=4488&view=rev]]
** [[r4490|http://svn.gna.org/viewcvs/pokersource?rev=4490&view=rev]]
* pokerpackets.py
** [[r4478|http://svn.gna.org/viewcvs/pokersource?rev=4478&view=rev]]
** [[r4479|http://svn.gna.org/viewcvs/pokersource?rev=4479&view=rev]]
* pokerservice.py
** [[r4485|http://svn.gna.org/viewcvs/pokersource?rev=4485&view=rev]]
** [[r4487|http://svn.gna.org/viewcvs/pokersource?rev=4487&view=rev]]
** [[r4490|http://svn.gna.org/viewcvs/pokersource?rev=4490&view=rev]]
* pokertable.py, pokeravatar.py
** [[r4489|http://svn.gna.org/viewcvs/pokersource?rev=4489&view=rev]]
** [[r4490|http://svn.gna.org/viewcvs/pokersource?rev=4490&view=rev]]
!!IRC Conversations
* [[proppy and bkuhn discuss the contents of the PacketPokerStats packet and when it should be sent, starting at 14:44:37|http://pokersource.info/irc/pokersource@irc.freenode.net/2008-09-10.html]]
* [[dachary and bkuhn discuss at 22:52:56 the way the packets should work|http://pokersource.info/irc/pokersource@irc.freenode.net/2008-09-13.html]]
* [[dachary and bkuhn discuss handling of missing rank table at 21:27:15|http://pokersource.info/irc/pokersource@irc.freenode.net/2008-09-14.html]]
!!Server Work Status
Basics of UserStats objects worked out and implementation nearly complete.
!!Server Work Todo
This is basically done on the server side.  PacketPokerPlayerStats is sent
after PacketPokerPlayerArrive.  A few things remain:
* look at pokerclient.py -- should it do the same?
* PacketPokerStatsSupported and PacketPokerGetStatsSupported, and do we need a PacketPokerPlayerGetStats?
!!Server Next Job (bkuhn)
[[two tabs open on the same game : packets get distributed to both and its a mess]]
with current jpoker.dialog as default implementation



http://svn.gna.org/viewcvs/pokersource?rev=4934&view=rev
http://svn.gna.org/viewcvs/pokersource?rev=4520&view=rev
{{{
if(server === undefined) {
  return;
}
}}}

ajouter des balises <col id="" /> 
pour pouvoir aligner les textes 
des colonnes comme on veut
 et même les faire disparaitre
 (y a une petite astuce pour 
que ça marche dans ff et ie, voir : 
http://skyrock.com/search/songs/?q=toto)
make room in the poker table for a powered by
Most poker sites have preaction boxes, so you can plan to fold before the action gets to you, etc.  jspoker should have the same.
poker-engine now has the following locales. translations for jpoker will be added soon. prepare jpoker so that it has all the necessary files, including tw for each language. Figure out a way to deal with variations of the same language (see fr_FX). bkuhn will work on it later today, the primary goal is to make it as easy as possible for him to run the tool he committed to poker-network yesterday. It means that the tw for each language should be commited separately, as if a different task.

/usr/share/locale/fr_FX/LC_MESSAGES/poker-engine.mo
/usr/share/locale/en_CA/LC_MESSAGES/poker-engine.mo
/usr/share/locale/sv/LC_MESSAGES/poker-engine.mo
/usr/share/locale/en_US/LC_MESSAGES/poker-engine.mo
/usr/share/locale/da/LC_MESSAGES/poker-engine.mo
/usr/share/locale/en/LC_MESSAGES/poker-engine.mo
/usr/share/locale/fr/LC_MESSAGES/poker-engine.mo
/usr/share/locale/fr_BE/LC_MESSAGES/poker-engine.mo
/usr/share/locale/nl/LC_MESSAGES/poker-engine.mo
/usr/share/locale/pt/LC_MESSAGES/poker-engine.mo
/usr/share/locale/de/LC_MESSAGES/poker-engine.mo
/usr/share/locale/fi/LC_MESSAGES/poker-engine.mo
/usr/share/locale/nb/LC_MESSAGES/poker-engine.mo
/usr/share/locale/es/LC_MESSAGES/poker-engine.mo
/usr/share/locale/fr_CA/LC_MESSAGES/poker-engine.mo
/usr/share/locale/it/LC_MESSAGES/poker-engine.mo

TW 2.3 translations are here: http://trac.tiddlywiki.org/wiki/Translations
sv: http://www.vizway.se/TiddlyWiki/v230_svenska.html
nl: http://www.trooijen.dds.nl/TW/
de: http://www.karadeniz.de/tiddlywiki/
it: http://pollio.maurizio.googlepages.com/MiniGuidaTiddlyWiki.html

https://gna.org/support/index.php?2177

the piece of code that prevents cycling, probably because value cannot be an index (reported with IE7 on vista)
Johan Euphrosine mailto:proppy@aminche.com
when the quit callback is called as a result of a TableMove and TableDestroy, make it so it receives the packet that triggered the call, using the uninit arguments
if the quit button in the table is clicked when the server is in a non running state, it will destroy the table, the packets won't be handled and the server will never go back to running state, blocking all other interactions
the timer shows on the wrong player, probably because of a race condition where the user serial is incorrect and therefore the calculated seat is incorrect. This was seen a while ago and will only show when playing with 4 or 5 players.

* type 1.1 in the box
* see that another amount is taken in account
the bet button always says 'raise' when it is checked to.  It should say bet if there is no bet yet.
in the case where the raise is just a symbol, not the text "raise"
this is a disgrace, do something !
----
the state was not updated
(06:20:35 PM) bkuhn: when you get TourneyRank, you know you are now an observer.
(06:20:52 PM) bkuhn: and when the table gets destroyed, send them to the lobby.
(06:21:23 PM) bkuhn: On most sites I've seen.
(06:21:29 PM) bkuhn: it goes this way:
(06:21:30 PM) bkuhn: (a) you bust
(06:21:36 PM) bkuhn: (b) it leaves the table you were playing at
(06:21:47 PM) bkuhn: ... until that table is destroyed
* call a table.callback
* with default implementation: show tourneyDetails
** in order to redirect the player to tourneyDetails from tableDestroy we need to figure out which tourney belonged the table to
{{{
bkuhn: I am becoming convinced that adding tourney_serial to PacketPokerTable is maybe ok.
}}}
implement strategies to only issue a ping/poll packet when needed in jpoker
* do not poll for tournament when table is joined
** how do we know a table belong ot a tourney when receiving PacketPokerTable ?
* do not poll for finished tournament
@@the rationale for turning this feature into a RC bug is that the noise makes it very difficult to analyze bugs@@
{{{
create()()jquery.jpoker.js (line 2301)
(?)()()jquery.jpoker.js (line 2290)
each()()jquery-1.2.6.js (line 745)
each()()jquery-1.2.6.js (line 138)
table()()jquery.jpoker.js (line 2281)
jpoker()()jquery.jpoker.js (line 39)
(?)()index.html (line 3247)
invokeMacro(div.viewer, "jpokerTable", "'/REST' 100 'One'", Object source=<<jpokerTable '/REST' 100 'One'>>, Object title= Table One)index.html (line 3271)
handler()(Object source=<<jpokerTable '/REST' 100 'One'>>)index.html (line 3751)
subWikifyUnterm()(div.viewer)index.html (line 4110)
wikify("<<jpokerTable '/REST' 100 'One'>>", div.viewer, null, Object title= Table One)index.html (line 4013)
handler()(div.viewer, "view", ["text", "wikified"], null, "text wikified", Object title= Table One)index.html (line 4496)
invokeMacro(div.viewer, "view", "text wikified", null, Object title= Table One)index.html (line 3271)
applyHtmlMacros(div#tiddler Table One.tiddler, Object title= Table One)index.html (line 7665)
refreshTiddler()(" Table One", "PublicViewTemplate", false, undefined, null)index.html (line 6276)
getPluginInfo()index.html (line 3227)
createTiddler()(div#tiddlerDisplay, null, " Table One", 1, undefined)index.html (line 6184)
displayTiddler()(null, " Table One", 1, undefined, undefined, undefined, undefined)index.html (line 6138)
invokeParamifier()index.html (line 3337)
getPluginInfo()index.html (line 3232)
handler()(Object playersCount=1 tablesCount=40 mode=queue url=/REST, "0", Object observers=0 name=One percent_flop=0 average_pot=0)jquery.jpoker.js (line 912)
wrapper()()jquery.jpoker.js (line 452)
notify()("0", Object observers=0 name=One percent_flop=0 average_pot=0)jquery.jpoker.js (line 423)
handle()("0", Object observers=0 name=One percent_flop=0 average_pot=0)jquery.jpoker.js (line 637)
dequeueIncoming()()jquery.jpoker.js (line 774)
(?)()()jquery.jpoker.js (line 750)
}}}
{{{
create()()jquery.jpoker.js (line 2301)
reinit()()jquery.jpoker.js (line 2481)
wrapper()()jquery.jpoker.js (line 452)
notify()()jquery.jpoker.js (line 423)
notifyReinit()()jquery.jpoker.js (line 438)
reinit()()jquery.jpoker.js (line 1361)
handler()()jquery.jpoker.js (line 906)
wrapper()()jquery.jpoker.js (line 452)
notify()()jquery.jpoker.js (line 423)
handle()()jquery.jpoker.js (line 637)
dequeueIncoming()()jquery.jpoker.js (line 774)
(?)()()jquery.jpoker.js (line 750)
}}}
this make html and stylesheet hard to debug using firebug

maybe using a javascript templates system could help
* http://beebole.com/pure/
* http://embeddedjs.com/
http://jpoker.aminche.com/hg/jpoker/rev/2446e0f90789

because changing the type of a field is not supported in IE
jpokerSound player_arrive get called twice
only happen when refreshing
http://jpoker.aminche.com/hg/jpoker/rev/d86fe0ee481a

http://jpoker.aminche.com/hg/jpoker/rev/978e01a50f12
http://jpoker.aminche.com/hg/jpoker/rev/dff02e4583b5
everything CSS
http://jpoker.aminche.com/hg/jpoker/rev/8999eb9cf061
http://jpoker.aminche.com/hg/jpoker/rev/153e23e5580f
(16:10:57) dachary: 		this.tourney_rank = undefined;
(16:11:01) dachary: should be
(16:11:07) dachary: 		this.tourneyRank = undefined;
(16:11:19) dachary: it's inconsistent with the naming conventions
(16:11:20) dachary: :-)
run http://jspoker.pokersource.info/skin/test-jpoker.html on safari 3.1.2 and see the "has next page" test fail
may be due to a race condition, with closure variable and async ajax call
Saq Imtiaz mailto:lewcid@gmail.com
http://proppy.aminche.com/muck.png
As of r4379, poker-network can send localized strings to "dumb" clients so that explain packet messages come across in the correct language.

jpoker should test out this feature.  Send the PokerPacketSetLocale with locale = "fr_FR.UTF-8" as a good test case.  See [[the earthquake locale change feature change area|http://pokersource.info/developers/specifications/earthquake.html#%5B%5Blocale%20change%5D%5D]] for more information.
. tourney do not register a route as they should
. resthost entry for a given host must not be deleted when killing the server to avoid serial changing
{{{
Traceback (most recent call last):
  File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 186, in addCallbacks
    self._runCallbacks()
  File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 328, in _runCallbacks
    self.result = callback(self.result, *args, **kw)
  File "/usr/lib/python2.5/site-packages/pokernetwork/pokersite.py", line 210, in <lambda>
    self.deferred.addCallback(lambda result: self.deferRender(request, jsonp, packet))
  File "/usr/lib/python2.5/site-packages/pokernetwork/pokersite.py", line 221, in deferRender
    d = defer.maybeDeferred(session.avatar.handlePacketDefer, packet)
--- <exception caught here> ---
  File "/usr/lib/python2.5/site-packages/twisted/internet/defer.py", line 106, in maybeDeferred
    result = f(*args, **kw)
  File "/usr/lib/python2.5/site-packages/pokernetwork/pokeravatar.py", line 321, in handlePacketDefer
    self.handlePacketLogic(packet)
  File "/usr/lib/python2.5/site-packages/pokernetwork/pokeravatar.py", line 502, in handlePacketLogic
    self.sendPacketVerbose(self.service.tourneyManager(packet.tourney_serial))
  File "/usr/lib/python2.5/site-packages/pokernetwork/pokerservice.py", line 949, in tourneyManager
    user2properties[str(user_serial)] = {"name": user2name[user_serial],
exceptions.KeyError: 14L
}}}
db is not coherent: user_serial @@14@@ from user2tourney is missing from table users
{{{
mysql> select serial from users;
+--------+
| serial |
+--------+
|      1 | 
|      2 | 
|      3 | 
|      9 | 
|     25 | 
|     26 | 
|     27 | 
|     28 | 
|     29 | 
+--------+
9 rows in set (0.00 sec)
mysql> select user_serial from user2tourney;
+-------------+
| user_serial |
+-------------+
|          14 | 
|           9 | 
+-------------+
2 rows in set (0.00 sec)
}}}

Fixed : bots were not removed from user2tourney when they were discarded from the database.
http://jpoker.aminche.com/hg/jpoker/rev/983d8ac069dd
needs to be reproduced but the fact that setLocale is only called on login indicates that a page reload won't do what's expected
and it must set game_id: game_id in the SetLocale packet so that it is routed to the appropriate server when there is a proxy frontend. The server has been fixed accordingly (using PacketPokerId instead of PacketSerial to derive PokerAvatar).
* show the tourney start date in the tourneyDetail of completed tournaments
* show the tourney buy in in the tourneyDetail of registering tournaments
* show the total number of players registered to a tournament in tourneyDetail (all)
* show the tourney description in the title of the tourneyDetail
* show the prize pool in SNG tournament details registering because fixed number of players
the showdown disapears too quickly

see jpoker_55_allWithSidePot on http://jspoker.pokersource.info/skin/skin.html
instead they are emptied and this does not play well with skinning.
In addition 
	    var sidepot_element = $('#player_seat' + seat  + '_sidepot' + id).removeClass().addClass('jpoker_player_sidepot jpoker_ptable_player_seat' + seat + '_sidepot');
is 

Should use hide/show instead
{{{
		    $('#player_seat' + player.seat + '_sidepot' + id).html(html);
		} else {
		    $('#player_seat' + player.seat + '_sidepot' + id).html('');

}}}

* if http://www.schillmania.com/projects/soundmanager2/ support simultaneous sound, switch to soundmanager
* adding a jpokerSound element by player could also be an option
Upon clicking "Click here to get a seat" sometimes nothing happens forever, sometimes there is a large
    delay. Good idea to display a wait animation to avoid frustrating the user. Also timeout and throw an error
    if the server is not responding at all. 

server always return registered: 0
regression introduced with:
http://svn.gna.org/viewcvs/pokersource?rev=4323&view=rev
delay due to waiting for the server to acknowledge the sitin





must show sitin button : already on jpoker_05
side + pots : http://upstream.jspoker.pokersource.info/rev/98593a7cd867
text in chat areas : http://upstream.jspoker.pokersource.info/rev/29a6eb1559bc
* tourney list
* the buyin dialog never shows anywhere


sometimes when clicking show cards, the cards are not shown enought time for the opponent to notice
sometime the muck buttons disappear so fast we don't have a chance to click them
Even if seated at the table the server return players:0
{{{
2008-09-11 09:16:30+0000 [HTTPChannel,1,127.0.0.1] 	id = 721, name = One, variant = holdem, betting_structure = 2-4-limit, seats = 10, average_pot = 0, hands_per_hour = 0, percent_flop = 0, players = 0, observers = 0, waiting = 0, player_timeout = 60, muck_timeout = 5, currency_serial = 1, skin = default type = POKER_TABLE(73)
}}}
{{{
mysql> select name,serial,players from pokertables where name = 'One';
+------+--------+---------+
| name | serial | players |
+------+--------+---------+
| One  |    721 |       0 | 
+------+--------+---------+
1 row in set (0.00 sec)

mysql> select * from user2table;
+-------------+--------------+-------+-----+
| user_serial | table_serial | money | bet |
+-------------+--------------+-------+-----+
|           4 |          721 |  6000 |   0 | 
+-------------+--------------+-------+-----+
1 row in set (0.00 sec)
}}}
pokertables table is updated by pokerservice.updateTableStats.
{{{
    def updateTableStats(self, game, observers, waiting):
        cursor = self.db.cursor()
        cursor.execute("UPDATE pokertables SET " +
                       " average_pot = %s, " + 
                       " hands_per_hour = %s, " + 
                       " percent_flop = %s, " + 
                       " players = %s, " + 
                       " observers = %s, " + 
                       " waiting = %s " +
                       " WHERE serial = %s ", (
            game.stats['average_pot'],
            game.stats['hands_per_hour'],
            game.stats['percent_flop'],
            game.allCount(),
            observers,
            waiting,
            game.id
            ))
        cursor.close()
}}}
Which is called at the end of the hand in pokertable.syncDatabase.
{{{
            elif type == "finish":
                (type, hand_serial) = event
                self.factory.saveHand(self.compressedHistory(game.historyGet()), hand_serial)
                self.factory.updateTableStats(game, len(self.observers), len(self.waiting))
}}}

Therefore if a player is sitting alone at the table, (not playing) waiting for another player to play with, pokertables table will still shows players = 0

After playing a hand, pokertables is updated:
{{{
mysql> select name,serial,players from pokertables where name = 'One';
+------+--------+---------+
| name | serial | players |
+------+--------+---------+
| One  |    721 |       2 | 
+------+--------+---------+
1 row in set (0.00 sec)
}}}

in pokertable.py the  def seatPlayer must update the pokertables accordingly (call udpateTableStats).
in pokertable.py the def leavePlayer must call updateTableStats if removeplayer returns true (otherwise the stats will be updated at the end of the hand)
in pokertable.py the def kick/disconnect/quitPlayer must call updateTableStats if removeplayer returns true (otherwise the stats will be updated at the end of the hand)

{{{
mysql> select name, serial, players from pokertables;
+-----------+--------+---------+
| name      | serial | players |
+-----------+--------+---------+
| One       |    826 |       2 | 
| Two       |    827 |       0 | 
| Three     |    828 |       0 | 
| Four      |    829 |       1 | 
| Antigua   |    830 |       0 | 
| Cairo     |    831 |       0 | 
| Mont      |    832 |       0 | 
| Nancy     |    833 |       0 | 
| Corail    |    834 |       0 | 
| Legend    |    835 |       0 | 
| Chip      |    836 |       0 | 
| Relax     |    837 |       0 | 
| Speed     |    838 |       0 | 
| Un        |    839 |       0 | 
| Deux      |    840 |       0 | 
| Trois     |    841 |       0 | 
| Quatre    |    842 |       0 | 
| Five      |    843 |       0 | 
| Six       |    844 |       0 | 
| Seven     |    845 |       0 | 
| Eight     |    846 |       0 | 
| Nine      |    847 |       0 | 
| Ten       |    848 |       0 | 
| Eleven    |    849 |       0 | 
| Twelve    |    850 |       0 | 
| Thirty    |    851 |       0 | 
| Fourty    |    852 |       0 | 
| Lyearnys  |    853 |       0 | 
| Ingwskel  |    854 |       0 | 
| Cerrt     |    855 |       0 | 
| Therrd    |    856 |       0 | 
| Issgar    |    857 |       0 | 
| Torray    |    858 |       0 | 
| Uskeluina |    859 |       0 | 
| Oilde     |    860 |       0 | 
| Cheper    |    861 |       0 | 
| Syfar     |    862 |       0 | 
| Rhoine    |    863 |       0 | 
| Mosolor   |    864 |       0 | 
| Cayrryns  |    865 |       0 | 
| sitngo42  |    867 |       2 | 
+-----------+--------+---------+
41 rows in set (0.00 sec)

mysql> select * from user2table;
+-------------+--------------+--------+-----+
| user_serial | table_serial | money  | bet |
+-------------+--------------+--------+-----+
|          43 |          867 | 398500 |   0 | 
|          52 |          867 | 397000 |   0 | 
+-------------+--------------+--------+-----+
2 rows in set (0.00 sec)
}}}
and we don't see any table action
sitout/sitin is a workaround

fixed by bug fixing the later tourney arrival problem 
* common
* avatar
* stats
* sidepot
* poweredby
* last action


instead of hardcoded 800x800
as per [[specifications|specs/jstable.html]]
{{{
(03:16:32 PM) proppy: rikeko: ckudige: carmie was suggesting that we put cellspacing, cellpadding = 0 by default in all html table template of jpoker, do you have any thought regarding this ?
(03:16:56 PM) ckudige: yeah I usually prefer to do that
(03:18:08 PM) ckudige: proppy: in my opinion cellspacing does not server serve much purpose except for borders, and it could be better achieved by TD borders
(03:18:46 PM) ckudige: as for cellpadding - you can always override it in CSS
}}}
with name of the table, percent flop, big blind amount and level in case of a tourney
and sorted by default:
{{{
bkuhn: here's the algorithm:
bkuhn: (a) First sort criteria: stakes
bkuhn: (b) second sort criteria: { empty, heads-up, very-short-handed, short-handed, full-ring }
bkuhn: where empty == 0
bkuhn: heads-up == 1
bkuhn: very-short-handed == 2-3
bkuhn: short-handed == 4-6
bkuhn: full-ring == 7-10
bkuhn: MAYBE you could also separate out the 10's as "no-seats-avaiable"
}}}
. modify jpoker.plugins.tableList.template.pager to show value="30" instead of value="10"
. display the table list
. only 10 rows are shown
. inspect the elements and see that value="30" is set in the DOM
. click on the first page link and see that 30 rows are shown


* make an additional template for empty table
if var element = document.getElementById(id); is undefined update callback is killed, but not the refresh loop

must be due to tablesorterpager, being called before attaching .click() handler




http://jpoker.aminche.com/hg/jpoker/rev/995afb3c08bd

it is now part of the template. Just let me know which link you want to have.
to prevent the tourney from running too fast
(04:09:49 PM) dachary: proppy: the Rank must only show if running or complete, not when registering, announced or canceled
(04:10:14 PM) proppy: dachary: is there rank when running ?
(04:10:32 PM) dachary: proppy: yes, when a player is kicked out of the tournament.
Starting from http://jspoker.pokersource.info/specs/tiddlypoker.html write specifications suitable for a RAC job with deliverables similar to https://www.rentacoder.com/RentACoder/misc/BidRequests/ShowBidRequest.asp?lngBidRequestId=877722&txtForceRefresh=392008931211450
The specs must contain all that is required from jpoker to implement the behaviour loosely described in the implementation section. The jpoker API dependency is the primary goal, the RAC description is secondary. The specification must detail what is needed from jpoker in order to implement the tw integration. This behaviour must be refined with the people at irc.freenode.net#pokersource. This work is fuzzy by nature. Best effort is required but the quality of the deliverable is left to the judgement of the implementor.
# Write a TiddlyWiki plugin that uses the jQuery javascript library and the plugin jPoker to display a list of poker tables, nicely formatted as a HTML table.
# Provide unit tests for all code written
# Use JsCoverage to demonstrate 100% code coverage for the unit tests

http://www.tiddlywiki.com/
http://jquery.com/plugins/project/jpoker

[[RAC job|https://www.rentacoder.com/RentACoder/misc/BidRequests/ShowBidRequest.asp?lngBidRequestId=877722&txtForceRefresh=392008931211450]]
[[Deliverable|http://jspoker.pokersource.info/jPoker-saqimtiaz-2008-03-08/]]
[[Demo|http://jspoker.pokersource.info/jPoker-saqimtiaz-2008-03-08/poker.html]]
[[Tests coverage|http://jspoker.pokersource.info/jPoker-saqimtiaz-2008-03-08/tests/jscoverage.html?test.html]]

A is dealer
B is not dealer

B raise
A reraise
B call (timeout bar decrease)
B is in position (timeout bar not reset)




The table tournament break do not work this way.

(12:47:39) ckudige: the sequence is this:
(12:47:42) ckudige: table 66 finished
(12:47:48) ckudige: table 67 continued for a while
(12:47:56) ckudige: and then table 67 hanged

(15:08:04) ckudige: proppy: I think I have figured out the bug, but I am not that familiar with pokerengine
(15:08:31) ckudige: basically at the end of the turn, if the tourney goes on break, it waits for all other tables to finish their turns too
(15:08:37) proppy: yep
(15:08:38) ckudige: until then it will be in breakwait
(15:08:49) ckudige: but if a table is finished, it doesnt process breaks :)
(15:08:57) ckudige: so the other tables just wait indefinitely



* login
* click tourney sng list
* click on a tourney
* register
* unregister
* click tourney sng list
* click on the same tourney
* the list of players has an empty line
* repeat the operation and a new empty line is added every time
* login
* go to tourney list
* click on a tourney in the state registering
* a notify update recursion occurs
{{{
 ....loading....
Firebug's log limit has been reached. %S entries not shown.		Preferences	 
The profiler is running. Click 'Profile' again to see its report.
setState running reset
setState running reset
setState getting personal info undefined
sendPacket {"type":"PacketPokerGetPersonalInfo","serial":42}
server.handler {"rating":1000,"firstname":"John","money":{},"addr_street":"8","phone":"000-00000","cookie":"","serial":42,"password":"","addr_country":"Yours","name":"testuser","gender":"Male","birthdate":"01/01/1970","addr_street2":"Main street","addr_zip":"5000","affiliate":0,"lastname":"Doe","addr_town":"GhostTown","addr_state":"Alabama","type":"PacketPokerPersonalInfo","email":"john@doe.com","uid__":"jpoker1223287551672"}
setState running PacketPokerPersonalInfo
setState running reset
setState running reset
setState running reset
setState running reset
1000 x 6
Firebug's log limit has been reached. %S entries not shown.		Preferences	 
Firebug's log limit has been reached. %S entries not shown.		Preferences	 
setState running reset
setState trying to reconnect undefined
sendPacket {"type":"PacketPokerGetPlayerInfo"}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			213ms	jquery-1.2.6.js (line 2806)
queueIncoming {"message":"Not logged in","code":1,"type":"PacketError","other_type":123,"time__":1223288939759}
connection handle 0: {"message":"Not logged in","code":1,"type":"PacketError","other_type":123,"time__":1223288939759}
server.handler {"message":"Not logged in","code":1,"type":"PacketError","other_type":123,"uid__":"jpoker1223288938088"}
setState running PacketError reconnect
setState searching tables undefined
sendPacket {"type":"PacketPokerTableSelect","string":"my"}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			19ms	jquery-1.2.6.js (line 2806)
queueIncoming {"players":0,"type":"PacketPokerTableList","packets":[],"tables":40,"time__":1223288939919}
connection handle 0: {"players":0,"type":"PacketPokerTableList","packets":[],"tables":40,"time__":1223288939919}
server.handler {"players":0,"type":"PacketPokerTableList","packets":[],"tables":40,"uid__":"jpoker1223288938089"}
setState running PacketPokerTableList
setState searching tables undefined
sendPacket {"type":"PacketPokerTableSelect","string":""}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			83ms	jquery-1.2.6.js (line 2806)
queueIncoming {"players":0,"type":"PacketPokerTableList","packets":[{"observers":0,"name":"One","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":846},{"observers":0,"name":"Two","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":847},{"observers":0,"name":"Three","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":848},{"observers":0,"name":"Four","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":849},{"observers":0,"name":"Antigua","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":850},{"observers":0,"name":"Cairo","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":851},{"observers":0,"name":"Mont","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":852},{"observers":0,"name":"Nancy","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":853},{"observers":0,"name":"Corail","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":854},{"observers":0,"name":"Legend","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":855},{"observers":0,"name":"Chip","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":856},{"observers":0,"name":"Relax","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":857},{"observers":0,"name":"Speed","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":858},{"observers":0,"name":"Un","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":859},{"observers":0,"name":"Deux","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":860},{"observers":0,"name":"Trois","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":861},{"observers":0,"name":"Quatre","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":862},{"observers":0,"name":"Five","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":863},{"observers":0,"name":"Six","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":864},{"observers":0,"name":"Seven","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":865},{"observers":0,"name":"Eight","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":866},{"observers":0,"name":"Nine","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":867},{"observers":0,"name":"Ten","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":868},{"observers":0,"name":"Eleven","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":869},{"observers":0,"name":"Twelve","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":870},{"observers":0,"name":"Thirty","percent_flop":0,"average_pot":0,"skin":"default","variant":"7stud","hands_per_hour":0,"betting_structure":"ante-10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":8,"player_timeout":60,"type":"PacketPokerTable","id":871},{"observers":0,"name":"Fourty","percent_flop":0,"average_pot":0,"skin":"default","variant":"7stud","hands_per_hour":0,"betting_structure":"ante-5-10-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":8,"player_timeout":60,"type":"PacketPokerTable","id":872},{"observers":0,"name":"Lyearnys","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".02-.04-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":873},{"observers":0,"name":"Ingwskel","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".05-.10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":874},{"observers":0,"name":"Cerrt","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".10-.25-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":875},{"observers":0,"name":"Therrd","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".25-.50-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":876},{"observers":0,"name":"Issgar","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".50-1-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":877},{"observers":0,"name":"Torray","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"1-2-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":878},{"observers":0,"name":"Uskeluina","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":879},{"observers":0,"name":"Oilde","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"3-6-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":880},{"observers":0,"name":"Cheper","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"5-10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":881},{"observers":0,"name":"Syfar","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":882},{"observers":0,"name":"Rhoine","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"30-60-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":883},{"observers":0,"name":"Mosolor","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"50-100-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":884},{"observers":0,"name":"Cayrryns","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":885}],"tables":40,"time__":1223288940292}
connection handle 0: {"players":0,"type":"PacketPokerTableList","packets":[{"observers":0,"name":"One","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":846},{"observers":0,"name":"Two","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":847},{"observers":0,"name":"Three","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":848},{"observers":0,"name":"Four","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":849},{"observers":0,"name":"Antigua","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":850},{"observers":0,"name":"Cairo","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":851},{"observers":0,"name":"Mont","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":852},{"observers":0,"name":"Nancy","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":853},{"observers":0,"name":"Corail","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":854},{"observers":0,"name":"Legend","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":855},{"observers":0,"name":"Chip","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":856},{"observers":0,"name":"Relax","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":857},{"observers":0,"name":"Speed","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":858},{"observers":0,"name":"Un","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":859},{"observers":0,"name":"Deux","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":860},{"observers":0,"name":"Trois","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":861},{"observers":0,"name":"Quatre","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":862},{"observers":0,"name":"Five","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":863},{"observers":0,"name":"Six","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":864},{"observers":0,"name":"Seven","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":865},{"observers":0,"name":"Eight","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":866},{"observers":0,"name":"Nine","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":867},{"observers":0,"name":"Ten","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":868},{"observers":0,"name":"Eleven","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":869},{"observers":0,"name":"Twelve","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":870},{"observers":0,"name":"Thirty","percent_flop":0,"average_pot":0,"skin":"default","variant":"7stud","hands_per_hour":0,"betting_structure":"ante-10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":8,"player_timeout":60,"type":"PacketPokerTable","id":871},{"observers":0,"name":"Fourty","percent_flop":0,"average_pot":0,"skin":"default","variant":"7stud","hands_per_hour":0,"betting_structure":"ante-5-10-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":8,"player_timeout":60,"type":"PacketPokerTable","id":872},{"observers":0,"name":"Lyearnys","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".02-.04-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":873},{"observers":0,"name":"Ingwskel","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".05-.10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":874},{"observers":0,"name":"Cerrt","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".10-.25-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":875},{"observers":0,"name":"Therrd","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".25-.50-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":876},{"observers":0,"name":"Issgar","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".50-1-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":877},{"observers":0,"name":"Torray","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"1-2-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":878},{"observers":0,"name":"Uskeluina","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":879},{"observers":0,"name":"Oilde","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"3-6-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":880},{"observers":0,"name":"Cheper","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"5-10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":881},{"observers":0,"name":"Syfar","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":882},{"observers":0,"name":"Rhoine","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"30-60-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":883},{"observers":0,"name":"Mosolor","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"50-100-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":884},{"observers":0,"name":"Cayrryns","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":885}],"tables":40,"time__":1223288940292}
server.handler {"players":0,"type":"PacketPokerTableList","packets":[{"observers":0,"name":"One","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":846},{"observers":0,"name":"Two","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":847},{"observers":0,"name":"Three","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":848},{"observers":0,"name":"Four","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":849},{"observers":0,"name":"Antigua","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":850},{"observers":0,"name":"Cairo","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":851},{"observers":0,"name":"Mont","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":852},{"observers":0,"name":"Nancy","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":853},{"observers":0,"name":"Corail","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":854},{"observers":0,"name":"Legend","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":855},{"observers":0,"name":"Chip","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":856},{"observers":0,"name":"Relax","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":857},{"observers":0,"name":"Speed","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":858},{"observers":0,"name":"Un","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":859},{"observers":0,"name":"Deux","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":860},{"observers":0,"name":"Trois","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":861},{"observers":0,"name":"Quatre","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":862},{"observers":0,"name":"Five","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":863},{"observers":0,"name":"Six","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":864},{"observers":0,"name":"Seven","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":865},{"observers":0,"name":"Eight","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":866},{"observers":0,"name":"Nine","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":867},{"observers":0,"name":"Ten","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":868},{"observers":0,"name":"Eleven","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"10-20-pot-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":869},{"observers":0,"name":"Twelve","percent_flop":0,"average_pot":0,"skin":"default","variant":"omaha8","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":870},{"observers":0,"name":"Thirty","percent_flop":0,"average_pot":0,"skin":"default","variant":"7stud","hands_per_hour":0,"betting_structure":"ante-10-20-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":8,"player_timeout":60,"type":"PacketPokerTable","id":871},{"observers":0,"name":"Fourty","percent_flop":0,"average_pot":0,"skin":"default","variant":"7stud","hands_per_hour":0,"betting_structure":"ante-5-10-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":8,"player_timeout":60,"type":"PacketPokerTable","id":872},{"observers":0,"name":"Lyearnys","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".02-.04-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":873},{"observers":0,"name":"Ingwskel","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".05-.10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":874},{"observers":0,"name":"Cerrt","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".10-.25-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":875},{"observers":0,"name":"Therrd","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".25-.50-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":876},{"observers":0,"name":"Issgar","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":".50-1-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":877},{"observers":0,"name":"Torray","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"1-2-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":878},{"observers":0,"name":"Uskeluina","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":879},{"observers":0,"name":"Oilde","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"3-6-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":880},{"observers":0,"name":"Cheper","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"5-10-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":881},{"observers":0,"name":"Syfar","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"10-20-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":882},{"observers":0,"name":"Rhoine","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"30-60-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":883},{"observers":0,"name":"Mosolor","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"50-100-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":884},{"observers":0,"name":"Cayrryns","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"100-200-no-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":885}],"tables":40,"uid__":"jpoker1223288938090"}
setState running PacketPokerTableList
setState joining table undefined
sendPacket {"type":"PacketPokerTableJoin","game_id":846}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			620ms	jquery-1.2.6.js (line 2806)
queueIncoming {"observers":0,"name":"One","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":846,"time__":1223288941356}
queueIncoming {"count":1,"game_ids":[846],"length":9,"type":"PacketPokerCurrentGames","time__":1223288941369}
queueIncoming {"min":1000,"max":100000000,"rebuy_min":300,"length":23,"game_id":846,"type":"PacketPokerBuyInLimits","best":6000,"time__":1223288941378}
queueIncoming {"game_id":846,"serial":0,"cookie":"","type":"PacketPokerBatchMode","time__":1223288941384}
queueIncoming {"game_id":846,"serial":0,"cookie":"","type":"PacketPokerStreamMode","time__":1223288941389}
connection handle 0: {"observers":0,"name":"One","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":846,"time__":1223288941356}
server.handler {"observers":0,"name":"One","percent_flop":0,"average_pot":0,"skin":"default","variant":"holdem","hands_per_hour":0,"betting_structure":"2-4-limit","currency_serial":1,"muck_timeout":5,"players":0,"waiting":0,"tourney_serial":0,"seats":10,"player_timeout":60,"type":"PacketPokerTable","id":846,"uid__":"jpoker1223288938091"}
sendPacket {"type":"PacketPokerPoll","game_id":846}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			866ms	jquery-1.2.6.js (line 2806)
plugins.table.create jpoker1223288938092 game: 846
connection handle 846: {"min":1000,"max":100000000,"rebuy_min":300,"length":23,"game_id":846,"type":"PacketPokerBuyInLimits","best":6000,"time__":1223288941378}
table.handler {"min":1000,"max":100000000,"rebuy_min":300,"length":23,"game_id":846,"type":"PacketPokerBuyInLimits","best":6000,"uid__":"jpoker1223288938093"}
connection handle 0: {"count":1,"game_ids":[846],"length":9,"type":"PacketPokerCurrentGames","time__":1223288941369}
server.handler {"count":1,"game_ids":[846],"length":9,"type":"PacketPokerCurrentGames","uid__":"jpoker1223288938094"}
connection handle 846: {"game_id":846,"serial":0,"cookie":"","type":"PacketPokerBatchMode","time__":1223288941384}
table.handler {"game_id":846,"serial":0,"cookie":"","type":"PacketPokerBatchMode","uid__":"jpoker1223288938095"}
connection handle 846: {"game_id":846,"serial":0,"cookie":"","type":"PacketPokerStreamMode","time__":1223288941389}
table.handler {"game_id":846,"serial":0,"cookie":"","type":"PacketPokerStreamMode","uid__":"jpoker1223288938096"}
setState running PacketPokerStreamMode
sendPacket {"type":"PacketPokerPoll","game_id":846}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			16ms	jquery-1.2.6.js (line 2806)
setState loging undefined
sendPacket {"type":"PacketLogin","name":"proppy","password":"pqsspqss"}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			30ms	jquery-1.2.6.js (line 2806)
queueIncoming {"type":"PacketAuthOk","time__":1223288947916}
queueIncoming {"cookie":"","serial":9,"type":"PacketSerial","time__":1223288947921}
connection handle 0: {"type":"PacketAuthOk","time__":1223288947916}
server.handler {"type":"PacketAuthOk","uid__":"jpoker1223288938097"}
connection handle 0: {"cookie":"","serial":9,"type":"PacketSerial","time__":1223288947921}
server.handler {"cookie":"","serial":9,"type":"PacketSerial","uid__":"jpoker1223288938098"}
setState running login serial received
setState retrieving user info undefined
sendPacket {"type":"PacketPokerGetUserInfo","serial":9}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			19ms	jquery-1.2.6.js (line 2806)
queueIncoming {"rating":1000,"name":"proppy","money":{"X1":[5000000,0,0]},"affiliate":0,"cookie":"","serial":9,"password":"","type":"PacketPokerUserInfo","email":"","time__":1223288948285}
connection handle 0: {"rating":1000,"name":"proppy","money":{"X1":[5000000,0,0]},"affiliate":0,"cookie":"","serial":9,"password":"","type":"PacketPokerUserInfo","email":"","time__":1223288948285}
server.handler {"rating":1000,"name":"proppy","money":{"X1":[5000000,0,0]},"affiliate":0,"cookie":"","serial":9,"password":"","type":"PacketPokerUserInfo","email":"","uid__":"jpoker1223288938099"}
table.handler {"rating":1000,"name":"proppy","money":{"X1":[5000000,0,0]},"affiliate":0,"cookie":"","serial":9,"password":"","type":"PacketPokerUserInfo","email":"","uid__":"jpoker1223288938099","game_id":"846"}
setState running PacketPokerUserInfo
setState searching tourneys refresh
sendPacket {"type":"PacketPokerTourneySelect","string":""}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			173ms	jquery-1.2.6.js (line 2806)
queueIncoming {"players":0,"packets":[{"players_quota":4,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":1223288150,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"complete","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":28,"description_short":"Sit and Go 2 players, Holdem","registered":4},{"players_quota":4,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":0,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"registering","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":30,"description_short":"Sit and Go 2 players, Holdem","registered":0}],"tourneys":1,"type":"PacketPokerTourneyList","time__":1223288950322}
queueIncoming {"packets":[{"cookie":"","serial":1,"type":"PacketPokerTourneyAttrs"},{"cookie":"","serial":1,"type":"PacketPokerTourneyAttrs"}],"tourneyAttrs":1,"type":"PacketPokerTourneyAttrsList","time__":1223288950331}
connection handle 0: {"players":0,"packets":[{"players_quota":4,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":1223288150,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"complete","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":28,"description_short":"Sit and Go 2 players, Holdem","registered":4},{"players_quota":4,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":0,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"registering","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":30,"description_short":"Sit and Go 2 players, Holdem","registered":0}],"tourneys":1,"type":"PacketPokerTourneyList","time__":1223288950322}
server.handler {"players":0,"packets":[{"players_quota":4,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":1223288150,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"complete","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":28,"description_short":"Sit and Go 2 players, Holdem","registered":4},{"players_quota":4,"breaks_interval":3600,"name":"sitngo2","type":"PacketPokerTourney","start_time":0,"breaks_first":7200,"variant":"holdem","currency_serial":1,"state":"registering","buy_in":300000,"sit_n_go":"y","breaks_duration":300,"serial":30,"description_short":"Sit and Go 2 players, Holdem","registered":0}],"tourneys":1,"type":"PacketPokerTourneyList","uid__":"jpoker1223288938101"}
setState running refresh searching tourneys
connection handle 0: {"packets":[{"cookie":"","serial":1,"type":"PacketPokerTourneyAttrs"},{"cookie":"","serial":1,"type":"PacketPokerTourneyAttrs"}],"tourneyAttrs":1,"type":"PacketPokerTourneyAttrsList","time__":1223288950331}
server.handler {"packets":[{"cookie":"","serial":1,"type":"PacketPokerTourneyAttrs"},{"cookie":"","serial":1,"type":"PacketPokerTourneyAttrs"}],"tourneyAttrs":1,"type":"PacketPokerTourneyAttrsList","uid__":"jpoker1223288938102"}
sendPacket {"type":"PacketPokerPoll","game_id":846}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			19ms	jquery-1.2.6.js (line 2806)
setState retrieving tourney details refresh
sendPacket {"type":"PacketPokerGetTourneyManager","tourney_serial":30}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			31ms	jquery-1.2.6.js (line 2806)
queueIncoming {"user2properties":{},"length":3,"tourney_serial":30,"table2serials":{},"type":"PacketPokerTourneyManager","tourney":{"breaks_interval":3600,"currency_serial":1,"description_long":"Sit and Go 2 players","rank2prize":null,"serial":30,"resthost_serial":0,"rebuy_count":0,"state":"registering","buy_in":300000,"add_on_count":0,"description_short":"Sit and Go 2 players, Holdem","registered":0,"players_quota":4,"breaks_first":7200,"add_on":0,"start_time":0,"rake":0,"variant":"holdem","players_min":4,"schedule_serial":1,"betting_structure":"level-15-30-no-limit","add_on_delay":60,"name":"sitngo2","finish_time":0,"prize_min":0,"player_timeout":60,"breaks_duration":300,"seats_per_game":2,"bailor_serial":0,"sit_n_go":"y","rebuy_delay":0},"time__":1223288952077}
connection handle 0: {"user2properties":{},"length":3,"tourney_serial":30,"table2serials":{},"type":"PacketPokerTourneyManager","tourney":{"breaks_interval":3600,"currency_serial":1,"description_long":"Sit and Go 2 players","rank2prize":null,"serial":30,"resthost_serial":0,"rebuy_count":0,"state":"registering","buy_in":300000,"add_on_count":0,"description_short":"Sit and Go 2 players, Holdem","registered":0,"players_quota":4,"breaks_first":7200,"add_on":0,"start_time":0,"rake":0,"variant":"holdem","players_min":4,"schedule_serial":1,"betting_structure":"level-15-30-no-limit","add_on_delay":60,"name":"sitngo2","finish_time":0,"prize_min":0,"player_timeout":60,"breaks_duration":300,"seats_per_game":2,"bailor_serial":0,"sit_n_go":"y","rebuy_delay":0},"time__":1223288952077}
server.handler {"user2properties":{},"length":3,"tourney_serial":30,"table2serials":{},"type":"PacketPokerTourneyManager","tourney":{"breaks_interval":3600,"currency_serial":1,"description_long":"Sit and Go 2 players","rank2prize":null,"serial":30,"resthost_serial":0,"rebuy_count":0,"state":"registering","buy_in":300000,"add_on_count":0,"description_short":"Sit and Go 2 players, Holdem","registered":0,"players_quota":4,"breaks_first":7200,"add_on":0,"start_time":0,"rake":0,"variant":"holdem","players_min":4,"schedule_serial":1,"betting_structure":"level-15-30-no-limit","add_on_delay":60,"name":"sitngo2","finish_time":0,"prize_min":0,"player_timeout":60,"breaks_duration":300,"seats_per_game":2,"bailor_serial":0,"sit_n_go":"y","rebuy_delay":0},"uid__":"jpoker1223288938104"}
setState running reset
uncaught exception: notify recursion for update
[Break on this error] checkCell = (n[0].length-1),
jquery.t...sorter.js (line 251)
sendPacket {"type":"PacketPokerPoll","game_id":846}
POST http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
http://127.0.0.1/POKER_REST?name=33709A7BAC22083C22659129347E4F1D7BDA9230
			16ms	jquery-1.2.6.js (line 2806)
uncaught exception: notify recursion for update
[Break on this error] undefined
refresh waiting
sendPacket {"type":"PacketPokerPoll","game_id":846}
refresh waiting
}}}


complete list of tournament state:
TOURNAMENT_STATE_ANNOUNCED = "announced"
TOURNAMENT_STATE_REGISTERING = "registering"
TOURNAMENT_STATE_RUNNING = "running"
TOURNAMENT_STATE_BREAK_WAIT = "breakwait"
TOURNAMENT_STATE_BREAK = "break"
TOURNAMENT_STATE_COMPLETE = "complete"
TOURNAMENT_STATE_CANCELED = "canceled"
http://jpoker.aminche.com/hg/jpoker/rev/47fae4e146b5

http://svn.gna.org/viewcvs/pokersource?rev=4575&view=rev
http://jpoker.aminche.com/hg/jpoker/rev/4ec8d406d01e
solution :
* auto increment a cookie client side
* discard packet if the cookie is < to the last one received
http://jpoker.aminche.com/hg/jpoker/rev/92a4fe4e37bf

http://jpoker.aminche.com/hg/jpoker/rev/d130c32d8a75
http://svn.gna.org/viewcvs/pokersource?rev=4476&view=rev
ping the fedora package maintainer to upgrade to 1.0.7. He has agreed on 2 or 3 more uploads.
http://docs.jquery.com/QUnit
http://code.google.com/p/jqunit/

http://jpoker.aminche.com/hg/jpoker/rev/32bf981db882
http://www.filamentgroup.com/lab/update_automatically_preload_images_from_css_with_jquery/
it must be in a state that forbids all other interaction
http://jpoker.aminche.com/hg/jpoker/rev/71e7a8e357a6
* firefox skin.html
* click on the case you want to validate
* save the file locally to caseXXX.html
* firefox caseXXX.html
* ctrl+shift+a using webdevelopper FF extension
** https://addons.mozilla.org/en-US/firefox/addon/60
arrange for the uninit function to be given and argument in watchable

{{{
root@kun:/usr/src# curl -c /tmp/cookiejar -v -d '{"type":"PacketLogin", "username":"imageupload", "password":"imageupload"}' http://127.0.0.1:19384/POKER_REST
* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /POKER_REST HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Content-Length: 74
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 200 OK
< Date: Tue, 19 Aug 2008 16:45:47 GMT
< Content-length: 80
< Content-type: text/plain; charset="UTF-8"
< Server: TwistedWeb/8.1.0
* Added cookie TWISTED_SESSION="dde9bff3fd43a8205416c7e9b0b5f62e" for domain 127.0.0.1, path /, expire 0
< Set-Cookie: TWISTED_SESSION=dde9bff3fd43a8205416c7e9b0b5f62e; Path=/
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
[{"type": "PacketAuthOk"}, {"type": "PacketSerial", "serial": 39, "cookie": ""}]root@kun:/usr/src# 
root@kun:/usr/src# 
root@kun:/usr/src# 
root@kun:/usr/src# curl -b /tmp/cookiejar -v -F filename=@/usr/src/cropped.png http://127.0.0.1:19384/UPLOAD* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /UPLOAD HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Cookie: TWISTED_SESSION=dde9bff3fd43a8205416c7e9b0b5f62e
> Content-Length: 4693
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------04201ae24f1a
> 
< HTTP/1.1 200 OK
< Date: Tue, 19 Aug 2008 16:46:00 GMT
< Content-length: 14
< Content-type: text/plain; charset="UTF-8"
< Server: TwistedWeb/8.1.0
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
image uploadedroot@kun:/usr/src# curl -b /tmp/cookiejar -v -F filename=@/usr/src/cropped.jpg http://127.0.0.1:19384/UPLOAD
* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /UPLOAD HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Cookie: TWISTED_SESSION=dde9bff3fd43a8205416c7e9b0b5f62e
> Content-Length: 1205
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------bbdfc573f85b
> 
< HTTP/1.1 200 OK
< Date: Tue, 19 Aug 2008 16:46:06 GMT
< Content-length: 14
< Content-type: text/plain; charset="UTF-8"
< Server: TwistedWeb/8.1.0
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
image uploadedroot@kun:/usr/src# curl -b /tmp/cookiejar -v -F filename=@/usr/src/cropped.png http://127.0.0.1:19384/UPLOAD
* About to connect() to 127.0.0.1 port 19384 (#0)
*   Trying 127.0.0.1... connected
* Connected to 127.0.0.1 (127.0.0.1) port 19384 (#0)
> POST /UPLOAD HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.9 libssh2/0.18
> Host: 127.0.0.1:19384
> Accept: */*
> Cookie: TWISTED_SESSION=dde9bff3fd43a8205416c7e9b0b5f62e
> Content-Length: 4693
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------369e1fcf31a9
> 
< HTTP/1.1 200 OK
< Date: Tue, 19 Aug 2008 16:46:12 GMT
< Content-length: 14
< Content-type: text/plain; charset="UTF-8"
< Server: TwistedWeb/8.1.0
< 
* Connection #0 to host 127.0.0.1 left intact
* Closing connection #0
}}}
"); //]]>