├── .gitignore ├── README.md └── server ├── Pd.py ├── aux_patches ├── .svn │ ├── all-wcprops │ ├── entries │ ├── prop-base │ │ ├── id.pd.svn-base │ │ ├── nmb.pd.svn-base │ │ ├── server.pd.svn-base │ │ └── sym.pd.svn-base │ └── text-base │ │ ├── id.pd.svn-base │ │ ├── nmb.pd.svn-base │ │ ├── server.pd.svn-base │ │ └── sym.pd.svn-base ├── id.pd ├── nmb.pd ├── server.pd └── sym.pd ├── basic_classes ├── .svn │ ├── all-wcprops │ ├── entries │ ├── prop-base │ │ ├── __init__.py.svn-base │ │ ├── box.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 │ └── text-base │ │ ├── __init__.py.svn-base │ │ ├── box.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 ├── __init__.py ├── box.py ├── comment.py ├── connection.py ├── message.py ├── number.py ├── object.py └── symbol.py ├── communication.py ├── gui_updater.py ├── killPureeData.sh ├── properties.config ├── pureeDataServer.py ├── startPureeData.sh ├── static ├── css │ ├── eggplant │ │ ├── images │ │ │ ├── ui-anim_basic_16x16.gif │ │ │ ├── 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 │ │ │ ├── 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 │ │ └── jquery-ui-1.8.2.custom.css │ └── pureedata.css ├── favicon.ico ├── images │ ├── blender.png │ └── blender_logo.png ├── js │ ├── jquery-1.4.2.min.js │ ├── jquery-ui-1.8.2.custom.min.js │ ├── jquery.easyRotate.js │ ├── objects.js │ └── pureedata.js └── pureedata.pls ├── templates └── index.html └── transfer_board.py /.gitignore: -------------------------------------------------------------------------------- 1 | *.log 2 | *.out 3 | *.pyc 4 | server/old 5 | -------------------------------------------------------------------------------- /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/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/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/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 | -------------------------------------------------------------------------------- /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/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/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/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/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/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/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/server.pd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/aux_patches/server.pd -------------------------------------------------------------------------------- /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/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/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/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/box.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/basic_classes/.svn/text-base/__init__.py.svn-base: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/basic_classes/.svn/text-base/__init__.py.svn-base -------------------------------------------------------------------------------- /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/.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/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/.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/.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/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/.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/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/basic_classes/__init__.py -------------------------------------------------------------------------------- /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/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/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/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/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/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/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/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/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/killPureeData.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | sudo killall python 3 | sudo killall pdextended -------------------------------------------------------------------------------- /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/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/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-anim_basic_16x16.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/css/eggplant/images/ui-anim_basic_16x16.gif -------------------------------------------------------------------------------- /server/static/css/eggplant/images/ui-bg_flat_0_aaaaaa_40x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/css/eggplant/images/ui-bg_flat_55_fafafa_40x100.png -------------------------------------------------------------------------------- /server/static/css/eggplant/images/ui-bg_gloss-wave_30_3d3644_500x100.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/css/eggplant/images/ui-bg_highlight-soft_45_5f5964_1x100.png -------------------------------------------------------------------------------- /server/static/css/eggplant/images/ui-icons_454545_256x240.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/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/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/css/eggplant/images/ui-icons_ffffff_256x240.png -------------------------------------------------------------------------------- /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/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/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/favicon.ico -------------------------------------------------------------------------------- /server/static/images/blender.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/images/blender.png -------------------------------------------------------------------------------- /server/static/images/blender_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/t3db0t/PureeData/0825313b5abcbdd91a4ab1ada155dbcc33eb5557/server/static/images/blender_logo.png -------------------------------------------------------------------------------- /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(;b
a"; 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=/"},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=//gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== 120 | "string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("
").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, 121 | serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), 122 | function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, 123 | global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& 124 | e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? 125 | "&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== 126 | false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= 127 | false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", 128 | c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| 129 | d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); 130 | g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== 131 | 1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== 132 | "json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; 133 | if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== 139 | "number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| 140 | c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; 141 | this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= 142 | this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, 143 | e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b
"; 149 | a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); 150 | c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, 151 | d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- 152 | f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": 153 | "pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in 154 | e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); 155 | -------------------------------------------------------------------------------- /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/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/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/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/templates/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PuréeData 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 20 |
21 | 22 | 23 | 24 |
25 |
26 | 27 | 28 | 29 |
30 | 31 | 34 |
information
35 |
36 | 39 | 42 | 45 | 48 | 49 |
50 |
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 |
70 | PuréeData is a 2011 commission of New Radio and Performing Arts, Inc. (a.k.a Ether-Ore) for its Turbulence web site. It was made possible with funding from the Jerome Foundation. « Back to Turbulence.org 71 |
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 |
81 | PuréeData is a 2011 commission of New Radio and Performing Arts, Inc. (a.k.a Ether-Ore) for its Turbulence web site. It was made possible with funding from the Jerome Foundation. « Back to Turbulence.org 82 |
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/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 | --------------------------------------------------------------------------------