├── server
├── basic_classes
│ ├── __init__.py
│ ├── .svn
│ │ ├── text-base
│ │ │ ├── __init__.py.svn-base
│ │ │ ├── comment.py.svn-base
│ │ │ ├── object.py.svn-base
│ │ │ ├── message.py.svn-base
│ │ │ ├── symbol.py.svn-base
│ │ │ ├── number.py.svn-base
│ │ │ ├── connection.py.svn-base
│ │ │ └── box.py.svn-base
│ │ ├── prop-base
│ │ │ ├── box.py.svn-base
│ │ │ ├── __init__.py.svn-base
│ │ │ ├── comment.py.svn-base
│ │ │ ├── connection.py.svn-base
│ │ │ ├── message.py.svn-base
│ │ │ ├── number.py.svn-base
│ │ │ ├── object.py.svn-base
│ │ │ └── symbol.py.svn-base
│ │ ├── all-wcprops
│ │ └── entries
│ ├── comment.py
│ ├── object.py
│ ├── message.py
│ ├── symbol.py
│ ├── number.py
│ ├── connection.py
│ └── box.py
├── killPureeData.sh
├── aux_patches
│ ├── .svn
│ │ ├── prop-base
│ │ │ ├── id.pd.svn-base
│ │ │ ├── nmb.pd.svn-base
│ │ │ ├── server.pd.svn-base
│ │ │ └── sym.pd.svn-base
│ │ ├── text-base
│ │ │ ├── nmb.pd.svn-base
│ │ │ ├── sym.pd.svn-base
│ │ │ ├── server.pd.svn-base
│ │ │ └── id.pd.svn-base
│ │ ├── all-wcprops
│ │ └── entries
│ ├── server.pd
│ ├── nmb.pd
│ ├── sym.pd
│ └── id.pd
├── static
│ ├── favicon.ico
│ ├── images
│ │ ├── blender.png
│ │ └── blender_logo.png
│ ├── css
│ │ ├── eggplant
│ │ │ ├── images
│ │ │ │ ├── ui-anim_basic_16x16.gif
│ │ │ │ ├── ui-icons_454545_256x240.png
│ │ │ │ ├── ui-icons_734d99_256x240.png
│ │ │ │ ├── ui-icons_8d78a5_256x240.png
│ │ │ │ ├── ui-icons_a8a3ae_256x240.png
│ │ │ │ ├── ui-icons_ebccce_256x240.png
│ │ │ │ ├── ui-icons_ffffff_256x240.png
│ │ │ │ ├── ui-bg_flat_0_aaaaaa_40x100.png
│ │ │ │ ├── ui-bg_flat_0_eeeeee_40x100.png
│ │ │ │ ├── ui-bg_flat_55_994d53_40x100.png
│ │ │ │ ├── ui-bg_flat_55_fafafa_40x100.png
│ │ │ │ ├── ui-bg_gloss-wave_30_3d3644_500x100.png
│ │ │ │ ├── ui-bg_highlight-soft_100_dcd9de_1x100.png
│ │ │ │ ├── ui-bg_highlight-soft_100_eae6ea_1x100.png
│ │ │ │ ├── ui-bg_highlight-soft_25_30273a_1x100.png
│ │ │ │ └── ui-bg_highlight-soft_45_5f5964_1x100.png
│ │ │ └── jquery-ui-1.8.2.custom.css
│ │ └── pureedata.css
│ ├── pureedata.pls
│ └── js
│ │ ├── objects.js
│ │ ├── jquery.easyRotate.js
│ │ ├── pureedata.js
│ │ └── jquery-1.4.2.min.js
├── startPureeData.sh
├── properties.config
├── transfer_board.py
├── gui_updater.py
├── Pd.py
├── communication.py
├── templates
│ └── index.html
└── pureeDataServer.py
├── .gitignore
└── README.md
/server/basic_classes/__init__.py:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | *.log
2 | *.out
3 | *.pyc
4 | server/old
5 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/__init__.py.svn-base:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/server/killPureeData.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 | sudo killall python
3 | sudo killall pdextended
--------------------------------------------------------------------------------
/server/aux_patches/.svn/prop-base/id.pd.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/prop-base/nmb.pd.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/prop-base/server.pd.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/prop-base/sym.pd.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/box.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/static/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/favicon.ico
--------------------------------------------------------------------------------
/server/aux_patches/server.pd:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/aux_patches/server.pd
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/__init__.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/comment.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/connection.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/message.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/number.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/object.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/prop-base/symbol.py.svn-base:
--------------------------------------------------------------------------------
1 | K 14
2 | svn:executable
3 | V 1
4 | *
5 | END
6 |
--------------------------------------------------------------------------------
/server/static/images/blender.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/images/blender.png
--------------------------------------------------------------------------------
/server/static/images/blender_logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/images/blender_logo.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-anim_basic_16x16.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-anim_basic_16x16.gif
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-icons_454545_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-icons_454545_256x240.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-icons_734d99_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-icons_734d99_256x240.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-icons_8d78a5_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-icons_8d78a5_256x240.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-icons_a8a3ae_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-icons_a8a3ae_256x240.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-icons_ebccce_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-icons_ebccce_256x240.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-icons_ffffff_256x240.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-icons_ffffff_256x240.png
--------------------------------------------------------------------------------
/server/startPureeData.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | #debugging
4 | sudo nohup python pureeDataServer.py 80 &
5 |
6 | #production
7 | #sudo nohup python pureeDataServer.py 80 > /dev/null &
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_flat_0_aaaaaa_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_flat_0_aaaaaa_40x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_flat_0_eeeeee_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_flat_0_eeeeee_40x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_flat_55_994d53_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_flat_55_994d53_40x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_flat_55_fafafa_40x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_flat_55_fafafa_40x100.png
--------------------------------------------------------------------------------
/server/properties.config:
--------------------------------------------------------------------------------
1 | #replace this to where pd file is
2 | /usr/bin
3 | #variable that stores the receiver port number
4 | 3001
5 | #variable that stores the sender port number
6 | 3000
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_highlight-soft_100_dcd9de_1x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_highlight-soft_100_eae6ea_1x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_highlight-soft_25_30273a_1x100.png
--------------------------------------------------------------------------------
/server/static/css/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/t3db0t/PureeData/HEAD/server/static/css/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png
--------------------------------------------------------------------------------
/server/static/pureedata.pls:
--------------------------------------------------------------------------------
1 | [playlist]
2 | numberofentries=1
3 | File1=http://pureedata.net:8000/pureedata.mp3
4 | Title1=PuréeData.net: A Turbulence.org commission by Ted Hayes
5 | Length1=-1
6 | Version=2
--------------------------------------------------------------------------------
/server/aux_patches/nmb.pd:
--------------------------------------------------------------------------------
1 | #N canvas 628 183 366 260 10;
2 | #X floatatom 100 100 5 0 0 0 - - -;
3 | #X obj 99 44 inlet;
4 | #X obj 192 116 pack f f;
5 | #X obj 192 52 id;
6 | #X obj 192 155 send pyata;
7 | #X obj 100 154 outlet;
8 | #X connect 0 0 2 0;
9 | #X connect 0 0 5 0;
10 | #X connect 1 0 0 0;
11 | #X connect 2 0 4 0;
12 | #X connect 3 0 2 1;
13 | #X coords 0 -1 1 1 32 17 1 100 100;
14 |
--------------------------------------------------------------------------------
/server/aux_patches/sym.pd:
--------------------------------------------------------------------------------
1 | #N canvas 151 173 450 300 10;
2 | #X obj 101 44 inlet;
3 | #X symbolatom 101 101 10 0 0 0 - - -;
4 | #X obj 193 53 id;
5 | #X obj 193 156 send pyata;
6 | #X obj 101 155 outlet;
7 | #X obj 193 117 pack s f;
8 | #X connect 0 0 1 0;
9 | #X connect 1 0 4 0;
10 | #X connect 1 0 5 0;
11 | #X connect 2 0 5 1;
12 | #X connect 5 0 3 0;
13 | #X coords 0 -1 1 1 64 18 1 100 100;
14 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/text-base/nmb.pd.svn-base:
--------------------------------------------------------------------------------
1 | #N canvas 628 183 366 260 10;
2 | #X floatatom 100 100 5 0 0 0 - - -;
3 | #X obj 99 44 inlet;
4 | #X obj 192 116 pack f f;
5 | #X obj 192 52 id;
6 | #X obj 192 155 send pyata;
7 | #X obj 100 154 outlet;
8 | #X connect 0 0 2 0;
9 | #X connect 0 0 5 0;
10 | #X connect 1 0 0 0;
11 | #X connect 2 0 4 0;
12 | #X connect 3 0 2 1;
13 | #X coords 0 -1 1 1 32 17 1 100 100;
14 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/text-base/sym.pd.svn-base:
--------------------------------------------------------------------------------
1 | #N canvas 151 173 450 300 10;
2 | #X obj 101 44 inlet;
3 | #X symbolatom 101 101 10 0 0 0 - - -;
4 | #X obj 193 53 id;
5 | #X obj 193 156 send pyata;
6 | #X obj 101 155 outlet;
7 | #X obj 193 117 pack s f;
8 | #X connect 0 0 1 0;
9 | #X connect 1 0 4 0;
10 | #X connect 1 0 5 0;
11 | #X connect 2 0 5 1;
12 | #X connect 5 0 3 0;
13 | #X coords 0 -1 1 1 64 18 1 100 100;
14 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/all-wcprops:
--------------------------------------------------------------------------------
1 | K 25
2 | svn:wc:ra_dav:version-url
3 | V 44
4 | /svn/!svn/ver/91/trunk/pyata/src/aux_patches
5 | END
6 | server.pd
7 | K 25
8 | svn:wc:ra_dav:version-url
9 | V 54
10 | /svn/!svn/ver/91/trunk/pyata/src/aux_patches/server.pd
11 | END
12 | sym.pd
13 | K 25
14 | svn:wc:ra_dav:version-url
15 | V 51
16 | /svn/!svn/ver/51/trunk/pyata/src/aux_patches/sym.pd
17 | END
18 | nmb.pd
19 | K 25
20 | svn:wc:ra_dav:version-url
21 | V 51
22 | /svn/!svn/ver/51/trunk/pyata/src/aux_patches/nmb.pd
23 | END
24 | id.pd
25 | K 25
26 | svn:wc:ra_dav:version-url
27 | V 50
28 | /svn/!svn/ver/51/trunk/pyata/src/aux_patches/id.pd
29 | END
30 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/all-wcprops:
--------------------------------------------------------------------------------
1 | K 25
2 | svn:wc:ra_dav:version-url
3 | V 44
4 | /svn/!svn/ver/92/trunk/pyata/src/box_classes
5 | END
6 | box.py
7 | K 25
8 | svn:wc:ra_dav:version-url
9 | V 51
10 | /svn/!svn/ver/53/trunk/pyata/src/box_classes/box.py
11 | END
12 | number.py
13 | K 25
14 | svn:wc:ra_dav:version-url
15 | V 54
16 | /svn/!svn/ver/91/trunk/pyata/src/box_classes/number.py
17 | END
18 | __init__.py
19 | K 25
20 | svn:wc:ra_dav:version-url
21 | V 56
22 | /svn/!svn/ver/27/trunk/pyata/src/box_classes/__init__.py
23 | END
24 | connection.py
25 | K 25
26 | svn:wc:ra_dav:version-url
27 | V 58
28 | /svn/!svn/ver/91/trunk/pyata/src/box_classes/connection.py
29 | END
30 | comment.py
31 | K 25
32 | svn:wc:ra_dav:version-url
33 | V 55
34 | /svn/!svn/ver/27/trunk/pyata/src/box_classes/comment.py
35 | END
36 | message.py
37 | K 25
38 | svn:wc:ra_dav:version-url
39 | V 55
40 | /svn/!svn/ver/44/trunk/pyata/src/box_classes/message.py
41 | END
42 | symbol.py
43 | K 25
44 | svn:wc:ra_dav:version-url
45 | V 54
46 | /svn/!svn/ver/92/trunk/pyata/src/box_classes/symbol.py
47 | END
48 | object.py
49 | K 25
50 | svn:wc:ra_dav:version-url
51 | V 54
52 | /svn/!svn/ver/27/trunk/pyata/src/box_classes/object.py
53 | END
54 |
--------------------------------------------------------------------------------
/server/transfer_board.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | ##########################################################
4 | ##########################################################
5 | # description: class that aux the copy/paste/duplicate/etc stuff
6 | #
7 | # autor: jeraman
8 | # date: 22/04/2010
9 | ##########################################################
10 | ##########################################################
11 |
12 |
13 | from basic_classes.box import *
14 | import copy
15 |
16 | class TransferBoard():
17 | def __init__(self):
18 | self.memory = []
19 |
20 | #copy method
21 | def copy(self):
22 | del self.memory[:]
23 | for b in memory_box:
24 | if b.selected:
25 | self.memory.append(copy.deepcopy(b))
26 |
27 | #paste method
28 | def paste(self, x, y):
29 | for b in self.memory:
30 | b.x+=x
31 | b.y+=y
32 | b.create()
33 |
34 | #cut method
35 | def cut(self):
36 | self.copy()
37 | for b in memory_box:
38 | if b.selected:
39 | b.delete()
40 |
41 | #duplicate method
42 | def duplicate(self, x, y):
43 | self.copy()
44 | self.paste(x, y)
45 |
46 | #select all method
47 | def selectall(self):
48 | for b in memory_box:
49 | b.shift_select()
50 |
--------------------------------------------------------------------------------
/server/gui_updater.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | ##########################################################
4 | ##########################################################
5 | # description: class that get all values from GUI boxes inside Pd, updating python values
6 | #
7 | # autor: jeraman
8 | # date: 21/04/2010
9 | ##########################################################
10 | ##########################################################
11 |
12 | from threading import *
13 | from basic_classes.box import *
14 |
15 | class GuiUpdater(Thread):
16 | #class variable that indicates if the thread should end
17 | finish = False
18 |
19 | #constructor
20 | def __init__(self, rcv):
21 | Thread.__init__(self)
22 | self.rcv = rcv
23 |
24 | #run method
25 | def run(self):
26 | while not(GuiUpdater.finish):
27 | temp = self.rcv.recv(1024)
28 | commands = temp.split(";")
29 |
30 | for c in commands:
31 | i = c.rfind(" ")
32 | #print c
33 | #verifica se a string nao veio quebrada
34 | result = c.split(" ")
35 | if len(result) > 1:
36 | value = c[0:i]
37 | id= int(c[i:len(c)])
38 | box=memory_box[id-1] #get the box
39 | box.value=value #updates its value
--------------------------------------------------------------------------------
/server/aux_patches/.svn/text-base/server.pd.svn-base:
--------------------------------------------------------------------------------
1 | #N canvas 575 90 416 252 10;
2 | #X obj 72 48 loadbang;
3 | #X msg 71 78 \; pd dsp 1;
4 | #X msg 69 127 \; pd dsp 0;
5 | #N canvas 0 27 761 674 new 1;
6 | #X obj 300 300 outlet;
7 | #X obj 300 200 nmb;
8 | #X obj 350 213 nmb;
9 | #X obj 386 250 nmb;
10 | #X obj 400 300 nmb;
11 | #X obj 386 350 nmb;
12 | #X obj 350 386 nmb;
13 | #X obj 300 400 nmb;
14 | #X obj 250 386 nmb;
15 | #X obj 213 350 nmb;
16 | #X obj 200 300 nmb;
17 | #X obj 213 250 nmb;
18 | #X obj 249 213 nmb;
19 | #X obj 300 200 nmb;
20 | #X obj 300 0 nmb;
21 | #X obj 450 40 nmb;
22 | #X obj 559 150 nmb;
23 | #X obj 600 300 nmb;
24 | #X obj 559 450 nmb;
25 | #X obj 450 559 nmb;
26 | #X obj 300 600 nmb;
27 | #X obj 150 559 nmb;
28 | #X obj 40 450 nmb;
29 | #X obj 0 300 nmb;
30 | #X obj 40 149 nmb;
31 | #X obj 149 40 nmb;
32 | #X obj 299 0 nmb;
33 | #X connect 5 0 0 0;
34 | #X connect 17 0 0 0;
35 | #X restore 201 32 pd new;
36 | #X obj 252 179 netsend;
37 | #X obj 271 132 r pyata;
38 | #X msg 194 148 disconnect;
39 | #X obj 394 103 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
40 | -1 -1;
41 | #X obj 265 32 netreceive 3000 0 old;
42 | #X obj 252 64 loadbang;
43 | #X msg 252 110 connect localhost 3001;
44 | #X obj 252 86 del 6000;
45 | #X floatatom 252 201 5 0 0 0 - - -;
46 | #X obj 173 99 print a;
47 | #X msg 271 155 send \$1 \$2;
48 | #X connect 0 0 1 0;
49 | #X connect 4 0 12 0;
50 | #X connect 5 0 14 0;
51 | #X connect 6 0 4 0;
52 | #X connect 9 0 11 0;
53 | #X connect 9 0 6 0;
54 | #X connect 9 0 13 0;
55 | #X connect 10 0 4 0;
56 | #X connect 11 0 7 0;
57 | #X connect 11 0 10 0;
58 | #X connect 14 0 4 0;
59 |
--------------------------------------------------------------------------------
/server/basic_classes/comment.py:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a comment box
5 | #
6 | # autor: jeraman
7 | # date: 14/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 |
12 | from box import *
13 |
14 | #number class itself
15 | class Comment (Box):
16 | #constructor
17 | def __init__(self, x, y,text, id=-1):
18 | self.text = text
19 | Box.__init__(self,x, y, id)
20 |
21 | def create(self):
22 | command = Box.canvas + "text " + str(self.x) + " " + str(self.y) + " " + self.text + "; "
23 | Box.snd.send_pd(command)
24 | Box.create(self)
25 |
26 | #edits this object
27 | def edit(self, text):
28 | self.unselect() #unselects
29 | self.click() #selects this
30 |
31 | command = ""
32 | for i in text: #sends all key pressed
33 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
34 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
35 | Box.snd.send_pd(command)
36 | self.unselect() #unselects this
37 | #ajeita o indice atual do objeto na memoria do pd
38 | temp = memory_box.pop(search_box(self))
39 | memory_box.append(temp)
40 |
41 | self.text = text
42 |
43 |
44 | #aux static function to debug this class
45 | @staticmethod
46 | def debug():
47 | box = Comment(20, 20, "alo!", 0)
48 | print box.edit("ola")
--------------------------------------------------------------------------------
/server/static/js/objects.js:
--------------------------------------------------------------------------------
1 | // List of "supported' objects with number of inlets and outlets
2 |
3 | var objectDictionary = {
4 | 'osc~' : {inlets: 2, outlets: 1},
5 | 'mtof' : {inlets: 1, outlets: 1},
6 | 'random' : {inlets: 2, outlets: 1},
7 | 'metro' : {inlets: 2, outlets: 1},
8 | '+' : {inlets: 2, outlets: 1},
9 | 'phasor~' : {inlets: 2, outlets: 1},
10 | '*' : {inlets: 2, outlets: 1},
11 | '*~' : {inlets: 2, outlets: 1},
12 | '+~' : {inlets: 2, outlets: 1},
13 | '/' : {inlets: 2, outlets: 1},
14 | '/~' : {inlets: 2, outlets: 1},
15 | 'expr' : {inlets: 1, outlets: 1},
16 | 'expr~' : {inlets: 1, outlets: 1},
17 | 'float' : {inlets: 2, outlets: 1},
18 | 'f' : {inlets: 2, outlets: 1},
19 | 'select' : {inlets: 2, outlets: 2}, // TODO: has dynamic outlets
20 | '>' : {inlets: 2, outlets: 1},
21 | '<' : {inlets: 2, outlets: 1},
22 | '>=' : {inlets: 2, outlets: 1},
23 | '<=' : {inlets: 2, outlets: 1},
24 | '==' : {inlets: 2, outlets: 1},
25 | 'delay' : {inlets: 2, outlets: 1},
26 | 'timer' : {inlets: 2, outlets: 1},
27 | 'pipe' : {inlets: 2, outlets: 1},
28 | 'trigger' : {inlets: 1, outlets: 2}, // TODO: has dynamic outlets
29 | 't' : {inlets: 1, outlets: 2}, // TODO: has dynamic outlets
30 | 'send' : {inlets: 1, outlets: 0},
31 | 's' : {inlets: 1, outlets: 0},
32 | 'send~' : {inlets: 1, outlets: 0},
33 | 'receive' : {inlets: 0, outlets: 1},
34 | 'r' : {inlets: 0, outlets: 1},
35 | 'receive~' : {inlets: 0, outlets: 1},
36 | 'pack' : {inlets: 2, outlets: 1}, // TODO: has dynamic inlets
37 | 'unpack' : {inlets: 1, outlets: 2}, // TODO: has dynamic outlets
38 | 'print' : {inlets: 1, outlets: 0}, // for debugging purposes
39 | };
40 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/comment.py.svn-base:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a comment box
5 | #
6 | # autor: jeraman
7 | # date: 14/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 |
12 | from box import *
13 |
14 | #number class itself
15 | class Comment (Box):
16 | #constructor
17 | def __init__(self, x, y,text, id=-1):
18 | self.text = text
19 | Box.__init__(self,x, y, id)
20 |
21 | def create(self):
22 | command = Box.canvas + "text " + str(self.x) + " " + str(self.y) + " " + self.text + "; "
23 | Box.snd.send_pd(command)
24 | Box.create(self)
25 |
26 | #edits this object
27 | def edit(self, text):
28 | self.unselect() #unselects
29 | self.click() #selects this
30 |
31 | command = ""
32 | for i in text: #sends all key pressed
33 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
34 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
35 | Box.snd.send_pd(command)
36 | self.unselect() #unselects this
37 | #ajeita o indice atual do objeto na memoria do pd
38 | temp = memory_box.pop(search_box(self))
39 | memory_box.append(temp)
40 |
41 | self.text = text
42 |
43 |
44 | #aux static function to debug this class
45 | @staticmethod
46 | def debug():
47 | box = Comment(20, 20, "alo!", 0)
48 | print box.edit("ola")
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/object.py.svn-base:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a generic Object box
5 | #
6 | # autor: jeraman
7 | # date: 13/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 | from box import *
12 |
13 |
14 |
15 |
16 | #box class itself
17 | class Object (Box):
18 | #constructor
19 | def __init__(self, x, y, label, id=-1):
20 | self.label = label
21 | Box.__init__(self,x, y, id)
22 |
23 |
24 | def create(self):
25 | command = Box.canvas + "obj " + str(self.x) + " " + str(self.y) + " " + self.label + "; "
26 | Box.snd.send_pd(command)
27 | Box.create(self)
28 |
29 |
30 | #edits this object
31 | def edit(self, label):
32 | self.unselect() #unselects
33 | self.click() #selects this
34 |
35 | command = ""
36 | for i in label: #sends all key pressed
37 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
38 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
39 |
40 | Box.snd.send_pd(command)
41 | self.unselect() #unselects this
42 | #ajeita o indice atual do objeto na memoria do pd
43 | temp = memory_box.pop(search_box(self))
44 | memory_box.append(temp)
45 | self.label = label
46 |
47 |
48 | #aux static function to debug this class
49 | @staticmethod
50 | def debug():
51 | o = Object(10, 10, 0, "dac~")
52 | print o.edit("osc~")
53 | print o.edit("")
54 |
--------------------------------------------------------------------------------
/server/basic_classes/object.py:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a generic Object box
5 | #
6 | # autor: jeraman
7 | # date: 13/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 | from box import *
12 |
13 |
14 |
15 |
16 | #box class itself
17 | class Object (Box):
18 | #constructor
19 | def __init__(self, x, y, label, id=-1):
20 | self.label = label
21 | Box.__init__(self,x, y, id)
22 |
23 |
24 | def create(self):
25 | #print "Object.create()"
26 | command = Box.canvas + "obj " + str(self.x) + " " + str(self.y) + " " + self.label + "; "
27 | Box.snd.send_pd(command)
28 | Box.create(self)
29 |
30 |
31 | #edits this object
32 | def edit(self, label):
33 | self.unselect() #unselects
34 | self.click() #selects this
35 |
36 | command = ""
37 | for i in label: #sends all key pressed
38 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
39 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
40 |
41 | Box.snd.send_pd(command)
42 | self.unselect() #unselects this
43 | #ajeita o indice atual do objeto na memoria do pd
44 | temp = memory_box.pop(search_box(self))
45 | memory_box.append(temp)
46 | self.label = label
47 |
48 |
49 | #aux static function to debug this class
50 | @staticmethod
51 | def debug():
52 | o = Object(10, 10, 0, "dac~")
53 | print o.edit("osc~")
54 | print o.edit("")
55 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/entries:
--------------------------------------------------------------------------------
1 | 10
2 |
3 | dir
4 | 100
5 | http://pyata.googlecode.com/svn/trunk/pyata/src/aux_patches
6 | http://pyata.googlecode.com/svn
7 |
8 |
9 |
10 | 2010-04-26T19:52:22.579708Z
11 | 91
12 | isto.definitivamente.nao.e.um.email@gmail.com
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 2377cdc7-5ca1-53dc-26af-935eca9ddf1a
28 |
29 | server.pd
30 | file
31 |
32 |
33 |
34 |
35 | 2011-09-14T21:35:16.000000Z
36 | b6b4fe078b40652b1af73ff2d12c932f
37 | 2010-04-26T19:52:22.579708Z
38 | 91
39 | isto.definitivamente.nao.e.um.email@gmail.com
40 | has-props
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | 1325
62 |
63 | sym.pd
64 | file
65 |
66 |
67 |
68 |
69 | 2011-09-14T21:35:16.000000Z
70 | fa407fe9a4aacb97f7e60ee4a189886b
71 | 2010-04-21T17:58:55.054548Z
72 | 51
73 | isto.definitivamente.nao.e.um.email@gmail.com
74 | has-props
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | 318
96 |
97 | nmb.pd
98 | file
99 |
100 |
101 |
102 |
103 | 2011-09-14T21:35:16.000000Z
104 | 350643a7a4a481046acae9a7b098330e
105 | 2010-04-21T17:58:55.054548Z
106 | 51
107 | isto.definitivamente.nao.e.um.email@gmail.com
108 | has-props
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 | 315
130 |
131 | id.pd
132 | file
133 |
134 |
135 |
136 |
137 | 2011-09-14T21:35:16.000000Z
138 | 02321621b35e3b546fa05a383e94346b
139 | 2010-04-21T17:58:55.054548Z
140 | 51
141 | isto.definitivamente.nao.e.um.email@gmail.com
142 | has-props
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 | 2181
164 |
165 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | PuréeData is a browser-based PureData interface for a remote, central server that allows live, collaborative patching for anyone, anywhere.
2 |
3 | Using Pd's internal messaging system and an accompanying python script, PureéData allows anyone with a browser to modify a public, shared patch running on a server and listen to the results over an internet audio stream.
4 |
5 | ### Installation
6 |
7 | 1. Clone into your server
8 | 2. Install Pd-extended (i.e. for Ubuntu): http://puredata.info/docs/faq/debian
9 | 3. Install web.py: `pip install web.py`
10 | 4. Change all occurrences of /var/www... to the location of the repo (sorry, this should be set up better)
11 | 5. Install icecast: `apt-get install icecast2`
12 | 6. Configure icecast: TODO
13 |
14 | ### Info
15 |
16 | The project is freely available for forking on GitHub. PureéData is in part adapted from code by Jeraman.
17 |
18 | PuréeData is a 2011 commission of New Radio and Performing Arts, Inc. (a.k.a Ether-Ore) for its Turbulence web site (http://www.turbulence.org). It was made possible with funding from the Jerome Foundation.
19 |
20 | Ted Hayes is a poet-inventor: conceiving objects and experiences that explore the sublime and the enigmatic through recombination and deconstruction. He is a proponent of what he has dubbed “Research Art,” or art as science experiment, and actively investigates the themes, technologies and ramifications of autonomy, emergence, semiotics, pattern recognition, and neural networks.
21 |
22 | Ted’s works range from a group of language-inventing robots to a mythological city-founding ritual for soprano and string quartet, is a graduate of NYU’s Interactive Telecommunications Program, and is recently the recipient of a New Radio and Performing Arts commission. His operating principle is, in a word, poetry: to pique with enigma and confound with beauty. See more of Ted’s work at http://log.liminastudio.com.
23 |
24 | PuréeData 2010/2011 Ted Hayes & Sofy Yuditskaya
25 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/message.py.svn-base:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a message box
5 | #
6 | # autor: jeraman
7 | # date: 14/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 |
12 | from box import *
13 |
14 | #number class itself
15 | class Message (Box):
16 | #constructor
17 | def __init__(self, x, y,text, id=-1):
18 | self.text = text
19 | Box.__init__(self,x, y, id)
20 |
21 | def create(self):
22 | command = Box.canvas + "msg " + str(self.x) + " " + str(self.y) + " " + self.text + "; "
23 | Box.snd.send_pd(command)
24 | Box.create(self)
25 |
26 | #edits this object
27 | def edit(self, text):
28 | self.unselect() #unselects
29 | self.click() #selects this
30 |
31 | command = ""
32 | for i in text: #sends all key pressed
33 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
34 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
35 | Box.snd.send_pd(command)
36 | self.unselect() #unselects this
37 | #ajeita o indice atual do objeto na memoria do pd
38 | temp = memory_box.pop(search_box(self))
39 | memory_box.append(temp)
40 | self.text = text
41 |
42 |
43 | def click(self):
44 | #sets no-edit mode
45 | command = Box.canvas + "editmode 1 ; "
46 | command += Box.canvas + "editmode 0 ; "
47 | Box.snd.send_pd(command)
48 | Box.click(self)
49 | #sets edit mode
50 | command = Box.canvas + "editmode 1 ; "
51 | Box.snd.send_pd(command)
52 |
53 |
54 | #aux static function to debug this class
55 | @staticmethod
56 | def debug():
57 | box = Message(20, 20, "alo!", 0)
58 | print box.edit("ola")
--------------------------------------------------------------------------------
/server/basic_classes/message.py:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a message box
5 | #
6 | # autor: jeraman
7 | # date: 14/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 |
12 | from box import *
13 |
14 | #number class itself
15 | class Message (Box):
16 | #constructor
17 | def __init__(self, x, y,text, id=-1):
18 | self.text = text
19 | Box.__init__(self,x, y, id)
20 |
21 | def create(self):
22 | command = Box.canvas + "msg " + str(self.x) + " " + str(self.y) + " " + self.text + "; "
23 | Box.snd.send_pd(command)
24 | Box.create(self)
25 |
26 | #edits this object
27 | def edit(self, text):
28 | self.unselect() #unselects
29 | self.click() #selects this
30 |
31 | command = ""
32 | for i in text: #sends all key pressed
33 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
34 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
35 | Box.snd.send_pd(command)
36 | self.unselect() #unselects this
37 | #ajeita o indice atual do objeto na memoria do pd
38 | temp = memory_box.pop(search_box(self))
39 | memory_box.append(temp)
40 | self.text = text
41 |
42 |
43 | def click(self):
44 | #sets no-edit mode
45 | command = Box.canvas + "editmode 1 ; "
46 | command += Box.canvas + "editmode 0 ; "
47 | Box.snd.send_pd(command)
48 | Box.click(self)
49 | #sets edit mode
50 | command = Box.canvas + "editmode 1 ; "
51 | Box.snd.send_pd(command)
52 | return True
53 |
54 |
55 | #aux static function to debug this class
56 | @staticmethod
57 | def debug():
58 | box = Message(20, 20, "alo!", 0)
59 | print box.edit("ola")
--------------------------------------------------------------------------------
/server/static/css/pureedata.css:
--------------------------------------------------------------------------------
1 | .draggable {
2 | cursor:default;
3 | }
4 | .pdObject {
5 | position:fixed;
6 | width: 75px;
7 | height:15px;
8 | padding-top: 2px;
9 | padding-left: 4px;
10 | background-color: #eeeeee;
11 | border: 1px solid #000;
12 | font-family: Arial;
13 | font-size: 12px;
14 | cursor:default;
15 | }
16 | .pdMessage {
17 | background-color: #dddddd;
18 | cursor: pointer;
19 | }
20 | /* iolets default to control (unfilled) */
21 | .iolet {
22 | position: absolute;
23 | z-index: 100;
24 | width:10px;
25 | height:2px;
26 | background-color: #eeeeee;
27 | border: 1px solid #000;
28 | }
29 | .inlet {
30 | top:-2px;
31 | }
32 | .outlet {
33 | bottom:-2px;
34 | cursor:pointer;
35 | }
36 | .filled {
37 | /* for signal iolets */
38 | background-color: #999999;
39 | }
40 | .line {
41 | position: absolute;
42 | /* width: 200px;*/
43 | height: 2px;
44 | border: 0px;
45 | background-color: #222;
46 | cursor: default; /* changed dynamically */
47 | }
48 | .objDelete {
49 | font-size: 8px;
50 | display: none;
51 | right: 5px;
52 | top: 2px;
53 | position: absolute;
54 | cursor: pointer;
55 | }
56 | .highlightBox {
57 | padding: 8px;
58 | font-size: 14px;
59 | background: #70273A;
60 | }
61 | .customInput {
62 | border: 1px solid #AAA;
63 | padding: 3px;
64 | color: #111;
65 | }
66 | .helpButton {
67 | width: 127px;
68 | font-size: 11px;
69 | margin-top: 2px;
70 | }
71 | .specialObject {
72 | background: #333;
73 | color: #eee;
74 | }
75 | #traceBox {
76 | position: fixed;
77 | top: 5px;
78 | right: 5px;
79 | text-align: right;
80 | font-family: Arial;
81 | font-size: smaller;
82 | }
83 | #disconnectCB {
84 |
85 | }
86 | #infoBox {
87 | /*font-size: 12px;*/
88 | }
89 | .infoBox {
90 | font-size: 12px;
91 | }
92 | #infoline {
93 | font-family: Arial, Helvetica, sans-serif;
94 | font-variant: small-caps;
95 | font-size: 11px;
96 | text-align: center;
97 | }
98 | #infoContainer {
99 | /* position: absolute;*/
100 | /* bottom: 8px;*/
101 | }
102 | #toolsContainer {
103 | position: fixed;
104 | top: 8px;
105 | right: 8px;
106 | width: 127px;
107 | }
108 |
--------------------------------------------------------------------------------
/server/static/js/jquery.easyRotate.js:
--------------------------------------------------------------------------------
1 | /*
2 | * jquery.easyRotate 1.0 - 3-11-2010
3 | * author: Jordan Andree (jordan@noblegiant.com)
4 | * http://noblegiant.com
5 | *
6 | * Written to ease the implementation of element rotation for cross-browser support
7 | * Feel free to do whatever you want with this file
8 | *
9 | */
10 | (function ($) {
11 |
12 | // base function
13 | $.fn.extend({
14 | easyRotate: function(options) {
15 |
16 | // default config
17 | var defaults = {
18 | degrees: 0
19 | };
20 |
21 | // extend the options
22 | var options = $.extend(defaults, options);
23 |
24 | // return function
25 | return this.each(function() {
26 |
27 | // the object
28 | var obj = this;
29 |
30 | // the degrees param
31 | var deg = options.degrees;
32 |
33 | // calculations to get our matrix
34 | var deg2radians = Math.PI * 2 / 360;
35 | var rad = deg * deg2radians;
36 | var costheta = Math.cos(rad);
37 | var sintheta = Math.sin(rad);
38 |
39 | // vars for cosin and sin
40 | var a = parseFloat(costheta).toFixed(8);
41 | var c = parseFloat(-sintheta).toFixed(8);
42 | var b = parseFloat(sintheta).toFixed(8);
43 | var d = parseFloat(costheta).toFixed(8);
44 |
45 | // the matrix string
46 | var matrix = "matrix(" + a + ", " + b + ", " + c + ", " + d + ", 0, 0);";
47 |
48 | // if IE filters are present
49 | if (obj.filters) {
50 |
51 | obj.style.filter = "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand');";
52 | obj.filters.item(0).M11 = costheta;
53 | obj.filters.item(0).M12 = -sintheta;
54 | obj.filters.item(0).M21 = sintheta;
55 | obj.filters.item(0).M22 = costheta;
56 |
57 | // else for Safari, Firefox, etc
58 | } else {
59 | obj.setAttribute("style", "position:absolute; -moz-transform: " + matrix +
60 | "; -webkit-transform: " + matrix +
61 | "; -o-transform: " + matrix + "");
62 |
63 |
64 | }
65 |
66 |
67 |
68 |
69 | });
70 | }
71 | });
72 | })(jQuery);
73 |
74 |
75 |
--------------------------------------------------------------------------------
/server/aux_patches/id.pd:
--------------------------------------------------------------------------------
1 | #N canvas 10 210 705 435 10;
2 | #X floatatom 56 -54 5 0 0 0 - - -;
3 | #X floatatom 39 -194 5 0 0 0 - - -;
4 | #X floatatom 373 -109 5 0 0 0 - - -;
5 | #X text 34 -254 refreshs on the first;
6 | #X obj 358 -62 ==;
7 | #X obj 39 -218 r id;
8 | #X obj 263 145 s id;
9 | #X msg 248 112 20;
10 | #X floatatom 358 -41 5 0 0 0 - - -;
11 | #X floatatom 358 -162 5 0 0 0 - - -;
12 | #X text 349 -242 resets the id;
13 | #X floatatom 121 109 8 0 0 0 - - -;
14 | #X obj 121 141 outlet;
15 | #X obj -1 -128 != 0;
16 | #X msg 288 113 0;
17 | #X msg 268 79 10;
18 | #X obj -1 -155 f;
19 | #X obj 115 -186 spigot;
20 | #X obj 115 -208 pipe 10;
21 | #X obj 113 -137 del 10;
22 | #X floatatom 64 -107 5 0 0 0 - - -;
23 | #X obj -25 -178 del 10;
24 | #X floatatom 132 -46 5 0 0 0 - - -;
25 | #X obj 130 -72 == 0;
26 | #X obj 89 -17 &&;
27 | #X floatatom 91 12 5 0 0 0 - - -;
28 | #X obj 142 -109 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
29 | -1 -1;
30 | #X obj 8 -95 pipe 10;
31 | #X obj 358 -215 r decrement;
32 | #X obj 352 145 s decrement;
33 | #X obj 242 -109 f 0;
34 | #X obj 421 -43 spigot;
35 | #X obj 421 -16 - 1;
36 | #X floatatom 351 1 5 0 0 0 - - -;
37 | #X msg 352 120 20;
38 | #X floatatom 462 -15 5 0 0 0 - - -;
39 | #X obj 352 23 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
40 | -1;
41 | #X msg 400 119 19;
42 | #X msg 456 121 18;
43 | #X obj 414 -133 pipe 1;
44 | #X msg 308 -195 0;
45 | #X connect 0 0 24 0;
46 | #X connect 1 0 16 1;
47 | #X connect 1 0 21 0;
48 | #X connect 2 0 4 1;
49 | #X connect 4 0 8 0;
50 | #X connect 5 0 1 0;
51 | #X connect 7 0 6 0;
52 | #X connect 8 0 31 1;
53 | #X connect 9 0 4 0;
54 | #X connect 9 0 39 0;
55 | #X connect 11 0 12 0;
56 | #X connect 13 0 26 0;
57 | #X connect 13 0 27 0;
58 | #X connect 14 0 6 0;
59 | #X connect 15 0 6 0;
60 | #X connect 16 0 13 0;
61 | #X connect 16 0 18 0;
62 | #X connect 17 0 19 0;
63 | #X connect 17 0 20 0;
64 | #X connect 17 0 30 1;
65 | #X connect 18 0 17 0;
66 | #X connect 19 0 30 0;
67 | #X connect 21 0 16 0;
68 | #X connect 22 0 24 1;
69 | #X connect 23 0 22 0;
70 | #X connect 24 0 25 0;
71 | #X connect 25 0 17 1;
72 | #X connect 26 0 30 0;
73 | #X connect 27 0 0 0;
74 | #X connect 28 0 9 0;
75 | #X connect 30 0 2 0;
76 | #X connect 30 0 11 0;
77 | #X connect 30 0 23 0;
78 | #X connect 31 0 32 0;
79 | #X connect 31 0 35 0;
80 | #X connect 32 0 33 0;
81 | #X connect 33 0 30 1;
82 | #X connect 33 0 36 0;
83 | #X connect 34 0 29 0;
84 | #X connect 36 0 30 0;
85 | #X connect 37 0 29 0;
86 | #X connect 38 0 29 0;
87 | #X connect 39 0 31 0;
88 | #X connect 40 0 9 0;
89 | #X coords 0 -1 1 1 80 30 1 100 100;
90 |
--------------------------------------------------------------------------------
/server/aux_patches/.svn/text-base/id.pd.svn-base:
--------------------------------------------------------------------------------
1 | #N canvas 10 210 705 435 10;
2 | #X floatatom 56 -54 5 0 0 0 - - -;
3 | #X floatatom 39 -194 5 0 0 0 - - -;
4 | #X floatatom 373 -109 5 0 0 0 - - -;
5 | #X text 34 -254 refreshs on the first;
6 | #X obj 358 -62 ==;
7 | #X obj 39 -218 r id;
8 | #X obj 263 145 s id;
9 | #X msg 248 112 20;
10 | #X floatatom 358 -41 5 0 0 0 - - -;
11 | #X floatatom 358 -162 5 0 0 0 - - -;
12 | #X text 349 -242 resets the id;
13 | #X floatatom 121 109 8 0 0 0 - - -;
14 | #X obj 121 141 outlet;
15 | #X obj -1 -128 != 0;
16 | #X msg 288 113 0;
17 | #X msg 268 79 10;
18 | #X obj -1 -155 f;
19 | #X obj 115 -186 spigot;
20 | #X obj 115 -208 pipe 10;
21 | #X obj 113 -137 del 10;
22 | #X floatatom 64 -107 5 0 0 0 - - -;
23 | #X obj -25 -178 del 10;
24 | #X floatatom 132 -46 5 0 0 0 - - -;
25 | #X obj 130 -72 == 0;
26 | #X obj 89 -17 &&;
27 | #X floatatom 91 12 5 0 0 0 - - -;
28 | #X obj 142 -109 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144
29 | -1 -1;
30 | #X obj 8 -95 pipe 10;
31 | #X obj 358 -215 r decrement;
32 | #X obj 352 145 s decrement;
33 | #X obj 242 -109 f 0;
34 | #X obj 421 -43 spigot;
35 | #X obj 421 -16 - 1;
36 | #X floatatom 351 1 5 0 0 0 - - -;
37 | #X msg 352 120 20;
38 | #X floatatom 462 -15 5 0 0 0 - - -;
39 | #X obj 352 23 bng 15 250 50 0 empty empty empty 17 7 0 10 -262144 -1
40 | -1;
41 | #X msg 400 119 19;
42 | #X msg 456 121 18;
43 | #X obj 414 -133 pipe 1;
44 | #X msg 308 -195 0;
45 | #X connect 0 0 24 0;
46 | #X connect 1 0 16 1;
47 | #X connect 1 0 21 0;
48 | #X connect 2 0 4 1;
49 | #X connect 4 0 8 0;
50 | #X connect 5 0 1 0;
51 | #X connect 7 0 6 0;
52 | #X connect 8 0 31 1;
53 | #X connect 9 0 4 0;
54 | #X connect 9 0 39 0;
55 | #X connect 11 0 12 0;
56 | #X connect 13 0 26 0;
57 | #X connect 13 0 27 0;
58 | #X connect 14 0 6 0;
59 | #X connect 15 0 6 0;
60 | #X connect 16 0 13 0;
61 | #X connect 16 0 18 0;
62 | #X connect 17 0 19 0;
63 | #X connect 17 0 20 0;
64 | #X connect 17 0 30 1;
65 | #X connect 18 0 17 0;
66 | #X connect 19 0 30 0;
67 | #X connect 21 0 16 0;
68 | #X connect 22 0 24 1;
69 | #X connect 23 0 22 0;
70 | #X connect 24 0 25 0;
71 | #X connect 25 0 17 1;
72 | #X connect 26 0 30 0;
73 | #X connect 27 0 0 0;
74 | #X connect 28 0 9 0;
75 | #X connect 30 0 2 0;
76 | #X connect 30 0 11 0;
77 | #X connect 30 0 23 0;
78 | #X connect 31 0 32 0;
79 | #X connect 31 0 35 0;
80 | #X connect 32 0 33 0;
81 | #X connect 33 0 30 1;
82 | #X connect 33 0 36 0;
83 | #X connect 34 0 29 0;
84 | #X connect 36 0 30 0;
85 | #X connect 37 0 29 0;
86 | #X connect 38 0 29 0;
87 | #X connect 39 0 31 0;
88 | #X connect 40 0 9 0;
89 | #X coords 0 -1 1 1 80 30 1 100 100;
90 |
--------------------------------------------------------------------------------
/server/basic_classes/symbol.py:
--------------------------------------------------------------------------------
1 | ##########################################################
2 | ##########################################################
3 | # description: abstract class that represents a generic Symbol box
4 | #
5 | # autor: jeraman
6 | # date: 13/04/2010
7 | ##########################################################
8 | ##########################################################
9 |
10 | from box import *
11 | from socket import *
12 |
13 |
14 |
15 | #number class itself
16 | class Symbol (Box):
17 | rcv = ""
18 |
19 | #constructor
20 | def __init__(self, x, y, id=-1):
21 | self.value = "symbol"
22 | Box.__init__(self,x, y, id)
23 |
24 | def create(self):
25 | command = Box.canvas + "obj " + str(self.x) + " " + str(self.y) + " sym ; "
26 | Box.snd.send_pd(command)
27 | Box.create(self)
28 | command = "id " + str(search_box(self)+1) + " ; "
29 | #print command
30 | Box.snd.send_pd(command)
31 | sleep(0.1)
32 |
33 | @staticmethod
34 | def init_socket(r):
35 | Symbol.rcv = r
36 |
37 | #get the value from pd
38 | def get_value(self):
39 | #temp = Symbol.rcv.recv(32)
40 | #temp = temp[:(len(temp)-2)]
41 | #brk = temp.rfind("\n")
42 |
43 | #if brk == -1: #se nao encontrou
44 | # self.value = temp
45 | #else:
46 | # print brk
47 | # self.value = temp[(brk+1):len(temp)] #se encontrou
48 |
49 | return self.value
50 |
51 |
52 | #edits this object
53 | def set(self, value):
54 | #sets no-edit mode
55 | command = Box.canvas + "editmode 1 ; "
56 | command += Box.canvas + "editmode 0 ; "
57 | Box.snd.send_pd(command)
58 |
59 | self.click() #clicks
60 |
61 | for i in self.value: #delete all previous keys
62 | command += Box.canvas + "key 1 8 0 ; "
63 | command += Box.canvas + "key 0 8 0 ; "
64 | for i in value: #sends all key pressed
65 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
66 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
67 | Box.snd.send_pd(command)
68 | command = Box.canvas + "key 1 10 0 ;" # press enter
69 | command += Box.canvas + "key 0 10 0 ;"
70 | #self.value = self.get_value()
71 | command += Box.canvas + "editmode 1 ; "
72 | Box.snd.send_pd(command)
73 |
74 | self.value=value
75 |
76 |
77 | #aux static function to debug this class
78 | @staticmethod
79 | def debug():
80 | o = Symbol(10, 10, 0)
81 | print o.set("mesa")
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/symbol.py.svn-base:
--------------------------------------------------------------------------------
1 | ##########################################################
2 | ##########################################################
3 | # description: abstract class that represents a generic Symbol box
4 | #
5 | # autor: jeraman
6 | # date: 13/04/2010
7 | ##########################################################
8 | ##########################################################
9 |
10 | from box import *
11 | from socket import *
12 |
13 |
14 |
15 | #number class itself
16 | class Symbol (Box):
17 | rcv = ""
18 |
19 | #constructor
20 | def __init__(self, x, y, id=-1):
21 | self.value = "symbol"
22 | Box.__init__(self,x, y, id)
23 |
24 | def create(self):
25 | command = Box.canvas + "obj " + str(self.x) + " " + str(self.y) + " sym ; "
26 | Box.snd.send_pd(command)
27 | Box.create(self)
28 | command = "id " + str(search_box(self)+1) + " ; "
29 | #print command
30 | Box.snd.send_pd(command)
31 | sleep(0.1)
32 |
33 | @staticmethod
34 | def init_socket(r):
35 | Symbol.rcv = r
36 |
37 | #get the value from pd
38 | def get_value(self):
39 | #temp = Symbol.rcv.recv(32)
40 | #temp = temp[:(len(temp)-2)]
41 | #brk = temp.rfind("\n")
42 |
43 | #if brk == -1: #se nao encontrou
44 | # self.value = temp
45 | #else:
46 | # print brk
47 | # self.value = temp[(brk+1):len(temp)] #se encontrou
48 |
49 | return self.value
50 |
51 |
52 | #edits this object
53 | def set(self, value):
54 | #sets no-edit mode
55 | command = Box.canvas + "editmode 1 ; "
56 | command += Box.canvas + "editmode 0 ; "
57 | Box.snd.send_pd(command)
58 |
59 | self.click() #clicks
60 |
61 | for i in self.value: #delete all previous keys
62 | command += Box.canvas + "key 1 8 0 ; "
63 | command += Box.canvas + "key 0 8 0 ; "
64 | for i in value: #sends all key pressed
65 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
66 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
67 | Box.snd.send_pd(command)
68 | command = Box.canvas + "key 1 10 0 ;" # press enter
69 | command += Box.canvas + "key 0 10 0 ;"
70 | #self.value = self.get_value()
71 | command += Box.canvas + "editmode 1 ; "
72 | Box.snd.send_pd(command)
73 |
74 | self.value=value
75 |
76 |
77 | #aux static function to debug this class
78 | @staticmethod
79 | def debug():
80 | o = Symbol(10, 10, 0)
81 | print o.set("mesa")
--------------------------------------------------------------------------------
/server/basic_classes/.svn/entries:
--------------------------------------------------------------------------------
1 | 10
2 |
3 | dir
4 | 100
5 | http://pyata.googlecode.com/svn/trunk/pyata/src/box_classes
6 | http://pyata.googlecode.com/svn
7 |
8 |
9 |
10 | 2010-04-26T19:57:42.044653Z
11 | 92
12 | isto.definitivamente.nao.e.um.email@gmail.com
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 | 2377cdc7-5ca1-53dc-26af-935eca9ddf1a
28 |
29 | box.py
30 | file
31 |
32 |
33 |
34 |
35 | 2011-09-14T21:35:16.000000Z
36 | 77296e95df3c63f14b380baaa7c51ecd
37 | 2010-04-22T16:19:53.452347Z
38 | 53
39 | isto.definitivamente.nao.e.um.email@gmail.com
40 | has-props
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 | 6069
62 |
63 | number.py
64 | file
65 |
66 |
67 |
68 |
69 | 2011-09-14T21:35:16.000000Z
70 | 6206ee8bbbffb6902ef6b71484b5b7f7
71 | 2010-04-26T19:52:22.579708Z
72 | 91
73 | isto.definitivamente.nao.e.um.email@gmail.com
74 | has-props
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 | 3667
96 |
97 | __init__.py
98 | file
99 |
100 |
101 |
102 |
103 | 2011-09-14T21:35:16.000000Z
104 | d41d8cd98f00b204e9800998ecf8427e
105 | 2010-04-15T14:40:42.499010Z
106 | 27
107 | isto.definitivamente.nao.e.um.email@gmail.com
108 | has-props
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 | 0
130 |
131 | connection.py
132 | file
133 |
134 |
135 |
136 |
137 | 2011-09-14T21:35:16.000000Z
138 | 54bf0ea29fa247475b006ab9b2d79ff3
139 | 2010-04-26T19:52:22.579708Z
140 | 91
141 | isto.definitivamente.nao.e.um.email@gmail.com
142 | has-props
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 | 3679
164 |
165 | comment.py
166 | file
167 |
168 |
169 |
170 |
171 | 2011-09-14T21:35:16.000000Z
172 | 49739ddd9e1b0d1d2ead6169ac9c650b
173 | 2010-04-15T14:40:42.499010Z
174 | 27
175 | isto.definitivamente.nao.e.um.email@gmail.com
176 | has-props
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 | 1449
198 |
199 | message.py
200 | file
201 |
202 |
203 |
204 |
205 | 2011-09-14T21:35:16.000000Z
206 | 1a469eb65fbe607d108a9cf9183b98fd
207 | 2010-04-19T15:24:48.232741Z
208 | 44
209 | isto.definitivamente.nao.e.um.email@gmail.com
210 | has-props
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 | 1761
232 |
233 | symbol.py
234 | file
235 |
236 |
237 |
238 |
239 | 2011-09-14T21:35:16.000000Z
240 | 79d15d19b7eadd1a1771fc2c9961f0b5
241 | 2010-04-26T19:57:42.044653Z
242 | 92
243 | isto.definitivamente.nao.e.um.email@gmail.com
244 | has-props
245 |
246 |
247 |
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 |
263 |
264 |
265 | 2376
266 |
267 | object.py
268 | file
269 |
270 |
271 |
272 |
273 | 2011-09-14T21:35:16.000000Z
274 | 635d0eaf84d579cce0463fbb999c61af
275 | 2010-04-15T14:40:42.499010Z
276 | 27
277 | isto.definitivamente.nao.e.um.email@gmail.com
278 | has-props
279 |
280 |
281 |
282 |
283 |
284 |
285 |
286 |
287 |
288 |
289 |
290 |
291 |
292 |
293 |
294 |
295 |
296 |
297 |
298 |
299 | 1490
300 |
301 |
--------------------------------------------------------------------------------
/server/Pd.py:
--------------------------------------------------------------------------------
1 |
2 |
3 | ##########################################################
4 | ##########################################################
5 | # description: main class that emulates Pd
6 | #
7 | # autor: jeraman
8 | # date: 16/04/2010
9 | ##########################################################
10 | ##########################################################
11 |
12 |
13 |
14 | from basic_classes.box import *
15 | from basic_classes.object import *
16 | from basic_classes.message import *
17 | from basic_classes.number import *
18 | from basic_classes.symbol import *
19 | from basic_classes.comment import *
20 | from basic_classes.connection import *
21 | from communication import *
22 | from gui_updater import *
23 | from transfer_board import *
24 |
25 |
26 |
27 | class Pd():
28 | #construtor
29 | def __init__(self):
30 | self.c = Communication(True)
31 | self.b = ""
32 | self.tb = TransferBoard()
33 |
34 | #inicializando a api
35 | def init(self, usePdThread=True):
36 | self.c.init_pd(usePdThread)
37 | self.clear()
38 | self.dsp(True)
39 | self.editmode(True)
40 |
41 | self.b = GuiUpdater(self.c.rcv)
42 | self.b.start()
43 |
44 | #finalizando a api
45 | def quit(self):
46 | self.clear()
47 | self.save()
48 | self.dsp(False)
49 | GuiUpdater.finish = True
50 | self.c.finish_pd()
51 |
52 |
53 | #salvando o arquivo
54 | def save(self):
55 | print "Pd: Saving patch"
56 | self.c.save_state(Box.canvas)
57 |
58 | #cleans the patch
59 | def clear(self):
60 | print "Pd: Clearing Patch"
61 | self.c.send_pd(Box.canvas + "clear ; ")
62 | del memory_box[:]
63 | del memory_connections[:]
64 |
65 |
66 |
67 | #modifies the editmode. receives a boolean.
68 | def editmode(self, on_off):
69 | command = Box.canvas + "editmode 1 ; "
70 | if on_off==False:
71 | command += Box.canvas + "editmode 0 ; "
72 | self.c.send_pd(command)
73 |
74 | #modifies the dsp. receives a boolean
75 | def dsp(self, on_off):
76 | if on_off==False:
77 | self.c.send_pd("; pd dsp 0 ; ")
78 | else:
79 | self.c.send_pd("; pd dsp 1 ; ")
80 |
81 | #returns the memory available in Pd
82 | def get_box_list(self):
83 | return memory_box
84 |
85 | #return the connections available in Pd
86 | def get_connection_list(self):
87 | return memory_connections
88 |
89 |
90 |
91 | #################################
92 | ## EDIT MENU METHODS
93 | #################################
94 |
95 | #copy method
96 | def copy(self):
97 | self.tb.copy()
98 |
99 | #paste method
100 | def paste(self, x, y):
101 | self.tb.paste(x, y)
102 |
103 | #cut method
104 | def cut(self):
105 | self.tb.cut()
106 |
107 | #duplicate method
108 | def duplicate(self, x, y):
109 | self.tb.duplicate(x, y)
110 |
111 | #select all method
112 | def selectall(self):
113 | command = Box.canvas + "selectall ; "
114 | self.c.send_pd(command)
115 | self.tb.selectall()
116 |
117 |
118 |
119 | #################################
120 | ## FIND MENU METHODS
121 | #################################
122 |
123 | #finds a given box by its label
124 | def find(self, label):
125 | command = self.canvas + "find " + str(label) + " ; "
126 | self.send.send_pd(command)
127 |
128 | #continues the last find called
129 | def findagain(self):
130 | command = self.canvas + "findagain ; "
131 | self.send.send_pd(command)
132 |
133 | def finderror(self):
134 | command = "; pd finderror"
135 | self.send.send_pd(command)
136 |
137 |
--------------------------------------------------------------------------------
/server/basic_classes/number.py:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a generic Number box
5 | #
6 | # autor: jeraman
7 | # date: 13/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 | from box import *
12 | from socket import *
13 | from time import *
14 |
15 |
16 |
17 | #number class itself
18 | class Number (Box):
19 | #class variables
20 | rcv = ""
21 |
22 | #constructor
23 | def __init__(self, x, y, id =-1):
24 | self.value = 0
25 | Box.__init__(self,x, y, id)
26 |
27 | def create(self):
28 | command = Box.canvas + "obj " + str(self.x) + " " + str(self.y) + " nmb ; "
29 | Box.snd.send_pd(command)
30 | Box.create(self)
31 | command = "id " + str(search_box(self)+1) + " ; "
32 | #print command
33 | Box.snd.send_pd(command)
34 | sleep(0.1)
35 |
36 | @staticmethod
37 | def init_socket(r):
38 | Number.rcv = r
39 |
40 | #get the value from pd
41 | def get_value(self):
42 | sleep(0.1)
43 | return int(self.value)
44 |
45 |
46 | #edits this object
47 | def set(self, value):
48 | #sets no-edit mode
49 | command = Box.canvas + "editmode 1 ; "
50 | command += Box.canvas + "editmode 0 ; "
51 | Box.snd.send_pd(command)
52 |
53 | self.click() #clicks
54 |
55 | #str_value = str(self.value) # transforms the value to str
56 | #for i in str_value: #delete all previous keys
57 | # command += Box.canvas + "key 1 8 0 ; "
58 | # command += Box.canvas + "key 0 8 0 ; "
59 | #Box.snd.send_pd(command)
60 |
61 | str_value = str(value) # transforms the value to str
62 | for i in str_value: #sends all key pressed
63 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
64 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
65 | Box.snd.send_pd(command)
66 |
67 | command = Box.canvas + "key 1 10 0 ; " # press enter
68 | command += Box.canvas + "key 0 10 0 ; "
69 |
70 | #sets edit mode
71 | command += Box.canvas + "editmode 1 ; "
72 |
73 | Box.snd.send_pd(command)
74 |
75 | #increments the lowest amount from the value of a number
76 | def increment(self):
77 | #sets no-edit mode
78 | command = Box.canvas + "editmode 1 ; "
79 | command += Box.canvas + "editmode 0 ; "
80 | Box.snd.send_pd(command)
81 |
82 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
83 | command += Box.canvas + "motion " + str(self.x+1) + " " + str(self.y) + " 0 ; "
84 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y) + " 1 0 ; "
85 | #self.value = self.get_value()
86 |
87 | command += Box.canvas + "editmode 1 ; "
88 | Box.snd.send_pd(command)
89 |
90 | #decrements the lowest amount from the value of a numbe
91 | def decrement(self):
92 | #sets no-edit mode
93 | command = Box.canvas + "editmode 1 ; "
94 | command += Box.canvas + "editmode 0 ; "
95 | Box.snd.send_pd(command)
96 |
97 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
98 | command += Box.canvas + "motion " + str(self.x+1) + " " + str(self.y+2) + " 0 ; "
99 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y+2) + " 1 0 ; "
100 | #self.value = self.get_value()
101 | command += Box.canvas + "editmode 1 ; "
102 | Box.snd.send_pd(command)
103 |
104 |
105 |
106 |
107 | #aux static function to debug this class
108 | @staticmethod
109 | def debug():
110 | o = Number(10, 10, 0)
111 | print o.set(20)
112 | print o.increment()
113 | print o.decrement()
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/number.py.svn-base:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents a generic Number box
5 | #
6 | # autor: jeraman
7 | # date: 13/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 | from box import *
12 | from socket import *
13 | from time import *
14 |
15 |
16 |
17 | #number class itself
18 | class Number (Box):
19 | #class variables
20 | rcv = ""
21 |
22 | #constructor
23 | def __init__(self, x, y, id =-1):
24 | self.value = 0
25 | Box.__init__(self,x, y, id)
26 |
27 | def create(self):
28 | command = Box.canvas + "obj " + str(self.x) + " " + str(self.y) + " nmb ; "
29 | Box.snd.send_pd(command)
30 | Box.create(self)
31 | command = "id " + str(search_box(self)+1) + " ; "
32 | #print command
33 | Box.snd.send_pd(command)
34 | sleep(0.1)
35 |
36 | @staticmethod
37 | def init_socket(r):
38 | Number.rcv = r
39 |
40 | #get the value from pd
41 | def get_value(self):
42 | sleep(0.1)
43 | return int(self.value)
44 |
45 |
46 | #edits this object
47 | def set(self, value):
48 | #sets no-edit mode
49 | command = Box.canvas + "editmode 1 ; "
50 | command += Box.canvas + "editmode 0 ; "
51 | Box.snd.send_pd(command)
52 |
53 | self.click() #clicks
54 |
55 | #str_value = str(self.value) # transforms the value to str
56 | #for i in str_value: #delete all previous keys
57 | # command += Box.canvas + "key 1 8 0 ; "
58 | # command += Box.canvas + "key 0 8 0 ; "
59 | #Box.snd.send_pd(command)
60 |
61 | str_value = str(value) # transforms the value to str
62 | for i in str_value: #sends all key pressed
63 | command += Box.canvas + "key 1 " + str(ord(i)) + " 0 ; "
64 | command += Box.canvas + "key 0 " + str(ord(i)) + " 0 ; "
65 | Box.snd.send_pd(command)
66 |
67 | command = Box.canvas + "key 1 10 0 ; " # press enter
68 | command += Box.canvas + "key 0 10 0 ; "
69 |
70 | #sets edit mode
71 | command += Box.canvas + "editmode 1 ; "
72 |
73 | Box.snd.send_pd(command)
74 |
75 | #increments the lowest amount from the value of a number
76 | def increment(self):
77 | #sets no-edit mode
78 | command = Box.canvas + "editmode 1 ; "
79 | command += Box.canvas + "editmode 0 ; "
80 | Box.snd.send_pd(command)
81 |
82 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
83 | command += Box.canvas + "motion " + str(self.x+1) + " " + str(self.y) + " 0 ; "
84 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y) + " 1 0 ; "
85 | #self.value = self.get_value()
86 |
87 | command += Box.canvas + "editmode 1 ; "
88 | Box.snd.send_pd(command)
89 |
90 | #decrements the lowest amount from the value of a numbe
91 | def decrement(self):
92 | #sets no-edit mode
93 | command = Box.canvas + "editmode 1 ; "
94 | command += Box.canvas + "editmode 0 ; "
95 | Box.snd.send_pd(command)
96 |
97 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
98 | command += Box.canvas + "motion " + str(self.x+1) + " " + str(self.y+2) + " 0 ; "
99 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y+2) + " 1 0 ; "
100 | #self.value = self.get_value()
101 | command += Box.canvas + "editmode 1 ; "
102 | Box.snd.send_pd(command)
103 |
104 |
105 |
106 |
107 | #aux static function to debug this class
108 | @staticmethod
109 | def debug():
110 | o = Number(10, 10, 0)
111 | print o.set(20)
112 | print o.increment()
113 | print o.decrement()
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/connection.py.svn-base:
--------------------------------------------------------------------------------
1 | ##########################################################
2 | ##########################################################
3 | # description: abstract class that represents any Connection between boxes
4 | #
5 | # autor: jeraman
6 | # date: 15/04/2010
7 | ##########################################################
8 | ##########################################################
9 |
10 | from box import *
11 | from time import *
12 |
13 |
14 | memory_connections = []
15 |
16 |
17 |
18 | #connects two generic boxes
19 | def connect (b1, outlet, b2, inlet):
20 | c = Connection(b1, outlet, b2, inlet)
21 | return c.status
22 |
23 |
24 | #disconnect a connection
25 | def disconnect(b1, outlet, b2, inlet):
26 | #procura a conexao
27 | i = search_connection(b1, outlet, b2, inlet)
28 | #se realmente existir
29 | if i>-1:
30 | return memory_connections[i].delete()
31 | else:
32 | return False
33 |
34 |
35 | #searchs a generic connection
36 | def search_connection (b1, outlet, b2, inlet):
37 | i=0
38 | #seraching for a specific box in memory
39 | for c in memory_connections:
40 | if (b1==c.box_orig) & (outlet==c.outlet) & (b2==c.box_dest) & (inlet==c.inlet):
41 | return i
42 | i+=1
43 |
44 | #return -1 if not
45 | if i==len(memory_connections):
46 | return -1
47 |
48 |
49 |
50 |
51 | class Connection:
52 | canvas = "pd-new "
53 | snd = ""
54 |
55 | #constructor
56 | def __init__(self, box_orig, outlet, box_dest, inlet):
57 | self.box_orig = box_orig
58 | self.outlet = outlet
59 | self.box_dest = box_dest
60 | self.inlet = inlet
61 | self.status = self.create()
62 |
63 |
64 | #creates a connection in Pd
65 | def create(self):
66 | b1 = search_box(self.box_orig)
67 | b2 = search_box(self.box_dest)
68 |
69 | if (b1 > -1) & (b2 > -1):
70 | #get the state before inserting the connection
71 | Connection.snd.save_state(Connection.canvas)
72 | t1 = self.snd.get_file()
73 |
74 | #try to build the connection
75 | command = Connection.canvas + "connect " + str(b1) + " " + str(self.outlet) + " " + str(b2) + " " + str(self.inlet) + " ; "
76 | Connection.snd.send_pd(command)
77 |
78 | #get the state after insertin the connection
79 | Connection.snd.save_state(Connection.canvas)
80 | t2 = self.snd.get_file()
81 |
82 | #verifies if changed
83 | if t1 != t2:
84 | memory_connections.append(self)
85 | return True
86 | else:
87 | return False
88 |
89 |
90 | #creates a connection in Pd
91 | def delete(self):
92 | b1 = search_box(self.box_orig)
93 | b2 = search_box(self.box_dest)
94 | if (b1 > -1) & (b2 > -1):
95 | #get the state before removing the connection
96 | Connection.snd.save_state(Connection.canvas)
97 | t1 = self.snd.get_file()
98 |
99 | #try to remove the connection
100 | command = Connection.canvas + "disconnect " + str(b1) + " " + str(self.outlet) + " " + str(b2) + " " + str(self.inlet) + " ; "
101 | Connection.snd.send_pd(command)
102 |
103 | #get the state after removing the connection
104 | Connection.snd.save_state(Connection.canvas)
105 | t2 = self.snd.get_file()
106 |
107 | #verifies if changed
108 | if t1 != t2:
109 | i=search_connection(self.box_orig, self.outlet, self.box_dest, self.inlet)
110 | memory_connections.pop(i)
111 | return True
112 | else:
113 | return False
114 |
115 |
116 |
117 | #method that sets the canvas
118 | @staticmethod
119 | def set_canvas(nc):
120 | Connection.canvas = nc
121 |
122 | #method that sets the sender
123 | @staticmethod
124 | def set_sender(s):
125 | Connection.snd = s
126 |
127 |
--------------------------------------------------------------------------------
/server/basic_classes/connection.py:
--------------------------------------------------------------------------------
1 | ##########################################################
2 | ##########################################################
3 | # description: abstract class that represents any Connection between boxes
4 | #
5 | # autor: jeraman
6 | # date: 15/04/2010
7 | ##########################################################
8 | ##########################################################
9 |
10 | from box import *
11 | from time import *
12 |
13 |
14 | memory_connections = []
15 |
16 |
17 |
18 | #connects two generic boxes
19 | def connect (b1, outlet, b2, inlet):
20 | c = Connection(b1, outlet, b2, inlet)
21 | return c.status
22 |
23 |
24 | #disconnect a connection
25 | def disconnect(b1, outlet, b2, inlet):
26 | #procura a conexao
27 | i = search_connection(b1, outlet, b2, inlet)
28 | #se realmente existir
29 | if i>-1:
30 | return memory_connections[i].delete()
31 | else:
32 | return False
33 |
34 |
35 | #searchs a generic connection
36 | def search_connection (b1, outlet, b2, inlet):
37 | i=0
38 | #seraching for a specific box in memory
39 | for c in memory_connections:
40 | if (b1==c.box_orig) & (outlet==c.outlet) & (b2==c.box_dest) & (inlet==c.inlet):
41 | return i
42 | i+=1
43 |
44 | #return -1 if not
45 | if i==len(memory_connections):
46 | return -1
47 |
48 |
49 |
50 |
51 | class Connection:
52 | canvas = "pd-new "
53 | snd = ""
54 |
55 | #constructor
56 | def __init__(self, box_orig, outlet, box_dest, inlet):
57 | self.box_orig = box_orig
58 | self.outlet = outlet
59 | self.box_dest = box_dest
60 | self.inlet = inlet
61 | self.id = len(memory_connections)
62 | self.status = self.create()
63 |
64 |
65 | #creates a connection in Pd
66 | def create(self):
67 | b1 = search_box(self.box_orig)
68 | b2 = search_box(self.box_dest)
69 |
70 | if (b1 > -1) & (b2 > -1):
71 | #get the state before inserting the connection
72 | Connection.snd.save_state(Connection.canvas)
73 | t1 = self.snd.get_file()
74 |
75 | #try to build the connection
76 | command = Connection.canvas + "connect " + str(b1) + " " + str(self.outlet) + " " + str(b2) + " " + str(self.inlet) + " ; "
77 | Connection.snd.send_pd(command)
78 |
79 | #get the state after insertin the connection
80 | Connection.snd.save_state(Connection.canvas)
81 | t2 = self.snd.get_file()
82 |
83 | #verifies if changed
84 | if t1 != t2:
85 | memory_connections.append(self)
86 | return True
87 | else:
88 | return False
89 |
90 |
91 | #creates a connection in Pd
92 | def delete(self):
93 | b1 = search_box(self.box_orig)
94 | b2 = search_box(self.box_dest)
95 | if (b1 > -1) & (b2 > -1):
96 | #get the state before removing the connection
97 | Connection.snd.save_state(Connection.canvas)
98 | t1 = self.snd.get_file()
99 |
100 | #try to remove the connection
101 | command = Connection.canvas + "disconnect " + str(b1) + " " + str(self.outlet) + " " + str(b2) + " " + str(self.inlet) + " ; "
102 | Connection.snd.send_pd(command)
103 |
104 | #get the state after removing the connection
105 | Connection.snd.save_state(Connection.canvas)
106 | t2 = self.snd.get_file()
107 |
108 | #verifies if changed
109 | if t1 != t2:
110 | i=search_connection(self.box_orig, self.outlet, self.box_dest, self.inlet)
111 | memory_connections.pop(i)
112 | return True
113 | else:
114 | return False
115 |
116 |
117 |
118 | #method that sets the canvas
119 | @staticmethod
120 | def set_canvas(nc):
121 | Connection.canvas = nc
122 |
123 | #method that sets the sender
124 | @staticmethod
125 | def set_sender(s):
126 | Connection.snd = s
127 |
128 |
--------------------------------------------------------------------------------
/server/communication.py:
--------------------------------------------------------------------------------
1 | ##########################################################
2 | ##########################################################
3 | # description: class that handles pd communication
4 | #
5 | # important: based on Frank Barknecht script at:
6 | # http://markmail.org/message/ohuwrz77hwo3bcwp#query:python%20pdsend+page:1+mid:ybdc6esbu7q53otu+state:results
7 | #
8 | # autor: jeraman
9 | # date: 06/04/2009
10 | ##########################################################
11 | ##########################################################
12 |
13 | #import sys
14 | from threading import *
15 | from socket import *
16 | from time import *
17 | from subprocess import *
18 | from basic_classes.box import *
19 | from basic_classes.number import *
20 | from basic_classes.symbol import *
21 | from basic_classes.connection import *
22 |
23 |
24 |
25 |
26 |
27 |
28 | # a thread class that we're gonna use for calling the server.pd patch
29 | class RemotePd ( Thread ):
30 | def __init__(self, nogui, pd_dir, server_dir):
31 | Thread.__init__(self)
32 | self.nogui = nogui
33 | self.server_dir = server_dir
34 | self.pd_dir = pd_dir
35 |
36 | #run method
37 | def run ( self ):
38 | if self.nogui:
39 | temp = "cd %s && pdextended -nogui %s/server.pd" %(self.pd_dir, self.server_dir)
40 | else:
41 | temp = "cd %s && pdextended %s/server.pd" %(self.pd_dir, self.server_dir)
42 | self.p = Popen(temp, shell=True)
43 |
44 |
45 |
46 |
47 | #communication class
48 | class Communication():
49 |
50 | #constructor
51 | def __init__(self, nogui):
52 | # variables from config file
53 | self.pd_dir = ""
54 | self.server_dir = "/var/www/PureeData/server/aux_patches"
55 | self.host = "localhost"
56 | #self.snd_port = ""
57 | #self.rcv_port = ""
58 | #self.load_config() #loads the properties.config
59 | self.pd_dir = "/usr/bin"
60 | self.rcv_port = 3001
61 | self.snd_port = 3000
62 |
63 | #class variables
64 | self.snd_socket = socket(AF_INET, SOCK_STREAM)
65 | self.rcv_socket = socket(AF_INET, SOCK_STREAM)
66 | self.thread=RemotePd(nogui, self.pd_dir, self.server_dir)
67 | self.file = open(self.server_dir+"/server.pd","r")
68 | #self.rcv = ""
69 |
70 | #loads the properties.config
71 | def load_config(self):
72 | #config = open("/var/www/PureeData/server/properties.config","r")
73 |
74 | #reads the pd dir
75 | temp = config.readline()
76 | while(temp[0]=="#"):
77 | temp = config.readline()
78 | self.pd_dir = temp[:len(temp)-1]
79 |
80 | #reads the server dir
81 | temp = config.readline()
82 | while(temp[0]=="#"):
83 | temp = config.readline()
84 | self.rcv_port = int(temp)
85 |
86 | #reads the server dir
87 | temp = config.readline()
88 | while(temp[0]=="#"):
89 | temp = config.readline()
90 | self.snd_port = int(temp)
91 |
92 | config.close()
93 |
94 | #connecting to pd
95 | def init_pd(self, usePdThread=True):
96 | if(usePdThread):
97 | print "Initializing server.pd in seperate thread..."
98 | self.thread.start()
99 | sleep(5)
100 | else:
101 | print "Trying to connect to existing Pd instance..."
102 |
103 | try:
104 | print "Connecting to Send Port: %s" % self.snd_port
105 | self.snd_socket.connect((self.host, self.snd_port))
106 | print "Binding to Receive Port: %s" % self.rcv_port
107 | self.rcv_socket.bind((self.host, self.rcv_port))
108 | self.rcv_socket.listen(1)
109 | self.rcv, addr = self.rcv_socket.accept()
110 | self.init_pyata()
111 | print "Connected with Pd"
112 | return True
113 | except error, err:
114 | print "Error connecting to %s:%d: %s" % (self.host, self.snd_port, err)
115 | return False
116 |
117 | #init some socket variables
118 | def init_pyata(self):
119 | Box.set_sender(self)
120 | Connection.set_sender(self)
121 | Number.init_socket(self.rcv)
122 | Symbol.init_socket(self.rcv)
123 |
124 |
125 | #sending a command to pd
126 | def send_pd(self, commands):
127 | try:
128 | self.snd_socket.send(commands)
129 | return True
130 | except error, err:
131 | print "Error sending message %s : %s" % (commands, err)
132 | return False
133 |
134 |
135 | #closing connection
136 | def finish_pd(self):
137 | try:
138 | temp = "killall pd"
139 | p = Popen(temp, shell=True)
140 |
141 | self.snd_socket.close()
142 | self.rcv_socket.close()
143 | self.file.close()
144 | print "closing connection with pd"
145 | return True
146 | except error, err:
147 | print "Error sending message %s : %s" % (message, err)
148 | return False
149 |
150 |
151 | def save_state(self, canvas):
152 | self.snd_socket.send(canvas + "menusave ; ")
153 | sleep(0.1)
154 |
155 | #returns the useful content of a file
156 | def get_file(self):
157 | self.file.seek(0)
158 | text = self.file.read()
159 | i = text.find("new")
160 | text = text[(i+7):(len(text))]
161 | i = text.find("pd new;")
162 | text = text[0:(i-18)]
163 |
164 | return text
165 |
166 | #setting the canvas to where the messages are going
167 | def set_canvas(self, canvas):
168 | self.canvas=canvas
169 |
170 | #aux static function to debug this class
171 | @staticmethod
172 | def debug():
173 | c = Communication(False)
174 | c.init_pd()
175 | sleep(5)
176 | c.finish_pd()
177 |
178 |
179 |
180 |
--------------------------------------------------------------------------------
/server/basic_classes/.svn/text-base/box.py.svn-base:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents any Pd box
5 | #
6 | # autor: jeraman
7 | # date: 13/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 | from time import *
12 |
13 | memory_box = [] #stores all objetcs that are inserted to pd
14 |
15 | def search_box (b):
16 | i=0
17 | #seraching for a specific box in memory
18 | for box in memory_box:
19 | if b==box:
20 | return i
21 | i+=1
22 |
23 | #return -1 if not
24 | if i==len(memory_box):
25 | return -1
26 | else:
27 | return i
28 |
29 |
30 |
31 |
32 | #box class itself
33 | class Box:
34 | # class variables (not instance variables
35 | canvas = "pd-new " #stores the name of the canvas
36 | snd = "" #used to communicate to pd
37 |
38 | #constructor of the class
39 | def __init__(self, x, y, id):
40 | self.x=x
41 | self.y=y
42 | self.id=id
43 | self.create()
44 | self.inlets = 0
45 | self.outlets = 0
46 | self.selected = False
47 | #self.inlet= self.verify_inlets()
48 | #self.outlet=self.verify_outlets()
49 |
50 | def create(self):
51 | #the rest of the code is defined in the subclasses
52 | self.selected = False
53 | memory_box.append(self)
54 |
55 | def delete(self):
56 | self.select()
57 | command = Box.canvas + "cut ; "
58 | Box.snd.send_pd(command)
59 |
60 | i=search_box(self)
61 |
62 | if (i != -1):
63 | r = memory_box.pop(i)
64 |
65 | #ajustando os ids dos gui restantes apos remover um elemento
66 | #command = ""
67 | #print "i " + str(i)
68 | for id in range(i, len(memory_box)):
69 | command = "decrement " + str(id+2) + " ; "
70 | #print command
71 | Box.snd.send_pd(command);
72 | sleep(0.01)
73 |
74 | return True
75 |
76 | else:
77 | print False
78 |
79 |
80 | #method that sets the canvas
81 | @staticmethod
82 | def set_canvas(nc):
83 | Box.canvas = nc
84 |
85 | #method that sets the sender
86 | @staticmethod
87 | def set_sender(s):
88 | Box.snd = s
89 |
90 | #clicks inside this obj
91 | def click(self):
92 | #command = []
93 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
94 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
95 | Box.snd.send_pd(command)
96 |
97 | # method that moves this box
98 | def move (self, new_x, new_y):
99 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
100 | command += Box.canvas + "motion " + str(new_x+1) + " " + str(new_y+1) + " 0 ; "
101 | command += Box.canvas + "mouseup " + str(new_x+1) + " " + str(new_y+1) + " 1 0 ; "
102 | self.x=new_x
103 | self.y=new_y
104 | Box.snd.send_pd(command)
105 | self.unselect()
106 |
107 | #method that selects this box
108 | def select (self):
109 | command = Box.canvas + "mouse " + str(self.x-2) + " " + str(self.y-2) + " 1 0 ; "
110 | command += Box.canvas + "motion " + str(self.x+1) + " " + str(self.y+1) + " 0 ; "
111 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
112 | Box.snd.send_pd(command)
113 |
114 | for b in memory_box:
115 | b.selected = False
116 | self.selected = True
117 |
118 | #method that unselects this box
119 | def unselect(self):
120 | command = Box.canvas + "mouse " + str(self.x-2) + " " + str(self.y-2) + " 1 0 ; "
121 | command += Box.canvas + "mouseup " + str(self.x-2) + " " + str(self.y-2) + " 1 0 ; "
122 | Box.snd.send_pd(command)
123 |
124 | for b in memory_box:
125 | b.selected = False
126 |
127 | #deprecated!
128 | #method that selects this box with key shift pressed
129 | def shift_select (self):
130 | #Box.snd.send_pd( Box.canvas + "key 1 Shift_R 0 ; " )
131 | #self.select()
132 | #Box.snd.send_pd( Box.canvas + "key 0 Shift_R 0 ; " )
133 | self.selected = True
134 |
135 | #deprecated!
136 | #method that unselects this box with key shift pressed
137 | def shift_unselect(self):
138 | #Box.snd.send_pd( Box.canvas + "key 1 Shift_R 0 ; " )
139 | #self.click()
140 | #Box.nd_pd( Box.canvas + "key 0 Shift_R 0 ; " )
141 | self.selected = False
142 |
143 |
144 | #gets the number of inlets of the object
145 | def verify_inlets (self):
146 | #import dinamico pra evitar problema de referencia ciclica
147 | from connection import Connection, connect
148 | from object import Object
149 |
150 | #building an inlet test
151 | inlet = Object(self.x, self.y-30, "inlet")
152 | finished = False
153 |
154 | #tries to connect every single inlet to the inlet above
155 | n_inlets = -1
156 | while not(finished):
157 | n_inlets = n_inlets+1
158 | #if fails on connect, finishes the interaction
159 | finished = not (connect(inlet, 0, self, n_inlets))
160 | inlet.delete()
161 |
162 | self.inlets = n_inlets
163 |
164 | return n_inlets
165 |
166 |
167 | #gets the number of outlets of the object
168 | def verify_outlets (self):
169 | #import dinamico pra evitar problema de referencia ciclica
170 | from connection import Connection, connect
171 | from object import Object
172 |
173 | #building an outlet test
174 | outlet = Object(self.x, self.y-30, "outlet")
175 | finished = False
176 |
177 | #tries to connect every single outlet to the outlet above
178 | n_outlets = -1
179 | while not(finished):
180 | n_outlets = n_outlets+1
181 | #if fails on connect, finishes the interaction
182 | finished = not (connect(self, 0, outlet, n_outlets))
183 | outlet.delete()
184 |
185 | self.outlets = n_outlets
186 |
187 | return n_outlets
188 |
189 |
190 |
191 | #aux static function to debug this class
192 | @staticmethod
193 | def debug():
194 | box = Box(20, 20, 0)
195 | print box.move(10, 10)
196 | print box.select()
197 | print box.unselect()
198 | print box.shift_select()
199 | print box.shift_unselect()
200 |
201 |
202 |
203 |
--------------------------------------------------------------------------------
/server/basic_classes/box.py:
--------------------------------------------------------------------------------
1 |
2 | ##########################################################
3 | ##########################################################
4 | # description: abstract class that represents any Pd box
5 | #
6 | # autor: jeraman
7 | # date: 13/04/2010
8 | ##########################################################
9 | ##########################################################
10 |
11 | from time import *
12 |
13 | memory_box = [] #stores all objetcs that are inserted to pd
14 |
15 | def search_box (b):
16 | i=0
17 | #seraching for a specific box in memory
18 | for box in memory_box:
19 | if b==box:
20 | return i
21 | i+=1
22 |
23 | #return -1 if not
24 | if i==len(memory_box):
25 | return -1
26 | else:
27 | return i
28 |
29 |
30 |
31 |
32 | #box class itself
33 | class Box:
34 | # class variables (not instance variables
35 | canvas = "pd-new " #stores the name of the canvas
36 | snd = "" #used to communicate to pd
37 |
38 | #constructor of the class
39 | def __init__(self, x, y, id):
40 | self.x=x
41 | self.y=y
42 | self.id=id
43 | self.create()
44 | self.inlets = 0
45 | self.outlets = 0
46 | self.selected = False
47 | #self.inlet= self.verify_inlets()
48 | #self.outlet=self.verify_outlets()
49 | #self.verify_inlets()
50 | #self.verify_outlets()
51 |
52 | def create(self):
53 | #the rest of the code is defined in the subclasses
54 | self.selected = False
55 | memory_box.append(self)
56 |
57 | def delete(self):
58 | print "box.delete"
59 | self.select()
60 | command = Box.canvas + "cut ; "
61 | Box.snd.send_pd(command)
62 |
63 | i=search_box(self)
64 |
65 | if (i != -1):
66 | r = memory_box.pop(i)
67 |
68 | #ajustando os ids dos gui restantes apos remover um elemento
69 | #command = ""
70 | #print "i " + str(i)
71 | print "box.delete adjusting gui (???)"
72 | for id in range(i, len(memory_box)):
73 | command = "decrement " + str(id+2) + " ; "
74 | #print command
75 | Box.snd.send_pd(command);
76 | sleep(0.01)
77 |
78 | return True
79 |
80 | else:
81 | print False
82 |
83 |
84 | #method that sets the canvas
85 | @staticmethod
86 | def set_canvas(nc):
87 | Box.canvas = nc
88 |
89 | #method that sets the sender
90 | @staticmethod
91 | def set_sender(s):
92 | Box.snd = s
93 |
94 | #clicks inside this obj
95 | def click(self):
96 | #command = []
97 | #print "Box.click: %s" % self
98 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
99 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
100 | Box.snd.send_pd(command)
101 |
102 | # method that moves this box
103 | def move (self, new_x, new_y):
104 | command = Box.canvas + "mouse " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
105 | command += Box.canvas + "motion " + str(new_x+1) + " " + str(new_y+1) + " 0 ; "
106 | command += Box.canvas + "mouseup " + str(new_x+1) + " " + str(new_y+1) + " 1 0 ; "
107 | self.x=new_x
108 | self.y=new_y
109 | Box.snd.send_pd(command)
110 | self.unselect()
111 | print "Box.move sent: %s" % command
112 |
113 | #method that selects this box
114 | def select (self):
115 | command = Box.canvas + "mouse " + str(self.x-2) + " " + str(self.y-2) + " 1 0 ; "
116 | command += Box.canvas + "motion " + str(self.x+1) + " " + str(self.y+1) + " 0 ; "
117 | command += Box.canvas + "mouseup " + str(self.x+1) + " " + str(self.y+1) + " 1 0 ; "
118 | Box.snd.send_pd(command)
119 |
120 | for b in memory_box:
121 | b.selected = False
122 | self.selected = True
123 |
124 | #method that unselects this box
125 | def unselect(self):
126 | command = Box.canvas + "mouse " + str(self.x-2) + " " + str(self.y-2) + " 1 0 ; "
127 | command += Box.canvas + "mouseup " + str(self.x-2) + " " + str(self.y-2) + " 1 0 ; "
128 | Box.snd.send_pd(command)
129 |
130 | for b in memory_box:
131 | b.selected = False
132 |
133 | #deprecated!
134 | #method that selects this box with key shift pressed
135 | def shift_select (self):
136 | #Box.snd.send_pd( Box.canvas + "key 1 Shift_R 0 ; " )
137 | #self.select()
138 | #Box.snd.send_pd( Box.canvas + "key 0 Shift_R 0 ; " )
139 | self.selected = True
140 |
141 | #deprecated!
142 | #method that unselects this box with key shift pressed
143 | def shift_unselect(self):
144 | #Box.snd.send_pd( Box.canvas + "key 1 Shift_R 0 ; " )
145 | #self.click()
146 | #Box.nd_pd( Box.canvas + "key 0 Shift_R 0 ; " )
147 | self.selected = False
148 |
149 |
150 | #gets the number of inlets of the object
151 | def verify_inlets (self):
152 | #import dinamico pra evitar problema de referencia ciclica
153 | from connection import Connection, connect
154 | from object import Object
155 |
156 | #building an inlet test
157 | # INFINITE RECURSION
158 | inlet = Object(self.x, self.y-30, "inlet")
159 | finished = False
160 |
161 | #tries to connect every single inlet to the inlet above
162 | n_inlets = -1
163 | while not(finished):
164 | n_inlets = n_inlets+1
165 | #if fails on connect, finishes the interaction
166 | finished = not (connect(inlet, 0, self, n_inlets))
167 | inlet.delete()
168 |
169 | self.inlets = n_inlets
170 |
171 | return n_inlets
172 |
173 |
174 | #gets the number of outlets of the object
175 | def verify_outlets (self):
176 | #import dinamico pra evitar problema de referencia ciclica
177 | from connection import Connection, connect
178 | from object import Object
179 |
180 | #building an outlet test
181 | outlet = Object(self.x, self.y-30, "outlet")
182 | finished = False
183 |
184 | #tries to connect every single outlet to the outlet above
185 | n_outlets = -1
186 | while not(finished):
187 | n_outlets = n_outlets+1
188 | #if fails on connect, finishes the interaction
189 | finished = not (connect(self, 0, outlet, n_outlets))
190 | outlet.delete()
191 |
192 | self.outlets = n_outlets
193 |
194 | return n_outlets
195 |
196 |
197 |
198 | #aux static function to debug this class
199 | @staticmethod
200 | def debug():
201 | box = Box(20, 20, 0)
202 | print box.move(10, 10)
203 | print box.select()
204 | print box.unselect()
205 | print box.shift_select()
206 | print box.shift_unselect()
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------
/server/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | PuréeData
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
Welcome to PuréeData!
58 | PuréeData is a net-art experiment that implements a web interface to an instance of
PureData ,
59 | a dataflow audio programming environment. To hear the sound output, listen to
this MP3 stream with your favorite audio application.
60 |
61 |
62 | Ready to dive in? Check out the
list of supported objects and
some helpful PureData tutorials ! For technical information, check out
How PuréeData works .
63 |
64 |
65 | This application is open-source and in-progress, and currently works best in
Google Chrome . If you'd like to pitch in, the source code is maintained on
GitHub ! We're still testing and developing PuréeData, so it has some limitations. We need your help to complete it!
66 | If you find any bugs,
put 'em in the tracker —your help is greatly appreciated!
67 |
68 |
69 |
72 |
73 |
74 | PuréeData was dreamed up by
Ted Hayes and
Sofy Yuditskaya in 2010, and implemented from then to now by Ted with the indispensable aid of the
Pyata library .
75 |
76 | Ted Hayes is a poet-inventor: conceiving objects and experiences that explore the sublime and the enigmatic through recombination and deconstruction. He is a proponent of what he has dubbed “Research Art,” or art as science experiment, and actively investigates the themes, technologies and ramifications of autonomy, emergence, semiotics, pattern recognition, and neural networks.
77 |
78 | Ted’s works range from a group of language-inventing robots to a mythological city-founding ritual for soprano and string quartet, is a graduate of NYU’s Interactive Telecommunications Program, and is recently the recipient of a New Radio and Performing Arts commission. His operating principle is, in a word, poetry: to pique with enigma and confound with beauty. See more of Ted’s work at
http://log.liminastudio.com .
79 |
80 |
83 |
84 |
85 | What on earth do I do with this thing?
86 |
87 | PuréeData is a "dataflow patching environment," which means you connect boxes together to generate a flow of information and audio signals.
88 | To get started, try making a new object, such as "osc~ 440", which generates a sine wave at 440hz. This can then be connected, or "patched," to other objects that accept signal inputs, such as the main outputs, "send~ left" and "send~ right".
89 | Connections between objects and messages can be made by clicking on an outlet of one object and then clicking on an inlet of another object.
90 | Connections can be deleted by checking the "Disconnect Wires" toggle button and then clicking on the connections you want to remove.
91 | To hear the audio output of the patch, click on the "Listen" button. This is an MP3 audio stream that is typically about 5 seconds behind "real-time," so you won't hear your changes immediately.
92 | The square boxes are "messages," which can be clicked on to send their information to another object. For instance, sending "300" to the second inlet of a "metro" object will change the metronome's rate to 300ms.
93 | For more in-depth tutorials on dataflow and audio synthesis, check out these helpful PureData tutorials !
94 |
95 |
96 |
97 |
--------------------------------------------------------------------------------
/server/pureeDataServer.py:
--------------------------------------------------------------------------------
1 | # Pure'eData Server by Ted Hayes & Sofy Yuditskaya 2010
2 | # adapted from invaluable code by Jeraman
3 | # http://jeraman.wordpress.com/2009/03/22/how-to-use-pure-data-as-a-api/
4 |
5 | import sys
6 | import os
7 | # make sure this script can find the Pd classes
8 | cmd_folder = os.path.dirname(os.path.abspath(__file__))
9 | if cmd_folder not in sys.path:
10 | sys.path.insert(0, cmd_folder)
11 | import threading
12 | import json
13 | import subprocess as sub
14 | import web
15 | import logging
16 | from socket import *
17 | from time import *
18 | from subprocess import *
19 | from Pd import *
20 |
21 | #web.py vars
22 | urls = ("/pd", "PdCommand",
23 | "/list", "List",
24 | '/', 'Index'
25 | )
26 |
27 | #app = web.application(urls, globals())
28 | render = web.template.render('templates')
29 |
30 | #absolute path to server.pd
31 | serverDir = "/var/www/PureeData/server"
32 | # this stuff in properties.config
33 | #absolute path to pdsend
34 | #pdsendDir = "/usr/bin"
35 | #the port used
36 | #port = 3005
37 | #pdReceivePort = 3006
38 |
39 | #pd master objects list
40 | allObjects = []
41 | pd = None # declare as global (?)
42 |
43 | # redirect print statements to logfile
44 | class LogStream(object):
45 | def write(self, data):
46 | logging.debug(data)
47 | sys.stdout = LogStream()
48 |
49 | logging.basicConfig(filename='/var/www/PureeData/pureedata.log',level=logging.DEBUG, format='[%(asctime)s] %(message)s', datefmt='%m/%d/%Y %I:%M:%S %p')
50 | logging.info("------------------START--------------------")
51 |
52 | class Index:
53 | def GET(self):
54 | return render.index()
55 |
56 | def getObjProps(pdObj):
57 | if hasattr(pdObj, 'label'):
58 | content = pdObj.label
59 | type = 'obj'
60 | elif hasattr(pdObj, 'text'):
61 | content = pdObj.text
62 | type = 'msg'
63 | else:
64 | content = '';
65 |
66 | return {
67 | 'id' : pdObj.id,
68 | 'x' : pdObj.x,
69 | 'y' : pdObj.y,
70 | 'type' : type,
71 | 'content' : content
72 | }
73 |
74 | def makeJSON(data):
75 | tempData = []
76 | logging.debug("makeJSON: data: %s", data)
77 | for o in data:
78 | tempData.append(getObjProps(o))
79 |
80 | output = json.dumps(tempData, indent=4)
81 | web.header("Content-Type", "text/plain")
82 | logging.debug("makeJSON: %s", tempData)
83 | return output
84 |
85 | class PdCommand:
86 | def POST(self):
87 | global allObjects
88 | i = web.input()
89 | logging.debug("Pd.POST: %s", i)
90 | if hasattr(i, 'cmd'):
91 | if i.cmd == 'obj':
92 | logging.debug("Making object: %s" % i.obj)
93 | try:
94 | theobj = pdObject(int(i.x), int(i.y), i.obj)
95 | logging.debug("inlets: %s / outlets: %s", theobj.inlets, theobj.outlets)
96 | except error, e:
97 | return "error: %s" % e
98 | return makeJSON([theobj])
99 |
100 | if i.cmd == "msg":
101 | try:
102 | theobj = pdMessage(int(i.x), int(i.y), i.msg)
103 | except error, e:
104 | return "error: %s" % e
105 | return makeJSON([theobj])
106 |
107 | if i.cmd == "msgclick":
108 | result = memory_box[int(i.id)].click()
109 | #logging.debug('msgclick result: %s',result)
110 | return result
111 |
112 | if i.cmd == "dsp":
113 | val = int(i.dsp)
114 | try:
115 | if(val == 1):
116 | pd.dsp(True)
117 | if(val == 0):
118 | pd.dsp(False)
119 | except error, e:
120 | return "error: %s" % e
121 | return "success"
122 |
123 | if i.cmd == "savePatch":
124 | logging.debug("Saving patch...")
125 | #allObjects = []
126 | try:
127 | pd.save()
128 | # remove all but lsend and rsend
129 | except error, e:
130 | return "error: %s" % e
131 | return "success"
132 |
133 | if i.cmd == "clear":
134 | logging.debug("Clearing patch...")
135 | try:
136 | #pd.clear()
137 | # remove all but lsend and rsend
138 | pass
139 | except error, e:
140 | return "error: %s" % e
141 | return "success"
142 |
143 | if i.cmd == "connect":
144 | #logging.debug("Connecting... [%s: %s] to [%s: %s]", i.firstID, i.outlet, i.secondID, i.inlet)
145 | status = connect(memory_box[int(i.firstID)], i.outlet, memory_box[int(i.secondID)], i.inlet)
146 | if status:
147 | # return connection object
148 | c = getConnectionProps(memory_connections[len(memory_connections)-1])
149 | #logging.debug('c: %s', c)
150 | return json.dumps(c)
151 | else:
152 | logging.error('*** Connection error')
153 | return web.internalerror("Connection error")
154 |
155 | if i.cmd == "disconnect":
156 | try:
157 | c = memory_connections[int(i.id)]
158 | c.delete()
159 | except error, e:
160 | return "error: %s" % e
161 | output = {
162 | 'id':int(i.id)
163 | }
164 | return json.dumps(output)
165 |
166 | if i.cmd == "update":
167 | # update an object
168 | logging.debug("Updating object...")
169 | return "success"
170 |
171 | if i.cmd == "move":
172 | logging.debug("Moving object...")
173 | obj = memory_box[int(i.id)]
174 | obj.move(int(i.x), int(i.y))
175 | return "success"
176 |
177 | if i.cmd == "delObject":
178 | logging.debug("Deleting object %s", i.id)
179 | obj = memory_box[int(i.id)]
180 | obj.delete()
181 | return "success"
182 |
183 | if i.cmd == "quit":
184 | pd.quit()
185 | return "success"
186 |
187 | return "Error: No recognized commands"
188 |
189 | class List:
190 | def GET(self):
191 | objs = getAllObjects()
192 | conns = getAllConnections()
193 | tempData = {
194 | 'objects': objs,
195 | 'connections': conns
196 | }
197 | return json.dumps(tempData, indent=4)
198 |
199 | def getAllConnections():
200 | #parse through all connection objects and format relevant information
201 | tempData = []
202 | for c in memory_connections:
203 | conn = getConnectionProps(c)
204 | tempData.append(conn)
205 | return tempData
206 |
207 | def getAllObjects():
208 | tempData = []
209 | for o in memory_box:
210 | tempData.append(getObjProps(o))
211 | return tempData
212 |
213 | def getConnectionProps(c):
214 | return {
215 | 'id' : c.id,
216 | 'firstID' : c.box_orig.id,
217 | 'outlet' : c.outlet,
218 | 'secondID' : c.box_dest.id,
219 | 'inlet' : c.inlet
220 | }
221 |
222 | def pdObject(x, y, msg):
223 | global allObjects
224 | theObject = Object(x, y, msg, len(memory_box))
225 | allObjects.append(theObject)
226 | return theObject
227 |
228 | def pdMessage(x, y, msg):
229 | global allObjects
230 | theObject = Message(x, y, msg, len(memory_box))
231 | allObjects.append(theObject)
232 | return theObject
233 |
234 | if __name__ == "__main__":
235 | global pd
236 | #global allObjects
237 | #allObjects = []
238 | logging.info("Starting Pyata...")
239 | pd = Pd()
240 | pd.init(usePdThread=True)
241 | # TODO: may want to be able to keep the content of the patch between restarts?
242 | pd.clear()
243 |
244 | logging.info("Making send~ objects")
245 | lsend = pdObject(300, 400, "send~ left")
246 | rsend = pdObject(400, 400, "send~ right")
247 |
248 | logging.info("Starting web.py server")
249 | #application = web.application(urls, globals()).wsgifunc()
250 | app = web.application(urls, globals())
251 | app.internalerror = web.debugerror
252 | app.run()
--------------------------------------------------------------------------------
/server/static/js/pureedata.js:
--------------------------------------------------------------------------------
1 | /*****
2 |
3 | PureeData.net
4 | Ted Hayes 2010/2011
5 |
6 |
7 | ******/
8 |
9 | var DEBUGMODE = false;
10 |
11 | var host = "http://pureedata.net/";
12 | var isConnecting = false;
13 | var connectFirstObject;
14 | var connectSecondObject;
15 |
16 | var objects;
17 | var connections;
18 |
19 | function trace(what) {
20 | if(DEBUGMODE){
21 | $('#traceBox').append(what+" ");
22 | }
23 | }
24 |
25 | function Point(x,y){
26 | this.x = x;
27 | this.y = y;
28 | }
29 |
30 | function objSubmit(){
31 | addObj($('#addObjField').val());
32 | }
33 |
34 | function msgSubmit(){
35 | addMsg($('#addMsgField').val());
36 | }
37 |
38 | function errorAnimation(what){
39 | what.effect("highlight", {color:'#9E1616'}, 2000);
40 | }
41 |
42 | function addObj(what) {
43 | //trace("addObj: "+what);
44 | var objStem = what.split(' ')[0];
45 | if(objStem in objectDictionary){
46 | $.ajax({
47 | type: "POST",
48 | url: host+"pd",
49 | data: {
50 | cmd: 'obj',
51 | obj: what,
52 | x: '50',
53 | y: '50'
54 | },
55 | success: function (result) {
56 | trace("addObj success: "+result);
57 | makeNewObject(jQuery.parseJSON(result)[0]);
58 | },
59 | error: function (result) {
60 | trace("addObj error: "+result);
61 | errorAnimation($('#addObjField'));
62 | }
63 | });
64 | } else {
65 | // TODO: show error message
66 | errorAnimation($('#addObjField'));
67 | $('#addObjField').val('Add Object');
68 | }
69 | }
70 |
71 | function addMsg(what) {
72 | $.ajax({
73 | type : "POST",
74 | url : host + "pd",
75 | data : {
76 | cmd : 'msg',
77 | msg : what,
78 | x : 50,
79 | y : 50
80 | },
81 | success : function(result) {
82 | makeNewObject(jQuery.parseJSON(result)[0]);
83 | },
84 | error : function(result) {
85 | trace("addMsg error: " + result);
86 | }
87 | });
88 | $('#addObjField').val('Add Message');
89 | }
90 |
91 | function clearPatch() {
92 | trace("clearPatch()");
93 | $.ajax({
94 | type: "POST",
95 | url: host+"pd",
96 | data: {
97 | cmd: 'clear'
98 | },
99 | success: function (result) {
100 | trace("clear success: "+result);
101 | //getCurrentObjectList();
102 | objects = [];
103 | $(".pdObject").remove();
104 | },
105 | error: function (result) {
106 | trace("clear error: "+result);
107 | }
108 | });
109 | }
110 |
111 | function getCurrentObjectList(){
112 | objects = [];
113 | $.ajax({
114 | type: "GET",
115 | url: host+"list",
116 | success: function (result) {
117 | var stuff = jQuery.parseJSON(result);
118 | objects = stuff.objects;
119 | connections = stuff.connections;
120 | //traceList();
121 | updateGUI();
122 | },
123 | error: function (result) {
124 | trace(result.responseText.substr(4));
125 | }
126 | });
127 | }
128 |
129 | var obj_gui_html = "
";
130 | var msg_gui_html = "
";
131 | var obj_inlet_html = "
";
132 | var obj_outlet_html = "
";
133 | var obj_del_html = "X
"
134 |
135 | function makeNewObject(obj){
136 | var which_html;
137 | var numInlets, numOutlets;
138 |
139 | if(obj.type == 'obj'){
140 | which_html = obj_gui_html;
141 | var objStem = obj.content.split(' ')[0];
142 | numInlets = objectDictionary[objStem].inlets;
143 | numOutlets = objectDictionary[objStem].outlets;
144 | } else {
145 | which_html = msg_gui_html;
146 | numInlets = 1;
147 | numOutlets = 1;
148 | }
149 | var special = false;
150 | if(obj.content == "send~ left" || obj.content == "send~ right"){
151 | // special!
152 | special = true;
153 | }
154 |
155 | // var deleteButton = $(obj_del_html)
156 | // .click(deleteClick);
157 |
158 | theObj = $(which_html)
159 | .attr('id', obj.id)
160 | .html(obj.content)
161 | .css({'left':obj.x+'px', 'top':obj.y+'px'})
162 | //.append(deleteButton)
163 | .hover(objectOver, objectOut);
164 |
165 | if(!special){
166 | // Disabled until backend deleting works
167 | //theObj.append(deleteButton);
168 | } else {
169 | // apply special class
170 | theObj.addClass('specialObject');
171 | }
172 |
173 | var i = 0;
174 | var l = 0;
175 | for (i=0; i 0){
291 | // // this line already exists, update it
292 | // update = true;
293 | // }
294 |
295 | var l = drawLine(firstPoint, secondPoint, id);
296 | // if(!update)
297 | l.attr('id', id);
298 | }
299 |
300 | function quitPd(){
301 | $.post(host+'pd', {cmd:'quit'});
302 | }
303 |
304 | function drawLine(pt1, pt2, id){
305 | var dx = pt2.x - pt1.x;
306 | var dy = pt2.y - pt1.y;
307 | var h = Math.sqrt(Math.pow(dx,2) + Math.pow(dy,2));
308 | var thetaRad = Math.atan2(dy, dx);
309 | var thetaDeg = thetaRad * 180 / Math.PI;
310 | //trace("("+pt1.x+","+pt1.y+"), ("+pt2.x+","+pt2.y+") h: "+h+" / theta: "+thetaDeg);
311 | var l = lesser(pt1.x, pt2.x) + 6; // centered on iolet
312 | var t = lesser(pt1.y, pt2.y);
313 | //trace("t: "+t+" / l: "+l);
314 | var theLine;
315 | var update = false;
316 | //trace('id: '+id+' len: '+$('.line#'+id).length);
317 | if($('.line[id='+id+']').length > 0){
318 | // this line already exists, update it
319 | update = true;
320 | theLine = $('.line[id='+id+']');
321 | } else {
322 | theLine = $(" ");
323 | }
324 | //theLine = $(" ")
325 | theLine.easyRotate({
326 | degrees: thetaDeg
327 | })
328 | .css({
329 | // not sure why, but these also have to be set to make offset() work
330 | 'left':l+'px',
331 | 'top':t+'px',
332 | 'width':h+'px'
333 | });
334 | if(!update)
335 | $("body").append(theLine);
336 | theLine.offset({
337 | top:t,
338 | left:l
339 | })
340 | .click(lineClick);
341 | return theLine;
342 | }
343 |
344 | function lineClick(){
345 | //trace("line clicked");
346 | if($('#disconnectCB').is(':checked')){
347 | disconnect($(this).attr('id'));
348 | }
349 | }
350 |
351 | function updateGUI(){
352 | //clearPatch();
353 | if(!objects || objects.length < 1)
354 | return;
355 | for(var i=0; i < objects.length; i++){
356 | //trace()
357 | if($('#'+i).attr('id')) {
358 | //trace("updateGUI old object: "+i);
359 | } else {
360 | //trace("updateGUI new object: "+i);
361 | makeNewObject(objects[i]);
362 | }
363 | }
364 | makeDraggable();
365 | drawAllConnections();
366 | }
367 |
368 | function drawAllConnections(){
369 | for(ci in connections){
370 | // javascript uses values for for..in instead of keys. Thanks, assholes.
371 | //console.log(connections);
372 | var c = connections[ci];
373 | //trace('c: '+c);
374 | //console.log(c);
375 | var o1 = $('#'+c.firstID);
376 | var o2 = $('#'+c.secondID);
377 | //trace("drawAllConnections: firstID: "+c.firstID+" / second: "+c.secondID+" / "+o1+" / "+o2);
378 | drawConnection(c.id, o1, c.outlet, o2, c.inlet);
379 | }
380 | }
381 |
382 | function traceList(){
383 | if(!objects || objects.length < 1)
384 | return;
385 | for(var i=0; i < objects.length; i++){
386 | trace("object "+objects[i].id+": "+objects[i].type+"> "+objects[i].content+" / x: "+objects[i].x+" / y: "+objects[i].y);
387 | }
388 | }
389 |
390 | function makeDraggable(){
391 | $(".draggable").draggable({
392 | start: objectStartDrag,
393 | drag: objectDrag,
394 | stop: objectStopDrag
395 | });
396 | }
397 |
398 | function objectStartDrag(e, ui){
399 | //e.stopPropagation(); // stop message objects from triggering "click" event
400 | //return false;
401 | }
402 |
403 | function objectDrag(e, ui){
404 | // called as object is dragged; update all lines connected to this object
405 | // ui contains:
406 | // Object
407 | // helper: c.fn.c.init[1]
408 | // 0: HTMLDivElement
409 | // context: HTMLDivElement
410 | // length: 1
411 | // offset: Object
412 | // left: 349
413 | // top: 179
414 |
415 | // left: 353
416 | // top: 183
417 | // position: Object
418 | // left: 349
419 | // top: 179
420 |
421 | var id = $(e.target).attr('id');
422 | // get connections to this object
423 | for (ci in connections){
424 | var c = connections[ci];
425 | if(c.firstID == id || c.secondID == id){
426 | // redraw all connections attached to this object
427 | drawConnection(c.id, $('#'+c.firstID), c.outlet, $('#'+c.secondID), c.inlet);
428 | }
429 | }
430 | }
431 |
432 | function objectStopDrag(e){
433 | var id = $(this).attr('id');
434 | var x = $(this).offset().left;
435 | var y = $(this).offset().top;
436 | trace("stopDrag: "+x+" / "+y);
437 | $.post(host+'pd', {
438 | cmd:'move',
439 | id:id,
440 | x:x,
441 | y:y
442 | });
443 | //e.stopPropagation(); // stop message objects from triggering "click" event
444 | return false;
445 | }
446 |
447 | function deleteObject(id){
448 | $('#'+id).remove();
449 | $.post(host+'pd', {cmd:'delObject', id:id});
450 | }
451 |
452 | function setDSP(to){
453 | $.ajax({
454 | type: "POST",
455 | url: host+"pd",
456 | data: {
457 | cmd: 'dsp',
458 | dsp: to
459 | },
460 | success: function (result) {
461 | //trace("setDSP success: "+result);
462 | },
463 | error: function (result) {
464 | //trace("setDSP error: "+result);
465 | }
466 | });
467 | }
468 |
469 | function dspClick(){
470 | var val;
471 | if($(this).is(':checked')){
472 | // turn on dsp
473 | setDSP(1);
474 | } else {
475 | // turn off dsp
476 | setDSP(0);
477 | }
478 | }
479 |
480 | function lesser(a, b){
481 | if(a 0 && val != "Click here to add tags"){
510 |
511 | } else {
512 |
513 | }
514 | }
515 |
516 | function disconnectClick(e){
517 | if($('#disconnectCB').is(':checked')){
518 | $('.line').css({
519 | 'cursor':'pointer'
520 | });
521 | } else {
522 | $('.line').css({
523 | 'cursor':'default'
524 | });
525 | }
526 | }
527 |
528 | $(function() {
529 | //// MAIN ////
530 | //$("#dspCheckbox").button().click(dspClick);
531 | $('#infoBox').dialog({
532 | modal : true,
533 | title : 'About PuréeData',
534 | width : 600
535 | });
536 | $('#creditsBox').dialog({
537 | autoOpen: false,
538 | modal : true,
539 | title : 'Credits',
540 | width : 600
541 | });
542 | $('#helpBox').dialog({
543 | autoOpen: false,
544 | //modal : true,
545 | title : 'Help!',
546 | width : 600
547 | });
548 | $('#creditsButton').button().click(function(){
549 | $('#creditsBox').dialog('open');
550 | });
551 | $('#helpButton').button().click(function(){
552 | $('#helpBox').dialog('open');
553 | });
554 | $('#infoButton').button().click(function(){
555 | $('#infoBox').dialog('open');
556 | });
557 | $('#listenButton').button().click(function(){
558 | //window.open('http://pureedata.net:8000/pureedata.mp3', '_blank');
559 | window.open('http://pureedata.net/static/pureedata.pls', '_blank');
560 | });
561 | $("#disconnectCB").button().click(disconnectClick);
562 | //clearPatch();
563 | getCurrentObjectList();
564 | //updateGUI();
565 | //drawLine(new Point(50, 50),new Point(70, 60));
566 | });
--------------------------------------------------------------------------------
/server/static/css/eggplant/jquery-ui-1.8.2.custom.css:
--------------------------------------------------------------------------------
1 | /*
2 | * jQuery UI CSS Framework
3 | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
4 | * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
5 | */
6 |
7 | /* Layout helpers
8 | ----------------------------------*/
9 | .ui-helper-hidden { display: none; }
10 | .ui-helper-hidden-accessible { position: absolute; left: -99999999px; }
11 | .ui-helper-reset { margin: 0; padding: 0; border: 0; outline: 0; line-height: 1.3; text-decoration: none; font-size: 100%; list-style: none; }
12 | .ui-helper-clearfix:after { content: "."; display: block; height: 0; clear: both; visibility: hidden; }
13 | .ui-helper-clearfix { display: inline-block; }
14 | /* required comment for clearfix to work in Opera \*/
15 | * html .ui-helper-clearfix { height:1%; }
16 | .ui-helper-clearfix { display:block; }
17 | /* end clearfix */
18 | .ui-helper-zfix { width: 100%; height: 100%; top: 0; left: 0; position: absolute; opacity: 0; filter:Alpha(Opacity=0); }
19 |
20 |
21 | /* Interaction Cues
22 | ----------------------------------*/
23 | .ui-state-disabled { cursor: default !important; }
24 |
25 |
26 | /* Icons
27 | ----------------------------------*/
28 |
29 | /* states and images */
30 | .ui-icon { display: block; text-indent: -99999px; overflow: hidden; background-repeat: no-repeat; }
31 |
32 |
33 | /* Misc visuals
34 | ----------------------------------*/
35 |
36 | /* Overlays */
37 | .ui-widget-overlay { position: absolute; top: 0; left: 0; width: 100%; height: 100%; }
38 |
39 |
40 | /*
41 | * jQuery UI CSS Framework
42 | * Copyright (c) 2010 AUTHORS.txt (http://jqueryui.com/about)
43 | * Dual licensed under the MIT (MIT-LICENSE.txt) and GPL (GPL-LICENSE.txt) licenses.
44 | * To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Lucida%20Grande,%20Lucida%20Sans,%20Arial,%20sans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=6px&bgColorHeader=30273a&bgTextureHeader=03_highlight_soft.png&bgImgOpacityHeader=25&borderColorHeader=231d2b&fcHeader=ffffff&iconColorHeader=a8a3ae&bgColorContent=3d3644&bgTextureContent=12_gloss_wave.png&bgImgOpacityContent=30&borderColorContent=7e7783&fcContent=ffffff&iconColorContent=ffffff&bgColorDefault=dcd9de&bgTextureDefault=03_highlight_soft.png&bgImgOpacityDefault=100&borderColorDefault=dcd9de&fcDefault=665874&iconColorDefault=8d78a5&bgColorHover=eae6ea&bgTextureHover=03_highlight_soft.png&bgImgOpacityHover=100&borderColorHover=d1c5d8&fcHover=734d99&iconColorHover=734d99&bgColorActive=5f5964&bgTextureActive=03_highlight_soft.png&bgImgOpacityActive=45&borderColorActive=7e7783&fcActive=ffffff&iconColorActive=454545&bgColorHighlight=fafafa&bgTextureHighlight=01_flat.png&bgImgOpacityHighlight=55&borderColorHighlight=ffdb1f&fcHighlight=333333&iconColorHighlight=8d78a5&bgColorError=994d53&bgTextureError=01_flat.png&bgImgOpacityError=55&borderColorError=994d53&fcError=ffffff&iconColorError=ebccce&bgColorOverlay=eeeeee&bgTextureOverlay=01_flat.png&bgImgOpacityOverlay=0&opacityOverlay=80&bgColorShadow=aaaaaa&bgTextureShadow=01_flat.png&bgImgOpacityShadow=0&opacityShadow=60&thicknessShadow=4px&offsetTopShadow=-4px&offsetLeftShadow=-4px&cornerRadiusShadow=0px
45 | */
46 |
47 |
48 | /* Component containers
49 | ----------------------------------*/
50 | .ui-widget { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1.1em; }
51 | .ui-widget .ui-widget { font-size: 1em; }
52 | .ui-widget input, .ui-widget select, .ui-widget textarea, .ui-widget button { font-family: Lucida Grande, Lucida Sans, Arial, sans-serif; font-size: 1em; }
53 | .ui-widget-content { border: 1px solid #7e7783; background: #3d3644 url(images/ui-bg_gloss-wave_30_3d3644_500x100.png) 50% top repeat-x; color: #ffffff; }
54 | .ui-widget-content a { color: #ffffff; }
55 | .ui-widget-header { border: 1px solid #231d2b; background: #30273a url(images/ui-bg_highlight-soft_25_30273a_1x100.png) 50% 50% repeat-x; color: #ffffff; font-weight: bold; }
56 | .ui-widget-header a { color: #ffffff; }
57 |
58 | /* Interaction states
59 | ----------------------------------*/
60 | .ui-state-default, .ui-widget-content .ui-state-default, .ui-widget-header .ui-state-default { border: 1px solid #dcd9de; background: #dcd9de url(images/ui-bg_highlight-soft_100_dcd9de_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #665874; }
61 | .ui-state-default a, .ui-state-default a:link, .ui-state-default a:visited { color: #665874; text-decoration: none; }
62 | .ui-state-hover, .ui-widget-content .ui-state-hover, .ui-widget-header .ui-state-hover, .ui-state-focus, .ui-widget-content .ui-state-focus, .ui-widget-header .ui-state-focus { border: 1px solid #d1c5d8; background: #eae6ea url(images/ui-bg_highlight-soft_100_eae6ea_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #734d99; }
63 | .ui-state-hover a, .ui-state-hover a:hover { color: #734d99; text-decoration: none; }
64 | .ui-state-active, .ui-widget-content .ui-state-active, .ui-widget-header .ui-state-active { border: 1px solid #7e7783; background: #5f5964 url(images/ui-bg_highlight-soft_45_5f5964_1x100.png) 50% 50% repeat-x; font-weight: bold; color: #ffffff; }
65 | .ui-state-active a, .ui-state-active a:link, .ui-state-active a:visited { color: #ffffff; text-decoration: none; }
66 | .ui-widget :active { outline: none; }
67 |
68 | /* Interaction Cues
69 | ----------------------------------*/
70 | .ui-state-highlight, .ui-widget-content .ui-state-highlight, .ui-widget-header .ui-state-highlight {border: 1px solid #ffdb1f; background: #fafafa url(images/ui-bg_flat_55_fafafa_40x100.png) 50% 50% repeat-x; color: #333333; }
71 | .ui-state-highlight a, .ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a { color: #333333; }
72 | .ui-state-error, .ui-widget-content .ui-state-error, .ui-widget-header .ui-state-error {border: 1px solid #994d53; background: #994d53 url(images/ui-bg_flat_55_994d53_40x100.png) 50% 50% repeat-x; color: #ffffff; }
73 | .ui-state-error a, .ui-widget-content .ui-state-error a, .ui-widget-header .ui-state-error a { color: #ffffff; }
74 | .ui-state-error-text, .ui-widget-content .ui-state-error-text, .ui-widget-header .ui-state-error-text { color: #ffffff; }
75 | .ui-priority-primary, .ui-widget-content .ui-priority-primary, .ui-widget-header .ui-priority-primary { font-weight: bold; }
76 | .ui-priority-secondary, .ui-widget-content .ui-priority-secondary, .ui-widget-header .ui-priority-secondary { opacity: .7; filter:Alpha(Opacity=70); font-weight: normal; }
77 | .ui-state-disabled, .ui-widget-content .ui-state-disabled, .ui-widget-header .ui-state-disabled { opacity: .35; filter:Alpha(Opacity=35); background-image: none; }
78 |
79 | /* Icons
80 | ----------------------------------*/
81 |
82 | /* states and images */
83 | .ui-icon { width: 16px; height: 16px; background-image: url(images/ui-icons_ffffff_256x240.png); }
84 | .ui-widget-content .ui-icon {background-image: url(images/ui-icons_ffffff_256x240.png); }
85 | .ui-widget-header .ui-icon {background-image: url(images/ui-icons_a8a3ae_256x240.png); }
86 | .ui-state-default .ui-icon { background-image: url(images/ui-icons_8d78a5_256x240.png); }
87 | .ui-state-hover .ui-icon, .ui-state-focus .ui-icon {background-image: url(images/ui-icons_734d99_256x240.png); }
88 | .ui-state-active .ui-icon {background-image: url(images/ui-icons_454545_256x240.png); }
89 | .ui-state-highlight .ui-icon {background-image: url(images/ui-icons_8d78a5_256x240.png); }
90 | .ui-state-error .ui-icon, .ui-state-error-text .ui-icon {background-image: url(images/ui-icons_ebccce_256x240.png); }
91 |
92 | /* positioning */
93 | .ui-icon-carat-1-n { background-position: 0 0; }
94 | .ui-icon-carat-1-ne { background-position: -16px 0; }
95 | .ui-icon-carat-1-e { background-position: -32px 0; }
96 | .ui-icon-carat-1-se { background-position: -48px 0; }
97 | .ui-icon-carat-1-s { background-position: -64px 0; }
98 | .ui-icon-carat-1-sw { background-position: -80px 0; }
99 | .ui-icon-carat-1-w { background-position: -96px 0; }
100 | .ui-icon-carat-1-nw { background-position: -112px 0; }
101 | .ui-icon-carat-2-n-s { background-position: -128px 0; }
102 | .ui-icon-carat-2-e-w { background-position: -144px 0; }
103 | .ui-icon-triangle-1-n { background-position: 0 -16px; }
104 | .ui-icon-triangle-1-ne { background-position: -16px -16px; }
105 | .ui-icon-triangle-1-e { background-position: -32px -16px; }
106 | .ui-icon-triangle-1-se { background-position: -48px -16px; }
107 | .ui-icon-triangle-1-s { background-position: -64px -16px; }
108 | .ui-icon-triangle-1-sw { background-position: -80px -16px; }
109 | .ui-icon-triangle-1-w { background-position: -96px -16px; }
110 | .ui-icon-triangle-1-nw { background-position: -112px -16px; }
111 | .ui-icon-triangle-2-n-s { background-position: -128px -16px; }
112 | .ui-icon-triangle-2-e-w { background-position: -144px -16px; }
113 | .ui-icon-arrow-1-n { background-position: 0 -32px; }
114 | .ui-icon-arrow-1-ne { background-position: -16px -32px; }
115 | .ui-icon-arrow-1-e { background-position: -32px -32px; }
116 | .ui-icon-arrow-1-se { background-position: -48px -32px; }
117 | .ui-icon-arrow-1-s { background-position: -64px -32px; }
118 | .ui-icon-arrow-1-sw { background-position: -80px -32px; }
119 | .ui-icon-arrow-1-w { background-position: -96px -32px; }
120 | .ui-icon-arrow-1-nw { background-position: -112px -32px; }
121 | .ui-icon-arrow-2-n-s { background-position: -128px -32px; }
122 | .ui-icon-arrow-2-ne-sw { background-position: -144px -32px; }
123 | .ui-icon-arrow-2-e-w { background-position: -160px -32px; }
124 | .ui-icon-arrow-2-se-nw { background-position: -176px -32px; }
125 | .ui-icon-arrowstop-1-n { background-position: -192px -32px; }
126 | .ui-icon-arrowstop-1-e { background-position: -208px -32px; }
127 | .ui-icon-arrowstop-1-s { background-position: -224px -32px; }
128 | .ui-icon-arrowstop-1-w { background-position: -240px -32px; }
129 | .ui-icon-arrowthick-1-n { background-position: 0 -48px; }
130 | .ui-icon-arrowthick-1-ne { background-position: -16px -48px; }
131 | .ui-icon-arrowthick-1-e { background-position: -32px -48px; }
132 | .ui-icon-arrowthick-1-se { background-position: -48px -48px; }
133 | .ui-icon-arrowthick-1-s { background-position: -64px -48px; }
134 | .ui-icon-arrowthick-1-sw { background-position: -80px -48px; }
135 | .ui-icon-arrowthick-1-w { background-position: -96px -48px; }
136 | .ui-icon-arrowthick-1-nw { background-position: -112px -48px; }
137 | .ui-icon-arrowthick-2-n-s { background-position: -128px -48px; }
138 | .ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; }
139 | .ui-icon-arrowthick-2-e-w { background-position: -160px -48px; }
140 | .ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; }
141 | .ui-icon-arrowthickstop-1-n { background-position: -192px -48px; }
142 | .ui-icon-arrowthickstop-1-e { background-position: -208px -48px; }
143 | .ui-icon-arrowthickstop-1-s { background-position: -224px -48px; }
144 | .ui-icon-arrowthickstop-1-w { background-position: -240px -48px; }
145 | .ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; }
146 | .ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; }
147 | .ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; }
148 | .ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; }
149 | .ui-icon-arrowreturn-1-w { background-position: -64px -64px; }
150 | .ui-icon-arrowreturn-1-n { background-position: -80px -64px; }
151 | .ui-icon-arrowreturn-1-e { background-position: -96px -64px; }
152 | .ui-icon-arrowreturn-1-s { background-position: -112px -64px; }
153 | .ui-icon-arrowrefresh-1-w { background-position: -128px -64px; }
154 | .ui-icon-arrowrefresh-1-n { background-position: -144px -64px; }
155 | .ui-icon-arrowrefresh-1-e { background-position: -160px -64px; }
156 | .ui-icon-arrowrefresh-1-s { background-position: -176px -64px; }
157 | .ui-icon-arrow-4 { background-position: 0 -80px; }
158 | .ui-icon-arrow-4-diag { background-position: -16px -80px; }
159 | .ui-icon-extlink { background-position: -32px -80px; }
160 | .ui-icon-newwin { background-position: -48px -80px; }
161 | .ui-icon-refresh { background-position: -64px -80px; }
162 | .ui-icon-shuffle { background-position: -80px -80px; }
163 | .ui-icon-transfer-e-w { background-position: -96px -80px; }
164 | .ui-icon-transferthick-e-w { background-position: -112px -80px; }
165 | .ui-icon-folder-collapsed { background-position: 0 -96px; }
166 | .ui-icon-folder-open { background-position: -16px -96px; }
167 | .ui-icon-document { background-position: -32px -96px; }
168 | .ui-icon-document-b { background-position: -48px -96px; }
169 | .ui-icon-note { background-position: -64px -96px; }
170 | .ui-icon-mail-closed { background-position: -80px -96px; }
171 | .ui-icon-mail-open { background-position: -96px -96px; }
172 | .ui-icon-suitcase { background-position: -112px -96px; }
173 | .ui-icon-comment { background-position: -128px -96px; }
174 | .ui-icon-person { background-position: -144px -96px; }
175 | .ui-icon-print { background-position: -160px -96px; }
176 | .ui-icon-trash { background-position: -176px -96px; }
177 | .ui-icon-locked { background-position: -192px -96px; }
178 | .ui-icon-unlocked { background-position: -208px -96px; }
179 | .ui-icon-bookmark { background-position: -224px -96px; }
180 | .ui-icon-tag { background-position: -240px -96px; }
181 | .ui-icon-home { background-position: 0 -112px; }
182 | .ui-icon-flag { background-position: -16px -112px; }
183 | .ui-icon-calendar { background-position: -32px -112px; }
184 | .ui-icon-cart { background-position: -48px -112px; }
185 | .ui-icon-pencil { background-position: -64px -112px; }
186 | .ui-icon-clock { background-position: -80px -112px; }
187 | .ui-icon-disk { background-position: -96px -112px; }
188 | .ui-icon-calculator { background-position: -112px -112px; }
189 | .ui-icon-zoomin { background-position: -128px -112px; }
190 | .ui-icon-zoomout { background-position: -144px -112px; }
191 | .ui-icon-search { background-position: -160px -112px; }
192 | .ui-icon-wrench { background-position: -176px -112px; }
193 | .ui-icon-gear { background-position: -192px -112px; }
194 | .ui-icon-heart { background-position: -208px -112px; }
195 | .ui-icon-star { background-position: -224px -112px; }
196 | .ui-icon-link { background-position: -240px -112px; }
197 | .ui-icon-cancel { background-position: 0 -128px; }
198 | .ui-icon-plus { background-position: -16px -128px; }
199 | .ui-icon-plusthick { background-position: -32px -128px; }
200 | .ui-icon-minus { background-position: -48px -128px; }
201 | .ui-icon-minusthick { background-position: -64px -128px; }
202 | .ui-icon-close { background-position: -80px -128px; }
203 | .ui-icon-closethick { background-position: -96px -128px; }
204 | .ui-icon-key { background-position: -112px -128px; }
205 | .ui-icon-lightbulb { background-position: -128px -128px; }
206 | .ui-icon-scissors { background-position: -144px -128px; }
207 | .ui-icon-clipboard { background-position: -160px -128px; }
208 | .ui-icon-copy { background-position: -176px -128px; }
209 | .ui-icon-contact { background-position: -192px -128px; }
210 | .ui-icon-image { background-position: -208px -128px; }
211 | .ui-icon-video { background-position: -224px -128px; }
212 | .ui-icon-script { background-position: -240px -128px; }
213 | .ui-icon-alert { background-position: 0 -144px; }
214 | .ui-icon-info { background-position: -16px -144px; }
215 | .ui-icon-notice { background-position: -32px -144px; }
216 | .ui-icon-help { background-position: -48px -144px; }
217 | .ui-icon-check { background-position: -64px -144px; }
218 | .ui-icon-bullet { background-position: -80px -144px; }
219 | .ui-icon-radio-off { background-position: -96px -144px; }
220 | .ui-icon-radio-on { background-position: -112px -144px; }
221 | .ui-icon-pin-w { background-position: -128px -144px; }
222 | .ui-icon-pin-s { background-position: -144px -144px; }
223 | .ui-icon-play { background-position: 0 -160px; }
224 | .ui-icon-pause { background-position: -16px -160px; }
225 | .ui-icon-seek-next { background-position: -32px -160px; }
226 | .ui-icon-seek-prev { background-position: -48px -160px; }
227 | .ui-icon-seek-end { background-position: -64px -160px; }
228 | .ui-icon-seek-start { background-position: -80px -160px; }
229 | /* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */
230 | .ui-icon-seek-first { background-position: -80px -160px; }
231 | .ui-icon-stop { background-position: -96px -160px; }
232 | .ui-icon-eject { background-position: -112px -160px; }
233 | .ui-icon-volume-off { background-position: -128px -160px; }
234 | .ui-icon-volume-on { background-position: -144px -160px; }
235 | .ui-icon-power { background-position: 0 -176px; }
236 | .ui-icon-signal-diag { background-position: -16px -176px; }
237 | .ui-icon-signal { background-position: -32px -176px; }
238 | .ui-icon-battery-0 { background-position: -48px -176px; }
239 | .ui-icon-battery-1 { background-position: -64px -176px; }
240 | .ui-icon-battery-2 { background-position: -80px -176px; }
241 | .ui-icon-battery-3 { background-position: -96px -176px; }
242 | .ui-icon-circle-plus { background-position: 0 -192px; }
243 | .ui-icon-circle-minus { background-position: -16px -192px; }
244 | .ui-icon-circle-close { background-position: -32px -192px; }
245 | .ui-icon-circle-triangle-e { background-position: -48px -192px; }
246 | .ui-icon-circle-triangle-s { background-position: -64px -192px; }
247 | .ui-icon-circle-triangle-w { background-position: -80px -192px; }
248 | .ui-icon-circle-triangle-n { background-position: -96px -192px; }
249 | .ui-icon-circle-arrow-e { background-position: -112px -192px; }
250 | .ui-icon-circle-arrow-s { background-position: -128px -192px; }
251 | .ui-icon-circle-arrow-w { background-position: -144px -192px; }
252 | .ui-icon-circle-arrow-n { background-position: -160px -192px; }
253 | .ui-icon-circle-zoomin { background-position: -176px -192px; }
254 | .ui-icon-circle-zoomout { background-position: -192px -192px; }
255 | .ui-icon-circle-check { background-position: -208px -192px; }
256 | .ui-icon-circlesmall-plus { background-position: 0 -208px; }
257 | .ui-icon-circlesmall-minus { background-position: -16px -208px; }
258 | .ui-icon-circlesmall-close { background-position: -32px -208px; }
259 | .ui-icon-squaresmall-plus { background-position: -48px -208px; }
260 | .ui-icon-squaresmall-minus { background-position: -64px -208px; }
261 | .ui-icon-squaresmall-close { background-position: -80px -208px; }
262 | .ui-icon-grip-dotted-vertical { background-position: 0 -224px; }
263 | .ui-icon-grip-dotted-horizontal { background-position: -16px -224px; }
264 | .ui-icon-grip-solid-vertical { background-position: -32px -224px; }
265 | .ui-icon-grip-solid-horizontal { background-position: -48px -224px; }
266 | .ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; }
267 | .ui-icon-grip-diagonal-se { background-position: -80px -224px; }
268 |
269 |
270 | /* Misc visuals
271 | ----------------------------------*/
272 |
273 | /* Corner radius */
274 | .ui-corner-tl { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; }
275 | .ui-corner-tr { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
276 | .ui-corner-bl { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
277 | .ui-corner-br { -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
278 | .ui-corner-top { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; }
279 | .ui-corner-bottom { -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
280 | .ui-corner-right { -moz-border-radius-topright: 6px; -webkit-border-top-right-radius: 6px; border-top-right-radius: 6px; -moz-border-radius-bottomright: 6px; -webkit-border-bottom-right-radius: 6px; border-bottom-right-radius: 6px; }
281 | .ui-corner-left { -moz-border-radius-topleft: 6px; -webkit-border-top-left-radius: 6px; border-top-left-radius: 6px; -moz-border-radius-bottomleft: 6px; -webkit-border-bottom-left-radius: 6px; border-bottom-left-radius: 6px; }
282 | .ui-corner-all { -moz-border-radius: 6px; -webkit-border-radius: 6px; border-radius: 6px; }
283 |
284 | /* Overlays */
285 | .ui-widget-overlay { background: #eeeeee url(images/ui-bg_flat_0_eeeeee_40x100.png) 50% 50% repeat-x; opacity: .80;filter:Alpha(Opacity=80); }
286 | .ui-widget-shadow { margin: -4px 0 0 -4px; padding: 4px; background: #aaaaaa url(images/ui-bg_flat_0_aaaaaa_40x100.png) 50% 50% repeat-x; opacity: .60;filter:Alpha(Opacity=60); -moz-border-radius: 0px; -webkit-border-radius: 0px; border-radius: 0px; }/* Resizable
287 | ----------------------------------*/
288 | .ui-resizable { position: relative;}
289 | .ui-resizable-handle { position: absolute;font-size: 0.1px;z-index: 99999; display: block;}
290 | .ui-resizable-disabled .ui-resizable-handle, .ui-resizable-autohide .ui-resizable-handle { display: none; }
291 | .ui-resizable-n { cursor: n-resize; height: 7px; width: 100%; top: -5px; left: 0; }
292 | .ui-resizable-s { cursor: s-resize; height: 7px; width: 100%; bottom: -5px; left: 0; }
293 | .ui-resizable-e { cursor: e-resize; width: 7px; right: -5px; top: 0; height: 100%; }
294 | .ui-resizable-w { cursor: w-resize; width: 7px; left: -5px; top: 0; height: 100%; }
295 | .ui-resizable-se { cursor: se-resize; width: 12px; height: 12px; right: 1px; bottom: 1px; }
296 | .ui-resizable-sw { cursor: sw-resize; width: 9px; height: 9px; left: -5px; bottom: -5px; }
297 | .ui-resizable-nw { cursor: nw-resize; width: 9px; height: 9px; left: -5px; top: -5px; }
298 | .ui-resizable-ne { cursor: ne-resize; width: 9px; height: 9px; right: -5px; top: -5px;}/* Selectable
299 | ----------------------------------*/
300 | .ui-selectable-helper { border:1px dotted black }
301 | /* Accordion
302 | ----------------------------------*/
303 | .ui-accordion .ui-accordion-header { cursor: pointer; position: relative; margin-top: 1px; zoom: 1; }
304 | .ui-accordion .ui-accordion-li-fix { display: inline; }
305 | .ui-accordion .ui-accordion-header-active { border-bottom: 0 !important; }
306 | .ui-accordion .ui-accordion-header a { display: block; font-size: 1em; padding: .5em .5em .5em .7em; }
307 | /* IE7-/Win - Fix extra vertical space in lists */
308 | .ui-accordion a { zoom: 1; }
309 | .ui-accordion-icons .ui-accordion-header a { padding-left: 2.2em; }
310 | .ui-accordion .ui-accordion-header .ui-icon { position: absolute; left: .5em; top: 50%; margin-top: -8px; }
311 | .ui-accordion .ui-accordion-content { padding: 1em 2.2em; border-top: 0; margin-top: -2px; position: relative; top: 1px; margin-bottom: 2px; overflow: auto; display: none; zoom: 1; }
312 | .ui-accordion .ui-accordion-content-active { display: block; }/* Autocomplete
313 | ----------------------------------*/
314 | .ui-autocomplete { position: absolute; cursor: default; }
315 | .ui-autocomplete-loading { background: white url('images/ui-anim_basic_16x16.gif') right center no-repeat; }
316 |
317 | /* workarounds */
318 | * html .ui-autocomplete { width:1px; } /* without this, the menu expands to 100% in IE6 */
319 |
320 | /* Menu
321 | ----------------------------------*/
322 | .ui-menu {
323 | list-style:none;
324 | padding: 2px;
325 | margin: 0;
326 | display:block;
327 | }
328 | .ui-menu .ui-menu {
329 | margin-top: -3px;
330 | }
331 | .ui-menu .ui-menu-item {
332 | margin:0;
333 | padding: 0;
334 | zoom: 1;
335 | float: left;
336 | clear: left;
337 | width: 100%;
338 | }
339 | .ui-menu .ui-menu-item a {
340 | text-decoration:none;
341 | display:block;
342 | padding:.2em .4em;
343 | line-height:1.5;
344 | zoom:1;
345 | }
346 | .ui-menu .ui-menu-item a.ui-state-hover,
347 | .ui-menu .ui-menu-item a.ui-state-active {
348 | font-weight: normal;
349 | margin: -1px;
350 | }
351 | /* Button
352 | ----------------------------------*/
353 |
354 | .ui-button { display: inline-block; position: relative; padding: 0; margin-right: .1em; text-decoration: none !important; cursor: pointer; text-align: center; zoom: 1; overflow: visible; } /* the overflow property removes extra width in IE */
355 | .ui-button-icon-only { width: 2.2em; } /* to make room for the icon, a width needs to be set here */
356 | button.ui-button-icon-only { width: 2.4em; } /* button elements seem to need a little more width */
357 | .ui-button-icons-only { width: 3.4em; }
358 | button.ui-button-icons-only { width: 3.7em; }
359 |
360 | /*button text element */
361 | .ui-button .ui-button-text { display: block; line-height: 1.4; }
362 | .ui-button-text-only .ui-button-text { padding: .4em 1em; }
363 | .ui-button-icon-only .ui-button-text, .ui-button-icons-only .ui-button-text { padding: .4em; text-indent: -9999999px; }
364 | .ui-button-text-icon .ui-button-text, .ui-button-text-icons .ui-button-text { padding: .4em 1em .4em 2.1em; }
365 | .ui-button-text-icons .ui-button-text { padding-left: 2.1em; padding-right: 2.1em; }
366 | /* no icon support for input elements, provide padding by default */
367 | input.ui-button { padding: .4em 1em; }
368 |
369 | /*button icon element(s) */
370 | .ui-button-icon-only .ui-icon, .ui-button-text-icon .ui-icon, .ui-button-text-icons .ui-icon, .ui-button-icons-only .ui-icon { position: absolute; top: 50%; margin-top: -8px; }
371 | .ui-button-icon-only .ui-icon { left: 50%; margin-left: -8px; }
372 | .ui-button-text-icon .ui-button-icon-primary, .ui-button-text-icons .ui-button-icon-primary, .ui-button-icons-only .ui-button-icon-primary { left: .5em; }
373 | .ui-button-text-icons .ui-button-icon-secondary, .ui-button-icons-only .ui-button-icon-secondary { right: .5em; }
374 |
375 | /*button sets*/
376 | .ui-buttonset { margin-right: 7px; }
377 | .ui-buttonset .ui-button { margin-left: 0; margin-right: -.3em; }
378 |
379 | /* workarounds */
380 | button.ui-button::-moz-focus-inner { border: 0; padding: 0; } /* reset extra padding in Firefox */
381 |
382 |
383 |
384 |
385 |
386 | /* Dialog
387 | ----------------------------------*/
388 | .ui-dialog { position: absolute; padding: .2em; width: 300px; overflow: hidden; }
389 | .ui-dialog .ui-dialog-titlebar { padding: .5em 1em .3em; position: relative; }
390 | .ui-dialog .ui-dialog-title { float: left; margin: .1em 16px .2em 0; }
391 | .ui-dialog .ui-dialog-titlebar-close { position: absolute; right: .3em; top: 50%; width: 19px; margin: -10px 0 0 0; padding: 1px; height: 18px; }
392 | .ui-dialog .ui-dialog-titlebar-close span { display: block; margin: 1px; }
393 | .ui-dialog .ui-dialog-titlebar-close:hover, .ui-dialog .ui-dialog-titlebar-close:focus { padding: 0; }
394 | .ui-dialog .ui-dialog-content { border: 0; padding: .5em 1em; background: none; overflow: auto; zoom: 1; }
395 | .ui-dialog .ui-dialog-buttonpane { text-align: left; border-width: 1px 0 0 0; background-image: none; margin: .5em 0 0 0; padding: .3em 1em .5em .4em; }
396 | .ui-dialog .ui-dialog-buttonpane button { float: right; margin: .5em .4em .5em 0; cursor: pointer; padding: .2em .6em .3em .6em; line-height: 1.4em; width:auto; overflow:visible; }
397 | .ui-dialog .ui-resizable-se { width: 14px; height: 14px; right: 3px; bottom: 3px; }
398 | .ui-draggable .ui-dialog-titlebar { cursor: move; }
399 | /* Slider
400 | ----------------------------------*/
401 | .ui-slider { position: relative; text-align: left; }
402 | .ui-slider .ui-slider-handle { position: absolute; z-index: 2; width: 1.2em; height: 1.2em; cursor: default; }
403 | .ui-slider .ui-slider-range { position: absolute; z-index: 1; font-size: .7em; display: block; border: 0; background-position: 0 0; }
404 |
405 | .ui-slider-horizontal { height: .8em; }
406 | .ui-slider-horizontal .ui-slider-handle { top: -.3em; margin-left: -.6em; }
407 | .ui-slider-horizontal .ui-slider-range { top: 0; height: 100%; }
408 | .ui-slider-horizontal .ui-slider-range-min { left: 0; }
409 | .ui-slider-horizontal .ui-slider-range-max { right: 0; }
410 |
411 | .ui-slider-vertical { width: .8em; height: 100px; }
412 | .ui-slider-vertical .ui-slider-handle { left: -.3em; margin-left: 0; margin-bottom: -.6em; }
413 | .ui-slider-vertical .ui-slider-range { left: 0; width: 100%; }
414 | .ui-slider-vertical .ui-slider-range-min { bottom: 0; }
415 | .ui-slider-vertical .ui-slider-range-max { top: 0; }/* Tabs
416 | ----------------------------------*/
417 | .ui-tabs { position: relative; padding: .2em; zoom: 1; } /* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */
418 | .ui-tabs .ui-tabs-nav { margin: 0; padding: .2em .2em 0; }
419 | .ui-tabs .ui-tabs-nav li { list-style: none; float: left; position: relative; top: 1px; margin: 0 .2em 1px 0; border-bottom: 0 !important; padding: 0; white-space: nowrap; }
420 | .ui-tabs .ui-tabs-nav li a { float: left; padding: .5em 1em; text-decoration: none; }
421 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected { margin-bottom: 0; padding-bottom: 1px; }
422 | .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { cursor: text; }
423 | .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { cursor: pointer; } /* first selector in group seems obsolete, but required to overcome bug in Opera applying cursor: text overall if defined elsewhere... */
424 | .ui-tabs .ui-tabs-panel { display: block; border-width: 0; padding: 1em 1.4em; background: none; }
425 | .ui-tabs .ui-tabs-hide { display: none !important; }
426 | /* Datepicker
427 | ----------------------------------*/
428 | .ui-datepicker { width: 17em; padding: .2em .2em 0; }
429 | .ui-datepicker .ui-datepicker-header { position:relative; padding:.2em 0; }
430 | .ui-datepicker .ui-datepicker-prev, .ui-datepicker .ui-datepicker-next { position:absolute; top: 2px; width: 1.8em; height: 1.8em; }
431 | .ui-datepicker .ui-datepicker-prev-hover, .ui-datepicker .ui-datepicker-next-hover { top: 1px; }
432 | .ui-datepicker .ui-datepicker-prev { left:2px; }
433 | .ui-datepicker .ui-datepicker-next { right:2px; }
434 | .ui-datepicker .ui-datepicker-prev-hover { left:1px; }
435 | .ui-datepicker .ui-datepicker-next-hover { right:1px; }
436 | .ui-datepicker .ui-datepicker-prev span, .ui-datepicker .ui-datepicker-next span { display: block; position: absolute; left: 50%; margin-left: -8px; top: 50%; margin-top: -8px; }
437 | .ui-datepicker .ui-datepicker-title { margin: 0 2.3em; line-height: 1.8em; text-align: center; }
438 | .ui-datepicker .ui-datepicker-title select { font-size:1em; margin:1px 0; }
439 | .ui-datepicker select.ui-datepicker-month-year {width: 100%;}
440 | .ui-datepicker select.ui-datepicker-month,
441 | .ui-datepicker select.ui-datepicker-year { width: 49%;}
442 | .ui-datepicker table {width: 100%; font-size: .9em; border-collapse: collapse; margin:0 0 .4em; }
443 | .ui-datepicker th { padding: .7em .3em; text-align: center; font-weight: bold; border: 0; }
444 | .ui-datepicker td { border: 0; padding: 1px; }
445 | .ui-datepicker td span, .ui-datepicker td a { display: block; padding: .2em; text-align: right; text-decoration: none; }
446 | .ui-datepicker .ui-datepicker-buttonpane { background-image: none; margin: .7em 0 0 0; padding:0 .2em; border-left: 0; border-right: 0; border-bottom: 0; }
447 | .ui-datepicker .ui-datepicker-buttonpane button { float: right; margin: .5em .2em .4em; cursor: pointer; padding: .2em .6em .3em .6em; width:auto; overflow:visible; }
448 | .ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { float:left; }
449 |
450 | /* with multiple calendars */
451 | .ui-datepicker.ui-datepicker-multi { width:auto; }
452 | .ui-datepicker-multi .ui-datepicker-group { float:left; }
453 | .ui-datepicker-multi .ui-datepicker-group table { width:95%; margin:0 auto .4em; }
454 | .ui-datepicker-multi-2 .ui-datepicker-group { width:50%; }
455 | .ui-datepicker-multi-3 .ui-datepicker-group { width:33.3%; }
456 | .ui-datepicker-multi-4 .ui-datepicker-group { width:25%; }
457 | .ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header { border-left-width:0; }
458 | .ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { border-left-width:0; }
459 | .ui-datepicker-multi .ui-datepicker-buttonpane { clear:left; }
460 | .ui-datepicker-row-break { clear:both; width:100%; }
461 |
462 | /* RTL support */
463 | .ui-datepicker-rtl { direction: rtl; }
464 | .ui-datepicker-rtl .ui-datepicker-prev { right: 2px; left: auto; }
465 | .ui-datepicker-rtl .ui-datepicker-next { left: 2px; right: auto; }
466 | .ui-datepicker-rtl .ui-datepicker-prev:hover { right: 1px; left: auto; }
467 | .ui-datepicker-rtl .ui-datepicker-next:hover { left: 1px; right: auto; }
468 | .ui-datepicker-rtl .ui-datepicker-buttonpane { clear:right; }
469 | .ui-datepicker-rtl .ui-datepicker-buttonpane button { float: left; }
470 | .ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current { float:right; }
471 | .ui-datepicker-rtl .ui-datepicker-group { float:right; }
472 | .ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
473 | .ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { border-right-width:0; border-left-width:1px; }
474 |
475 | /* IE6 IFRAME FIX (taken from datepicker 1.5.3 */
476 | .ui-datepicker-cover {
477 | display: none; /*sorry for IE5*/
478 | display/**/: block; /*sorry for IE5*/
479 | position: absolute; /*must have*/
480 | z-index: -1; /*must have*/
481 | filter: mask(); /*must have*/
482 | top: -4px; /*must have*/
483 | left: -4px; /*must have*/
484 | width: 200px; /*must have*/
485 | height: 200px; /*must have*/
486 | }/* Progressbar
487 | ----------------------------------*/
488 | .ui-progressbar { height:2em; text-align: left; }
489 | .ui-progressbar .ui-progressbar-value {margin: -1px; height:100%; }
--------------------------------------------------------------------------------
/server/static/js/jquery-1.4.2.min.js:
--------------------------------------------------------------------------------
1 | /*!
2 | * jQuery JavaScript Library v1.4.2
3 | * http://jquery.com/
4 | *
5 | * Copyright 2010, John Resig
6 | * Dual licensed under the MIT or GPL Version 2 licenses.
7 | * http://jquery.org/license
8 | *
9 | * Includes Sizzle.js
10 | * http://sizzlejs.com/
11 | * Copyright 2010, The Dojo Foundation
12 | * Released under the MIT, BSD, and GPL Licenses.
13 | *
14 | * Date: Sat Feb 13 22:33:48 2010 -0500
15 | */
16 | (function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/,
21 | Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&&
22 | (d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this,
23 | a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b===
24 | "find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,
25 | function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;ba ";
34 | var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected,
35 | parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent=
36 | false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML=" ";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n=
37 | s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,
38 | applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando];
39 | else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,
40 | a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===
41 | w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i,
42 | cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected=
47 | c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");
48 | a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g,
49 | function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split(".");
50 | k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a),
51 | C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B=0){a.type=
53 | e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&&
54 | f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive;
55 | if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data",
63 | e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a,
64 | "_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a,
65 | d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
71 | e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift();
72 | t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D||
73 | g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},
80 | CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m,
81 | g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},
82 | text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},
83 | setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return hl[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=
84 | h[3];l=0;for(m=h.length;l=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m===
86 | "="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g,
87 | h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l ";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&&
90 | q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML=" ";
91 | if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="
";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}();
92 | (function(){var g=s.createElement("div");g.innerHTML="
";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}:
93 | function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var j=d;j0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j=
96 | {},i;if(f&&a.length){e=0;for(var o=a.length;e-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a===
97 | "string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",
98 | d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?
99 | a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType===
100 | 1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/"+d+">"},F={option:[1,""," "],legend:[1,""," "],thead:[1,""],tr:[2,""],td:[3,""],col:[2,""],area:[1,""," "],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div","
"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=
102 | c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},
103 | wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},
104 | prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,
105 | this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild);
106 | return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja,
107 | ""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]);
111 | return this}else{e=0;for(var j=d.length;e0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["",
112 | ""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]===""&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e=
113 | c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]?
114 | c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja=
115 | function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter=
116 | Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a,
117 | "border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f=
118 | a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b=
119 | a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/