From 63dabd9789b74a32d1fc0ea6bd7a8b254abbb2c4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 09:07:18 -0600 Subject: [PATCH 01/30] Fix #7150 (Updated recipe for chilean news portal El Mercurio) --- resources/recipes/el_mercurio_chile.recipe | 51 +++++++++------------- 1 file changed, 20 insertions(+), 31 deletions(-) diff --git a/resources/recipes/el_mercurio_chile.recipe b/resources/recipes/el_mercurio_chile.recipe index e08a21d33a..a8371f5af9 100644 --- a/resources/recipes/el_mercurio_chile.recipe +++ b/resources/recipes/el_mercurio_chile.recipe @@ -1,7 +1,5 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' +__copyright__ = '2009-2010, Darko Miletic ' ''' emol.com ''' @@ -19,43 +17,34 @@ class ElMercurio(BasicNewsRecipe): no_stylesheets = True use_embedded_content = False encoding = 'cp1252' - cover_url = 'http://www.emol.com/especiales/logo_emol/logo_emol.gif' + masthead_url = 'http://www.emol.com/especiales/logo_emol/logo_emol.gif' remove_javascript = True use_embedded_content = False + language = 'es' + - html2lrf_options = [ - '--comment', description - , '--category', category - , '--publisher', publisher - ] - - html2epub_options = 'publisher="' + publisher + '"\ncomments="' + description + '"\ntags="' + category + '"' - - keep_only_tags = [ - dict(name='div', attrs={'class':'despliegue-txt_750px'}) - ,dict(name='div', attrs={'id':'div_cuerpo_participa'}) - ] - - remove_tags = [ - dict(name='div', attrs={'class':'contenedor_despliegue-col-left300'}) - ,dict(name='div', attrs={'id':['div_centro_dn_opc','div_cabezera','div_secciones','div_contenidos','div_pie','nav']}) - ] + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + keep_only_tags = [dict(name='div', attrs={'id':['cont_iz_titulobajada','cont_iz_creditos_1_a','cont_iz_cuerpo']})] + remove_tags = [dict(name='div', attrs={'id':'cont_iz_cuerpo_relacionados'})] + remove_attributes = ['height','width'] + feeds = [ - (u'Noticias de ultima hora', u'http://www.emol.com/rss20/rss.asp?canal=0') - ,(u'Nacional', u'http://www.emol.com/rss20/rss.asp?canal=1') - ,(u'Mundo', u'http://www.emol.com/rss20/rss.asp?canal=2') - ,(u'Deportes', u'http://www.emol.com/rss20/rss.asp?canal=4') - ,(u'Magazine', u'http://www.emol.com/rss20/rss.asp?canal=6') - ,(u'Tecnologia', u'http://www.emol.com/rss20/rss.asp?canal=5') - ,(u'La Musica', u'http://www.emol.com/rss20/rss.asp?canal=7') + (u'Noticias de ultima hora', u'http://rss.emol.com/rss.asp?canal=0') + ,(u'Nacional', u'http://rss.emol.com/rss.asp?canal=1') + ,(u'Mundo', u'http://rss.emol.com/rss.asp?canal=2') + ,(u'Deportes', u'http://rss.emol.com/rss.asp?canal=4') + ,(u'Magazine', u'http://rss.emol.com/rss.asp?canal=6') + ,(u'Tecnologia', u'http://rss.emol.com/rss.asp?canal=5') ] def preprocess_html(self, soup): - mtag = '' - soup.head.insert(0,mtag) for item in soup.findAll(style=True): del item['style'] return soup - language = 'es' From 4c493846703569828487279b5c6e536fb5cbbd2c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 13:24:22 -0600 Subject: [PATCH 02/30] Fix #7151 (The Miami Herald) --- resources/recipes/miami_herald.recipe | 73 ++++++++++----------------- 1 file changed, 28 insertions(+), 45 deletions(-) diff --git a/resources/recipes/miami_herald.recipe b/resources/recipes/miami_herald.recipe index 4500b02097..bdff88b375 100644 --- a/resources/recipes/miami_herald.recipe +++ b/resources/recipes/miami_herald.recipe @@ -1,6 +1,6 @@ __license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' +__copyright__ = '2009-2010, Darko Miletic ' ''' miamiherald.com ''' @@ -15,13 +15,11 @@ class TheMiamiHerald(BasicNewsRecipe): max_articles_per_feed = 100 publisher = u'The Miami Herald' category = u'miami herald, weather, dolphins, news, miami news, local news, miamiherald, miami newspaper, miamiherald.com, miami, the miami herald, broward, miami-dade' - language = 'en' - + language = 'en' no_stylesheets = True use_embedded_content = False encoding = 'cp1252' remove_javascript = True - extra_css = ''' h1{font-family:Arial,Helvetica,sans-serif; font-size:large; color:#1A272F; } .subheadline{font-family:Arial,Helvetica,sans-serif; font-size:30%; color: #666666;} @@ -33,50 +31,35 @@ class TheMiamiHerald(BasicNewsRecipe): .imageCaption{font-family:Arial,Helvetica,sans-serif; font-size:30%; color:#666666; } ''' - keep_only_tags = [dict(name='div', attrs={'id':['storyBody','storyPhotoContentArea']}), - ] + conversion_options = { + 'comment' : description + , 'tags' : category + , 'publisher' : publisher + , 'language' : language + } + + keep_only_tags = [dict(name='div', attrs={'id':'wide'}),] - remove_tags = [dict(name=['object','link','embed']), - dict(name='div', attrs={'class':["imageBuyButton","shareLinksArea","storyTools","spill_navigation pagination","circPromoArea","storyTools_footer","storyYahooContentMatch"]}) , - dict(name='div', attrs={'id':["pluck","mlt","storyAssets"]}) ] + remove_tags = [dict(name=['object','link','embed','iframe','meta'])] feeds = [ - (u'Breaking News' , u'http://www.miamiherald.com/416/index.xml' ) - ,(u'Miami-Dade' , u'http://www.miamiherald.com/460/index.xml' ) - ,(u'Broward' , u'http://www.miamiherald.com/467/index.xml' ) - ,(u'Florida Keys' , u'http://www.miamiherald.com/505/index.xml' ) - ,(u'Florida' , u'http://www.miamiherald.com/569/index.xml' ) - ,(u'Nation' , u'http://www.miamiherald.com/509/index.xml' ) - ,(u'World' , u'http://www.miamiherald.com/578/index.xml' ) - ,(u'Americas' , u'http://www.miamiherald.com/579/index.xml' ) - ,(u'Cuba' , u'http://www.miamiherald.com/581/index.xml' ) - ,(u'Haiti' , u'http://www.miamiherald.com/582/index.xml' ) - ,(u'Politics' , u'http://www.miamiherald.com/515/index.xml' ) - ,(u'Education' , u'http://www.miamiherald.com/295/index.xml' ) - ,(u'Environment' , u'http://www.miamiherald.com/573/index.xml' ) + (u'Breaking News' , u'http://www.miamiherald.com/news/breaking-news/index.xml' ) + ,(u'Miami-Dade' , u'http://www.miamiherald.com/news/miami-dade/index.xml' ) + ,(u'Broward' , u'http://www.miamiherald.com/news/broward/index.xml' ) + ,(u'Florida Keys' , u'http://www.miamiherald.com/news/florida-keys/index.xml' ) + ,(u'Florida' , u'http://www.miamiherald.com/news/florida/index.xml' ) + ,(u'Nation' , u'http://www.miamiherald.com/news/nation/index.xml' ) + ,(u'World' , u'http://www.miamiherald.com/news/world/index.xml' ) + ,(u'Americas' , u'http://www.miamiherald.com/news/americas/index.xml' ) + ,(u'Cuba' , u'http://www.miamiherald.com/news/americas/cuba/index.xml' ) + ,(u'Haiti' , u'http://www.miamiherald.com/news/americas/haiti/index.xml' ) + ,(u'Politics' , u'http://www.miamiherald.com/news/politics/index.xml' ) + ,(u'Education' , u'http://www.miamiherald.com/news/education/index.xml' ) + ,(u'Environment' , u'http://www.miamiherald.com/news/environment/index.xml' ) ] - - - - - def get_article_url(self, article): - ans = article.get('guid', None) - print ans - try: - self.log('Looking for full story link in', ans) - soup = self.index_to_soup(ans) - x = soup.find(text="Full Story") - - if x is not None: - a = x.parent - if a and a.has_key('href'): - ans = 'http://www.miamiherald.com'+a['href'] - self.log('Found full story link', ans) - except: - pass - return ans - - - + def print_version(self, url): + art, sep, rest = url.rpartition('/') + art2, sep2, rest2 = art.rpartition('/') + return art2 + '/v-print/' + rest2 + '/' + rest From ebecf86916113499828d7f8372595e1b90757c47 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 13:25:26 -0600 Subject: [PATCH 03/30] Fix #7152 (Business Standard) --- resources/recipes/business_standard.recipe | 44 +++++++++------------- 1 file changed, 17 insertions(+), 27 deletions(-) diff --git a/resources/recipes/business_standard.recipe b/resources/recipes/business_standard.recipe index 75b2e0af8f..badca48733 100644 --- a/resources/recipes/business_standard.recipe +++ b/resources/recipes/business_standard.recipe @@ -1,7 +1,5 @@ -#!/usr/bin/env python - __license__ = 'GPL v3' -__copyright__ = '2009, Darko Miletic ' +__copyright__ = '2009-2010, Darko Miletic ' ''' www.business-standard.com ''' @@ -28,30 +26,22 @@ class BusinessStandard(BasicNewsRecipe): ,'publisher' : publisher ,'linearize_tables': True } - - remove_attributes=['style'] - remove_tags = [dict(name=['object','link','script','iframe'])] + keep_only_tags=[dict(attrs={'class':'TableClas'})] + remove_tags = [ + dict(name=['object','link','script','iframe','base','meta']) + ,dict(attrs={'class':'rightDiv2'}) + ,dict(name='table',attrs={'width':'450px'}) + ] + remove_attributes=['width','height'] feeds = [ - (u'News Now' , u'http://feeds.business-standard.com/News-Now.xml' ) - ,(u'Banking & finance' , u'http://feeds.business-standard.com/Banking-Finance-All.xml' ) - ,(u'Companies & Industry', u'http://feeds.business-standard.com/Companies-Industry-All.xml') - ,(u'Economy & Policy' , u'http://feeds.business-standard.com/Economy-Policy-All.xml' ) - ,(u'Tech World' , u'http://feeds.business-standard.com/Tech-World-All.xml' ) - ,(u'Life & Leisure' , u'http://feeds.business-standard.com/Life-Leisure-All.xml' ) - ,(u'Markets & Investing' , u'http://feeds.business-standard.com/Markets-Investing-All.xml' ) - ,(u'Management & Mktg' , u'http://feeds.business-standard.com/Management-Mktg-All.xml' ) - ,(u'Automobiles' , u'http://feeds.business-standard.com/Automobiles.xml' ) - ,(u'Aviation' , u'http://feeds.business-standard.com/Aviation.xml' ) + (u'News Now' , u'http://feeds.business-standard.com/rss/online.xml') + ,(u'Banking & finance' , u'http://feeds.business-standard.com/rss/3_0.xml' ) + ,(u'Companies & Industry', u'http://feeds.business-standard.com/rss/2_0.xml' ) + ,(u'Economy & Policy' , u'http://feeds.business-standard.com/rss/4_0.xml' ) + ,(u'Tech World' , u'http://feeds.business-standard.com/rss/8_0.xml' ) + ,(u'Life & Leisure' , u'http://feeds.business-standard.com/rss/6_0.xml' ) + ,(u'Markets & Investing' , u'http://feeds.business-standard.com/rss/1_0.xml' ) + ,(u'Management & Mktg' , u'http://feeds.business-standard.com/rss/7_0.xml' ) + ,(u'Opinion' , u'http://feeds.business-standard.com/rss/5_0.xml' ) ] - - def print_version(self, url): - autono = url.rpartition('autono=')[2] - tp = 'on' - hk = url.rpartition('bKeyFlag=')[1] - if hk == '': - tp = '' - return 'http://www.business-standard.com/india/printpage.php?autono=' + autono + '&tp=' + tp - - def get_article_url(self, article): - return article.get('guid', None) From 80bf40ba5f889bdb7070b13f45b001d366f183f1 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 15:14:03 -0600 Subject: [PATCH 04/30] Novaya Gazeta by muwa --- resources/recipes/novaya_gazeta.recipe | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 resources/recipes/novaya_gazeta.recipe diff --git a/resources/recipes/novaya_gazeta.recipe b/resources/recipes/novaya_gazeta.recipe new file mode 100644 index 0000000000..50ce83b130 --- /dev/null +++ b/resources/recipes/novaya_gazeta.recipe @@ -0,0 +1,18 @@ +from calibre.web.feeds.news import BasicNewsRecipe + +class AdvancedUserRecipe1286819935(BasicNewsRecipe): + title = u'Novaya Gazeta' + __author__ = 'muwa' + oldest_article = 7 + max_articles_per_feed = 100 + no_stylesheets = True + conversion_options = {'linearize_tables' : True} + remove_attributes = ['style'] + language = 'ru' + + feeds = [(u'Articles', u'http://www.novayagazeta.ru/rss_number.xml')] + + + def print_version(self, url): + return url + '?print=true' + From ef5f30994bc7541e93353eedc6b9c3d33002e777 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 15:15:16 -0600 Subject: [PATCH 05/30] Fix #7157 (New recipe for Financial times UK Printed edition) --- resources/recipes/financial_times_uk.recipe | 74 +++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 resources/recipes/financial_times_uk.recipe diff --git a/resources/recipes/financial_times_uk.recipe b/resources/recipes/financial_times_uk.recipe new file mode 100644 index 0000000000..152e6a9f59 --- /dev/null +++ b/resources/recipes/financial_times_uk.recipe @@ -0,0 +1,74 @@ +__license__ = 'GPL v3' +__copyright__ = '2010, Darko Miletic ' +''' +ft.com +''' +from calibre import strftime +from calibre.web.feeds.news import BasicNewsRecipe + +class FinancialTimes(BasicNewsRecipe): + title = u'Financial Times - UK printed edition' + __author__ = 'Darko Miletic' + description = 'Financial world news' + oldest_article = 2 + language = 'en_GB' + max_articles_per_feed = 250 + no_stylesheets = True + use_embedded_content = False + needs_subscription = True + encoding = 'utf8' + simultaneous_downloads= 1 + delay = 1 + LOGIN = 'https://registration.ft.com/registration/barrier/login' + INDEX = 'http://www.ft.com/uk-edition' + PREFIX = 'http://www.ft.com' + + def get_browser(self): + br = BasicNewsRecipe.get_browser() + if self.username is not None and self.password is not None: + br.open(self.LOGIN) + br.select_form(name='loginForm') + br['username'] = self.username + br['password'] = self.password + br.submit() + return br + + keep_only_tags = [ dict(name='div', attrs={'id':'cont'}) ] + remove_tags_after = dict(name='p', attrs={'class':'copyright'}) + remove_tags = [ + dict(name='div', attrs={'id':'floating-con'}) + ,dict(name=['meta','iframe','base','object','embed','link']) + ] + remove_attributes = ['width','height','lang'] + + extra_css = """ + body{font-family:Arial,Helvetica,sans-serif;} + h2{font-size:large;} + .ft-story-header{font-size:xx-small;} + .ft-story-body{font-size:small;} + a{color:#003399;} + .container{font-size:x-small;} + h3{font-size:x-small;color:#003399;} + .copyright{font-size: x-small} + """ + + def parse_index(self): + articles = [] + soup = self.index_to_soup(self.INDEX) + wide = soup.find('div',attrs={'class':'wide'}) + if wide: + for item in wide.findAll('a',href=True): + url = self.PREFIX + item['href'] + title = self.tag_to_string(item) + date = strftime(self.timefmt) + articles.append({ + 'title' :title + ,'date' :date + ,'url' :url + ,'description':'' + }) + return [('FT UK edition',articles)] + + def preprocess_html(self, soup): + return self.adeify_images(soup) + From 022ea017d770d4a29b6133a1c413a109cabaa3bf Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 22:55:13 -0600 Subject: [PATCH 06/30] frazpc.pl by Tomasz Dlugosz --- resources/recipes/frazpc.recipe | 35 +++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) create mode 100644 resources/recipes/frazpc.recipe diff --git a/resources/recipes/frazpc.recipe b/resources/recipes/frazpc.recipe new file mode 100644 index 0000000000..56e45076ac --- /dev/null +++ b/resources/recipes/frazpc.recipe @@ -0,0 +1,35 @@ +#!/usr/bin/env python + +__license__ = 'GPL v3' +__copyright__ = u'2010, Tomasz Dlugosz ' +''' +frazpc.pl +''' + +from calibre.web.feeds.news import BasicNewsRecipe +import re +class FrazPC(BasicNewsRecipe): + title = u'frazpc.pl' + publisher = u'frazpc.pl' + description = u'Tw\xf3j Vortal Technologiczny' + language = 'pl' + __author__ = u'Tomasz D\u0142ugosz' + oldest_article = 7 + max_articles_per_feed = 100 + use_embedded_content = False + no_stylesheets = True + + feeds = [(u'Aktualno\u015bci', u'http://www.frazpc.pl/feed'), (u'Recenzje', u'http://www.frazpc.pl/kat/recenzje-2/feed') ] + + keep_only_tags = [dict(name='div', attrs={'id':'FRAZ_CONTENT'})] + + remove_tags = [dict(name='p', attrs={'class':'gray tagsP fs11'})] + + preprocess_regexps = [ + (re.compile(i[0], re.IGNORECASE | re.DOTALL), i[1]) for i in + [(r'
(Skomentuj|Komentarz(e)?\([0-9]*\))  \|', lambda match: '')] + ] + + remove_attributes = [ 'width', 'height' ] From 0cd891fc2d132e4a6b1907b78e28de931e2e5c75 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Tue, 12 Oct 2010 23:00:46 -0600 Subject: [PATCH 07/30] ... --- resources/images/news/frazpc.png | Bin 0 -> 631 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 resources/images/news/frazpc.png diff --git a/resources/images/news/frazpc.png b/resources/images/news/frazpc.png new file mode 100644 index 0000000000000000000000000000000000000000..525a13faa9a9f5c45d7d03f5353535c5f2606263 GIT binary patch literal 631 zcmeAS@N?(olHy`uVBq!ia0vp^0w65F1|>n_qV`qGr`=h4#gmOg|vxR)H}9hxM(Wfa=X1vP*5if3KWzj9H~uJO-t(b`Z&%E#<-cnsPCosY zb701Y-)=4UTbBnXAJW+r`Q+u-l5&UG8*k0j)`)JDuriwc_r-zqmU8P2L5%CeH-s=f zE?nC;BUp3M@t(bL$%l?BOK>c3a&@%ZFaP_bN=K|x;E~A+J#H6F58izHE$--T-5oa@ z%B(A_8dr;2NZfgC+Wgv-hrRjx^nk!GobSIUm~bt-tROv8L#c4 Date: Wed, 13 Oct 2010 10:38:33 -0600 Subject: [PATCH 08/30] Add entry about worker processes to FAQ --- src/calibre/manual/faq.rst | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index 3cf171bc1b..51660d2620 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -418,3 +418,14 @@ How do I run calibre from my USB stick? A portable version of calibre is available at: `portableapps.com `_. However, this is usually out of date. You can also setup your own portable calibre install by following :ref:`these instructions `. +Why are there so many calibre-parallel processes on my system? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +|app| maintains two separate worker process pools. One is used for adding books/saving to disk and the other for conversions. You can control the number of worker processes via :guilabel:`Preferences->Advanced->Miscellaneous`. So if you set it to 6 that means a maximum of 3 conversions will run simultaneously. And that is why you will see the number of worker processes changes by two when you use the up and down arrows. On windows, you can set the priority that these processes run with. This can be useful on older, single CPU machines, if you find them slowing down to a crawl when conversions are running. + +In addition to this some conversion plugins run tasks in their own pool of processes, so for example if you bulk convert comics, each comic conversion will use three separate processes to render the images. The job manager knows this so it will run only a single comic conversion simultaneously. + +And since I'm sure someone will ask: The reason adding/saving books are in separate processes is because of PDF. PDF processing libraries can crash on reading PDFs and I dont want the crash to take down all of calibre. Also when adding EPUB books, in order to extract the cover you have to sometimes render the HTML of the first page, which means that it either has to run the GUI thread of the main process or in a separate process. + +Finally, the reason calibre keep workers alive and idle instead of launching on demand is to workaround the slow startup time of python processes. + From ecb6ef0aef60692e43539ea4caaad39a319e4bf6 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 10:39:32 -0600 Subject: [PATCH 09/30] ... --- resources/content_server/browse/browse.css | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index aaaa8d9c86..b4256f974b 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -212,7 +212,6 @@ h2.library_name { -moz-box-shadow: 5px 5px 5px #ccc; -webkit-box-shadow: 5px 5px 5px #ccc; box-shadow: 5px 5px 5px #ccc; - text-shadow: #27211b 1px 1px 1px; } From 404a5080a9c65639f95494fb03b22174a5c61778 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 10:54:10 -0600 Subject: [PATCH 10/30] Ebook viewer: Add command line option to start in full screen mode --- src/calibre/gui2/viewer/main.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index 26fd2cadc9..a1d3b9bea4 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -695,6 +695,9 @@ def config(defaults=None): c.add_opt('raise_window', ['--raise-window'], default=False, help=_('If specified, viewer window will try to come to the ' 'front when started.')) + c.add_opt('full_screen', ['--full-screen', '--fullscreen', '-f'], default=False, + help=_('If specified, viewer window will try to open ' + 'full screen when started.')) c.add_opt('remember_window_size', default=False, help=_('Remember last used window size')) c.add_opt('debug_javascript', ['--debug-javascript'], default=False, @@ -726,6 +729,8 @@ def main(args=sys.argv): main.show() if opts.raise_window: main.raise_() + if opts.full_screen: + main.action_full_screen.trigger() with main: return app.exec_() return 0 From 2a8c2661a6fa64a3d1f2d8c40f25eb22ec85952c Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 12:54:20 -0600 Subject: [PATCH 11/30] Initial simple implementation of category view in new content server frontend --- resources/content_server/browse/browse.css | 35 ++- resources/content_server/browse/browse.html | 5 +- resources/content_server/browse/browse.js | 13 ++ resources/content_server/star-half.png | Bin 0 -> 667 bytes resources/content_server/star-off.png | Bin 0 -> 685 bytes resources/content_server/star-on.png | Bin 0 -> 631 bytes src/calibre/library/server/browse.py | 230 +++++++++++++++++--- src/calibre/library/server/utils.py | 1 + 8 files changed, 244 insertions(+), 40 deletions(-) create mode 100644 resources/content_server/star-half.png create mode 100644 resources/content_server/star-off.png create mode 100644 resources/content_server/star-on.png diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index b4256f974b..39d1d86241 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -82,9 +82,9 @@ body { -moz-border-radius: 5px; -webkit-border-radius: 5px; text-shadow: #27211b 1px 1px 1px; - -moz-box-shadow: 5px 5px 5px #222; - -webkit-box-shadow: 5px 5px 5px #222; - box-shadow: 5px 5px 5px #222; + -moz-box-shadow: 5px 5px 5px #222; + -webkit-box-shadow: 5px 5px 5px #222; + box-shadow: 5px 5px 5px #222; } @@ -220,3 +220,32 @@ h2.library_name { /* }}} */ +/* Category {{{ */ +.category ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +.category li.category-item { + margin: 0.75em; + padding: 0.75em; + text-align: center; + cursor: pointer; +} + +.category li.category-item:hover { + background-color: #d6d3c9; + font-weight: bold; + -moz-box-shadow: 5px 5px 5px #ccc; + -webkit-box-shadow: 5px 5px 5px #ccc; + box-shadow: 5px 5px 5px #ccc; + +} + +.category li.category-item h4 { display: inline } +.category li.category-item span.href { display: none } + +/* }}} */ + + diff --git a/resources/content_server/browse/browse.html b/resources/content_server/browse/browse.html index 9ae37e5c43..1258088741 100644 --- a/resources/content_server/browse/browse.html +++ b/resources/content_server/browse/browse.html @@ -15,7 +15,10 @@ - + + + diff --git a/resources/content_server/browse/browse.js b/resources/content_server/browse/browse.js index e2a8dc934a..d534ea15c1 100644 --- a/resources/content_server/browse/browse.js +++ b/resources/content_server/browse/browse.js @@ -127,3 +127,16 @@ function toplevel() { }); } // }}} + +// Category feed {{{ +function category() { + $(".category li").corner("15px"); + + $(".category li").click(function() { + var href = $(this).children("span.href").html(); + window.location = href; + }); +} +// }}} + + diff --git a/resources/content_server/star-half.png b/resources/content_server/star-half.png new file mode 100644 index 0000000000000000000000000000000000000000..3c19e90a8a755e004424db205c8433f0f63048b4 GIT binary patch literal 667 zcmV;M0%ZM(P)5kxfVxVHn4M^Ulocu4}uCxq(JO)+Y9GD5Jat zbqNy5lR|3Ugd)g`R}H!Z-82#+xHAej^Uvb`)a1J$lTNk&_XNAE zBfTQ9v_v8Sa5IxmRs3@SYh=d-l+~gM@B>A4P0dc=P9~jd$fQ$sTUl-3B9(2Y;#Z9F ziv79~Bz4_Q3b9eCYwPF+d^xg&l#+bj;nT_rzOS%t8z2j`7`B7!=X2+jXB|TV=B8-| z5I_(F*tU&nN^1AkB4vn~=}AV%Mjv-|U3#ej40jVdS&P?6I*kPtxhy74l2*jJNmZ458vW9PWLT-hGu|=LysO@uBuA(2q79M zrYCoMu8-X7>n;ia!^1;Yo0`tX3%(WvK`H*P`T^?|->M&U?OXr=002ovPDHLkV1gTF BCtCmj literal 0 HcmV?d00001 diff --git a/resources/content_server/star-off.png b/resources/content_server/star-off.png new file mode 100644 index 0000000000000000000000000000000000000000..956fa7c637cddb4db6a091556cc63a0f6a186264 GIT binary patch literal 685 zcmV;e0#f~nP)R5*>Dl0QrnVHn1Ly)Enp;##exZh7()Uk zR1!C3adKe*!lVgta&se2n3x!5BLe|s!Nt*~X-#y7B3eoUik5~%+lD(Tz0ZL^0YjVU zv%Pu#yl=keg9gZ?Q_Q(|Z0g_5!WIoz~V%6X6SCq;x5j%6#A6o&%l(m4W2o+DSkrok{@j zfS9fu_%t7u6-EyR*{?cCDbX|y$Ei}>*}-*d*tQMu1GuLQBnNZ({Kj-B6r%H5Cv9zQ z1OftQ-v&TRiEZ1cs+abw?R0hbV45b`)$HqmfpE80>NxE=6Ci}>F?0hV0tABwPH{}X=zm$k-d TM0>cp00000NkvXXu0mjfLk}+u0K@`S+@BV*_sWrqlwFo8}(kQkaqzD;A z=u{lE-2?}_II1YR)S)U)E*26HCl}q?MW=Ld6)l=U=ui@ZMFoe7jcsaT?tgaXnG9{0ZQ-FLi$F8Gk$pICVsN_6A+-I}LP#xf!zP`KEQ*A|86(eYX?Vrxqg`*m?> zyc17#YQ&Emm{YDS9%UIE2;KXq0p(YRuVBj4qCoke?8ek~ZfK?*SF$toUz&(q^LzVF zc)m+{o=z$CtKX9fo)4nH88Gx=Z0LtIJw+2pF{o}Aa&I@D_|-bv)_zWzpnQfNU|%D| z2ONlib6`yct1JCRlQx>P4J2Q!lkr}!P)`rD5RWn;!ch^BrauSPHXPUh?BDz@Ut;od zmQ4>}ahc!a2^JEAoD+yQ#m?=B%^vZad=f}S8X&Tqm1m)@;e`m!IcA(C>>M0F#2E0tt%Gn#jhcX3%^aLBZN-xDTU?LbBKJ1?Kz|Loh!06cE>#5u?R;17H*+`wdH ROO^lt002ovPDHLkV1mP{6ITEL literal 0 HcmV?d00001 diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index e058ccd4f3..fc49a92025 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -5,12 +5,122 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import operator, os +import operator, os, sys +from urllib import quote +from binascii import hexlify import cherrypy from calibre.constants import filesystem_encoding from calibre import isbytestring, force_unicode, prepare_string_for_xml as xml +from calibre.library.server.utils import Offsets + +def paginate(offsets, content, base_url, up_url=None): + 'Create markup for pagination' + + if '?' not in base_url: + base_url += '?' + + if base_url[-1] != '?': + base_url += '&' + + def navlink(decoration, name, cls, offset): + label = xml(name) + if cls in ('next', 'last'): + label += ' ' + decoration + else: + label = decoration + ' ' + label + return (u'' + u'{label}').format(cls=cls, decoration=decoration, + name=xml(name, True), offset=offset, + base_url=xml(base_url, True), label=label) + left = '' + if offsets.offset > 0 and offsets.previous_offset > 0: + left += navlink(u'\u219e', _('First'), 'first', 0) + if offsets.offset > 0: + left += ' ' + navlink('←', _('Previous'), 'previous', + offsets.previous_offset) + + middle = '' + if up_url: + middle = '[{1} ↑]'.format(xml(up_url, True), + xml(_('Up'))) + + right = '' + if offsets.next_offset > -1: + right += navlink('&rarr', _('Next'), 'next', offsets.next_offset) + if offsets.last_offset > offsets.next_offset and offsets.last_offset > 0: + right += ' ' + navlink(u'\u21A0', _('Last'), 'last', offsets.last_offset) + + navbar = u''' + + + + + + + + '''.format(left=left, right=right, middle=middle) + + templ = u''' +
+ {navbar} +
+ {content} +
+ {navbar} +
+ ''' + return templ.format(navbar=navbar, content=content) + +def utf8(x): + if isinstance(x, unicode): + x = x.encode('utf-8') + return x + +def render_rating(rating, container='span'): + if rating < 0.1: + return '', '' + added = 0 + rstring = xml(_('Average rating: %.1f stars')% (rating if rating else 0.0), + True) + ans = ['<%s class="rating">' % (container)] + for i in range(5): + n = rating - added + x = 'half' + if n <= 0.1: + x = 'off' + elif n >= 0.9: + x = 'on' + ans.append( + u'{0}'.format( + rstring, x)) + added += 1 + ans.append(''%container) + return u''.join(ans), rstring + +def get_category_items(category, items, offsets, db): + + def item(i): + templ = (u'
  • ' + '

    {0}  {1}

      {2}' + '{3}
  • ') + rating, rstring = render_rating(i.avg_rating) + name = xml(i.name) + id_ = i.id + if id_ is None: + id_ = hexlify(force_unicode(name).encode('utf-8')) + id_ = xml(str(id_)) + desc = '' + if i.count > 0: + desc += '[' + _('%d items')%i.count + ']' + href = '/browse/matches/%s/%s'%(category, id_) + return templ.format(xml(name), rating, + xml(desc), xml(quote(href)), rstring) + + items = list(map(item, items[offsets.offset:offsets.slice_upper_bound])) + return '\n'.join(['
      '] + items + ['
    ']) + class BrowseServer(object): @@ -23,7 +133,6 @@ class BrowseServer(object): connect('browse_search', base_href+'/search/{query}', self.browse_search) connect('browse_book', base_href+'/book/{uuid}', self.browse_book) - connect('browse_json', base_href+'/json/{query}', self.browse_json) def browse_template(self, category=True): @@ -36,7 +145,8 @@ class BrowseServer(object): sort_opts = [(x, fm[x]['name']) for x in fm.sortable_field_keys() if fm[x]['name']] prefix = 'category' if category else 'book' - ans = P('content_server/browse/browse.html', data=True) + ans = P('content_server/browse/browse.html', + data=True).decode('utf-8') ans = ans.replace('{sort_select_label}', xml(_('Sort by')+':')) opts = ['' % (prefix, xml(k), xml(n)) for k, n in @@ -61,50 +171,102 @@ class BrowseServer(object): # Catalogs {{{ - def browse_catalog(self, category=None): - if category == None: - categories = self.categories_cache() - category_meta = self.db.field_metadata - cats = [ - (_('Newest'), 'newest'), - ] - def getter(x): - return category_meta[x]['name'].lower() - for category in sorted(categories, - cmp=lambda x,y: cmp(getter(x), getter(y))): - if len(categories[category]) == 0: - continue - if category == 'formats': - continue - meta = category_meta.get(category, None) - if meta is None: - continue - cats.append((meta['name'], category)) - cats = ['
  • {0}/browse/category/{1}
  • '.format(xml(x, True), - xml(y), xml(_('Browse books by'))) for x, y in cats] + def browse_toplevel(self): + categories = self.categories_cache() + category_meta = self.db.field_metadata + cats = [ + (_('Newest'), 'newest'), + ] - main = '

    {0}

      {1}
    '\ - .format(_('Choose a category to browse by:'), '\n\n'.join(cats)) - ans = self.browse_template().format(title='', - script='toplevel();', main=main) - else: + def getter(x): + return category_meta[x]['name'].lower() + + for category in sorted(categories, + cmp=lambda x,y: cmp(getter(x), getter(y))): + if len(categories[category]) == 0: + continue + if category == 'formats': + continue + meta = category_meta.get(category, None) + if meta is None: + continue + cats.append((meta['name'], category)) + cats = ['
  • {0}/browse/category/{1}
  • '\ + .format(xml(x, True), xml(quote(y)), xml(_('Browse books by'))) + for x, y in cats] + + main = '

    {0}

      {1}
    '\ + .format(_('Choose a category to browse by:'), '\n\n'.join(cats)) + return self.browse_template().format(title='', + script='toplevel();', main=main) + + def browse_category(self, category, offset, sort, subcategory=None): + categories = self.categories_cache() + category_meta = self.db.field_metadata + category_name = category_meta[category]['name'] + + if category not in categories: + raise cherrypy.HTTPError(404, 'category not found') + + items = categories[category] + + base_url='/browse/category/'+category+'?' + if subcategory is not None: + base_url += 'subcategory='+quote(subcategory) + if sort is not None: + base_url += 'sort='+quote(sort) + + script = 'category();' + + max_items = sys.maxint + offsets = Offsets(offset, max_items, len(items)) + items = list(items)[offsets.offset:offsets.offset+max_items] + items = get_category_items(category, items, offsets, self.db) + main = u''' +
    +

    {0}

    +

    [{2} ↑] +

    + {1} +
    + '''.format( + xml(_('Browsing by')+': ' + category_name), items, + xml(_('Up'), True)) + + return self.browse_template().format(title=category_name, + script=script, main=main) + + + + def browse_catalog(self, category=None, offset=0, sort=None, + subcategory=None): + 'Entry point for top-level, categories and sub-categories' + try: + offset = int(offset) + except: raise cherrypy.HTTPError(404, 'Not found') + if category == None: + ans = self.browse_toplevel() + else: + ans = self.browse_category(category, offset, sort) + cherrypy.response.headers['Content-Type'] = 'text/html' updated = self.db.last_modified() cherrypy.response.headers['Last-Modified'] = \ self.last_modified(max(updated, self.build_time)) - return ans + return utf8(ans) # }}} # Book Lists {{{ - def browse_list(self, query=None): + def browse_list(self, query=None, offset=0, sort=None): raise NotImplementedError() # }}} # Search {{{ - def browse_search(self, query=None): + def browse_search(self, query=None, offset=0, sort=None): raise NotImplementedError() # }}} @@ -113,8 +275,4 @@ class BrowseServer(object): raise NotImplementedError() # }}} - # JSON {{{ - def browse_json(self, query=None): - raise NotImplementedError() - # }}} diff --git a/src/calibre/library/server/utils.py b/src/calibre/library/server/utils.py index 4c286b555b..35c92f7ae2 100644 --- a/src/calibre/library/server/utils.py +++ b/src/calibre/library/server/utils.py @@ -23,6 +23,7 @@ class Offsets(object): raise cherrypy.HTTPError(404, 'Invalid offset: %r'%offset) last_allowed_index = total - 1 last_current_index = offset + delta - 1 + self.slice_upper_bound = offset+delta self.offset = offset self.next_offset = last_current_index + 1 if self.next_offset > last_allowed_index: From a5f2c1fbb1f429acbd11ca56eb1d3025914e10da Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 15:11:06 -0600 Subject: [PATCH 12/30] Fix #7168 (unhandled exception when changing cover picture) --- src/calibre/gui2/convert/metadata.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/calibre/gui2/convert/metadata.py b/src/calibre/gui2/convert/metadata.py index b206bf68a6..7a02cf4429 100644 --- a/src/calibre/gui2/convert/metadata.py +++ b/src/calibre/gui2/convert/metadata.py @@ -172,7 +172,7 @@ class MetadataWidget(Widget, Ui_Form): if _file: _file = os.path.abspath(_file) if not os.access(_file, os.R_OK): - d = error_dialog(self.window, _('Cannot read'), + d = error_dialog(self.parent(), _('Cannot read'), _('You do not have permission to read the file: ') + _file) d.exec_() return @@ -181,14 +181,14 @@ class MetadataWidget(Widget, Ui_Form): cf = open(_file, "rb") cover = cf.read() except IOError, e: - d = error_dialog(self.window, _('Error reading file'), + d = error_dialog(self.parent(), _('Error reading file'), _("

    There was an error reading from file:
    ") + _file + "


    "+str(e)) d.exec_() if cover: pix = QPixmap() pix.loadFromData(cover) if pix.isNull(): - d = error_dialog(self.window, _('Error reading file'), + d = error_dialog(self.parent(), _('Error reading file'), _file + _(" is not a valid picture")) d.exec_() else: From 4f031e05dd23223a9f7bbfead2a4dd7cac20e4d2 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 18:47:46 -0600 Subject: [PATCH 13/30] Sorting for CS category views --- resources/content_server/browse/browse.html | 7 +- resources/content_server/browse/browse.js | 146 +++++++----------- .../content_server/jquery.multiselect.css | 21 +++ .../content_server/jquery.multiselect.min.js | 16 ++ src/calibre/library/server/browse.py | 118 +++++++++----- 5 files changed, 173 insertions(+), 135 deletions(-) create mode 100644 resources/content_server/jquery.multiselect.css create mode 100644 resources/content_server/jquery.multiselect.min.js diff --git a/resources/content_server/browse/browse.html b/resources/content_server/browse/browse.html index 1258088741..b5c208fd46 100644 --- a/resources/content_server/browse/browse.html +++ b/resources/content_server/browse/browse.html @@ -12,17 +12,22 @@ + + diff --git a/resources/content_server/browse/browse.js b/resources/content_server/browse/browse.js index 905b600322..c2d942efab 100644 --- a/resources/content_server/browse/browse.js +++ b/resources/content_server/browse/browse.js @@ -95,7 +95,7 @@ function category() { window.location = href; }); - $(".category a.navlink").button({ primary: 'ui-icon-arrow-1-n'}); + $(".category a.navlink").button(); } // }}} diff --git a/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_flat_75_aaaaaa_40x100.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_flat_75_aaaaaa_40x100.png new file mode 100644 index 0000000000000000000000000000000000000000..5b5dab2ab7b1c50dea9cfe73dc5a269a92d2d4b4 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^8bF-F!3HG1q!d*FscKIb$B>N1x91EQ4=4yQ7#`R^ z$vje}bP0l+XkK DSH>_4 literal 0 HcmV?d00001 diff --git a/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_glass_100_f5f0e5_1x400.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_glass_100_f5f0e5_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..688c2f3e8806f3afcc0b659d397d142ee4a0bb1c GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAGVZ#9R3S1yVd+978O6-(EE2I&2`|a&dor zn8LpQws$p8OzfO3V%e~f#q0BpwPkHfr@d8n;J+1T@Kk-4oVon+?9YosV?K4Y1e?D1 zs@@-9Jjqz`Hmt(*75f0D)F-JJVxa8Kd#rie_?PKtC^>bP0 Hl+XkK#L_u` literal 0 HcmV?d00001 diff --git a/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_glass_25_cb842e_1x400.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_glass_25_cb842e_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..cabc6a964db6f3249e44f544e7970b295b492183 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq&z)c978O6-=0_GYj6;7zIfl> z{Bes+Z?i(7w%Aq;8&1j3la`r2y|G=>;j+p8)EIRq15P2qqe~3LCLIb%eAIQmB}H`p e{LER;dZjns;J6a8{m*5fp$wj`elF{r5}E*dLM)pA literal 0 HcmV?d00001 diff --git a/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_glass_70_ede4d4_1x400.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_glass_70_ede4d4_1x400.png new file mode 100644 index 0000000000000000000000000000000000000000..779ef0d0e24ce761cdbf952b5f1db4c80face3fe GIT binary patch literal 125 zcmeAS@N?(olHy`uVBq!ia0vp^j6gJjgAK^akKnouq+C2*978O6-=0_GI$$8u{Lp^q zf7$AWm7QHq4}Ei%X4Un~=od&jRJp~-f#c!!GZza*BQ7zQe>!w*!){Z@V@~lu1f43L ZGQIlG{q(*7ZyC@$22WQ%mvv4FO#pkXEp7k+ literal 0 HcmV?d00001 diff --git a/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-bg_highlight-hard_100_f4f0ec_1x100.png new file mode 100644 index 0000000000000000000000000000000000000000..8766f00183abc559eeaa61766dc0401ba19de22c GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^j6j^i!3HGVb)pi0l%A)HV~E7m5FH&+JoXP|@hd!f^Go?6iA_FS-MDGI+ZBxvXMZJAC$8GnU0<<-ano)i%lSMBf^9780g&YfV$*X+Qi{M=B2PZvC@% qQ`Wu?mFM1dqC1Ot*w3`iJS6V%TOd*5`~fGR`3#<}elF{r5}E)^Gc&~i literal 0 HcmV?d00001 diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_8c291d_256x240.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_c47a23_256x240.png similarity index 94% rename from resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_8c291d_256x240.png rename to resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_c47a23_256x240.png index 961c8fea3bd431af0918d53a6ff55f8f8bfd014e..2e77966d429388240068a60115c22c288b4336cc 100644 GIT binary patch delta 267 tcmaE@`C4;=X8n;Wm4QU{^tJx6UEwnZ1_r;9AirP+2>~OP&FYLtgaND-cUu4e delta 267 tcmaE@`C4;=W_^#A%s`@g`dYsx?r9kV1A|{lkY6x^gn$vtW_89R!T<>SO4tAZ diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_3572ac_256x240.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_cb672b_256x240.png similarity index 92% rename from resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_3572ac_256x240.png rename to resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_cb672b_256x240.png index 6127bb0c84991c92d688df5e5d65e4fd9f67ee64..b75ecdabd116ba5934db42fc78595081d146fe84 100644 GIT binary patch delta 267 ucmbQJG*M}SX8oBooq8`fx)jN$S;^dLcoY+vpVAuVE`p{RCfRX diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_222222_256x240.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_f35f07_256x240.png similarity index 92% rename from resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_222222_256x240.png rename to resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_f35f07_256x240.png index b273ff111d219c9b9a8b96d57683d0075fb7871a..3ecc7d27eca0698af2545242426498322f5b1bd8 100644 GIT binary patch delta 267 tcmbQJG*M}SX8o5qmVrd|^tJwWoM`|91A|{lkY6x^gn$vtW_89_`~cyMa!mjL delta 267 tcmbQJG*M}SX1$7%%0Qxe`da_taEAy31A|{lkY6x^gn$vtW_89_`~Y0{DhdDq diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_fbdb93_256x240.png b/resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_ff7519_256x240.png similarity index 92% rename from resources/content_server/jquery_ui/css/pepper-grinder/images/ui-icons_fbdb93_256x240.png rename to resources/content_server/jquery_ui/css/humanity-custom/images/ui-icons_ff7519_256x240.png index 95c4a66f6679511ccf8a96c5af8521308cd276f7..544517142205f1adfc22b44eda10028e10abd42c 100644 GIT binary patch delta 267 ucmbQJG*M}SR(+YwpMga6bhVyYbLmzF1_r;9AirP+2>~M(j?Eg3FZluEhJtDU delta 267 vcmbQJG*M}SR{gChe+ClO)7AQ|C-ZX|7#RFYg8YIRBm|6DI5ulAzT^i0pf4C3?CzhDc0JKJ$6{&+`X>Kwab5 zhnIh~*(4mEedg>kG!R_;;_~ls9v=g?`3ods6n81H0fCwXbFAU6l{!2g43UOyR}J{| z7`98zK74U*<0H3{`O4bIq-pk)l6u6{1-oD!Mf4d3(AzhDc29op6x%fB^@yf9%QM z{Re#BDR+hhPC9UU0W&iLo6bq^=QXdyQl_0K2;A-SD=K|QRt1B~#_kS@M@irBe=PC& gIq&W2D1jfWR=PQ7Y?df{1C3?yboFyt=akR{0BZLyAOHXW diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png b/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-bg_fine-grain_10_eceadf_60x60.png deleted file mode 100644 index 46567420785a91503f30de00eec3a331cd4a969e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4429 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 ncXnGA{OfOX&WZaj zIF21-PI%|gdj|l75cIRwI(+c(&H(^=?ICh-pg_IIv3;=-hyZ`{lvE#aK#264` z#LsKYiEY2eir|aPQT5Ea$5dbbZnd4ZlK$ilrUeX#`>u}Ct&WS9RPpHKhbdS+Fhm;~}ZR*ye58QV_&YQXfPb9{mE=;4;y4>A62ZVsUd)(KJau;lQ zLkK~w&+l;oyqXx*E_%+1eb4xQPkcUyhL{theLe@y^HKu>D;xnJ#HhHiTz=tHoO6mr z*GVvDcmiv&^%c{tbzStnXSF^6lv1&6Ndai|0r=%+T+EiYm&@_JHtv80XuWsc*m3Nz z2h>`_1d#KlhKMm>8a&B)lLK2`6sK%r0R?oC{EV)`-z`884GBg7Fvj}soD*{ljUWD` z$K18Pj5Gl_;N_YOp_C@3+($#L&8>|W$uJCwlphizNJ=pD6Ij6N{>Kx_Tw(kUgJ=Oy5=ax0%P1a*0T zN-LI%xU+K(pJUhWg%I$O1<_?!zF(UjW8k{(^}f4c+mddm_x|#%IRK}24B24i*3iJUhjCcpwj#(j(dr4$S~5@H5{X7urL z`;-!Dt;_vqQ7~f8<+_}trOR-F>$)}NM&39l5S&xX@FkZ?;zZkROKXGtJ!~%*4Z*)i zMDJbEea@*M!V_hB;lg<`3^QPX7Y#>GW9k9$LjN&_ZZ^h<-Uqty3{T{&wPMT(CoF2t ziBgK5o=qbw=DTi^*0cXdYoF(Z5Z<(sV0T?NTI-trrsQRY0~uJY4Py);9ZjFZ=ko-C z6-pLd?faIu29Iq^%cc5&1K_<^>oY|$#t9sxh2Dh3d0rS}AWPawDZX+pjj#;7SXGQG zCGw=aUz_A9+qKYe%n)2#j6oTjHL4Fm!@!AwBT@7?f>?9naq|_2*L5p%VhSL5_1@vU zN6s61@3`gRG}g93k$r_p)YAl3ilS>yF~q)SIOkAn!)8vOF3$K(X=M@`V+d%Hz{D8! zJ{sKTJ!{$*{Edl^2ZsD%uFcg`VlAs>@p>0)`$D0f+v%M6;P=9~&1&Ym9Zn1fWF#b8(Cjtu;k)a%*zwA-sU$MWb0R0aSz#blrXz1>rVKNL_<A=ec$h?&n122TJF1OzP7Q-`&r~$RtGHM zf&|8Uzwm`GVD6(kb*YH~fP9=((Rr_@kn@Hi7{F?Wi`uq?i6<@5IBRj`m7lYzn}Y$p zr--PyWaCOzjjJ;}C?JrGq?GjF<`_%ySkx~9aH!o3F zLvOWXk&{*VJ#y~8XVJzsc%o@aQHchyln<*&QvZEiaB2?R_pF;`u|T51lcx(i=U#>d zpt==}WJ86h@4Z)DYs`s0#>;4=pxc%-e=|Kg0DUY>@+29oa6<4e-)Ewqc-Rq%f^!Z= zV9>Z_YM|C-1%?=-g4K21xUL(eRD3>%=475a^D^C(CwX5tKIWd@JIYcwm52~6DZl{_-yL(}GI9QBQ&AOAE{@_Mzt4OBuuCz9 z2mp%%lv2@p$0oQzU>btdWO#bob0X4mDMjV0+z5Z_!sW#&CA8Mnow;Zh_bdSDZmfu? zO|5&qVMb5P(^E)6dCJTje5QJlds-{x<@6$3s1TIB)tASdPtuqA)_K1`NeH<`X^Lm} zU9?u^%a3D67PZnA?Yy_vW|WoqifL||1p)<$CFqIxAnRdeMfc`&n7$UrScexvfcx*i z|310dMf&T*hv(B|V|)@ldH*f3vu#ORBGi%TvSSRfd{7+VsnI=cWA6W5tiyeH-t~*? zOIBfeVkQc~ui~Kz5$DUf5Q_9%JQ)_*7<2HH*jmy`e03#wicCrT+~Nd)Up7mS`+N=! z9U?hh*@Bz}JIXxkq?gB%?fF}PNf$4r+qNZa+omp>_Y8;;0B9O0;-V9*W`=HvuC>H) zuh!>j+ZM^si|+aTo=Co>*`&r7WW2f7$GLUiiu)Nig!^S(C%Mo%swNg=e91huR(!vw8k^zd@Q4I- zUEo3Bl@(T6qyjP}94YbeyQ_9injO6NaR2(}U+1#O{DrF$NC-BTz*81t9=54s%0k)O zWsKYF=joDrv*@?Fb}1EOjAtEr)0}Lteb1Vwr@;~K1ps_0Rgaz@lD%*vDW%0jHAO(_ zVT@7P7L)x)PqE>?Zp`^eN34Ub8?)QT{7IK32$9#1@x=07s-`na!cTwc>3*K)^`g7c zN~jAd!>glCcVh*`^h2_eQi8)Hzhr5Ab78<+rlpd|!hvN3@~mUdq3y}f=McuVynq5aqGt#y3GJAjq;Zb_M?R4sID2Lu2-JLLoiy4{=;ACX{~YS=}j z1Y~(M-N;r|rBrou8aBr8a%u8hE}X^=Az(_cIi;1uFH@UcTRuj<`^1W*m~Kf{UN$GLxthP&4v(^VcpUb2A;MpfM+D> zhvzNPU}1|@JLnzE>;CgOlquaJXxotnGBM|%iy(T^rELBtk~^{J;^yy@rm@(ws`b&1 z+0CHqTe`dDZDj}V0Ta6np{En!v<3jA-#k_&=Lt$q+;qiRRA38c+icMdvL|A(g zF|X@Zs!HaA9~BX$92OKQMa(hQKGN3PI}!_e|vpr@8i`rjm|k` zN351eLb7Ph%3@^brIv~iyrvY6718w;iI4`g_u7;my`#^mE@%b$<#y0YjRZ$~)e@g$ zPDCjU7pod-FuE;IoXx=A2a?2bWKB8dL~s4oDw(E}PWHn>Kg6Uc&1RN!UaO$ho|zhx z1S2Y;98x)s9pCeUbE_C=jb*48gl{h(vSWoIcsLg{t5|xw?@`hJ)orBWLBy>xVMF3i zAfe{PVu1IPoU{21ENaQ3oV935Nlq|okE)37?F3w`bi=_J%0f0vFfG!B2}(Ta5CTr4 zX}u~p20j3IaZ?rxq|D;b-@r_)_koAz*cDz5|dl){HrY5U|U}38*r9=n-R9Yq9XAL^1(Hndz{~gzXln zFwXfbS0e z4FC{R)GCIXqnx56!?Kt;hURr{?xzlIW3JXU61?RNy~{94ie!@7nWRX;-ZnV{5!_BH zd_KpLnDU0me6|{CUG*ZWiWJ*xZMwnhx{00qaVm$kgpmYbf#9*ixH|FrhZH_;7&C+!p= z^qjJxbyp85JdHLEe~ZG&McUpiKX=ZpO2}O6w4T(Y<)bjU5S}q907{O4l{P6y6}dl# z5QL39!kM++5D=3HQ%cEdiXiojH?2)m|KeZEuvq6LEr8cMzq0u`22MjGy>}`fS*eJe zo^`Yxa(UL*RO6yi;}iHDy+3Ufx{hsSOaPnh#08HdK6B0?Mzq@2&-P5@*xWehnwqD$ z06_V)cMik91$tImEGBp{do0grFDzi1WYdnJrW5ft&9K7Z-zm^FNlKg)@4b)JZBU7I zvG_qAX?B-S_^>iXxVp8n0!bHxSwtj7i8)JmukB7N%T$fg- zA=q629;!&9&fzuZyq13a{&K}9r?P&gjI^YqH5HWerliA;`O|nTX4r9{q{BZUutPTd hvjH8tlUVP)bSe4+R*!ewFa#<0DyB&zpJ&uS_^9p0HC#ooG-jy8@}HYF$Q?=007_b2>^J#HXLV$ zcMc(V{QUGjkW0asYs46Fo>||y?+If7=a~Tj+m>Lh!S{Q@T7zv%DCL6p9_N{1tbup3 zhuRu202si`wajmS|I6Uw+m>JqaOQ%2OS9RS|;6_j}^?+AzjI?;Y1w(YtJs2V9>8poac_Pi$Mld1ieU z0BUXMy~}d|u`cQhA}#vbB|}n=(@-l<8jd52d=9w&srFB zdkFwsSJh|eEn^IX;9-o#ahwPtptXkD8jLZ^`}EFWt${J-afYi_y#NmY$C0P|i7U{h z03fA+S}SU8FxFu7p_b!@#{hD<^rbmpaLyuxpoiYJq~35GS-m6Y3p6_4=e>h-7GnU{ zbs;4OJH5dejt?a%nuapV!E-5k!>u($>jkLBm|2D33-~QboDum5@i7MU8LtG2-iIERH*?HX zV6DLz12IN*Ip-YA3>AXhz9-~z!C8Yr448-I$9o5347|Vh6@o|a;{lYV%=q6DaxMrV zV8Ji!Kft%O4tt&j$C)w4P;?a6zR-I|?;W+ZN1BQ;;QKw1^M&9&F!SUXLs6H{hu|lO zh&vl&@P2LZ-m4+rb3=65TALWl81&w892wv5iBbwu3VNVgn|fAj9b-#Hi5*5Ryy zC5(#;4;W+B()``%1II)?x?yWg4@v8ZksNAk3M}963HO6m66}s6Pq&P^X#x}7pJ?1# ze_Y18?lEr}kWf-^ofpFOgqB*1l)`kW4r7G!y#1yasoG}(DMYPs%&X<#wr36KG0EqLZ>2|d?Wkq9#gy4ojxhhg5 zehfuyGsy%qiM2+H9A*>%2s7Kn7}Vf)+Y(X|MB7qSv?igD)Ff=_JhMVQp)ub3z*TSl{GK;%jKO(I0Yd^2f>+nvCtoK>tu9_$Ly7^T59FD)=#|b{ z*xozJRk5Wg^l_4UDJCp>@0#zJlUJ89#yn8F{QxsA$~;W^$e-LiW4yI4-|siFe?A97 z@QVK5@2Mas2elg8yTmDsmGmcEzbnPGwN?QoEg&|bXx^dLhSs{q0&{5y;woH_@h5KN z)E%9(h`}pk;@^%julj2(HU+yNl8SH<^` zygKGV_x;9!b#qKd^tRR2SAz(4mbmQH0!#Rs`)hXYIb|nbiH2nZj;=dY!B_tOoCnpJD4klU(x?AK@ z9_8DrX|10zh8}+9()?ZT{oxVx7J4UuDH2HOXq~g76V1aiCTp#l6A3_6Jpd^zwk=`b z1<46;EI`KS2*FPRf6z0ogA}|Yo77N_S`J?ENaJUW24ShZb08D~$ zmxbJqb5?b&-Un*CZ~XPzl!CHWUvs}PKy9MaS-X%7(l7E;v2dM-zS$9pf|;tt>P{&I zy#;Dr=OQq8?-lTlGvhonO1bcU@0yc&>&GIR?6YjBp%~y+sxh%$3F%y*V12w|nbY zf7Yew$mLQlP|Ag?3U?+llk5;c*G2&_;AuJPMmZNf2!HCvrx(T;P^;)!`<7Jk6qLLd zqr0&p;u=y*TRqfzU;xPZR0>K7mcz$jLmlOz;l<3|x zG}Bi~L36kFP9z>4)>@+i7+ru(HpV9rm(S;1(3<2~wnV5S(`7{r91r)Uu1$lljk*8t z!#dpBd#ztxe@vMuYA;NH)XELB65`9w2_`K3xp`xxqd)~wLLq3LrAW?0yj~kx?-;c7 zjQbUc?wfxec8sCOO;7lI4yC)Ra7RP%S^myiix}mSlzpug4jW+<1yYI+JqQ>I^>L;F zsiqvpv}~J5xhfpaT9t$(&WCQ`|GLrR$SUwPO)m!T_l`P4gw@hYSg6I7a?Sd?F6|fh zY?o5}X1;^QElGnr1pknE zO1U1)iRC8K+u9Qb*wPi@z&ShHHPT2QqiaK*MrBtc#-Q23ISccz-~V%nYCnGAsss{( z&9)`vQV^HIyw>(hAwT9ue}prIOnuXln&?fon(W3qWZc9 z>8hoR^rcNg_ChH&#xRQtGc5|Ghaq@nTYkzr?>!r6bnCt1FM$?PLCAK4$*q z6u=lm#utpinJ<-X_B|m4kCXkSWjf*eJs)(}uM(;trMs2;xv4R`a8wSMqp59ieu7@0 z?r03Ueaf^H_1N=a-e)`qzm%4*?a}ezO?|&7f_F+{jw5S(HZT3BbykEQ^T%(08${{z zl=4pjW*(Z9ueGiy%#G0f$ZS?XTB{yn0eeJiONA|xeM|b2dN;X&>QzTp{cY_!{wxXC zoWC~W?b;~^piQbV2HrDgl9bmfh)dS9wm#@aoT{P6P|D?vdG8)B&CSrO{LBc>IgHUC zMmmnWXduAxz2{l5ZBccxb?$?uVrxy(60iMd(+s#Ppq~J-7X5$r5yN?$XL%g>sVF{0 zygwV2I?jx+H1$%9+Rk0mAhoY`{)Dbf7ti^EWlwkC6H<(-ZSfC8Eb9}v?xLCnKZUc1~-%1_owHHcxY$e`gZLY!>j}+`+C3k z=|1u@5_C4K$i$3+Zi48^>S@j2bWvl(qKrQ&K+MBfq^@*f=6yB-XdE`=VvJLjvB1m? zR8izXv#m;IM5-#SP8n|b z>GsU60J{<$DMp!r1>6AUbPym#<2pK-T7OSzPU$cFFA zs8&q3zou>^vB9yTGH10Y$Xjb*ot?}{`n$DGOI!00lc@0ET@HW{X8N>;s}NVP-;%ZB!q2}X6Q z5o=ZTnZKtjOO-|3yFP$)9V=X0Ky1&jR_6OhA4spI+epQOh+B$qD7XRVIOwzzTXO2$f)T4J&PLLQuRnycAUPIDab zJPWR?Vw?If(U<++)|wXgsxoRz*3QEe^#Fn$FYBS7wT@$E6Ym}NoyCWo!;e0u+almk`nCq%40=(ZlaxSW6tt}Rc5~W-Z zM5i`JCB|Br2mP}uX$MaIhqD%O3*h9e z#B09+-K*PE)udhqKzaFla`w;X(76$M#&O=1kyG#NIguExB!yVP9DdGn z7r?D)edhc{pDxaP+FI8aGoDtFobgWN?L!Q>&oSiH+F>HDSq?*Ql7@O$fLyy3bWH&= z|437-R<;`QoYh;JgF1j*jAf#hnpPI%hyweoWMO<6M--V#SkA>5mXTrE%ozRAwxklW zPT#CCCxW@SeQRBxXYs?%z=Ns3vW|&p!mQNkku8LAs~5K)tFjUjw(f-_s%&T{QBuCWGw^+;8IG- zYHA%sr9{honWo#PBqI`(j_Bd*nxF4EhtxX0-0uv4H&FIrkWH;X7r}r91=- z&%m#(Y0Q|Jz}J75Kn;l!ErmV0trYVfwbuFbp2%5qV;=)4MimzTD4!Ovu@9rO(lW+A zMjMC|0JOkhyM{NsrdV>p#UKSElC>Meh-*u8QcEB0isE0$+F>`1RTl{M}p5xqx*%{|SL2@~p)<2um`> b8Sj4sJ%r;G6~R8400000NkvXXu0mjfnlArE diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png b/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-bg_fine-grain_15_ffffff_60x60.png deleted file mode 100644 index 19ab46c3f875f352230abdd8a2a651003b8b83b1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3716 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 Qe{7QJJu=d+)_fWIKRK1dSpWb4 diff --git a/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png b/resources/content_server/jquery_ui/css/pepper-grinder/images/ui-bg_fine-grain_68_b83400_60x60.png deleted file mode 100644 index 3f3639b490c47377b4a7bf6f57d52883ddda9cce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8306 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

    ! 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 R#}izLrLL?4d#h+0@gK7EGZp{< diff --git a/resources/content_server/jquery_ui/js/jquery-ui-1.8.5.custom.min.js b/resources/content_server/jquery_ui/js/jquery-ui-1.8.5.custom.min.js index 827b5f05ba..b63fe5cf60 100644 --- a/resources/content_server/jquery_ui/js/jquery-ui-1.8.5.custom.min.js +++ b/resources/content_server/jquery_ui/js/jquery-ui-1.8.5.custom.min.js @@ -63,210 +63,6 @@ a.pageX),Math.abs(this._mouseDownEvent.pageY-a.pageY))>=this.options.distance},_ b.left=d>0?b.left-d:Math.max(b.left-a.collisionPosition.left,b.left)},top:function(b,a){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();b.top=d>0?b.top-d:Math.max(b.top-a.collisionPosition.top,b.top)}},flip:{left:function(b,a){if(a.at[0]!=="center"){var d=c(window);d=a.collisionPosition.left+a.collisionWidth-d.width()-d.scrollLeft();var g=a.my[0]==="left"?-a.elemWidth:a.my[0]==="right"?a.elemWidth:0,e=a.at[0]==="left"?a.targetWidth:-a.targetWidth,h=-2*a.offset[0]; b.left+=a.collisionPosition.left<0?g+e+h:d>0?g+e+h:0}},top:function(b,a){if(a.at[1]!=="center"){var d=c(window);d=a.collisionPosition.top+a.collisionHeight-d.height()-d.scrollTop();var g=a.my[1]==="top"?-a.elemHeight:a.my[1]==="bottom"?a.elemHeight:0,e=a.at[1]==="top"?a.targetHeight:-a.targetHeight,h=-2*a.offset[1];b.top+=a.collisionPosition.top<0?g+e+h:d>0?g+e+h:0}}}};if(!c.offset.setOffset){c.offset.setOffset=function(b,a){if(/static/.test(c.curCSS(b,"position")))b.style.position="relative";var d= c(b),g=d.offset(),e=parseInt(c.curCSS(b,"top",true),10)||0,h=parseInt(c.curCSS(b,"left",true),10)||0;g={top:a.top-g.top+e,left:a.left-g.left+h};"using"in a?a.using.call(b,g):d.css(g)};c.fn.offset=function(b){var a=this[0];if(!a||!a.ownerDocument)return null;if(b)return this.each(function(){c.offset.setOffset(this,b)});return u.call(this)}}})(jQuery); -;/* - * jQuery UI Draggable 1.8.5 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Draggables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(d){d.widget("ui.draggable",d.ui.mouse,{widgetEventPrefix:"drag",options:{addClasses:true,appendTo:"parent",axis:false,connectToSortable:false,containment:false,cursor:"auto",cursorAt:false,grid:false,handle:false,helper:"original",iframeFix:false,opacity:false,refreshPositions:false,revert:false,revertDuration:500,scope:"default",scroll:true,scrollSensitivity:20,scrollSpeed:20,snap:false,snapMode:"both",snapTolerance:20,stack:false,zIndex:false},_create:function(){if(this.options.helper== -"original"&&!/^(?:r|a|f)/.test(this.element.css("position")))this.element[0].style.position="relative";this.options.addClasses&&this.element.addClass("ui-draggable");this.options.disabled&&this.element.addClass("ui-draggable-disabled");this._mouseInit()},destroy:function(){if(this.element.data("draggable")){this.element.removeData("draggable").unbind(".draggable").removeClass("ui-draggable ui-draggable-dragging ui-draggable-disabled");this._mouseDestroy();return this}},_mouseCapture:function(a){var b= -this.options;if(this.helper||b.disabled||d(a.target).is(".ui-resizable-handle"))return false;this.handle=this._getHandle(a);if(!this.handle)return false;return true},_mouseStart:function(a){var b=this.options;this.helper=this._createHelper(a);this._cacheHelperProportions();if(d.ui.ddmanager)d.ui.ddmanager.current=this;this._cacheMargins();this.cssPosition=this.helper.css("position");this.scrollParent=this.helper.scrollParent();this.offset=this.positionAbs=this.element.offset();this.offset={top:this.offset.top- -this.margins.top,left:this.offset.left-this.margins.left};d.extend(this.offset,{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this.position=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);b.containment&&this._setContainment();if(this._trigger("start",a)===false){this._clear();return false}this._cacheHelperProportions(); -d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.helper.addClass("ui-draggable-dragging");this._mouseDrag(a,true);return true},_mouseDrag:function(a,b){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute");if(!b){b=this._uiHash();if(this._trigger("drag",a,b)===false){this._mouseUp({});return false}this.position=b.position}if(!this.options.axis||this.options.axis!="y")this.helper[0].style.left=this.position.left+"px";if(!this.options.axis|| -this.options.axis!="x")this.helper[0].style.top=this.position.top+"px";d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);return false},_mouseStop:function(a){var b=false;if(d.ui.ddmanager&&!this.options.dropBehaviour)b=d.ui.ddmanager.drop(this,a);if(this.dropped){b=this.dropped;this.dropped=false}if(!this.element[0]||!this.element[0].parentNode)return false;if(this.options.revert=="invalid"&&!b||this.options.revert=="valid"&&b||this.options.revert===true||d.isFunction(this.options.revert)&&this.options.revert.call(this.element, -b)){var c=this;d(this.helper).animate(this.originalPosition,parseInt(this.options.revertDuration,10),function(){c._trigger("stop",a)!==false&&c._clear()})}else this._trigger("stop",a)!==false&&this._clear();return false},cancel:function(){this.helper.is(".ui-draggable-dragging")?this._mouseUp({}):this._clear();return this},_getHandle:function(a){var b=!this.options.handle||!d(this.options.handle,this.element).length?true:false;d(this.options.handle,this.element).find("*").andSelf().each(function(){if(this== -a.target)b=true});return b},_createHelper:function(a){var b=this.options;a=d.isFunction(b.helper)?d(b.helper.apply(this.element[0],[a])):b.helper=="clone"?this.element.clone():this.element;a.parents("body").length||a.appendTo(b.appendTo=="parent"?this.element[0].parentNode:b.appendTo);a[0]!=this.element[0]&&!/(fixed|absolute)/.test(a.css("position"))&&a.css("position","absolute");return a},_adjustOffsetFromHelper:function(a){if(typeof a=="string")a=a.split(" ");if(d.isArray(a))a={left:+a[0],top:+a[1]|| -0};if("left"in a)this.offset.click.left=a.left+this.margins.left;if("right"in a)this.offset.click.left=this.helperProportions.width-a.right+this.margins.left;if("top"in a)this.offset.click.top=a.top+this.margins.top;if("bottom"in a)this.offset.click.top=this.helperProportions.height-a.bottom+this.margins.top},_getParentOffset:function(){this.offsetParent=this.helper.offsetParent();var a=this.offsetParent.offset();if(this.cssPosition=="absolute"&&this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], -this.offsetParent[0])){a.left+=this.scrollParent.scrollLeft();a.top+=this.scrollParent.scrollTop()}if(this.offsetParent[0]==document.body||this.offsetParent[0].tagName&&this.offsetParent[0].tagName.toLowerCase()=="html"&&d.browser.msie)a={top:0,left:0};return{top:a.top+(parseInt(this.offsetParent.css("borderTopWidth"),10)||0),left:a.left+(parseInt(this.offsetParent.css("borderLeftWidth"),10)||0)}},_getRelativeOffset:function(){if(this.cssPosition=="relative"){var a=this.element.position();return{top:a.top- -(parseInt(this.helper.css("top"),10)||0)+this.scrollParent.scrollTop(),left:a.left-(parseInt(this.helper.css("left"),10)||0)+this.scrollParent.scrollLeft()}}else return{top:0,left:0}},_cacheMargins:function(){this.margins={left:parseInt(this.element.css("marginLeft"),10)||0,top:parseInt(this.element.css("marginTop"),10)||0}},_cacheHelperProportions:function(){this.helperProportions={width:this.helper.outerWidth(),height:this.helper.outerHeight()}},_setContainment:function(){var a=this.options;if(a.containment== -"parent")a.containment=this.helper[0].parentNode;if(a.containment=="document"||a.containment=="window")this.containment=[0-this.offset.relative.left-this.offset.parent.left,0-this.offset.relative.top-this.offset.parent.top,d(a.containment=="document"?document:window).width()-this.helperProportions.width-this.margins.left,(d(a.containment=="document"?document:window).height()||document.body.parentNode.scrollHeight)-this.helperProportions.height-this.margins.top];if(!/^(document|window|parent)$/.test(a.containment)&& -a.containment.constructor!=Array){var b=d(a.containment)[0];if(b){a=d(a.containment).offset();var c=d(b).css("overflow")!="hidden";this.containment=[a.left+(parseInt(d(b).css("borderLeftWidth"),10)||0)+(parseInt(d(b).css("paddingLeft"),10)||0)-this.margins.left,a.top+(parseInt(d(b).css("borderTopWidth"),10)||0)+(parseInt(d(b).css("paddingTop"),10)||0)-this.margins.top,a.left+(c?Math.max(b.scrollWidth,b.offsetWidth):b.offsetWidth)-(parseInt(d(b).css("borderLeftWidth"),10)||0)-(parseInt(d(b).css("paddingRight"), -10)||0)-this.helperProportions.width-this.margins.left,a.top+(c?Math.max(b.scrollHeight,b.offsetHeight):b.offsetHeight)-(parseInt(d(b).css("borderTopWidth"),10)||0)-(parseInt(d(b).css("paddingBottom"),10)||0)-this.helperProportions.height-this.margins.top]}}else if(a.containment.constructor==Array)this.containment=a.containment},_convertPositionTo:function(a,b){if(!b)b=this.position;a=a=="absolute"?1:-1;var c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0], -this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName);return{top:b.top+this.offset.relative.top*a+this.offset.parent.top*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollTop():f?0:c.scrollTop())*a),left:b.left+this.offset.relative.left*a+this.offset.parent.left*a-(d.browser.safari&&d.browser.version<526&&this.cssPosition=="fixed"?0:(this.cssPosition=="fixed"?-this.scrollParent.scrollLeft(): -f?0:c.scrollLeft())*a)}},_generatePosition:function(a){var b=this.options,c=this.cssPosition=="absolute"&&!(this.scrollParent[0]!=document&&d.ui.contains(this.scrollParent[0],this.offsetParent[0]))?this.offsetParent:this.scrollParent,f=/(html|body)/i.test(c[0].tagName),e=a.pageX,g=a.pageY;if(this.originalPosition){if(this.containment){if(a.pageX-this.offset.click.leftthis.containment[2])e=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])?g:!(g-this.offset.click.topthis.containment[2])?e:!(e-this.offset.click.left').css({width:this.offsetWidth+"px",height:this.offsetHeight+"px",position:"absolute",opacity:"0.001",zIndex:1E3}).css(d(this).offset()).appendTo("body")})},stop:function(){d("div.ui-draggable-iframeFix").each(function(){this.parentNode.removeChild(this)})}});d.ui.plugin.add("draggable","opacity",{start:function(a,b){a=d(b.helper);b=d(this).data("draggable").options; -if(a.css("opacity"))b._opacity=a.css("opacity");a.css("opacity",b.opacity)},stop:function(a,b){a=d(this).data("draggable").options;a._opacity&&d(b.helper).css("opacity",a._opacity)}});d.ui.plugin.add("draggable","scroll",{start:function(){var a=d(this).data("draggable");if(a.scrollParent[0]!=document&&a.scrollParent[0].tagName!="HTML")a.overflowOffset=a.scrollParent.offset()},drag:function(a){var b=d(this).data("draggable"),c=b.options,f=false;if(b.scrollParent[0]!=document&&b.scrollParent[0].tagName!= -"HTML"){if(!c.axis||c.axis!="x")if(b.overflowOffset.top+b.scrollParent[0].offsetHeight-a.pageY=0;h--){var i=c.snapElements[h].left,k=i+c.snapElements[h].width,j=c.snapElements[h].top,l=j+c.snapElements[h].height;if(i-e=j&&f<=l||h>=j&&h<=l||fl)&&(e>= -i&&e<=k||g>=i&&g<=k||ek);default:return false}};d.ui.ddmanager={current:null,droppables:{"default":[]},prepareOffsets:function(a,b){var c=d.ui.ddmanager.droppables[a.options.scope]||[],e=b?b.type:null,g=(a.currentItem||a.element).find(":data(droppable)").andSelf(),f=0;a:for(;f').css({position:this.element.css("position"),width:this.element.outerWidth(),height:this.element.outerHeight(), -top:this.element.css("top"),left:this.element.css("left")}));this.element=this.element.parent().data("resizable",this.element.data("resizable"));this.elementIsWrapper=true;this.element.css({marginLeft:this.originalElement.css("marginLeft"),marginTop:this.originalElement.css("marginTop"),marginRight:this.originalElement.css("marginRight"),marginBottom:this.originalElement.css("marginBottom")});this.originalElement.css({marginLeft:0,marginTop:0,marginRight:0,marginBottom:0});this.originalResizeStyle= -this.originalElement.css("resize");this.originalElement.css("resize","none");this._proportionallyResizeElements.push(this.originalElement.css({position:"static",zoom:1,display:"block"}));this.originalElement.css({margin:this.originalElement.css("margin")});this._proportionallyResize()}this.handles=a.handles||(!e(".ui-resizable-handle",this.element).length?"e,s,se":{n:".ui-resizable-n",e:".ui-resizable-e",s:".ui-resizable-s",w:".ui-resizable-w",se:".ui-resizable-se",sw:".ui-resizable-sw",ne:".ui-resizable-ne", -nw:".ui-resizable-nw"});if(this.handles.constructor==String){if(this.handles=="all")this.handles="n,e,s,w,se,sw,ne,nw";var c=this.handles.split(",");this.handles={};for(var d=0;d');/sw|se|ne|nw/.test(f)&&g.css({zIndex:++a.zIndex});"se"==f&&g.addClass("ui-icon ui-icon-gripsmall-diagonal-se");this.handles[f]=".ui-resizable-"+f;this.element.append(g)}}this._renderAxis=function(h){h=h||this.element;for(var i in this.handles){if(this.handles[i].constructor== -String)this.handles[i]=e(this.handles[i],this.element).show();if(this.elementIsWrapper&&this.originalElement[0].nodeName.match(/textarea|input|select|button/i)){var j=e(this.handles[i],this.element),k=0;k=/sw|ne|nw|se|n|s/.test(i)?j.outerHeight():j.outerWidth();j=["padding",/ne|nw|n/.test(i)?"Top":/se|sw|s/.test(i)?"Bottom":/^e$/.test(i)?"Right":"Left"].join("");h.css(j,k);this._proportionallyResize()}e(this.handles[i])}};this._renderAxis(this.element);this._handles=e(".ui-resizable-handle",this.element).disableSelection(); -this._handles.mouseover(function(){if(!b.resizing){if(this.className)var h=this.className.match(/ui-resizable-(se|sw|ne|nw|n|e|s|w)/i);b.axis=h&&h[1]?h[1]:"se"}});if(a.autoHide){this._handles.hide();e(this.element).addClass("ui-resizable-autohide").hover(function(){e(this).removeClass("ui-resizable-autohide");b._handles.show()},function(){if(!b.resizing){e(this).addClass("ui-resizable-autohide");b._handles.hide()}})}this._mouseInit()},destroy:function(){this._mouseDestroy();var b=function(c){e(c).removeClass("ui-resizable ui-resizable-disabled ui-resizable-resizing").removeData("resizable").unbind(".resizable").find(".ui-resizable-handle").remove()}; -if(this.elementIsWrapper){b(this.element);var a=this.element;a.after(this.originalElement.css({position:a.css("position"),width:a.outerWidth(),height:a.outerHeight(),top:a.css("top"),left:a.css("left")})).remove()}this.originalElement.css("resize",this.originalResizeStyle);b(this.originalElement);return this},_mouseCapture:function(b){var a=false;for(var c in this.handles)if(e(this.handles[c])[0]==b.target)a=true;return!this.options.disabled&&a},_mouseStart:function(b){var a=this.options,c=this.element.position(), -d=this.element;this.resizing=true;this.documentScroll={top:e(document).scrollTop(),left:e(document).scrollLeft()};if(d.is(".ui-draggable")||/absolute/.test(d.css("position")))d.css({position:"absolute",top:c.top,left:c.left});e.browser.opera&&/relative/.test(d.css("position"))&&d.css({position:"relative",top:"auto",left:"auto"});this._renderProxy();c=m(this.helper.css("left"));var f=m(this.helper.css("top"));if(a.containment){c+=e(a.containment).scrollLeft()||0;f+=e(a.containment).scrollTop()||0}this.offset= -this.helper.offset();this.position={left:c,top:f};this.size=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalSize=this._helper?{width:d.outerWidth(),height:d.outerHeight()}:{width:d.width(),height:d.height()};this.originalPosition={left:c,top:f};this.sizeDiff={width:d.outerWidth()-d.width(),height:d.outerHeight()-d.height()};this.originalMousePosition={left:b.pageX,top:b.pageY};this.aspectRatio=typeof a.aspectRatio=="number"?a.aspectRatio: -this.originalSize.width/this.originalSize.height||1;a=e(".ui-resizable-"+this.axis).css("cursor");e("body").css("cursor",a=="auto"?this.axis+"-resize":a);d.addClass("ui-resizable-resizing");this._propagate("start",b);return true},_mouseDrag:function(b){var a=this.helper,c=this.originalMousePosition,d=this._change[this.axis];if(!d)return false;c=d.apply(this,[b,b.pageX-c.left||0,b.pageY-c.top||0]);if(this._aspectRatio||b.shiftKey)c=this._updateRatio(c,b);c=this._respectSize(c,b);this._propagate("resize", -b);a.css({top:this.position.top+"px",left:this.position.left+"px",width:this.size.width+"px",height:this.size.height+"px"});!this._helper&&this._proportionallyResizeElements.length&&this._proportionallyResize();this._updateCache(c);this._trigger("resize",b,this.ui());return false},_mouseStop:function(b){this.resizing=false;var a=this.options,c=this;if(this._helper){var d=this._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName);d=f&&e.ui.hasScroll(d[0],"left")?0:c.sizeDiff.height; -f={width:c.size.width-(f?0:c.sizeDiff.width),height:c.size.height-d};d=parseInt(c.element.css("left"),10)+(c.position.left-c.originalPosition.left)||null;var g=parseInt(c.element.css("top"),10)+(c.position.top-c.originalPosition.top)||null;a.animate||this.element.css(e.extend(f,{top:g,left:d}));c.helper.height(c.size.height);c.helper.width(c.size.width);this._helper&&!a.animate&&this._proportionallyResize()}e("body").css("cursor","auto");this.element.removeClass("ui-resizable-resizing");this._propagate("stop", -b);this._helper&&this.helper.remove();return false},_updateCache:function(b){this.offset=this.helper.offset();if(l(b.left))this.position.left=b.left;if(l(b.top))this.position.top=b.top;if(l(b.height))this.size.height=b.height;if(l(b.width))this.size.width=b.width},_updateRatio:function(b){var a=this.position,c=this.size,d=this.axis;if(b.height)b.width=c.height*this.aspectRatio;else if(b.width)b.height=c.width/this.aspectRatio;if(d=="sw"){b.left=a.left+(c.width-b.width);b.top=null}if(d=="nw"){b.top= -a.top+(c.height-b.height);b.left=a.left+(c.width-b.width)}return b},_respectSize:function(b){var a=this.options,c=this.axis,d=l(b.width)&&a.maxWidth&&a.maxWidthb.width,h=l(b.height)&&a.minHeight&&a.minHeight>b.height;if(g)b.width=a.minWidth;if(h)b.height=a.minHeight;if(d)b.width=a.maxWidth;if(f)b.height=a.maxHeight;var i=this.originalPosition.left+this.originalSize.width,j=this.position.top+this.size.height, -k=/sw|nw|w/.test(c);c=/nw|ne|n/.test(c);if(g&&k)b.left=i-a.minWidth;if(d&&k)b.left=i-a.maxWidth;if(h&&c)b.top=j-a.minHeight;if(f&&c)b.top=j-a.maxHeight;if((a=!b.width&&!b.height)&&!b.left&&b.top)b.top=null;else if(a&&!b.top&&b.left)b.left=null;return b},_proportionallyResize:function(){if(this._proportionallyResizeElements.length)for(var b=this.helper||this.element,a=0;a');var a=e.browser.msie&&e.browser.version<7,c=a?1:0;a=a?2:-1;this.helper.addClass(this._helper).css({width:this.element.outerWidth()+a,height:this.element.outerHeight()+a,position:"absolute",left:this.elementOffset.left-c+"px",top:this.elementOffset.top-c+"px",zIndex:++b.zIndex});this.helper.appendTo("body").disableSelection()}else this.helper=this.element},_change:{e:function(b,a){return{width:this.originalSize.width+ -a}},w:function(b,a){return{left:this.originalPosition.left+a,width:this.originalSize.width-a}},n:function(b,a,c){return{top:this.originalPosition.top+c,height:this.originalSize.height-c}},s:function(b,a,c){return{height:this.originalSize.height+c}},se:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.e.apply(this,[b,a,c]))},sw:function(b,a,c){return e.extend(this._change.s.apply(this,arguments),this._change.w.apply(this,[b,a,c]))},ne:function(b,a,c){return e.extend(this._change.n.apply(this, -arguments),this._change.e.apply(this,[b,a,c]))},nw:function(b,a,c){return e.extend(this._change.n.apply(this,arguments),this._change.w.apply(this,[b,a,c]))}},_propagate:function(b,a){e.ui.plugin.call(this,b,[a,this.ui()]);b!="resize"&&this._trigger(b,a,this.ui())},plugins:{},ui:function(){return{originalElement:this.originalElement,element:this.element,helper:this.helper,position:this.position,size:this.size,originalSize:this.originalSize,originalPosition:this.originalPosition}}});e.extend(e.ui.resizable, -{version:"1.8.5"});e.ui.plugin.add("resizable","alsoResize",{start:function(){var b=e(this).data("resizable").options,a=function(c){e(c).each(function(){var d=e(this);d.data("resizable-alsoresize",{width:parseInt(d.width(),10),height:parseInt(d.height(),10),left:parseInt(d.css("left"),10),top:parseInt(d.css("top"),10),position:d.css("position")})})};if(typeof b.alsoResize=="object"&&!b.alsoResize.parentNode)if(b.alsoResize.length){b.alsoResize=b.alsoResize[0];a(b.alsoResize)}else e.each(b.alsoResize, -function(c){a(c)});else a(b.alsoResize)},resize:function(b,a){var c=e(this).data("resizable");b=c.options;var d=c.originalSize,f=c.originalPosition,g={height:c.size.height-d.height||0,width:c.size.width-d.width||0,top:c.position.top-f.top||0,left:c.position.left-f.left||0},h=function(i,j){e(i).each(function(){var k=e(this),q=e(this).data("resizable-alsoresize"),p={},r=j&&j.length?j:k.parents(a.originalElement[0]).length?["width","height"]:["width","height","top","left"];e.each(r,function(n,o){if((n= -(q[o]||0)+(g[o]||0))&&n>=0)p[o]=n||null});if(e.browser.opera&&/relative/.test(k.css("position"))){c._revertToRelativePosition=true;k.css({position:"absolute",top:"auto",left:"auto"})}k.css(p)})};typeof b.alsoResize=="object"&&!b.alsoResize.nodeType?e.each(b.alsoResize,function(i,j){h(i,j)}):h(b.alsoResize)},stop:function(){var b=e(this).data("resizable"),a=b.options,c=function(d){e(d).each(function(){var f=e(this);f.css({position:f.data("resizable-alsoresize").position})})};if(b._revertToRelativePosition){b._revertToRelativePosition= -false;typeof a.alsoResize=="object"&&!a.alsoResize.nodeType?e.each(a.alsoResize,function(d){c(d)}):c(a.alsoResize)}e(this).removeData("resizable-alsoresize")}});e.ui.plugin.add("resizable","animate",{stop:function(b){var a=e(this).data("resizable"),c=a.options,d=a._proportionallyResizeElements,f=d.length&&/textarea/i.test(d[0].nodeName),g=f&&e.ui.hasScroll(d[0],"left")?0:a.sizeDiff.height;f={width:a.size.width-(f?0:a.sizeDiff.width),height:a.size.height-g};g=parseInt(a.element.css("left"),10)+(a.position.left- -a.originalPosition.left)||null;var h=parseInt(a.element.css("top"),10)+(a.position.top-a.originalPosition.top)||null;a.element.animate(e.extend(f,h&&g?{top:h,left:g}:{}),{duration:c.animateDuration,easing:c.animateEasing,step:function(){var i={width:parseInt(a.element.css("width"),10),height:parseInt(a.element.css("height"),10),top:parseInt(a.element.css("top"),10),left:parseInt(a.element.css("left"),10)};d&&d.length&&e(d[0]).css({width:i.width,height:i.height});a._updateCache(i);a._propagate("resize", -b)}})}});e.ui.plugin.add("resizable","containment",{start:function(){var b=e(this).data("resizable"),a=b.element,c=b.options.containment;if(a=c instanceof e?c.get(0):/parent/.test(c)?a.parent().get(0):c){b.containerElement=e(a);if(/document/.test(c)||c==document){b.containerOffset={left:0,top:0};b.containerPosition={left:0,top:0};b.parentData={element:e(document),left:0,top:0,width:e(document).width(),height:e(document).height()||document.body.parentNode.scrollHeight}}else{var d=e(a),f=[];e(["Top", -"Right","Left","Bottom"]).each(function(i,j){f[i]=m(d.css("padding"+j))});b.containerOffset=d.offset();b.containerPosition=d.position();b.containerSize={height:d.innerHeight()-f[3],width:d.innerWidth()-f[1]};c=b.containerOffset;var g=b.containerSize.height,h=b.containerSize.width;h=e.ui.hasScroll(a,"left")?a.scrollWidth:h;g=e.ui.hasScroll(a)?a.scrollHeight:g;b.parentData={element:a,left:c.left,top:c.top,width:h,height:g}}}},resize:function(b){var a=e(this).data("resizable"),c=a.options,d=a.containerOffset, -f=a.position;b=a._aspectRatio||b.shiftKey;var g={top:0,left:0},h=a.containerElement;if(h[0]!=document&&/static/.test(h.css("position")))g=d;if(f.left<(a._helper?d.left:0)){a.size.width+=a._helper?a.position.left-d.left:a.position.left-g.left;if(b)a.size.height=a.size.width/c.aspectRatio;a.position.left=c.helper?d.left:0}if(f.top<(a._helper?d.top:0)){a.size.height+=a._helper?a.position.top-d.top:a.position.top;if(b)a.size.width=a.size.height*c.aspectRatio;a.position.top=a._helper?d.top:0}a.offset.left= -a.parentData.left+a.position.left;a.offset.top=a.parentData.top+a.position.top;c=Math.abs((a._helper?a.offset.left-g.left:a.offset.left-g.left)+a.sizeDiff.width);d=Math.abs((a._helper?a.offset.top-g.top:a.offset.top-d.top)+a.sizeDiff.height);f=a.containerElement.get(0)==a.element.parent().get(0);g=/relative|absolute/.test(a.containerElement.css("position"));if(f&&g)c-=a.parentData.left;if(c+a.size.width>=a.parentData.width){a.size.width=a.parentData.width-c;if(b)a.size.height=a.size.width/a.aspectRatio}if(d+ -a.size.height>=a.parentData.height){a.size.height=a.parentData.height-d;if(b)a.size.width=a.size.height*a.aspectRatio}},stop:function(){var b=e(this).data("resizable"),a=b.options,c=b.containerOffset,d=b.containerPosition,f=b.containerElement,g=e(b.helper),h=g.offset(),i=g.outerWidth()-b.sizeDiff.width;g=g.outerHeight()-b.sizeDiff.height;b._helper&&!a.animate&&/relative/.test(f.css("position"))&&e(this).css({left:h.left-d.left-c.left,width:i,height:g});b._helper&&!a.animate&&/static/.test(f.css("position"))&& -e(this).css({left:h.left-d.left-c.left,width:i,height:g})}});e.ui.plugin.add("resizable","ghost",{start:function(){var b=e(this).data("resizable"),a=b.options,c=b.size;b.ghost=b.originalElement.clone();b.ghost.css({opacity:0.25,display:"block",position:"relative",height:c.height,width:c.width,margin:0,left:0,top:0}).addClass("ui-resizable-ghost").addClass(typeof a.ghost=="string"?a.ghost:"");b.ghost.appendTo(b.helper)},resize:function(){var b=e(this).data("resizable");b.ghost&&b.ghost.css({position:"relative", -height:b.size.height,width:b.size.width})},stop:function(){var b=e(this).data("resizable");b.ghost&&b.helper&&b.helper.get(0).removeChild(b.ghost.get(0))}});e.ui.plugin.add("resizable","grid",{resize:function(){var b=e(this).data("resizable"),a=b.options,c=b.size,d=b.originalSize,f=b.originalPosition,g=b.axis;a.grid=typeof a.grid=="number"?[a.grid,a.grid]:a.grid;var h=Math.round((c.width-d.width)/(a.grid[0]||1))*(a.grid[0]||1);a=Math.round((c.height-d.height)/(a.grid[1]||1))*(a.grid[1]||1);if(/^(se|s|e)$/.test(g)){b.size.width= -d.width+h;b.size.height=d.height+a}else if(/^(ne)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}else{if(/^(sw)$/.test(g)){b.size.width=d.width+h;b.size.height=d.height+a}else{b.size.width=d.width+h;b.size.height=d.height+a;b.position.top=f.top-a}b.position.left=f.left-h}}});var m=function(b){return parseInt(b,10)||0},l=function(b){return!isNaN(parseInt(b,10))}})(jQuery); -;/* - * jQuery UI Selectable 1.8.5 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Selectables - * - * Depends: - * jquery.ui.core.js - * jquery.ui.mouse.js - * jquery.ui.widget.js - */ -(function(e){e.widget("ui.selectable",e.ui.mouse,{options:{appendTo:"body",autoRefresh:true,distance:0,filter:"*",tolerance:"touch"},_create:function(){var c=this;this.element.addClass("ui-selectable");this.dragged=false;var f;this.refresh=function(){f=e(c.options.filter,c.element[0]);f.each(function(){var d=e(this),b=d.offset();e.data(this,"selectable-item",{element:this,$element:d,left:b.left,top:b.top,right:b.left+d.outerWidth(),bottom:b.top+d.outerHeight(),startselected:false,selected:d.hasClass("ui-selected"), -selecting:d.hasClass("ui-selecting"),unselecting:d.hasClass("ui-unselecting")})})};this.refresh();this.selectees=f.addClass("ui-selectee");this._mouseInit();this.helper=e("

    ")},destroy:function(){this.selectees.removeClass("ui-selectee").removeData("selectable-item");this.element.removeClass("ui-selectable ui-selectable-disabled").removeData("selectable").unbind(".selectable");this._mouseDestroy();return this},_mouseStart:function(c){var f=this;this.opos=[c.pageX, -c.pageY];if(!this.options.disabled){var d=this.options;this.selectees=e(d.filter,this.element[0]);this._trigger("start",c);e(d.appendTo).append(this.helper);this.helper.css({left:c.clientX,top:c.clientY,width:0,height:0});d.autoRefresh&&this.refresh();this.selectees.filter(".ui-selected").each(function(){var b=e.data(this,"selectable-item");b.startselected=true;if(!c.metaKey){b.$element.removeClass("ui-selected");b.selected=false;b.$element.addClass("ui-unselecting");b.unselecting=true;f._trigger("unselecting", -c,{unselecting:b.element})}});e(c.target).parents().andSelf().each(function(){var b=e.data(this,"selectable-item");if(b){var g=!c.metaKey||!b.$element.hasClass("ui-selected");b.$element.removeClass(g?"ui-unselecting":"ui-selected").addClass(g?"ui-selecting":"ui-unselecting");b.unselecting=!g;b.selecting=g;(b.selected=g)?f._trigger("selecting",c,{selecting:b.element}):f._trigger("unselecting",c,{unselecting:b.element});return false}})}},_mouseDrag:function(c){var f=this;this.dragged=true;if(!this.options.disabled){var d= -this.options,b=this.opos[0],g=this.opos[1],h=c.pageX,i=c.pageY;if(b>h){var j=h;h=b;b=j}if(g>i){j=i;i=g;g=j}this.helper.css({left:b,top:g,width:h-b,height:i-g});this.selectees.each(function(){var a=e.data(this,"selectable-item");if(!(!a||a.element==f.element[0])){var k=false;if(d.tolerance=="touch")k=!(a.left>h||a.righti||a.bottomb&&a.rightg&&a.bottom *",opacity:false,placeholder:false,revert:false,scroll:true,scrollSensitivity:20,scrollSpeed:20,scope:"default",tolerance:"intersect",zIndex:1E3},_create:function(){this.containerCache={};this.element.addClass("ui-sortable"); -this.refresh();this.floating=this.items.length?/left|right/.test(this.items[0].item.css("float")):false;this.offset=this.element.offset();this._mouseInit()},destroy:function(){this.element.removeClass("ui-sortable ui-sortable-disabled").removeData("sortable").unbind(".sortable");this._mouseDestroy();for(var a=this.items.length-1;a>=0;a--)this.items[a].item.removeData("sortable-item");return this},_setOption:function(a,b){if(a==="disabled"){this.options[a]=b;this.widget()[b?"addClass":"removeClass"]("ui-sortable-disabled")}else d.Widget.prototype._setOption.apply(this, -arguments)},_mouseCapture:function(a,b){if(this.reverting)return false;if(this.options.disabled||this.options.type=="static")return false;this._refreshItems(a);var c=null,e=this;d(a.target).parents().each(function(){if(d.data(this,"sortable-item")==e){c=d(this);return false}});if(d.data(a.target,"sortable-item")==e)c=d(a.target);if(!c)return false;if(this.options.handle&&!b){var f=false;d(this.options.handle,c).find("*").andSelf().each(function(){if(this==a.target)f=true});if(!f)return false}this.currentItem= -c;this._removeCurrentsFromItems();return true},_mouseStart:function(a,b,c){b=this.options;var e=this;this.currentContainer=this;this.refreshPositions();this.helper=this._createHelper(a);this._cacheHelperProportions();this._cacheMargins();this.scrollParent=this.helper.scrollParent();this.offset=this.currentItem.offset();this.offset={top:this.offset.top-this.margins.top,left:this.offset.left-this.margins.left};this.helper.css("position","absolute");this.cssPosition=this.helper.css("position");d.extend(this.offset, -{click:{left:a.pageX-this.offset.left,top:a.pageY-this.offset.top},parent:this._getParentOffset(),relative:this._getRelativeOffset()});this.originalPosition=this._generatePosition(a);this.originalPageX=a.pageX;this.originalPageY=a.pageY;b.cursorAt&&this._adjustOffsetFromHelper(b.cursorAt);this.domPosition={prev:this.currentItem.prev()[0],parent:this.currentItem.parent()[0]};this.helper[0]!=this.currentItem[0]&&this.currentItem.hide();this._createPlaceholder();b.containment&&this._setContainment(); -if(b.cursor){if(d("body").css("cursor"))this._storedCursor=d("body").css("cursor");d("body").css("cursor",b.cursor)}if(b.opacity){if(this.helper.css("opacity"))this._storedOpacity=this.helper.css("opacity");this.helper.css("opacity",b.opacity)}if(b.zIndex){if(this.helper.css("zIndex"))this._storedZIndex=this.helper.css("zIndex");this.helper.css("zIndex",b.zIndex)}if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML")this.overflowOffset=this.scrollParent.offset();this._trigger("start", -a,this._uiHash());this._preserveHelperProportions||this._cacheHelperProportions();if(!c)for(c=this.containers.length-1;c>=0;c--)this.containers[c]._trigger("activate",a,e._uiHash(this));if(d.ui.ddmanager)d.ui.ddmanager.current=this;d.ui.ddmanager&&!b.dropBehaviour&&d.ui.ddmanager.prepareOffsets(this,a);this.dragging=true;this.helper.addClass("ui-sortable-helper");this._mouseDrag(a);return true},_mouseDrag:function(a){this.position=this._generatePosition(a);this.positionAbs=this._convertPositionTo("absolute"); -if(!this.lastPositionAbs)this.lastPositionAbs=this.positionAbs;if(this.options.scroll){var b=this.options,c=false;if(this.scrollParent[0]!=document&&this.scrollParent[0].tagName!="HTML"){if(this.overflowOffset.top+this.scrollParent[0].offsetHeight-a.pageY=0;b--){c=this.items[b];var e=c.item[0],f=this._intersectsWithPointer(c);if(f)if(e!=this.currentItem[0]&&this.placeholder[f==1?"next":"prev"]()[0]!=e&&!d.ui.contains(this.placeholder[0],e)&&(this.options.type=="semi-dynamic"?!d.ui.contains(this.element[0],e):true)){this.direction=f==1?"down":"up";if(this.options.tolerance=="pointer"||this._intersectsWithSides(c))this._rearrange(a, -c);else break;this._trigger("change",a,this._uiHash());break}}this._contactContainers(a);d.ui.ddmanager&&d.ui.ddmanager.drag(this,a);this._trigger("sort",a,this._uiHash());this.lastPositionAbs=this.positionAbs;return false},_mouseStop:function(a,b){if(a){d.ui.ddmanager&&!this.options.dropBehaviour&&d.ui.ddmanager.drop(this,a);if(this.options.revert){var c=this;b=c.placeholder.offset();c.reverting=true;d(this.helper).animate({left:b.left-this.offset.parent.left-c.margins.left+(this.offsetParent[0]== -document.body?0:this.offsetParent[0].scrollLeft),top:b.top-this.offset.parent.top-c.margins.top+(this.offsetParent[0]==document.body?0:this.offsetParent[0].scrollTop)},parseInt(this.options.revert,10)||500,function(){c._clear(a)})}else this._clear(a,b);return false}},cancel:function(){var a=this;if(this.dragging){this._mouseUp();this.options.helper=="original"?this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper"):this.currentItem.show();for(var b=this.containers.length-1;b>=0;b--){this.containers[b]._trigger("deactivate", -null,a._uiHash(this));if(this.containers[b].containerCache.over){this.containers[b]._trigger("out",null,a._uiHash(this));this.containers[b].containerCache.over=0}}}this.placeholder[0].parentNode&&this.placeholder[0].parentNode.removeChild(this.placeholder[0]);this.options.helper!="original"&&this.helper&&this.helper[0].parentNode&&this.helper.remove();d.extend(this,{helper:null,dragging:false,reverting:false,_noFinalSort:null});this.domPosition.prev?d(this.domPosition.prev).after(this.currentItem): -d(this.domPosition.parent).prepend(this.currentItem);return this},serialize:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};d(b).each(function(){var e=(d(a.item||this).attr(a.attribute||"id")||"").match(a.expression||/(.+)[-=_](.+)/);if(e)c.push((a.key||e[1]+"[]")+"="+(a.key&&a.expression?e[1]:e[2]))});!c.length&&a.key&&c.push(a.key+"=");return c.join("&")},toArray:function(a){var b=this._getItemsAsjQuery(a&&a.connected),c=[];a=a||{};b.each(function(){c.push(d(a.item||this).attr(a.attribute|| -"id")||"")});return c},_intersectsWith:function(a){var b=this.positionAbs.left,c=b+this.helperProportions.width,e=this.positionAbs.top,f=e+this.helperProportions.height,g=a.left,h=g+a.width,i=a.top,k=i+a.height,j=this.offset.click.top,l=this.offset.click.left;j=e+j>i&&e+jg&&b+la[this.floating?"width":"height"]?j:g0?"down":"up")}, -_getDragHorizontalDirection:function(){var a=this.positionAbs.left-this.lastPositionAbs.left;return a!=0&&(a>0?"right":"left")},refresh:function(a){this._refreshItems(a);this.refreshPositions();return this},_connectWith:function(){var a=this.options;return a.connectWith.constructor==String?[a.connectWith]:a.connectWith},_getItemsAsjQuery:function(a){var b=[],c=[],e=this._connectWith();if(e&&a)for(a=e.length-1;a>=0;a--)for(var f=d(e[a]),g=f.length-1;g>=0;g--){var h=d.data(f[g],"sortable");if(h&&h!= -this&&!h.options.disabled)c.push([d.isFunction(h.options.items)?h.options.items.call(h.element):d(h.options.items,h.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),h])}c.push([d.isFunction(this.options.items)?this.options.items.call(this.element,null,{options:this.options,item:this.currentItem}):d(this.options.items,this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"),this]);for(a=c.length-1;a>=0;a--)c[a][0].each(function(){b.push(this)});return d(b)},_removeCurrentsFromItems:function(){for(var a= -this.currentItem.find(":data(sortable-item)"),b=0;b=0;f--)for(var g=d(e[f]),h=g.length-1;h>=0;h--){var i=d.data(g[h],"sortable"); -if(i&&i!=this&&!i.options.disabled){c.push([d.isFunction(i.options.items)?i.options.items.call(i.element[0],a,{item:this.currentItem}):d(i.options.items,i.element),i]);this.containers.push(i)}}for(f=c.length-1;f>=0;f--){a=c[f][1];e=c[f][0];h=0;for(g=e.length;h= -0;b--){var c=this.items[b],e=this.options.toleranceElement?d(this.options.toleranceElement,c.item):c.item;if(!a){c.width=e.outerWidth();c.height=e.outerHeight()}e=e.offset();c.left=e.left;c.top=e.top}if(this.options.custom&&this.options.custom.refreshContainers)this.options.custom.refreshContainers.call(this);else for(b=this.containers.length-1;b>=0;b--){e=this.containers[b].element.offset();this.containers[b].containerCache.left=e.left;this.containers[b].containerCache.top=e.top;this.containers[b].containerCache.width= -this.containers[b].element.outerWidth();this.containers[b].containerCache.height=this.containers[b].element.outerHeight()}return this},_createPlaceholder:function(a){var b=a||this,c=b.options;if(!c.placeholder||c.placeholder.constructor==String){var e=c.placeholder;c.placeholder={element:function(){var f=d(document.createElement(b.currentItem[0].nodeName)).addClass(e||b.currentItem[0].className+" ui-sortable-placeholder").removeClass("ui-sortable-helper")[0];if(!e)f.style.visibility="hidden";return f}, -update:function(f,g){if(!(e&&!c.forcePlaceholderSize)){g.height()||g.height(b.currentItem.innerHeight()-parseInt(b.currentItem.css("paddingTop")||0,10)-parseInt(b.currentItem.css("paddingBottom")||0,10));g.width()||g.width(b.currentItem.innerWidth()-parseInt(b.currentItem.css("paddingLeft")||0,10)-parseInt(b.currentItem.css("paddingRight")||0,10))}}}}b.placeholder=d(c.placeholder.element.call(b.element,b.currentItem));b.currentItem.after(b.placeholder);c.placeholder.update(b,b.placeholder)},_contactContainers:function(a){for(var b= -null,c=null,e=this.containers.length-1;e>=0;e--)if(!d.ui.contains(this.currentItem[0],this.containers[e].element[0]))if(this._intersectsWith(this.containers[e].containerCache)){if(!(b&&d.ui.contains(this.containers[e].element[0],b.element[0]))){b=this.containers[e];c=e}}else if(this.containers[e].containerCache.over){this.containers[e]._trigger("out",a,this._uiHash(this));this.containers[e].containerCache.over=0}if(b)if(this.containers.length===1){this.containers[c]._trigger("over",a,this._uiHash(this)); -this.containers[c].containerCache.over=1}else if(this.currentContainer!=this.containers[c]){b=1E4;e=null;for(var f=this.positionAbs[this.containers[c].floating?"left":"top"],g=this.items.length-1;g>=0;g--)if(d.ui.contains(this.containers[c].element[0],this.items[g].item[0])){var h=this.items[g][this.containers[c].floating?"left":"top"];if(Math.abs(h-f)this.containment[2])f=this.containment[2]+this.offset.click.left;if(a.pageY-this.offset.click.top>this.containment[3])g=this.containment[3]+this.offset.click.top}if(b.grid){g=this.originalPageY+Math.round((g-this.originalPageY)/b.grid[1])*b.grid[1];g=this.containment?!(g-this.offset.click.topthis.containment[3])? -g:!(g-this.offset.click.topthis.containment[2])?f:!(f-this.offset.click.left=0;e--)if(d.ui.contains(this.containers[e].element[0],this.currentItem[0])&&!b){c.push(function(f){return function(g){f._trigger("receive", -g,this._uiHash(this))}}.call(this,this.containers[e]));c.push(function(f){return function(g){f._trigger("update",g,this._uiHash(this))}}.call(this,this.containers[e]))}}for(e=this.containers.length-1;e>=0;e--){b||c.push(function(f){return function(g){f._trigger("deactivate",g,this._uiHash(this))}}.call(this,this.containers[e]));if(this.containers[e].containerCache.over){c.push(function(f){return function(g){f._trigger("out",g,this._uiHash(this))}}.call(this,this.containers[e]));this.containers[e].containerCache.over= -0}}this._storedCursor&&d("body").css("cursor",this._storedCursor);this._storedOpacity&&this.helper.css("opacity",this._storedOpacity);if(this._storedZIndex)this.helper.css("zIndex",this._storedZIndex=="auto"?"":this._storedZIndex);this.dragging=false;if(this.cancelHelperRemoval){if(!b){this._trigger("beforeStop",a,this._uiHash());for(e=0;e").addClass("ui-autocomplete").appendTo(e(this.options.appendTo||"body",b)[0]).mousedown(function(c){var d=a.menu.element[0]; -c.target===d&&setTimeout(function(){e(document).one("mousedown",function(f){f.target!==a.element[0]&&f.target!==d&&!e.ui.contains(d,f.target)&&a.close()})},1);setTimeout(function(){clearTimeout(a.closing)},13)}).menu({focus:function(c,d){d=d.item.data("item.autocomplete");false!==a._trigger("focus",null,{item:d})&&/^key/.test(c.originalEvent.type)&&a.element.val(d.value)},selected:function(c,d){d=d.item.data("item.autocomplete");var f=a.previous;if(a.element[0]!==b.activeElement){a.element.focus(); -a.previous=f}if(false!==a._trigger("select",c,{item:d})){a.term=d.value;a.element.val(d.value)}a.close(c);a.selectedItem=d},blur:function(){a.menu.element.is(":visible")&&a.element.val()!==a.term&&a.element.val(a.term)}}).zIndex(this.element.zIndex()+1).css({top:0,left:0}).hide().data("menu");e.fn.bgiframe&&this.menu.element.bgiframe()},destroy:function(){this.element.removeClass("ui-autocomplete-input").removeAttr("autocomplete").removeAttr("role").removeAttr("aria-autocomplete").removeAttr("aria-haspopup"); -this.menu.element.remove();e.Widget.prototype.destroy.call(this)},_setOption:function(a,b){e.Widget.prototype._setOption.apply(this,arguments);a==="source"&&this._initSource();if(a==="appendTo")this.menu.element.appendTo(e(b||"body",this.element[0].ownerDocument)[0])},_initSource:function(){var a=this,b,c;if(e.isArray(this.options.source)){b=this.options.source;this.source=function(d,f){f(e.ui.autocomplete.filter(b,d.term))}}else if(typeof this.options.source==="string"){c=this.options.source;this.source= -function(d,f){a.xhr&&a.xhr.abort();a.xhr=e.getJSON(c,d,function(g,i,h){h===a.xhr&&f(g);a.xhr=null})}}else this.source=this.options.source},search:function(a,b){a=a!=null?a:this.element.val();this.term=this.element.val();if(a.length").data("item.autocomplete",b).append(e("
    ").text(b.label)).appendTo(a)},_move:function(a,b){if(this.menu.element.is(":visible"))if(this.menu.first()&&/^previous/.test(a)||this.menu.last()&&/^next/.test(a)){this.element.val(this.term);this.menu.deactivate()}else this.menu[a](b);else this.search(null,b)},widget:function(){return this.menu.element}});e.extend(e.ui.autocomplete,{escapeRegex:function(a){return a.replace(/[-[\]{}()*+?.,\\^$|#\s]/g,"\\$&")}, -filter:function(a,b){var c=new RegExp(e.ui.autocomplete.escapeRegex(b),"i");return e.grep(a,function(d){return c.test(d.label||d.value||d)})}})})(jQuery); -(function(e){e.widget("ui.menu",{_create:function(){var a=this;this.element.addClass("ui-menu ui-widget ui-widget-content ui-corner-all").attr({role:"listbox","aria-activedescendant":"ui-active-menuitem"}).click(function(b){if(e(b.target).closest(".ui-menu-item a").length){b.preventDefault();a.select(b)}});this.refresh()},refresh:function(){var a=this;this.element.children("li:not(.ui-menu-item):has(a)").addClass("ui-menu-item").attr("role","menuitem").children("a").addClass("ui-corner-all").attr("tabindex", --1).mouseenter(function(b){a.activate(b,e(this).parent())}).mouseleave(function(){a.deactivate()})},activate:function(a,b){this.deactivate();if(this.hasScroll()){var c=b.offset().top-this.element.offset().top,d=this.element.attr("scrollTop"),f=this.element.height();if(c<0)this.element.attr("scrollTop",d+c);else c>=f&&this.element.attr("scrollTop",d+c-f+b.height())}this.active=b.eq(0).children("a").addClass("ui-state-hover").attr("id","ui-active-menuitem").end();this._trigger("focus",a,{item:b})}, -deactivate:function(){if(this.active){this.active.children("a").removeClass("ui-state-hover").removeAttr("id");this._trigger("blur");this.active=null}},next:function(a){this.move("next",".ui-menu-item:first",a)},previous:function(a){this.move("prev",".ui-menu-item:last",a)},first:function(){return this.active&&!this.active.prevAll(".ui-menu-item").length},last:function(){return this.active&&!this.active.nextAll(".ui-menu-item").length},move:function(a,b,c){if(this.active){a=this.active[a+"All"](".ui-menu-item").eq(0); -a.length?this.activate(c,a):this.activate(c,this.element.children(b))}else this.activate(c,this.element.children(b))},nextPage:function(a){if(this.hasScroll())if(!this.active||this.last())this.activate(a,this.element.children(":first"));else{var b=this.active.offset().top,c=this.element.height(),d=this.element.children("li").filter(function(){var f=e(this).offset().top-b-c+e(this).height();return f<10&&f>-10});d.length||(d=this.element.children(":last"));this.activate(a,d)}else this.activate(a,this.element.children(!this.active|| -this.last()?":first":":last"))},previousPage:function(a){if(this.hasScroll())if(!this.active||this.first())this.activate(a,this.element.children(":last"));else{var b=this.active.offset().top,c=this.element.height();result=this.element.children("li").filter(function(){var d=e(this).offset().top-b+c-e(this).height();return d<10&&d>-10});result.length||(result=this.element.children(":first"));this.activate(a,result)}else this.activate(a,this.element.children(!this.active||this.first()?":last":":first"))}, -hasScroll:function(){return this.element.height()").addClass("ui-button-text").html(this.options.label).appendTo(b.empty()).text(),d=this.options.icons,e=d.primary&&d.secondary;if(d.primary||d.secondary){b.addClass("ui-button-text-icon"+(e?"s":d.primary?"-primary":"-secondary"));d.primary&&b.prepend("");d.secondary&&b.append("");if(!this.options.text){b.addClass(e?"ui-button-icons-only":"ui-button-icon-only").removeClass("ui-button-text-icons ui-button-text-icon-primary ui-button-text-icon-secondary"); this.hasTitle||b.attr("title",c)}}else b.addClass("ui-button-text-only")}}});a.widget("ui.buttonset",{_create:function(){this.element.addClass("ui-buttonset");this._init()},_init:function(){this.refresh()},_setOption:function(b,c){b==="disabled"&&this.buttons.button("option",b,c);a.Widget.prototype._setOption.apply(this,arguments)},refresh:function(){this.buttons=this.element.find(":button, :submit, :reset, :checkbox, :radio, a, :data(button)").filter(":ui-button").button("refresh").end().not(":ui-button").button().end().map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-all ui-corner-left ui-corner-right").filter(":visible").filter(":first").addClass("ui-corner-left").end().filter(":last").addClass("ui-corner-right").end().end().end()}, destroy:function(){this.element.removeClass("ui-buttonset");this.buttons.map(function(){return a(this).button("widget")[0]}).removeClass("ui-corner-left ui-corner-right").end().button("destroy");a.Widget.prototype.destroy.call(this)}})})(jQuery); -;/* - * jQuery UI Dialog 1.8.5 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Dialog - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - * jquery.ui.button.js - * jquery.ui.draggable.js - * jquery.ui.mouse.js - * jquery.ui.position.js - * jquery.ui.resizable.js - */ -(function(c,j){c.widget("ui.dialog",{options:{autoOpen:true,buttons:{},closeOnEscape:true,closeText:"close",dialogClass:"",draggable:true,hide:null,height:"auto",maxHeight:false,maxWidth:false,minHeight:150,minWidth:150,modal:false,position:{my:"center",at:"center",of:window,collision:"fit",using:function(a){var b=c(this).css(a).offset().top;b<0&&c(this).css("top",a.top-b)}},resizable:true,show:null,stack:true,title:"",width:300,zIndex:1E3},_create:function(){this.originalTitle=this.element.attr("title"); -if(typeof this.originalTitle!=="string")this.originalTitle="";this.options.title=this.options.title||this.originalTitle;var a=this,b=a.options,d=b.title||" ",f=c.ui.dialog.getTitleId(a.element),g=(a.uiDialog=c("
    ")).appendTo(document.body).hide().addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b.dialogClass).css({zIndex:b.zIndex}).attr("tabIndex",-1).css("outline",0).keydown(function(i){if(b.closeOnEscape&&i.keyCode&&i.keyCode===c.ui.keyCode.ESCAPE){a.close(i);i.preventDefault()}}).attr({role:"dialog", -"aria-labelledby":f}).mousedown(function(i){a.moveToTop(false,i)});a.element.show().removeAttr("title").addClass("ui-dialog-content ui-widget-content").appendTo(g);var e=(a.uiDialogTitlebar=c("
    ")).addClass("ui-dialog-titlebar ui-widget-header ui-corner-all ui-helper-clearfix").prependTo(g),h=c('').addClass("ui-dialog-titlebar-close ui-corner-all").attr("role","button").hover(function(){h.addClass("ui-state-hover")},function(){h.removeClass("ui-state-hover")}).focus(function(){h.addClass("ui-state-focus")}).blur(function(){h.removeClass("ui-state-focus")}).click(function(i){a.close(i); -return false}).appendTo(e);(a.uiDialogTitlebarCloseText=c("")).addClass("ui-icon ui-icon-closethick").text(b.closeText).appendTo(h);c("").addClass("ui-dialog-title").attr("id",f).html(d).prependTo(e);if(c.isFunction(b.beforeclose)&&!c.isFunction(b.beforeClose))b.beforeClose=b.beforeclose;e.find("*").add(e).disableSelection();b.draggable&&c.fn.draggable&&a._makeDraggable();b.resizable&&c.fn.resizable&&a._makeResizable();a._createButtons(b.buttons);a._isOpen=false;c.fn.bgiframe&& -g.bgiframe()},_init:function(){this.options.autoOpen&&this.open()},destroy:function(){var a=this;a.overlay&&a.overlay.destroy();a.uiDialog.hide();a.element.unbind(".dialog").removeData("dialog").removeClass("ui-dialog-content ui-widget-content").hide().appendTo("body");a.uiDialog.remove();a.originalTitle&&a.element.attr("title",a.originalTitle);return a},widget:function(){return this.uiDialog},close:function(a){var b=this,d;if(false!==b._trigger("beforeClose",a)){b.overlay&&b.overlay.destroy();b.uiDialog.unbind("keypress.ui-dialog"); -b._isOpen=false;if(b.options.hide)b.uiDialog.hide(b.options.hide,function(){b._trigger("close",a)});else{b.uiDialog.hide();b._trigger("close",a)}c.ui.dialog.overlay.resize();if(b.options.modal){d=0;c(".ui-dialog").each(function(){if(this!==b.uiDialog[0])d=Math.max(d,c(this).css("z-index"))});c.ui.dialog.maxZ=d}return b}},isOpen:function(){return this._isOpen},moveToTop:function(a,b){var d=this,f=d.options;if(f.modal&&!a||!f.stack&&!f.modal)return d._trigger("focus",b);if(f.zIndex>c.ui.dialog.maxZ)c.ui.dialog.maxZ= -f.zIndex;if(d.overlay){c.ui.dialog.maxZ+=1;d.overlay.$el.css("z-index",c.ui.dialog.overlay.maxZ=c.ui.dialog.maxZ)}a={scrollTop:d.element.attr("scrollTop"),scrollLeft:d.element.attr("scrollLeft")};c.ui.dialog.maxZ+=1;d.uiDialog.css("z-index",c.ui.dialog.maxZ);d.element.attr(a);d._trigger("focus",b);return d},open:function(){if(!this._isOpen){var a=this,b=a.options,d=a.uiDialog;a.overlay=b.modal?new c.ui.dialog.overlay(a):null;d.next().length&&d.appendTo("body");a._size();a._position(b.position);d.show(b.show); -a.moveToTop(true);b.modal&&d.bind("keypress.ui-dialog",function(f){if(f.keyCode===c.ui.keyCode.TAB){var g=c(":tabbable",this),e=g.filter(":first");g=g.filter(":last");if(f.target===g[0]&&!f.shiftKey){e.focus(1);return false}else if(f.target===e[0]&&f.shiftKey){g.focus(1);return false}}});c(a.element.find(":tabbable").get().concat(d.find(".ui-dialog-buttonpane :tabbable").get().concat(d.get()))).eq(0).focus();a._isOpen=true;a._trigger("open");return a}},_createButtons:function(a){var b=this,d=false, -f=c("
    ").addClass("ui-dialog-buttonpane ui-widget-content ui-helper-clearfix"),g=c("
    ").addClass("ui-dialog-buttonset").appendTo(f);b.uiDialog.find(".ui-dialog-buttonpane").remove();typeof a==="object"&&a!==null&&c.each(a,function(){return!(d=true)});if(d){c.each(a,function(e,h){h=c.isFunction(h)?{click:h,text:e}:h;e=c("",h).unbind("click").click(function(){h.click.apply(b.element[0],arguments)}).appendTo(g);c.fn.button&&e.button()});f.appendTo(b.uiDialog)}},_makeDraggable:function(){function a(e){return{position:e.position, -offset:e.offset}}var b=this,d=b.options,f=c(document),g;b.uiDialog.draggable({cancel:".ui-dialog-content, .ui-dialog-titlebar-close",handle:".ui-dialog-titlebar",containment:"document",start:function(e,h){g=d.height==="auto"?"auto":c(this).height();c(this).height(c(this).height()).addClass("ui-dialog-dragging");b._trigger("dragStart",e,a(h))},drag:function(e,h){b._trigger("drag",e,a(h))},stop:function(e,h){d.position=[h.position.left-f.scrollLeft(),h.position.top-f.scrollTop()];c(this).removeClass("ui-dialog-dragging").height(g); -b._trigger("dragStop",e,a(h));c.ui.dialog.overlay.resize()}})},_makeResizable:function(a){function b(e){return{originalPosition:e.originalPosition,originalSize:e.originalSize,position:e.position,size:e.size}}a=a===j?this.options.resizable:a;var d=this,f=d.options,g=d.uiDialog.css("position");a=typeof a==="string"?a:"n,e,s,w,se,sw,ne,nw";d.uiDialog.resizable({cancel:".ui-dialog-content",containment:"document",alsoResize:d.element,maxWidth:f.maxWidth,maxHeight:f.maxHeight,minWidth:f.minWidth,minHeight:d._minHeight(), -handles:a,start:function(e,h){c(this).addClass("ui-dialog-resizing");d._trigger("resizeStart",e,b(h))},resize:function(e,h){d._trigger("resize",e,b(h))},stop:function(e,h){c(this).removeClass("ui-dialog-resizing");f.height=c(this).height();f.width=c(this).width();d._trigger("resizeStop",e,b(h));c.ui.dialog.overlay.resize()}}).css("position",g).find(".ui-resizable-se").addClass("ui-icon ui-icon-grip-diagonal-se")},_minHeight:function(){var a=this.options;return a.height==="auto"?a.minHeight:Math.min(a.minHeight, -a.height)},_position:function(a){var b=[],d=[0,0],f;if(a){if(typeof a==="string"||typeof a==="object"&&"0"in a){b=a.split?a.split(" "):[a[0],a[1]];if(b.length===1)b[1]=b[0];c.each(["left","top"],function(g,e){if(+b[g]===b[g]){d[g]=b[g];b[g]=e}});a={my:b.join(" "),at:b.join(" "),offset:d.join(" ")}}a=c.extend({},c.ui.dialog.prototype.options.position,a)}else a=c.ui.dialog.prototype.options.position;(f=this.uiDialog.is(":visible"))||this.uiDialog.show();this.uiDialog.css({top:0,left:0}).position(a); -f||this.uiDialog.hide()},_setOption:function(a,b){var d=this,f=d.uiDialog,g=f.is(":data(resizable)"),e=false;switch(a){case "beforeclose":a="beforeClose";break;case "buttons":d._createButtons(b);e=true;break;case "closeText":d.uiDialogTitlebarCloseText.text(""+b);break;case "dialogClass":f.removeClass(d.options.dialogClass).addClass("ui-dialog ui-widget ui-widget-content ui-corner-all "+b);break;case "disabled":b?f.addClass("ui-dialog-disabled"):f.removeClass("ui-dialog-disabled");break;case "draggable":b? -d._makeDraggable():f.draggable("destroy");break;case "height":e=true;break;case "maxHeight":g&&f.resizable("option","maxHeight",b);e=true;break;case "maxWidth":g&&f.resizable("option","maxWidth",b);e=true;break;case "minHeight":g&&f.resizable("option","minHeight",b);e=true;break;case "minWidth":g&&f.resizable("option","minWidth",b);e=true;break;case "position":d._position(b);break;case "resizable":g&&!b&&f.resizable("destroy");g&&typeof b==="string"&&f.resizable("option","handles",b);!g&&b!==false&& -d._makeResizable(b);break;case "title":c(".ui-dialog-title",d.uiDialogTitlebar).html(""+(b||" "));break;case "width":e=true;break}c.Widget.prototype._setOption.apply(d,arguments);e&&d._size()},_size:function(){var a=this.options,b;this.element.css({width:"auto",minHeight:0,height:0});if(a.minWidth>a.width)a.width=a.minWidth;b=this.uiDialog.css({height:"auto",width:a.width}).height();this.element.css(a.height==="auto"?{minHeight:Math.max(a.minHeight-b,0),height:c.support.minHeight?"auto":Math.max(a.minHeight- -b,0)}:{minHeight:0,height:Math.max(a.height-b,0)}).show();this.uiDialog.is(":data(resizable)")&&this.uiDialog.resizable("option","minHeight",this._minHeight())}});c.extend(c.ui.dialog,{version:"1.8.5",uuid:0,maxZ:0,getTitleId:function(a){a=a.attr("id");if(!a){this.uuid+=1;a=this.uuid}return"ui-dialog-title-"+a},overlay:function(a){this.$el=c.ui.dialog.overlay.create(a)}});c.extend(c.ui.dialog.overlay,{instances:[],oldInstances:[],maxZ:0,events:c.map("focus,mousedown,mouseup,keydown,keypress,click".split(","), -function(a){return a+".dialog-overlay"}).join(" "),create:function(a){if(this.instances.length===0){setTimeout(function(){c.ui.dialog.overlay.instances.length&&c(document).bind(c.ui.dialog.overlay.events,function(d){if(c(d.target).zIndex()").addClass("ui-widget-overlay")).appendTo(document.body).css({width:this.width(),height:this.height()});c.fn.bgiframe&&b.bgiframe();this.instances.push(b);return b},destroy:function(a){this.oldInstances.push(this.instances.splice(c.inArray(a,this.instances),1)[0]);this.instances.length===0&&c([document,window]).unbind(".dialog-overlay");a.remove();var b=0;c.each(this.instances,function(){b=Math.max(b,this.css("z-index"))});this.maxZ=b},height:function(){var a, -b;if(c.browser.msie&&c.browser.version<7){a=Math.max(document.documentElement.scrollHeight,document.body.scrollHeight);b=Math.max(document.documentElement.offsetHeight,document.body.offsetHeight);return a");if(!b.values)b.values=[this._valueMin(),this._valueMin()];if(b.values.length&&b.values.length!==2)b.values=[b.values[0],b.values[0]]}else this.range=d("
    ");this.range.appendTo(this.element).addClass("ui-slider-range");if(b.range==="min"||b.range==="max")this.range.addClass("ui-slider-range-"+b.range);this.range.addClass("ui-widget-header")}d(".ui-slider-handle",this.element).length===0&&d("").appendTo(this.element).addClass("ui-slider-handle"); -if(b.values&&b.values.length)for(;d(".ui-slider-handle",this.element).length").appendTo(this.element).addClass("ui-slider-handle");this.handles=d(".ui-slider-handle",this.element).addClass("ui-state-default ui-corner-all");this.handle=this.handles.eq(0);this.handles.add(this.range).filter("a").click(function(c){c.preventDefault()}).hover(function(){b.disabled||d(this).addClass("ui-state-hover")},function(){d(this).removeClass("ui-state-hover")}).focus(function(){if(b.disabled)d(this).blur(); -else{d(".ui-slider .ui-state-focus").removeClass("ui-state-focus");d(this).addClass("ui-state-focus")}}).blur(function(){d(this).removeClass("ui-state-focus")});this.handles.each(function(c){d(this).data("index.ui-slider-handle",c)});this.handles.keydown(function(c){var e=true,f=d(this).data("index.ui-slider-handle"),h,g,i;if(!a.options.disabled){switch(c.keyCode){case d.ui.keyCode.HOME:case d.ui.keyCode.END:case d.ui.keyCode.PAGE_UP:case d.ui.keyCode.PAGE_DOWN:case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:e= -false;if(!a._keySliding){a._keySliding=true;d(this).addClass("ui-state-active");h=a._start(c,f);if(h===false)return}break}i=a.options.step;h=a.options.values&&a.options.values.length?(g=a.values(f)):(g=a.value());switch(c.keyCode){case d.ui.keyCode.HOME:g=a._valueMin();break;case d.ui.keyCode.END:g=a._valueMax();break;case d.ui.keyCode.PAGE_UP:g=a._trimAlignValue(h+(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.PAGE_DOWN:g=a._trimAlignValue(h-(a._valueMax()-a._valueMin())/5);break;case d.ui.keyCode.UP:case d.ui.keyCode.RIGHT:if(h=== -a._valueMax())return;g=a._trimAlignValue(h+i);break;case d.ui.keyCode.DOWN:case d.ui.keyCode.LEFT:if(h===a._valueMin())return;g=a._trimAlignValue(h-i);break}a._slide(c,f,g);return e}}).keyup(function(c){var e=d(this).data("index.ui-slider-handle");if(a._keySliding){a._keySliding=false;a._stop(c,e);a._change(c,e);d(this).removeClass("ui-state-active")}});this._refreshValue();this._animateOff=false},destroy:function(){this.handles.remove();this.range.remove();this.element.removeClass("ui-slider ui-slider-horizontal ui-slider-vertical ui-slider-disabled ui-widget ui-widget-content ui-corner-all").removeData("slider").unbind(".slider"); -this._mouseDestroy();return this},_mouseCapture:function(a){var b=this.options,c,e,f,h,g;if(b.disabled)return false;this.elementSize={width:this.element.outerWidth(),height:this.element.outerHeight()};this.elementOffset=this.element.offset();c=this._normValueFromMouse({x:a.pageX,y:a.pageY});e=this._valueMax()-this._valueMin()+1;h=this;this.handles.each(function(i){var j=Math.abs(c-h.values(i));if(e>j){e=j;f=d(this);g=i}});if(b.range===true&&this.values(1)===b.min){g+=1;f=d(this.handles[g])}if(this._start(a, -g)===false)return false;this._mouseSliding=true;h._handleIndex=g;f.addClass("ui-state-active").focus();b=f.offset();this._clickOffset=!d(a.target).parents().andSelf().is(".ui-slider-handle")?{left:0,top:0}:{left:a.pageX-b.left-f.width()/2,top:a.pageY-b.top-f.height()/2-(parseInt(f.css("borderTopWidth"),10)||0)-(parseInt(f.css("borderBottomWidth"),10)||0)+(parseInt(f.css("marginTop"),10)||0)};this._slide(a,g,c);return this._animateOff=true},_mouseStart:function(){return true},_mouseDrag:function(a){var b= -this._normValueFromMouse({x:a.pageX,y:a.pageY});this._slide(a,this._handleIndex,b);return false},_mouseStop:function(a){this.handles.removeClass("ui-state-active");this._mouseSliding=false;this._stop(a,this._handleIndex);this._change(a,this._handleIndex);this._clickOffset=this._handleIndex=null;return this._animateOff=false},_detectOrientation:function(){this.orientation=this.options.orientation==="vertical"?"vertical":"horizontal"},_normValueFromMouse:function(a){var b;if(this.orientation==="horizontal"){b= -this.elementSize.width;a=a.x-this.elementOffset.left-(this._clickOffset?this._clickOffset.left:0)}else{b=this.elementSize.height;a=a.y-this.elementOffset.top-(this._clickOffset?this._clickOffset.top:0)}b=a/b;if(b>1)b=1;if(b<0)b=0;if(this.orientation==="vertical")b=1-b;a=this._valueMax()-this._valueMin();return this._trimAlignValue(this._valueMin()+b*a)},_start:function(a,b){var c={handle:this.handles[b],value:this.value()};if(this.options.values&&this.options.values.length){c.value=this.values(b); -c.values=this.values()}return this._trigger("start",a,c)},_slide:function(a,b,c){var e;if(this.options.values&&this.options.values.length){e=this.values(b?0:1);if(this.options.values.length===2&&this.options.range===true&&(b===0&&c>e||b===1&&c1){this.options.values[a]=this._trimAlignValue(b);this._refreshValue();this._change(null,a)}if(arguments.length)if(d.isArray(arguments[0])){c=this.options.values;e=arguments[0];for(f=0;fthis._valueMax())return this._valueMax();var b=this.options.step>0?this.options.step:1,c=a%b;a=a-c;if(Math.abs(c)*2>=b)a+=c>0?b:-b;return parseFloat(a.toFixed(5))},_valueMin:function(){return this.options.min},_valueMax:function(){return this.options.max},_refreshValue:function(){var a= -this.options.range,b=this.options,c=this,e=!this._animateOff?b.animate:false,f,h={},g,i,j,l;if(this.options.values&&this.options.values.length)this.handles.each(function(k){f=(c.values(k)-c._valueMin())/(c._valueMax()-c._valueMin())*100;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";d(this).stop(1,1)[e?"animate":"css"](h,b.animate);if(c.options.range===true)if(c.orientation==="horizontal"){if(k===0)c.range.stop(1,1)[e?"animate":"css"]({left:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({width:f- -g+"%"},{queue:false,duration:b.animate})}else{if(k===0)c.range.stop(1,1)[e?"animate":"css"]({bottom:f+"%"},b.animate);if(k===1)c.range[e?"animate":"css"]({height:f-g+"%"},{queue:false,duration:b.animate})}g=f});else{i=this.value();j=this._valueMin();l=this._valueMax();f=l!==j?(i-j)/(l-j)*100:0;h[c.orientation==="horizontal"?"left":"bottom"]=f+"%";this.handle.stop(1,1)[e?"animate":"css"](h,b.animate);if(a==="min"&&this.orientation==="horizontal")this.range.stop(1,1)[e?"animate":"css"]({width:f+"%"}, -b.animate);if(a==="max"&&this.orientation==="horizontal")this.range[e?"animate":"css"]({width:100-f+"%"},{queue:false,duration:b.animate});if(a==="min"&&this.orientation==="vertical")this.range.stop(1,1)[e?"animate":"css"]({height:f+"%"},b.animate);if(a==="max"&&this.orientation==="vertical")this.range[e?"animate":"css"]({height:100-f+"%"},{queue:false,duration:b.animate})}}});d.extend(d.ui.slider,{version:"1.8.5"})})(jQuery); -;/* - * jQuery UI Tabs 1.8.5 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Tabs - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(d,p){function u(){return++v}function w(){return++x}var v=0,x=0;d.widget("ui.tabs",{options:{add:null,ajaxOptions:null,cache:false,cookie:null,collapsible:false,disable:null,disabled:[],enable:null,event:"click",fx:null,idPrefix:"ui-tabs-",load:null,panelTemplate:"
    ",remove:null,select:null,show:null,spinner:"Loading…",tabTemplate:"
  • #{label}
  • "},_create:function(){this._tabify(true)},_setOption:function(a,e){if(a=="selected")this.options.collapsible&& -e==this.options.selected||this.select(e);else{this.options[a]=e;this._tabify()}},_tabId:function(a){return a.title&&a.title.replace(/\s/g,"_").replace(/[^\w\u00c0-\uFFFF-]/g,"")||this.options.idPrefix+u()},_sanitizeSelector:function(a){return a.replace(/:/g,"\\:")},_cookie:function(){var a=this.cookie||(this.cookie=this.options.cookie.name||"ui-tabs-"+w());return d.cookie.apply(null,[a].concat(d.makeArray(arguments)))},_ui:function(a,e){return{tab:a,panel:e,index:this.anchors.index(a)}},_cleanup:function(){this.lis.filter(".ui-state-processing").removeClass("ui-state-processing").find("span:data(label.tabs)").each(function(){var a= -d(this);a.html(a.data("label.tabs")).removeData("label.tabs")})},_tabify:function(a){function e(g,f){g.css("display","");!d.support.opacity&&f.opacity&&g[0].style.removeAttribute("filter")}var b=this,c=this.options,h=/^#.+/;this.list=this.element.find("ol,ul").eq(0);this.lis=d(" > li:has(a[href])",this.list);this.anchors=this.lis.map(function(){return d("a",this)[0]});this.panels=d([]);this.anchors.each(function(g,f){var i=d(f).attr("href"),l=i.split("#")[0],q;if(l&&(l===location.toString().split("#")[0]|| -(q=d("base")[0])&&l===q.href)){i=f.hash;f.href=i}if(h.test(i))b.panels=b.panels.add(b._sanitizeSelector(i));else if(i&&i!=="#"){d.data(f,"href.tabs",i);d.data(f,"load.tabs",i.replace(/#.*$/,""));i=b._tabId(f);f.href="#"+i;f=d("#"+i);if(!f.length){f=d(c.panelTemplate).attr("id",i).addClass("ui-tabs-panel ui-widget-content ui-corner-bottom").insertAfter(b.panels[g-1]||b.list);f.data("destroy.tabs",true)}b.panels=b.panels.add(f)}else c.disabled.push(g)});if(a){this.element.addClass("ui-tabs ui-widget ui-widget-content ui-corner-all"); -this.list.addClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.lis.addClass("ui-state-default ui-corner-top");this.panels.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom");if(c.selected===p){location.hash&&this.anchors.each(function(g,f){if(f.hash==location.hash){c.selected=g;return false}});if(typeof c.selected!=="number"&&c.cookie)c.selected=parseInt(b._cookie(),10);if(typeof c.selected!=="number"&&this.lis.filter(".ui-tabs-selected").length)c.selected= -this.lis.index(this.lis.filter(".ui-tabs-selected"));c.selected=c.selected||(this.lis.length?0:-1)}else if(c.selected===null)c.selected=-1;c.selected=c.selected>=0&&this.anchors[c.selected]||c.selected<0?c.selected:0;c.disabled=d.unique(c.disabled.concat(d.map(this.lis.filter(".ui-state-disabled"),function(g){return b.lis.index(g)}))).sort();d.inArray(c.selected,c.disabled)!=-1&&c.disabled.splice(d.inArray(c.selected,c.disabled),1);this.panels.addClass("ui-tabs-hide");this.lis.removeClass("ui-tabs-selected ui-state-active"); -if(c.selected>=0&&this.anchors.length){this.panels.eq(c.selected).removeClass("ui-tabs-hide");this.lis.eq(c.selected).addClass("ui-tabs-selected ui-state-active");b.element.queue("tabs",function(){b._trigger("show",null,b._ui(b.anchors[c.selected],b.panels[c.selected]))});this.load(c.selected)}d(window).bind("unload",function(){b.lis.add(b.anchors).unbind(".tabs");b.lis=b.anchors=b.panels=null})}else c.selected=this.lis.index(this.lis.filter(".ui-tabs-selected"));this.element[c.collapsible?"addClass": -"removeClass"]("ui-tabs-collapsible");c.cookie&&this._cookie(c.selected,c.cookie);a=0;for(var j;j=this.lis[a];a++)d(j)[d.inArray(a,c.disabled)!=-1&&!d(j).hasClass("ui-tabs-selected")?"addClass":"removeClass"]("ui-state-disabled");c.cache===false&&this.anchors.removeData("cache.tabs");this.lis.add(this.anchors).unbind(".tabs");if(c.event!=="mouseover"){var k=function(g,f){f.is(":not(.ui-state-disabled)")&&f.addClass("ui-state-"+g)},n=function(g,f){f.removeClass("ui-state-"+g)};this.lis.bind("mouseover.tabs", -function(){k("hover",d(this))});this.lis.bind("mouseout.tabs",function(){n("hover",d(this))});this.anchors.bind("focus.tabs",function(){k("focus",d(this).closest("li"))});this.anchors.bind("blur.tabs",function(){n("focus",d(this).closest("li"))})}var m,o;if(c.fx)if(d.isArray(c.fx)){m=c.fx[0];o=c.fx[1]}else m=o=c.fx;var r=o?function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.hide().removeClass("ui-tabs-hide").animate(o,o.duration||"normal",function(){e(f,o);b._trigger("show", -null,b._ui(g,f[0]))})}:function(g,f){d(g).closest("li").addClass("ui-tabs-selected ui-state-active");f.removeClass("ui-tabs-hide");b._trigger("show",null,b._ui(g,f[0]))},s=m?function(g,f){f.animate(m,m.duration||"normal",function(){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");e(f,m);b.element.dequeue("tabs")})}:function(g,f){b.lis.removeClass("ui-tabs-selected ui-state-active");f.addClass("ui-tabs-hide");b.element.dequeue("tabs")};this.anchors.bind(c.event+".tabs", -function(){var g=this,f=d(g).closest("li"),i=b.panels.filter(":not(.ui-tabs-hide)"),l=d(b._sanitizeSelector(g.hash));if(f.hasClass("ui-tabs-selected")&&!c.collapsible||f.hasClass("ui-state-disabled")||f.hasClass("ui-state-processing")||b.panels.filter(":animated").length||b._trigger("select",null,b._ui(this,l[0]))===false){this.blur();return false}c.selected=b.anchors.index(this);b.abort();if(c.collapsible)if(f.hasClass("ui-tabs-selected")){c.selected=-1;c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs", -function(){s(g,i)}).dequeue("tabs");this.blur();return false}else if(!i.length){c.cookie&&b._cookie(c.selected,c.cookie);b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this));this.blur();return false}c.cookie&&b._cookie(c.selected,c.cookie);if(l.length){i.length&&b.element.queue("tabs",function(){s(g,i)});b.element.queue("tabs",function(){r(g,l)});b.load(b.anchors.index(this))}else throw"jQuery UI Tabs: Mismatching fragment identifier.";d.browser.msie&&this.blur()});this.anchors.bind("click.tabs", -function(){return false})},_getIndex:function(a){if(typeof a=="string")a=this.anchors.index(this.anchors.filter("[href$="+a+"]"));return a},destroy:function(){var a=this.options;this.abort();this.element.unbind(".tabs").removeClass("ui-tabs ui-widget ui-widget-content ui-corner-all ui-tabs-collapsible").removeData("tabs");this.list.removeClass("ui-tabs-nav ui-helper-reset ui-helper-clearfix ui-widget-header ui-corner-all");this.anchors.each(function(){var e=d.data(this,"href.tabs");if(e)this.href= -e;var b=d(this).unbind(".tabs");d.each(["href","load","cache"],function(c,h){b.removeData(h+".tabs")})});this.lis.unbind(".tabs").add(this.panels).each(function(){d.data(this,"destroy.tabs")?d(this).remove():d(this).removeClass("ui-state-default ui-corner-top ui-tabs-selected ui-state-active ui-state-hover ui-state-focus ui-state-disabled ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide")});a.cookie&&this._cookie(null,a.cookie);return this},add:function(a,e,b){if(b===p)b=this.anchors.length; -var c=this,h=this.options;e=d(h.tabTemplate.replace(/#\{href\}/g,a).replace(/#\{label\}/g,e));a=!a.indexOf("#")?a.replace("#",""):this._tabId(d("a",e)[0]);e.addClass("ui-state-default ui-corner-top").data("destroy.tabs",true);var j=d("#"+a);j.length||(j=d(h.panelTemplate).attr("id",a).data("destroy.tabs",true));j.addClass("ui-tabs-panel ui-widget-content ui-corner-bottom ui-tabs-hide");if(b>=this.lis.length){e.appendTo(this.list);j.appendTo(this.list[0].parentNode)}else{e.insertBefore(this.lis[b]); -j.insertBefore(this.panels[b])}h.disabled=d.map(h.disabled,function(k){return k>=b?++k:k});this._tabify();if(this.anchors.length==1){h.selected=0;e.addClass("ui-tabs-selected ui-state-active");j.removeClass("ui-tabs-hide");this.element.queue("tabs",function(){c._trigger("show",null,c._ui(c.anchors[0],c.panels[0]))});this.load(0)}this._trigger("add",null,this._ui(this.anchors[b],this.panels[b]));return this},remove:function(a){a=this._getIndex(a);var e=this.options,b=this.lis.eq(a).remove(),c=this.panels.eq(a).remove(); -if(b.hasClass("ui-tabs-selected")&&this.anchors.length>1)this.select(a+(a+1=a?--h:h});this._tabify();this._trigger("remove",null,this._ui(b.find("a")[0],c[0]));return this},enable:function(a){a=this._getIndex(a);var e=this.options;if(d.inArray(a,e.disabled)!=-1){this.lis.eq(a).removeClass("ui-state-disabled");e.disabled=d.grep(e.disabled,function(b){return b!=a});this._trigger("enable",null, -this._ui(this.anchors[a],this.panels[a]));return this}},disable:function(a){a=this._getIndex(a);var e=this.options;if(a!=e.selected){this.lis.eq(a).addClass("ui-state-disabled");e.disabled.push(a);e.disabled.sort();this._trigger("disable",null,this._ui(this.anchors[a],this.panels[a]))}return this},select:function(a){a=this._getIndex(a);if(a==-1)if(this.options.collapsible&&this.options.selected!=-1)a=this.options.selected;else return this;this.anchors.eq(a).trigger(this.options.event+".tabs");return this}, -load:function(a){a=this._getIndex(a);var e=this,b=this.options,c=this.anchors.eq(a)[0],h=d.data(c,"load.tabs");this.abort();if(!h||this.element.queue("tabs").length!==0&&d.data(c,"cache.tabs"))this.element.dequeue("tabs");else{this.lis.eq(a).addClass("ui-state-processing");if(b.spinner){var j=d("span",c);j.data("label.tabs",j.html()).html(b.spinner)}this.xhr=d.ajax(d.extend({},b.ajaxOptions,{url:h,success:function(k,n){d(e._sanitizeSelector(c.hash)).html(k);e._cleanup();b.cache&&d.data(c,"cache.tabs", -true);e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.success(k,n)}catch(m){}},error:function(k,n){e._cleanup();e._trigger("load",null,e._ui(e.anchors[a],e.panels[a]));try{b.ajaxOptions.error(k,n,a,c)}catch(m){}}}));e.element.dequeue("tabs");return this}},abort:function(){this.element.queue([]);this.panels.stop(false,true);this.element.queue("tabs",this.element.queue("tabs").splice(-2,2));if(this.xhr){this.xhr.abort();delete this.xhr}this._cleanup();return this},url:function(a, -e){this.anchors.eq(a).removeData("cache.tabs").data("load.tabs",e);return this},length:function(){return this.anchors.length}});d.extend(d.ui.tabs,{version:"1.8.5"});d.extend(d.ui.tabs.prototype,{rotation:null,rotate:function(a,e){var b=this,c=this.options,h=b._rotate||(b._rotate=function(j){clearTimeout(b.rotation);b.rotation=setTimeout(function(){var k=c.selected;b.select(++k')}function E(a,b){d.extend(a, -b);for(var c in b)if(b[c]==null||b[c]==G)a[c]=b[c];return a}d.extend(d.ui,{datepicker:{version:"1.8.5"}});var y=(new Date).getTime();d.extend(L.prototype,{markerClassName:"hasDatepicker",log:function(){this.debug&&console.log.apply("",arguments)},_widgetDatepicker:function(){return this.dpDiv},setDefaults:function(a){E(this._defaults,a||{});return this},_attachDatepicker:function(a,b){var c=null;for(var e in this._defaults){var f=a.getAttribute("date:"+e);if(f){c=c||{};try{c[e]=eval(f)}catch(h){c[e]= -f}}}e=a.nodeName.toLowerCase();f=e=="div"||e=="span";if(!a.id){this.uuid+=1;a.id="dp"+this.uuid}var i=this._newInst(d(a),f);i.settings=d.extend({},b||{},c||{});if(e=="input")this._connectDatepicker(a,i);else f&&this._inlineDatepicker(a,i)},_newInst:function(a,b){return{id:a[0].id.replace(/([^A-Za-z0-9_])/g,"\\\\$1"),input:a,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:b,dpDiv:!b?this.dpDiv:d('
    ')}}, -_connectDatepicker:function(a,b){var c=d(a);b.append=d([]);b.trigger=d([]);if(!c.hasClass(this.markerClassName)){this._attachments(c,b);c.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).keyup(this._doKeyUp).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});this._autoSize(b);d.data(a,"datepicker",b)}},_attachments:function(a,b){var c=this._get(b,"appendText"),e=this._get(b,"isRTL");b.append&& -b.append.remove();if(c){b.append=d(''+c+"");a[e?"before":"after"](b.append)}a.unbind("focus",this._showDatepicker);b.trigger&&b.trigger.remove();c=this._get(b,"showOn");if(c=="focus"||c=="both")a.focus(this._showDatepicker);if(c=="button"||c=="both"){c=this._get(b,"buttonText");var f=this._get(b,"buttonImage");b.trigger=d(this._get(b,"buttonImageOnly")?d("").addClass(this._triggerClass).attr({src:f,alt:c,title:c}):d('').addClass(this._triggerClass).html(f== -""?c:d("").attr({src:f,alt:c,title:c})));a[e?"before":"after"](b.trigger);b.trigger.click(function(){d.datepicker._datepickerShowing&&d.datepicker._lastInput==a[0]?d.datepicker._hideDatepicker():d.datepicker._showDatepicker(a[0]);return false})}},_autoSize:function(a){if(this._get(a,"autoSize")&&!a.inline){var b=new Date(2009,11,20),c=this._get(a,"dateFormat");if(c.match(/[DM]/)){var e=function(f){for(var h=0,i=0,g=0;gh){h=f[g].length;i=g}return i};b.setMonth(e(this._get(a, -c.match(/MM/)?"monthNames":"monthNamesShort")));b.setDate(e(this._get(a,c.match(/DD/)?"dayNames":"dayNamesShort"))+20-b.getDay())}a.input.attr("size",this._formatDate(a,b).length)}},_inlineDatepicker:function(a,b){var c=d(a);if(!c.hasClass(this.markerClassName)){c.addClass(this.markerClassName).append(b.dpDiv).bind("setData.datepicker",function(e,f,h){b.settings[f]=h}).bind("getData.datepicker",function(e,f){return this._get(b,f)});d.data(a,"datepicker",b);this._setDate(b,this._getDefaultDate(b), -true);this._updateDatepicker(b);this._updateAlternate(b)}},_dialogDatepicker:function(a,b,c,e,f){a=this._dialogInst;if(!a){this.uuid+=1;this._dialogInput=d('');this._dialogInput.keydown(this._doKeyDown);d("body").append(this._dialogInput);a=this._dialogInst=this._newInst(this._dialogInput,false);a.settings={};d.data(this._dialogInput[0],"datepicker",a)}E(a.settings,e||{});b=b&&b.constructor== -Date?this._formatDate(a,b):b;this._dialogInput.val(b);this._pos=f?f.length?f:[f.pageX,f.pageY]:null;if(!this._pos)this._pos=[document.documentElement.clientWidth/2-100+(document.documentElement.scrollLeft||document.body.scrollLeft),document.documentElement.clientHeight/2-150+(document.documentElement.scrollTop||document.body.scrollTop)];this._dialogInput.css("left",this._pos[0]+20+"px").css("top",this._pos[1]+"px");a.settings.onSelect=c;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]); -d.blockUI&&d.blockUI(this.dpDiv);d.data(this._dialogInput[0],"datepicker",a);return this},_destroyDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();d.removeData(a,"datepicker");if(e=="input"){c.append.remove();c.trigger.remove();b.removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress).unbind("keyup",this._doKeyUp)}else if(e=="div"||e=="span")b.removeClass(this.markerClassName).empty()}}, -_enableDatepicker:function(a){var b=d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=false;c.trigger.filter("button").each(function(){this.disabled=false}).end().filter("img").css({opacity:"1.0",cursor:""})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().removeClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f})}},_disableDatepicker:function(a){var b= -d(a),c=d.data(a,"datepicker");if(b.hasClass(this.markerClassName)){var e=a.nodeName.toLowerCase();if(e=="input"){a.disabled=true;c.trigger.filter("button").each(function(){this.disabled=true}).end().filter("img").css({opacity:"0.5",cursor:"default"})}else if(e=="div"||e=="span")b.children("."+this._inlineClass).children().addClass("ui-state-disabled");this._disabledInputs=d.map(this._disabledInputs,function(f){return f==a?null:f});this._disabledInputs[this._disabledInputs.length]=a}},_isDisabledDatepicker:function(a){if(!a)return false; -for(var b=0;b-1}},_doKeyUp:function(a){a=d.datepicker._getInst(a.target);if(a.input.val()!=a.lastVal)try{if(d.datepicker.parseDate(d.datepicker._get(a,"dateFormat"),a.input?a.input.val():null,d.datepicker._getFormatConfig(a))){d.datepicker._setDateFromField(a);d.datepicker._updateAlternate(a);d.datepicker._updateDatepicker(a)}}catch(b){d.datepicker.log(b)}return true},_showDatepicker:function(a){a=a.target|| -a;if(a.nodeName.toLowerCase()!="input")a=d("input",a.parentNode)[0];if(!(d.datepicker._isDisabledDatepicker(a)||d.datepicker._lastInput==a)){var b=d.datepicker._getInst(a);d.datepicker._curInst&&d.datepicker._curInst!=b&&d.datepicker._curInst.dpDiv.stop(true,true);var c=d.datepicker._get(b,"beforeShow");E(b.settings,c?c.apply(a,[a,b]):{});b.lastVal=null;d.datepicker._lastInput=a;d.datepicker._setDateFromField(b);if(d.datepicker._inDialog)a.value="";if(!d.datepicker._pos){d.datepicker._pos=d.datepicker._findPos(a); -d.datepicker._pos[1]+=a.offsetHeight}var e=false;d(a).parents().each(function(){e|=d(this).css("position")=="fixed";return!e});if(e&&d.browser.opera){d.datepicker._pos[0]-=document.documentElement.scrollLeft;d.datepicker._pos[1]-=document.documentElement.scrollTop}c={left:d.datepicker._pos[0],top:d.datepicker._pos[1]};d.datepicker._pos=null;b.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});d.datepicker._updateDatepicker(b);c=d.datepicker._checkOffset(b,c,e);b.dpDiv.css({position:d.datepicker._inDialog&& -d.blockUI?"static":e?"fixed":"absolute",display:"none",left:c.left+"px",top:c.top+"px"});if(!b.inline){c=d.datepicker._get(b,"showAnim");var f=d.datepicker._get(b,"duration"),h=function(){d.datepicker._datepickerShowing=true;var i=d.datepicker._getBorders(b.dpDiv);b.dpDiv.find("iframe.ui-datepicker-cover").css({left:-i[0],top:-i[1],width:b.dpDiv.outerWidth(),height:b.dpDiv.outerHeight()})};b.dpDiv.zIndex(d(a).zIndex()+1);d.effects&&d.effects[c]?b.dpDiv.show(c,d.datepicker._get(b,"showOptions"),f, -h):b.dpDiv[c||"show"](c?f:null,h);if(!c||!f)h();b.input.is(":visible")&&!b.input.is(":disabled")&&b.input.focus();d.datepicker._curInst=b}}},_updateDatepicker:function(a){var b=this,c=d.datepicker._getBorders(a.dpDiv);a.dpDiv.empty().append(this._generateHTML(a)).find("iframe.ui-datepicker-cover").css({left:-c[0],top:-c[1],width:a.dpDiv.outerWidth(),height:a.dpDiv.outerHeight()}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){d(this).removeClass("ui-state-hover"); -this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).removeClass("ui-datepicker-prev-hover");this.className.indexOf("ui-datepicker-next")!=-1&&d(this).removeClass("ui-datepicker-next-hover")}).bind("mouseover",function(){if(!b._isDisabledDatepicker(a.inline?a.dpDiv.parent()[0]:a.input[0])){d(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");d(this).addClass("ui-state-hover");this.className.indexOf("ui-datepicker-prev")!=-1&&d(this).addClass("ui-datepicker-prev-hover"); -this.className.indexOf("ui-datepicker-next")!=-1&&d(this).addClass("ui-datepicker-next-hover")}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();c=this._getNumberOfMonths(a);var e=c[1];e>1?a.dpDiv.addClass("ui-datepicker-multi-"+e).css("width",17*e+"em"):a.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("");a.dpDiv[(c[0]!=1||c[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");a.dpDiv[(this._get(a,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl"); -a==d.datepicker._curInst&&d.datepicker._datepickerShowing&&a.input&&a.input.is(":visible")&&!a.input.is(":disabled")&&a.input.focus()},_getBorders:function(a){var b=function(c){return{thin:1,medium:2,thick:3}[c]||c};return[parseFloat(b(a.css("border-left-width"))),parseFloat(b(a.css("border-top-width")))]},_checkOffset:function(a,b,c){var e=a.dpDiv.outerWidth(),f=a.dpDiv.outerHeight(),h=a.input?a.input.outerWidth():0,i=a.input?a.input.outerHeight():0,g=document.documentElement.clientWidth+d(document).scrollLeft(), -k=document.documentElement.clientHeight+d(document).scrollTop();b.left-=this._get(a,"isRTL")?e-h:0;b.left-=c&&b.left==a.input.offset().left?d(document).scrollLeft():0;b.top-=c&&b.top==a.input.offset().top+i?d(document).scrollTop():0;b.left-=Math.min(b.left,b.left+e>g&&g>e?Math.abs(b.left+e-g):0);b.top-=Math.min(b.top,b.top+f>k&&k>f?Math.abs(f+i):0);return b},_findPos:function(a){for(var b=this._get(this._getInst(a),"isRTL");a&&(a.type=="hidden"||a.nodeType!=1);)a=a[b?"previousSibling":"nextSibling"]; -a=d(a).offset();return[a.left,a.top]},_hideDatepicker:function(a){var b=this._curInst;if(!(!b||a&&b!=d.data(a,"datepicker")))if(this._datepickerShowing){a=this._get(b,"showAnim");var c=this._get(b,"duration"),e=function(){d.datepicker._tidyDialog(b);this._curInst=null};d.effects&&d.effects[a]?b.dpDiv.hide(a,d.datepicker._get(b,"showOptions"),c,e):b.dpDiv[a=="slideDown"?"slideUp":a=="fadeIn"?"fadeOut":"hide"](a?c:null,e);a||e();if(a=this._get(b,"onClose"))a.apply(b.input?b.input[0]:null,[b.input?b.input.val(): -"",b]);this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(d.blockUI){d.unblockUI();d("body").append(this.dpDiv)}}this._inDialog=false}},_tidyDialog:function(a){a.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(a){if(d.datepicker._curInst){a=d(a.target);a[0].id!=d.datepicker._mainDivId&&a.parents("#"+d.datepicker._mainDivId).length==0&&!a.hasClass(d.datepicker.markerClassName)&& -!a.hasClass(d.datepicker._triggerClass)&&d.datepicker._datepickerShowing&&!(d.datepicker._inDialog&&d.blockUI)&&d.datepicker._hideDatepicker()}},_adjustDate:function(a,b,c){a=d(a);var e=this._getInst(a[0]);if(!this._isDisabledDatepicker(a[0])){this._adjustInstDate(e,b+(c=="M"?this._get(e,"showCurrentAtPos"):0),c);this._updateDatepicker(e)}},_gotoToday:function(a){a=d(a);var b=this._getInst(a[0]);if(this._get(b,"gotoCurrent")&&b.currentDay){b.selectedDay=b.currentDay;b.drawMonth=b.selectedMonth=b.currentMonth; -b.drawYear=b.selectedYear=b.currentYear}else{var c=new Date;b.selectedDay=c.getDate();b.drawMonth=b.selectedMonth=c.getMonth();b.drawYear=b.selectedYear=c.getFullYear()}this._notifyChange(b);this._adjustDate(a)},_selectMonthYear:function(a,b,c){a=d(a);var e=this._getInst(a[0]);e._selectingMonthYear=false;e["selected"+(c=="M"?"Month":"Year")]=e["draw"+(c=="M"?"Month":"Year")]=parseInt(b.options[b.selectedIndex].value,10);this._notifyChange(e);this._adjustDate(a)},_clickMonthYear:function(a){var b= -this._getInst(d(a)[0]);b.input&&b._selectingMonthYear&&setTimeout(function(){b.input.focus()},0);b._selectingMonthYear=!b._selectingMonthYear},_selectDay:function(a,b,c,e){var f=d(a);if(!(d(e).hasClass(this._unselectableClass)||this._isDisabledDatepicker(f[0]))){f=this._getInst(f[0]);f.selectedDay=f.currentDay=d("a",e).html();f.selectedMonth=f.currentMonth=b;f.selectedYear=f.currentYear=c;this._selectDate(a,this._formatDate(f,f.currentDay,f.currentMonth,f.currentYear))}},_clearDate:function(a){a= -d(a);this._getInst(a[0]);this._selectDate(a,"")},_selectDate:function(a,b){a=this._getInst(d(a)[0]);b=b!=null?b:this._formatDate(a);a.input&&a.input.val(b);this._updateAlternate(a);var c=this._get(a,"onSelect");if(c)c.apply(a.input?a.input[0]:null,[b,a]);else a.input&&a.input.trigger("change");if(a.inline)this._updateDatepicker(a);else{this._hideDatepicker();this._lastInput=a.input[0];typeof a.input[0]!="object"&&a.input.focus();this._lastInput=null}},_updateAlternate:function(a){var b=this._get(a, -"altField");if(b){var c=this._get(a,"altFormat")||this._get(a,"dateFormat"),e=this._getDate(a),f=this.formatDate(c,e,this._getFormatConfig(a));d(b).each(function(){d(this).val(f)})}},noWeekends:function(a){a=a.getDay();return[a>0&&a<6,""]},iso8601Week:function(a){a=new Date(a.getTime());a.setDate(a.getDate()+4-(a.getDay()||7));var b=a.getTime();a.setMonth(0);a.setDate(1);return Math.floor(Math.round((b-a)/864E5)/7)+1},parseDate:function(a,b,c){if(a==null||b==null)throw"Invalid arguments";b=typeof b== -"object"?b.toString():b+"";if(b=="")return null;for(var e=(c?c.shortYearCutoff:null)||this._defaults.shortYearCutoff,f=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,h=(c?c.dayNames:null)||this._defaults.dayNames,i=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort,g=(c?c.monthNames:null)||this._defaults.monthNames,k=c=-1,l=-1,u=-1,j=false,o=function(p){(p=z+1 --1){k=1;l=u;do{e=this._getDaysInMonth(c,k-1);if(l<=e)break;k++;l-=e}while(1)}v=this._daylightSavingAdjust(new Date(c,k-1,l));if(v.getFullYear()!=c||v.getMonth()+1!=k||v.getDate()!=l)throw"Invalid date";return v},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TICKS:"!",TIMESTAMP:"@",W3C:"yy-mm-dd",_ticksTo1970:(718685+Math.floor(492.5)-Math.floor(19.7)+Math.floor(4.925))*24* -60*60*1E7,formatDate:function(a,b,c){if(!b)return"";var e=(c?c.dayNamesShort:null)||this._defaults.dayNamesShort,f=(c?c.dayNames:null)||this._defaults.dayNames,h=(c?c.monthNamesShort:null)||this._defaults.monthNamesShort;c=(c?c.monthNames:null)||this._defaults.monthNames;var i=function(o){(o=j+112?a.getHours()+2:0);return a},_setDate:function(a,b,c){var e=!b,f=a.selectedMonth,h=a.selectedYear;b=this._restrictMinMax(a,this._determineDate(a,b,new Date));a.selectedDay=a.currentDay=b.getDate();a.drawMonth=a.selectedMonth=a.currentMonth=b.getMonth();a.drawYear=a.selectedYear=a.currentYear=b.getFullYear();if((f!=a.selectedMonth||h!=a.selectedYear)&&!c)this._notifyChange(a);this._adjustInstDate(a);if(a.input)a.input.val(e? -"":this._formatDate(a))},_getDate:function(a){return!a.currentYear||a.input&&a.input.val()==""?null:this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay))},_generateHTML:function(a){var b=new Date;b=this._daylightSavingAdjust(new Date(b.getFullYear(),b.getMonth(),b.getDate()));var c=this._get(a,"isRTL"),e=this._get(a,"showButtonPanel"),f=this._get(a,"hideIfNoPrevNext"),h=this._get(a,"navigationAsDateFormat"),i=this._getNumberOfMonths(a),g=this._get(a,"showCurrentAtPos"),k= -this._get(a,"stepMonths"),l=i[0]!=1||i[1]!=1,u=this._daylightSavingAdjust(!a.currentDay?new Date(9999,9,9):new Date(a.currentYear,a.currentMonth,a.currentDay)),j=this._getMinMaxDate(a,"min"),o=this._getMinMaxDate(a,"max");g=a.drawMonth-g;var m=a.drawYear;if(g<0){g+=12;m--}if(o){var n=this._daylightSavingAdjust(new Date(o.getFullYear(),o.getMonth()-i[0]*i[1]+1,o.getDate()));for(n=j&&nn;){g--;if(g<0){g=11;m--}}}a.drawMonth=g;a.drawYear=m;n=this._get(a, -"prevText");n=!h?n:this.formatDate(n,this._daylightSavingAdjust(new Date(m,g-k,1)),this._getFormatConfig(a));n=this._canAdjustMonth(a,-1,m,g)?''+n+"":f?"":''+ -n+"";var r=this._get(a,"nextText");r=!h?r:this.formatDate(r,this._daylightSavingAdjust(new Date(m,g+k,1)),this._getFormatConfig(a));f=this._canAdjustMonth(a,+1,m,g)?''+r+"":f?"":''+r+"";k=this._get(a,"currentText");r=this._get(a,"gotoCurrent")&&a.currentDay?u:b;k=!h?k:this.formatDate(k,r,this._getFormatConfig(a));h=!a.inline?'":"";e=e?'
    '+(c?h:"")+(this._isInRange(a,r)?'":"")+(c?"":h)+"
    ":"";h=parseInt(this._get(a,"firstDay"),10);h=isNaN(h)?0:h;k=this._get(a,"showWeek");r=this._get(a,"dayNames");this._get(a,"dayNamesShort");var s=this._get(a,"dayNamesMin"),z=this._get(a,"monthNames"),v=this._get(a,"monthNamesShort"),p=this._get(a,"beforeShowDay"),w=this._get(a,"showOtherMonths"),H=this._get(a,"selectOtherMonths");this._get(a,"calculateWeek");for(var M=this._getDefaultDate(a),I="",C=0;C1)switch(D){case 0:x+=" ui-datepicker-group-first";t=" ui-corner-"+(c?"right":"left");break;case i[1]-1:x+=" ui-datepicker-group-last";t=" ui-corner-"+(c?"left":"right");break;default:x+=" ui-datepicker-group-middle";t="";break}x+='">'}x+='
    '+(/all|left/.test(t)&&C==0?c? -f:n:"")+(/all|right/.test(t)&&C==0?c?n:f:"")+this._generateMonthYearHeader(a,g,m,j,o,C>0||D>0,z,v)+'
    ';var A=k?'":"";for(t=0;t<7;t++){var q=(t+h)%7;A+="=5?' class="ui-datepicker-week-end"':"")+'>'+s[q]+""}x+=A+"";A=this._getDaysInMonth(m,g);if(m==a.selectedYear&&g==a.selectedMonth)a.selectedDay=Math.min(a.selectedDay, -A);t=(this._getFirstDayOfMonth(m,g)-h+7)%7;A=l?6:Math.ceil((t+A)/7);q=this._daylightSavingAdjust(new Date(m,g,1-t));for(var O=0;O";var P=!k?"":'";for(t=0;t<7;t++){var F=p?p.apply(a.input?a.input[0]:null,[q]):[true,""],B=q.getMonth()!=g,K=B&&!H||!F[0]||j&&qo;P+='";q.setDate(q.getDate()+1);q=this._daylightSavingAdjust(q)}x+=P+""}g++;if(g>11){g=0;m++}x+="
    '+this._get(a,"weekHeader")+"
    '+this._get(a,"calculateWeek")(q)+""+(B&&!w?" ":K?''+q.getDate()+ -"":''+q.getDate()+"")+"
    "+(l?"
    "+(i[0]>0&&D==i[1]-1?'
    ':""):"");N+=x}I+=N}I+=e+(d.browser.msie&&parseInt(d.browser.version,10)<7&&!a.inline?'': -"");a._keyEvent=false;return I},_generateMonthYearHeader:function(a,b,c,e,f,h,i,g){var k=this._get(a,"changeMonth"),l=this._get(a,"changeYear"),u=this._get(a,"showMonthAfterYear"),j='
    ',o="";if(h||!k)o+=''+i[b]+"";else{i=e&&e.getFullYear()==c;var m=f&&f.getFullYear()==c;o+='"}u||(j+=o+(h||!(k&&l)?" ":""));if(h||!l)j+=''+c+"";else{g=this._get(a,"yearRange").split(":");var r=(new Date).getFullYear();i=function(s){s=s.match(/c[+-].*/)?c+parseInt(s.substring(1),10):s.match(/[+-].*/)?r+parseInt(s,10):parseInt(s,10);return isNaN(s)?r:s};b=i(g[0]);g=Math.max(b, -i(g[1]||""));b=e?Math.max(b,e.getFullYear()):b;g=f?Math.min(g,f.getFullYear()):g;for(j+='"}j+=this._get(a,"yearSuffix");if(u)j+=(h||!(k&&l)?" ":"")+o;j+="
    ";return j},_adjustInstDate:function(a,b,c){var e= -a.drawYear+(c=="Y"?b:0),f=a.drawMonth+(c=="M"?b:0);b=Math.min(a.selectedDay,this._getDaysInMonth(e,f))+(c=="D"?b:0);e=this._restrictMinMax(a,this._daylightSavingAdjust(new Date(e,f,b)));a.selectedDay=e.getDate();a.drawMonth=a.selectedMonth=e.getMonth();a.drawYear=a.selectedYear=e.getFullYear();if(c=="M"||c=="Y")this._notifyChange(a)},_restrictMinMax:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");b=c&&ba?a:b},_notifyChange:function(a){var b=this._get(a, -"onChangeMonthYear");if(b)b.apply(a.input?a.input[0]:null,[a.selectedYear,a.selectedMonth+1,a])},_getNumberOfMonths:function(a){a=this._get(a,"numberOfMonths");return a==null?[1,1]:typeof a=="number"?[1,a]:a},_getMinMaxDate:function(a,b){return this._determineDate(a,this._get(a,b+"Date"),null)},_getDaysInMonth:function(a,b){return 32-(new Date(a,b,32)).getDate()},_getFirstDayOfMonth:function(a,b){return(new Date(a,b,1)).getDay()},_canAdjustMonth:function(a,b,c,e){var f=this._getNumberOfMonths(a); -c=this._daylightSavingAdjust(new Date(c,e+(b<0?b:f[0]*f[1]),1));b<0&&c.setDate(this._getDaysInMonth(c.getFullYear(),c.getMonth()));return this._isInRange(a,c)},_isInRange:function(a,b){var c=this._getMinMaxDate(a,"min");a=this._getMinMaxDate(a,"max");return(!c||b.getTime()>=c.getTime())&&(!a||b.getTime()<=a.getTime())},_getFormatConfig:function(a){var b=this._get(a,"shortYearCutoff");b=typeof b!="string"?b:(new Date).getFullYear()%100+parseInt(b,10);return{shortYearCutoff:b,dayNamesShort:this._get(a, -"dayNamesShort"),dayNames:this._get(a,"dayNames"),monthNamesShort:this._get(a,"monthNamesShort"),monthNames:this._get(a,"monthNames")}},_formatDate:function(a,b,c,e){if(!b){a.currentDay=a.selectedDay;a.currentMonth=a.selectedMonth;a.currentYear=a.selectedYear}b=b?typeof b=="object"?b:this._daylightSavingAdjust(new Date(e,c,b)):this._daylightSavingAdjust(new Date(a.currentYear,a.currentMonth,a.currentDay));return this.formatDate(this._get(a,"dateFormat"),b,this._getFormatConfig(a))}});d.fn.datepicker= -function(a){if(!d.datepicker.initialized){d(document).mousedown(d.datepicker._checkExternalClick).find("body").append(d.datepicker.dpDiv);d.datepicker.initialized=true}var b=Array.prototype.slice.call(arguments,1);if(typeof a=="string"&&(a=="isDisabled"||a=="getDate"||a=="widget"))return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b));if(a=="option"&&arguments.length==2&&typeof arguments[1]=="string")return d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this[0]].concat(b)); -return this.each(function(){typeof a=="string"?d.datepicker["_"+a+"Datepicker"].apply(d.datepicker,[this].concat(b)):d.datepicker._attachDatepicker(this,a)})};d.datepicker=new L;d.datepicker.initialized=false;d.datepicker.uuid=(new Date).getTime();d.datepicker.version="1.8.5";window["DP_jQuery_"+y]=d})(jQuery); -;/* - * jQuery UI Progressbar 1.8.5 - * - * Copyright 2010, AUTHORS.txt (http://jqueryui.com/about) - * Dual licensed under the MIT or GPL Version 2 licenses. - * http://jquery.org/license - * - * http://docs.jquery.com/UI/Progressbar - * - * Depends: - * jquery.ui.core.js - * jquery.ui.widget.js - */ -(function(b,c){b.widget("ui.progressbar",{options:{value:0},min:0,max:100,_create:function(){this.element.addClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").attr({role:"progressbar","aria-valuemin":this.min,"aria-valuemax":this.max,"aria-valuenow":this._value()});this.valueDiv=b("
    ").appendTo(this.element);this._refreshValue()},destroy:function(){this.element.removeClass("ui-progressbar ui-widget ui-widget-content ui-corner-all").removeAttr("role").removeAttr("aria-valuemin").removeAttr("aria-valuemax").removeAttr("aria-valuenow"); -this.valueDiv.remove();b.Widget.prototype.destroy.apply(this,arguments)},value:function(a){if(a===c)return this._value();this._setOption("value",a);return this},_setOption:function(a,d){if(a==="value"){this.options.value=d;this._refreshValue();this._trigger("change")}b.Widget.prototype._setOption.apply(this,arguments)},_value:function(){var a=this.options.value;if(typeof a!=="number")a=0;return Math.min(this.max,Math.max(this.min,a))},_refreshValue:function(){var a=this.value();this.valueDiv.toggleClass("ui-corner-right", -a===this.max).width(a+"%");this.element.attr("aria-valuenow",a)}});b.extend(b.ui.progressbar,{version:"1.8.5"})})(jQuery); ;/* * jQuery UI Effects 1.8.5 * diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index cf848b4ced..a292db309c 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -129,7 +129,7 @@ def get_category_items(category, items, db): # {{{ class Endpoint(object): # {{{ 'Manage encoding, mime-type, last modified, cookies, etc.' - def __init__(self, mimetype='text/html', sort_type='category'): + def __init__(self, mimetype='text/html; charset=utf-8', sort_type='category'): self.mimetype = mimetype self.sort_type = sort_type self.sort_kwarg = sort_type + '_sort' @@ -272,7 +272,8 @@ class BrowseServer(object): main = u'''

    {0}

    - {2} + {2} ↑ {1}
    '''.format( From 29b91f532e89f32ec18a88cdf275533d4515d605 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 21:59:32 -0600 Subject: [PATCH 16/30] Fix average rating calculation for rating datatype in Tag Browser incorrect --- src/calibre/library/database2.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5bec43ab28..e9b90f37e3 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -10,6 +10,7 @@ import os, sys, shutil, cStringIO, glob, time, functools, traceback, re from itertools import repeat from math import floor from Queue import Queue +from operator import itemgetter from PyQt4.QtGui import QImage @@ -1102,20 +1103,21 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): tooltip = self.custom_column_label_map[label]['name'] datatype = cat['datatype'] + avgr = itemgetter(3) + item_not_zero_func = lambda x: x[2] > 0 if datatype == 'rating': # eliminate the zero ratings line as well as count == 0 item_not_zero_func = (lambda x: x[1] > 0 and x[2] > 0) formatter = (lambda x:u'\u2605'*int(x/2)) + avgr = itemgetter(1) elif category == 'authors': - item_not_zero_func = (lambda x: x[2] > 0) # Clean up the authors strings to human-readable form formatter = (lambda x: x.replace('|', ',')) else: - item_not_zero_func = (lambda x: x[2] > 0) formatter = (lambda x:unicode(x)) categories[category] = [Tag(formatter(r[1]), count=r[2], id=r[0], - avg=r[3], sort=r[4], + avg=avgr(r), sort=r[4], icon=icon, tooltip=tooltip) for r in data if item_not_zero_func(r)] From 31cde51c11a4fcc47657068b7009f5ae9d1da912 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Wed, 13 Oct 2010 23:54:47 -0600 Subject: [PATCH 17/30] Grouping for category views --- resources/content_server/browse/browse.css | 33 +++----- resources/content_server/browse/browse.js | 37 +++++++++ src/calibre/library/server/browse.py | 97 ++++++++++++++++++---- 3 files changed, 130 insertions(+), 37 deletions(-) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index 438e9ebb8e..aa3d3be0ef 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -148,19 +148,6 @@ h2.library_name { padding-top: 40px; } -/* }}} */ - -/* Widgets {{{ */ - -#content .ui-widget { font-size: medium; font-family: monospace; } - -#content .ui-button, #content .ui-button-text { - padding: 0.2em 0.5em; - font-family: monospace; - line-height: 1 -} - - /* }}} */ /* Sort select {{{ */ @@ -179,7 +166,6 @@ h2.library_name { /* }}} */ - /* Search bar {{{ */ #search_box { @@ -192,7 +178,6 @@ h2.library_name { /* }}} */ - /* Top level {{{ */ .toplevel ul { list-style-type: none; @@ -220,7 +205,6 @@ h2.library_name { /* }}} */ - /* Category {{{ */ .category ul { list-style-type: none; @@ -247,16 +231,19 @@ h2.library_name { .category li.category-item h4 { display: inline } .category li.category-item span.href { display: none } -/* -.category a.navlink { - text-decoration: none; - color: inherit; +#groups span.load_href { display: none } + +#groups h3 { + font-weight: bold; + margin-top: 1ex; + padding-left: 2em; + padding-top: 0.5ex; + padding-bottom: 0.5ex; } -.category a.navlink:hover { - color: red; +#groups h3 span { + font-weight: normal } -*/ /* }}} */ diff --git a/resources/content_server/browse/browse.js b/resources/content_server/browse/browse.js index c2d942efab..692dd5e630 100644 --- a/resources/content_server/browse/browse.js +++ b/resources/content_server/browse/browse.js @@ -86,6 +86,10 @@ function toplevel() { } // }}} +function render_error(msg) { + return '

     Error: '+msg+"

    " +} + // Category feed {{{ function category() { $(".category li").corner("15px"); @@ -96,6 +100,39 @@ function category() { }); $(".category a.navlink").button(); + + $("#groups").accordion({ + collapsible: true, + active: false, + autoHeight: false, + clearStyle: true, + header: "h3", + + change: function(event, ui) { + if (ui.newContent) { + var href = ui.newContent.children("span.load_href").html(); + ui.newContent.children(".loading").show(); + if (href) { + $.ajax({ + url:href, + success: function(data) { + this.children(".loaded").html(data); + this.children(".loaded").show(); + this.children(".loading").hide(); + }, + context: ui.newContent, + dataType: "json", + timeout: 600000, //milliseconds (10 minutes) + error: function(xhr, stat, err) { + this.children(".loaded").html(render_error(stat)); + this.children(".loaded").show(); + this.children(".loading").hide(); + } + }); + } + } + } + }); } // }}} diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index a292db309c..87a6f6a9cf 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -5,7 +5,7 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import operator, os +import operator, os, json from urllib import quote from binascii import hexlify @@ -13,6 +13,7 @@ import cherrypy from calibre.constants import filesystem_encoding from calibre import isbytestring, force_unicode, prepare_string_for_xml as xml +from calibre.utils.ordered_dict import OrderedDict def paginate(offsets, content, base_url, up_url=None): # {{{ 'Create markup for pagination' @@ -102,7 +103,7 @@ def render_rating(rating, container='span'): # {{{ # }}} -def get_category_items(category, items, db): # {{{ +def get_category_items(category, items, db, datatype): # {{{ def item(i): templ = (u'
  • ' @@ -110,6 +111,8 @@ def get_category_items(category, items, db): # {{{ '{3}
  • ') rating, rstring = render_rating(i.avg_rating) name = xml(i.name) + if datatype == 'rating': + name = xml(_('%d stars')%int(i.avg_rating)) id_ = i.id if id_ is None: id_ = hexlify(force_unicode(name).encode('utf-8')) @@ -164,6 +167,9 @@ class BrowseServer(object): connect('browse', base_href, self.browse_catalog) connect('browse_catalog', base_href+'/category/{category}', self.browse_catalog) + connect('browse_category_group', + base_href+'/category_group/{category}/{group}', + self.browse_category_group) connect('browse_list', base_href+'/list/{query}', self.browse_list) connect('browse_search', base_href+'/search/{query}', self.browse_search) @@ -243,32 +249,66 @@ class BrowseServer(object): return self.browse_template('name').format(title='', script='toplevel();', main=main) - def browse_category(self, category, sort): + def browse_sort_categories(self, items, sort): if sort not in ('rating', 'name', 'popularity'): sort = 'name' + def sorter(x): + ans = getattr(x, 'sort', x.name) + if hasattr(ans, 'upper'): + ans = ans.upper() + return ans + items.sort(key=sorter) + if sort == 'popularity': + items.sort(key=operator.attrgetter('count'), reverse=True) + elif sort == 'rating': + items.sort(key=operator.attrgetter('avg_rating'), reverse=True) + return sort + + def browse_category(self, category, sort): categories = self.categories_cache() category_meta = self.db.field_metadata category_name = category_meta[category]['name'] + datatype = category_meta[category]['datatype'] if category not in categories: raise cherrypy.HTTPError(404, 'category not found') items = categories[category] + sort = self.browse_sort_categories(items, sort) - name_keyg = lambda x: getattr(x, 'sort', x.name).lower() - items.sort(key=name_keyg) - if sort == 'popularity': - items.sort(key=operator.attrgetter('count'), reverse=True) - elif sort == 'rating': - items.sort(key=operator.attrgetter('avg_rating'), reverse=True) + script = 'true' - base_url='/browse/category/'+category - if sort is not None: - base_url += '?sort='+quote(sort) + if len(items) <= self.opts.max_opds_ungrouped_items: + script = 'false' + items = get_category_items(category, items, self.db, datatype) + else: + getter = lambda x: unicode(getattr(x, 'sort', x.name)) + starts = set([]) + for x in items: + val = getter(x) + if not val: + val = u'A' + starts.add(val[0].upper()) + category_groups = OrderedDict() + for x in sorted(starts): + category_groups[x] = len([y for y in items if + getter(y).upper().startswith(x)]) + items = [(u'

    {0} [{2}]

    ' + u'' + u'
    {1}
    ' + u'{3}
    ').format( + xml(s, True), + xml(_('Loading, please wait'))+'…', + unicode(c), + xml(u'/browse/category_group/%s/%s'%(category, s))) + for s, c in category_groups.items()] + items = '\n\n'.join(items) + items = u'
    \n{0}
    '.format(items) - script = 'category();' - items = get_category_items(category, items, self.db) + + script = 'category(%s);'%script + main = u'''

    {0}

    @@ -283,6 +323,35 @@ class BrowseServer(object): return self.browse_template(sort).format(title=category_name, script=script, main=main) + @Endpoint(mimetype='application/json; charset=utf-8') + def browse_category_group(self, category=None, group=None, + category_sort=None): + sort = category_sort + if sort not in ('rating', 'name', 'popularity'): + sort = 'name' + categories = self.categories_cache() + category_meta = self.db.field_metadata + datatype = category_meta[category]['datatype'] + + if category not in categories: + raise cherrypy.HTTPError(404, 'category not found') + if not group: + raise cherrypy.HTTPError(404, 'invalid group') + + items = categories[category] + entries = [] + getter = lambda x: unicode(getattr(x, 'sort', x.name)) + for x in items: + val = getter(x) + if not val: + val = u'A' + if val.upper().startswith(group): + entries.append(x) + + sort = self.browse_sort_categories(entries, sort) + entries = get_category_items(category, entries, self.db, datatype) + return json.dumps(entries, ensure_ascii=False) + @Endpoint() From e216d698783b52da452b15f52929f0bb15ec30b4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 00:14:39 -0600 Subject: [PATCH 18/30] ... --- resources/content_server/browse/browse.css | 2 +- src/calibre/library/server/browse.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index aa3d3be0ef..824c1c5e09 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -236,7 +236,7 @@ h2.library_name { #groups h3 { font-weight: bold; margin-top: 1ex; - padding-left: 2em; + padding-left: 30px; padding-top: 0.5ex; padding-bottom: 0.5ex; } diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 87a6f6a9cf..28fa7b4772 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -295,7 +295,7 @@ class BrowseServer(object): getter(y).upper().startswith(x)]) items = [(u'

    {0} [{2}]

    ' u'' - u'
    {1}
    ' + u'
    {1}{1}
    ' u'{3}
    ').format( xml(s, True), xml(_('Loading, please wait'))+'…', From 8ecad1b0d750673d9b1fe65ac10f56a1067a022f Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 14 Oct 2010 10:21:38 +0100 Subject: [PATCH 19/30] Enhancement #7172: drop on items in user categories. Also fixed a bug where the interface indicated that one could drop on a format, when you can't. --- src/calibre/gui2/tag_view.py | 46 +++++++++++++++++--------------- src/calibre/library/database2.py | 16 ++++++----- 2 files changed, 35 insertions(+), 27 deletions(-) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 8732aec63d..a71230c984 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -434,25 +434,24 @@ class TagsModel(QAbstractItemModel): # {{{ action != Qt.CopyAction: return False idx = parent - p = self.parent(idx) - if idx.isValid() and p.isValid(): - item = self.data(p, Qt.UserRole) - fm = self.db.metadata_for_field(item.category_key) - if item.category_key in \ - ('tags', 'series', 'authors', 'rating', 'publisher') or \ - (fm['is_custom'] and \ - fm['datatype'] in ['text', 'rating', 'series']): - child = self.data(idx, Qt.UserRole) - mime = 'application/calibre+from_library' - ids = list(map(int, str(md.data(mime)).split())) - self.handle_drop(item, child, ids) - return True + if idx.isValid(): + node = self.data(idx, Qt.UserRole) + if node.type == TagTreeItem.TAG: + fm = self.db.metadata_for_field(node.tag.category) + if node.tag.category in \ + ('tags', 'series', 'authors', 'rating', 'publisher') or \ + (fm['is_custom'] and \ + fm['datatype'] in ['text', 'rating', 'series']): + mime = 'application/calibre+from_library' + ids = list(map(int, str(md.data(mime)).split())) + self.handle_drop(node, ids) + return True return False - def handle_drop(self, parent, child, ids): - # print 'Dropped ids:', ids, parent.category_key, child.tag.name - key = parent.category_key + def handle_drop(self, on_node, ids): + #print 'Dropped ids:', ids, on_node.tag + key = on_node.tag.category if (key == 'authors' and len(ids) >= 5): if not confirm('

    '+_('Changing the authors for several books can ' 'take a while. Are you sure?') @@ -466,7 +465,7 @@ class TagsModel(QAbstractItemModel): # {{{ fm = self.db.metadata_for_field(key) is_multiple = fm['is_multiple'] - val = child.tag.name + val = on_node.tag.name for id in ids: mi = self.db.get_metadata(id, index_is_id=True) @@ -500,8 +499,6 @@ class TagsModel(QAbstractItemModel): # {{{ self.db.commit() self.drag_drop_finished.emit(ids) - - def set_search_restriction(self, s): self.search_restriction = s @@ -633,8 +630,15 @@ class TagsModel(QAbstractItemModel): # {{{ def flags(self, index, *args): ans = Qt.ItemIsEnabled|Qt.ItemIsSelectable|Qt.ItemIsEditable - if index.isValid() and self.parent(index).isValid(): - ans |= Qt.ItemIsDropEnabled + if index.isValid(): + node = self.data(index, Qt.UserRole) + if node.type == TagTreeItem.TAG: + fm = self.db.metadata_for_field(node.tag.category) + if node.tag.category in \ + ('tags', 'series', 'authors', 'rating', 'publisher') or \ + (fm['is_custom'] and \ + fm['datatype'] in ['text', 'rating', 'series']): + ans |= Qt.ItemIsDropEnabled return ans def supportedDropActions(self): diff --git a/src/calibre/library/database2.py b/src/calibre/library/database2.py index 5bec43ab28..3c949fcf78 100644 --- a/src/calibre/library/database2.py +++ b/src/calibre/library/database2.py @@ -68,7 +68,7 @@ copyfile = os.link if hasattr(os, 'link') else shutil.copyfile class Tag(object): def __init__(self, name, id=None, count=0, state=0, avg=0, sort=None, - tooltip=None, icon=None): + tooltip=None, icon=None, category=None): self.name = name self.id = id self.count = count @@ -81,9 +81,11 @@ class Tag(object): tooltip = _('%sAverage rating is %3.1f')%(tooltip, self.avg_rating) self.tooltip = tooltip self.icon = icon + self.category = category def __unicode__(self): - return u'%s:%s:%s:%s:%s'%(self.name, self.count, self.id, self.state, self.tooltip) + return u'%s:%s:%s:%s:%s:%s'%(self.name, self.count, self.id, self.state, + self.category, self.tooltip) def __str__(self): return unicode(self).encode('utf-8') @@ -1115,8 +1117,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): formatter = (lambda x:unicode(x)) categories[category] = [Tag(formatter(r[1]), count=r[2], id=r[0], - avg=r[3], sort=r[4], - icon=icon, tooltip=tooltip) + avg=r[3], sort=r[4], icon=icon, + tooltip=tooltip, category=category) for r in data if item_not_zero_func(r)] # Needed for legacy databases that have multiple ratings that @@ -1148,7 +1150,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): WHERE format="%s"'''%fmt, all=False) if count > 0: - categories['formats'].append(Tag(fmt, count=count, icon=icon)) + categories['formats'].append(Tag(fmt, count=count, icon=icon, + category='formats')) if sort == 'popularity': categories['formats'].sort(key=lambda x: x.count, reverse=True) @@ -1194,7 +1197,8 @@ class LibraryDatabase2(LibraryDatabase, SchemaUpgrade, CustomColumns): if icon_map and 'search' in icon_map: icon = icon_map['search'] for srch in saved_searches().names(): - items.append(Tag(srch, tooltip=saved_searches().lookup(srch), icon=icon)) + items.append(Tag(srch, tooltip=saved_searches().lookup(srch), + icon=icon, category='search')) if len(items): if icon_map is not None: icon_map['search'] = icon_map['search'] From 082ffba6cf575a16279e90c6fb242beae073d468 Mon Sep 17 00:00:00 2001 From: Charles Haley <> Date: Thu, 14 Oct 2010 10:37:24 +0100 Subject: [PATCH 20/30] Restore average rating display in the icon. --- src/calibre/gui2/tag_view.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index a71230c984..36d78838d3 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -29,7 +29,7 @@ class TagDelegate(QItemDelegate): # {{{ def paint(self, painter, option, index): item = index.internalPointer() - if True or item.type != TagTreeItem.TAG: + if item.type != TagTreeItem.TAG: QItemDelegate.paint(self, painter, option, index) return r = option.rect From 05cda6b7f95dcecd832827f8c6c661f8db23e8de Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 08:24:47 -0600 Subject: [PATCH 21/30] ... --- src/calibre/gui2/viewer/main.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/calibre/gui2/viewer/main.py b/src/calibre/gui2/viewer/main.py index a1d3b9bea4..f0f29a67e6 100644 --- a/src/calibre/gui2/viewer/main.py +++ b/src/calibre/gui2/viewer/main.py @@ -731,8 +731,8 @@ def main(args=sys.argv): main.raise_() if opts.full_screen: main.action_full_screen.trigger() - with main: - return app.exec_() + with main: + return app.exec_() return 0 if __name__ == '__main__': From 5523da3dde513d82e6a1dbd1fd791d8671f6febe Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 08:36:10 -0600 Subject: [PATCH 22/30] Auto expand when dropping onto Tag Browser. Only seems to work for Searches node and I dont have the time to figure out why --- src/calibre/gui2/tag_view.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/calibre/gui2/tag_view.py b/src/calibre/gui2/tag_view.py index 36d78838d3..3505cc7344 100644 --- a/src/calibre/gui2/tag_view.py +++ b/src/calibre/gui2/tag_view.py @@ -84,6 +84,7 @@ class TagsView(QTreeView): # {{{ self.setAcceptDrops(True) self.setDragDropMode(self.DropOnly) self.setDropIndicatorShown(True) + self.setAutoExpandDelay(500) def set_database(self, db, tag_match, sort_by): self.hidden_categories = config['tag_browser_hidden_categories'] From f468fd5cf3a7feffbbb86f5363761d700591e0b4 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 09:08:42 -0600 Subject: [PATCH 23/30] Try using a table to layout category view --- resources/content_server/browse/browse.css | 15 +++++++-------- resources/content_server/browse/browse.js | 6 ++---- src/calibre/library/server/browse.py | 9 +++++---- 3 files changed, 14 insertions(+), 16 deletions(-) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index 824c1c5e09..7af4aeb5f4 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -206,30 +206,29 @@ h2.library_name { /* }}} */ /* Category {{{ */ -.category ul { - list-style-type: none; +.category table { margin: 0; padding: 0; + width: 100%; + border-collapse: collapse; } -.category li.category-item { - margin: 0.75em; +.category tr.category-item td { padding: 0.75em; text-align: center; cursor: pointer; } -.category li.category-item:hover { +.category tr.category-item:hover { background-color: #d6d3c9; - font-weight: bold; -moz-box-shadow: 5px 5px 5px #ccc; -webkit-box-shadow: 5px 5px 5px #ccc; box-shadow: 5px 5px 5px #ccc; } -.category li.category-item h4 { display: inline } -.category li.category-item span.href { display: none } +.category tr.category-item h4 { display: inline } +.category tr.category-item span.href { display: none } #groups span.load_href { display: none } diff --git a/resources/content_server/browse/browse.js b/resources/content_server/browse/browse.js index 692dd5e630..a841fb5e5d 100644 --- a/resources/content_server/browse/browse.js +++ b/resources/content_server/browse/browse.js @@ -92,10 +92,8 @@ function render_error(msg) { // Category feed {{{ function category() { - $(".category li").corner("15px"); - - $(".category li").click(function() { - var href = $(this).children("span.href").html(); + $(".category tr").click(function() { + var href = $(this).find("span.href").html(); window.location = href; }); diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 28fa7b4772..4d860b2d0d 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -106,9 +106,10 @@ def render_rating(rating, container='span'): # {{{ def get_category_items(category, items, db, datatype): # {{{ def item(i): - templ = (u'

  • ' - '

    {0}  {1}

      {2}' - '{3}
  • ') + templ = (u'' + '

    {0}

    {1}' + '{2}' + '{3}') rating, rstring = render_rating(i.avg_rating) name = xml(i.name) if datatype == 'rating': @@ -125,7 +126,7 @@ def get_category_items(category, items, db, datatype): # {{{ xml(desc), xml(quote(href)), rstring) items = list(map(item, items)) - return '\n'.join(['
      '] + items + ['
    ']) + return '\n'.join([''] + items + ['
    ']) # }}} From dbcf47468bd88bed0938596f90ed95bfca4ab5ac Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 09:38:52 -0600 Subject: [PATCH 24/30] More semantic table markup. --- resources/content_server/browse/browse.css | 25 +++++++++++++++------- resources/content_server/browse/browse.js | 4 +--- src/calibre/library/server/browse.py | 10 ++++----- 3 files changed, 23 insertions(+), 16 deletions(-) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index 7af4aeb5f4..0222aefdb4 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -206,29 +206,38 @@ h2.library_name { /* }}} */ /* Category {{{ */ -.category table { - margin: 0; - padding: 0; +.category > div.category-container { width: 100%; - border-collapse: collapse; + margin-top: 1ex; + margin-bottom: 1ex; + display: table; } -.category tr.category-item td { +.category div.category-item { + display: table-row; +} + +.category div.category-item > div { padding: 0.75em; text-align: center; cursor: pointer; + display: table-cell; } -.category tr.category-item:hover { +.category div.category-name { font-weight: bold } + +.category div.category-item:hover > div { background-color: #d6d3c9; -moz-box-shadow: 5px 5px 5px #ccc; -webkit-box-shadow: 5px 5px 5px #ccc; box-shadow: 5px 5px 5px #ccc; + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; } -.category tr.category-item h4 { display: inline } -.category tr.category-item span.href { display: none } +.category div.category-item span.href { display: none } #groups span.load_href { display: none } diff --git a/resources/content_server/browse/browse.js b/resources/content_server/browse/browse.js index a841fb5e5d..f3f278fc48 100644 --- a/resources/content_server/browse/browse.js +++ b/resources/content_server/browse/browse.js @@ -77,8 +77,6 @@ function init() { function toplevel() { $(".sort_select").hide(); - $(".toplevel li").corner("15px"); - $(".toplevel li").click(function() { var href = $(this).children("span").html(); window.location = href; @@ -92,7 +90,7 @@ function render_error(msg) { // Category feed {{{ function category() { - $(".category tr").click(function() { + $(".category .category-item").click(function() { var href = $(this).find("span.href").html(); window.location = href; }); diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 4d860b2d0d..6a557e423a 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -106,10 +106,10 @@ def render_rating(rating, container='span'): # {{{ def get_category_items(category, items, db, datatype): # {{{ def item(i): - templ = (u'' - '

    {0}

    {1}' - '{2}' - '{3}') + templ = (u'
    ' + '
    {0}
    {1}
    ' + '
    {2}' + '{3}
    ') rating, rstring = render_rating(i.avg_rating) name = xml(i.name) if datatype == 'rating': @@ -126,7 +126,7 @@ def get_category_items(category, items, db, datatype): # {{{ xml(desc), xml(quote(href)), rstring) items = list(map(item, items)) - return '\n'.join([''] + items + ['
    ']) + return '\n'.join(['
    '] + items + ['
    ']) # }}} From 6f2742500d22445132dcdecb2f8663d538fd9029 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 09:42:59 -0600 Subject: [PATCH 25/30] ... --- resources/content_server/browse/browse.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index 0222aefdb4..07cf22f1cc 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -190,6 +190,10 @@ h2.library_name { padding: 0.75em; text-align: center; cursor: pointer; + border-radius: 15px; + -moz-border-radius: 15px; + -webkit-border-radius: 15px; + } .toplevel li:hover { From 8f82dc37138053327bb3244c362328e49d0c6cf0 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 15:56:38 -0600 Subject: [PATCH 26/30] Orsai by DM. Fixes #7176 (New recipe for famous blog in Spanish - Orsai) --- resources/images/news/orsai.png | Bin 0 -> 684 bytes resources/recipes/orsai.recipe | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 resources/images/news/orsai.png create mode 100644 resources/recipes/orsai.recipe diff --git a/resources/images/news/orsai.png b/resources/images/news/orsai.png new file mode 100644 index 0000000000000000000000000000000000000000..e65f02206c19fed25f1632ff43531bd8609df8e6 GIT binary patch literal 684 zcmV;d0#p5oP)=e}8EFYAp^0E59e7=nZX1&9IxDN=+c zX{hKBk?4|$f|8DObkr27k}8UnKY%U>2^tIW(NKVGA+XrUVEncF-kcQkO!A6(Q`|Ya z_nhCAvyCX90cA{pLCQb?8FE16wk|+5kO-7%0NbDp4n%ou0+X=?LHQF!!xb13Kn0+N zxH*rzePTEP-2uOTKgX4?`u{bj1_+Fhgo|9ONW#5o4xBv7zT;Em-E&<1eSyCgmrG~c zH5QTq5RfQ$B%o1ubG z>WtCx7?W;zI2f|OT12Vwf*L3@rOKFgHnj+EhZTlwL|x!> zA|!(nI9QlB|J>VFFGox5C+8gn;BA&=+n-u;F+~4gYd~(w%DHSZ)F_K4D*gqvYY`M! Sit~H`0000 Date: Thu, 14 Oct 2010 15:59:54 -0600 Subject: [PATCH 27/30] ... --- resources/content_server/browse/browse.css | 11 ++ src/calibre/library/server/browse.py | 164 ++++++++++++--------- 2 files changed, 109 insertions(+), 66 deletions(-) diff --git a/resources/content_server/browse/browse.css b/resources/content_server/browse/browse.css index 07cf22f1cc..d66ae744cf 100644 --- a/resources/content_server/browse/browse.css +++ b/resources/content_server/browse/browse.css @@ -259,4 +259,15 @@ h2.library_name { /* }}} */ +/* Booklist {{{ */ + +#booklist .page { + display: none; +} + +.loading img { + vertical-align: middle; +} + +/* }}} */ diff --git a/src/calibre/library/server/browse.py b/src/calibre/library/server/browse.py index 6a557e423a..ffbd958688 100644 --- a/src/calibre/library/server/browse.py +++ b/src/calibre/library/server/browse.py @@ -7,7 +7,7 @@ __docformat__ = 'restructuredtext en' import operator, os, json from urllib import quote -from binascii import hexlify +from binascii import hexlify, unhexlify import cherrypy @@ -15,64 +15,33 @@ from calibre.constants import filesystem_encoding from calibre import isbytestring, force_unicode, prepare_string_for_xml as xml from calibre.utils.ordered_dict import OrderedDict -def paginate(offsets, content, base_url, up_url=None): # {{{ - 'Create markup for pagination' - - if '?' not in base_url: - base_url += '?' - - if base_url[-1] != '?': - base_url += '&' - - def navlink(decoration, name, cls, offset): - label = xml(name) - if cls in ('next', 'last'): - label += ' ' + decoration - else: - label = decoration + ' ' + label - return (u'' - u'{label}').format(cls=cls, decoration=decoration, - name=xml(name, True), offset=offset, - base_url=xml(base_url, True), label=label) - left = '' - if offsets.offset > 0 and offsets.previous_offset > 0: - left += navlink(u'\u219e', _('First'), 'first', 0) - if offsets.offset > 0: - left += ' ' + navlink('←', _('Previous'), 'previous', - offsets.previous_offset) - - middle = '' - if up_url: - middle = '[{1} ↑]'.format(xml(up_url, True), - xml(_('Up'))) - - right = '' - if offsets.next_offset > -1: - right += navlink('&rarr', _('Next'), 'next', offsets.next_offset) - if offsets.last_offset > offsets.next_offset and offsets.last_offset > 0: - right += ' ' + navlink(u'\u21A0', _('Last'), 'last', offsets.last_offset) - - navbar = u''' - - - - - - - - '''.format(left=left, right=right, middle=middle) - - templ = u''' -
    - {navbar} -
    - {content} +def render_book_list(ids): + pages = [] + while ids: + page = list(ids[:25]) + pages.append(page) + ids = ids[25:] + page_template = u'''\ +
    +
    +
    {2}
    +
    - {navbar} -
    - ''' - return templ.format(navbar=navbar, content=content) -# }}} + ''' + rpages = [] + for i, pg in enumerate(pages): + ld = xml(json.dumps(pg), True) + rpages.append(page_template.format(i, ld, + xml(_('Loading, please wait')) + '…')) + rpages = u'\n\n'.join(rpages) + + templ = u'''\ +

    {0}

    +
    + {pages} +
    + ''' + return templ.format(_('Browsing %d books')%len(ids), pages=rpages) def utf8(x): # {{{ if isinstance(x, unicode): @@ -171,10 +140,15 @@ class BrowseServer(object): connect('browse_category_group', base_href+'/category_group/{category}/{group}', self.browse_category_group) - connect('browse_list', base_href+'/list/{query}', self.browse_list) + connect('browse_matches', + base_href+'/matches/{category}/{cid}', + self.browse_matches) + connect('browse_booklist_page', + base_href+'/booklist_page', + self.browse_booklist_page) + connect('browse_search', base_href+'/search/{query}', self.browse_search) - connect('browse_book', base_href+'/book/{uuid}', self.browse_book) def browse_template(self, sort, category=True): @@ -267,12 +241,12 @@ class BrowseServer(object): def browse_category(self, category, sort): categories = self.categories_cache() + if category not in categories: + raise cherrypy.HTTPError(404, 'category not found') category_meta = self.db.field_metadata category_name = category_meta[category]['name'] datatype = category_meta[category]['datatype'] - if category not in categories: - raise cherrypy.HTTPError(404, 'category not found') items = categories[category] sort = self.browse_sort_categories(items, sort) @@ -331,11 +305,12 @@ class BrowseServer(object): if sort not in ('rating', 'name', 'popularity'): sort = 'name' categories = self.categories_cache() + if category not in categories: + raise cherrypy.HTTPError(404, 'category not found') + category_meta = self.db.field_metadata datatype = category_meta[category]['datatype'] - if category not in categories: - raise cherrypy.HTTPError(404, 'category not found') if not group: raise cherrypy.HTTPError(404, 'invalid group') @@ -360,6 +335,8 @@ class BrowseServer(object): 'Entry point for top-level, categories and sub-categories' if category == None: ans = self.browse_toplevel() + elif category == 'newest': + raise cherrypy.InternalRedirect('/browse/matches/newest/dummy') else: ans = self.browse_category(category, category_sort) @@ -368,8 +345,63 @@ class BrowseServer(object): # }}} # Book Lists {{{ - def browse_list(self, query=None, offset=0, sort=None): - raise NotImplementedError() + + def browse_sort_book_list(self, items, sort): + fm = self.db.field_metadata + keys = frozenset(fm.sortable_field_keys()) + if sort not in keys: + sort = 'title' + self.sort(items, 'title', True) + if sort != 'title': + ascending = fm[sort]['datatype'] not in ('rating', 'datetime') + self.sort(items, sort, ascending) + return sort + + @Endpoint(sort_type='list') + def browse_matches(self, category=None, cid=None, list_sort=None): + if not cid: + raise cherrypy.HTTPError(404, 'invalid category id: %r'%cid) + categories = self.categories_cache() + + if category not in categories and category != 'newest': + raise cherrypy.HTTPError(404, 'category not found') + try: + category_name = self.db.field_metadata[category]['name'] + except: + if category != 'newest': + raise + category_name = _('Newest') + + if category == 'search': + which = unhexlify(cid) + try: + ids = self.search_cache('search:"%s"'%which) + except: + raise cherrypy.HTTPError(404, 'Search: %r not understood'%which) + elif category == 'newest': + ids = list(self.db.data.iterallids()) + else: + ids = self.db.get_books_for_category(category, cid) + + items = [self.db.data._data[x] for x in ids] + if category == 'newest': + list_sort = 'timestamp' + sort = self.browse_sort_book_list(items, list_sort) + ids = [x[0] for x in items] + html = render_book_list(ids) + return self.browse_template(sort).format( + title=_('Books in') + " " +category_name, + script='booklist();', main=html) + + @Endpoint(mimetype='application/json; charset=utf-8', sort_type='list') + def browse_booklist_page(self, ids=None, list_sort=None): + if ids is None: + ids = json.dumps('[]') + try: + ids = json.loads(ids) + except: + raise cherrypy.HTTPError(404, 'invalid ids') + # }}} # Search {{{ From d5462c8d0063c844f5e8370a17e8da382d80dd37 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 17:39:00 -0600 Subject: [PATCH 28/30] Update Globe and Mail. Fix #405 (New news feed) --- resources/recipes/globe_and_mail.recipe | 31 ++++---------------- resources/recipes/volksrant.recipe | 39 ++++++++++++++----------- 2 files changed, 28 insertions(+), 42 deletions(-) diff --git a/resources/recipes/globe_and_mail.recipe b/resources/recipes/globe_and_mail.recipe index b2a9915250..b6e6b5c25b 100644 --- a/resources/recipes/globe_and_mail.recipe +++ b/resources/recipes/globe_and_mail.recipe @@ -26,31 +26,12 @@ class GlobeAndMail(BasicNewsRecipe): #credit {margin-top:0px;} .tag {font-size: 22pt;}''' description = 'Canada\'s national newspaper' - remove_tags_before = dict(id="article-top") - remove_tags = [ - {'id':['util', 'article-tabs', 'comments', 'article-relations', - 'gallery-controls', 'video', 'galleryLoading','deck','header', - 'toolsBottom'] }, - {'class':['credit','inline-img-caption','tab-pointer'] }, - dict(name='div', attrs={'id':['lead-photo', 'most-popular-story']}), - dict(name='div', attrs={'class':'right'}), - dict(name='div', attrs={'id':'footer'}), - dict(name='div', attrs={'id':'beta-msg'}), - dict(name='img', attrs={'class':'headshot'}), - dict(name='div', attrs={'class':'brand'}), - dict(name='div', attrs={'id':'nav-wrap'}), - dict(name='div', attrs={'id':'featureTopics'}), - dict(name='div', attrs={'id':'videoNav'}), - dict(name='div', attrs={'id':'blog-header'}), - dict(name='div', attrs={'id':'right-rail'}), - dict(name='div', attrs={'id':'group-footer-container'}), - dict(name=['iframe', 'style']) - ] - remove_attributes = ['style'] - remove_tags_after = [{'id':['article-content']}, - {'class':['pull','inline-img'] }, - dict(name='img', attrs={'class':'inline-media-embed'}), - ] + keep_only_tags = [dict(name='article')] + remove_tags = [dict(name='aside'), + dict(name='footer'), + dict(name='div', attrs={'class':(lambda x: isinstance(x, (str,unicode)) and 'articlecommentcountholder' in x.split(' '))}), + dict(name='ul', attrs={'class':(lambda x: isinstance(x, (str,unicode)) and 'articletoolbar' in x.split(' '))}), + ] feeds = [ (u'Latest headlines', u'http://www.theglobeandmail.com/?service=rss'), (u'Top stories', u'http://www.theglobeandmail.com/?service=rss&feed=topstories'), diff --git a/resources/recipes/volksrant.recipe b/resources/recipes/volksrant.recipe index dcc8c042ee..6f3ec4ce0d 100644 --- a/resources/recipes/volksrant.recipe +++ b/resources/recipes/volksrant.recipe @@ -11,6 +11,7 @@ __docformat__ = 'restructuredtext en' on 10/10/10 to include function to grab print version of articles ''' +from datetime import date from calibre.web.feeds.news import BasicNewsRecipe ''' added by Tony Stegall @@ -27,7 +28,6 @@ class AdvancedUserRecipe1249039563(BasicNewsRecipe): no_stylesheets = True language = 'nl' - extra_css = ''' body{font-family:Arial,Helvetica,sans-serif; font-size:small;} h1{font-size:large;} @@ -43,14 +43,16 @@ class AdvancedUserRecipe1249039563(BasicNewsRecipe): def get_obfuscated_article(self, url): br = self.get_browser() + print 'THE CURRENT URL IS: ', url br.open(url) + year = date.today().year try: - response = br.follow_link(url_regex='.*?(2010)(\\/)(article)(\\/)(print)(\\/)', nr = 0) - html = response.read() + response = br.follow_link(url_regex='.*?(%d)(\\/)(article)(\\/)(print)(\\/)'%year, nr = 0) + html = response.read() except: - response = br.open(url) - html = response.read() + response = br.open(url) + html = response.read() self.temp_files.append(PersistentTemporaryFile('_fa.html')) self.temp_files[-1].write(html) @@ -59,19 +61,22 @@ class AdvancedUserRecipe1249039563(BasicNewsRecipe): ############################################################################################################### - feeds = [ - (u'Laatste Nieuws', u'http://volkskrant.nl/rss/laatstenieuws.rss'), - (u'Binnenlands nieuws', u'http://volkskrant.nl/rss/nederland.rss'), - (u'Buitenlands nieuws', u'http://volkskrant.nl/rss/internationaal.rss'), - (u'Economisch nieuws', u'http://volkskrant.nl/rss/economie.rss'), - (u'Sportnieuws', u'http://volkskrant.nl/rss/sport.rss'), - (u'Kunstnieuws', u'http://volkskrant.nl/rss/kunst.rss'), + ''' + Change Log: + Date: 10/15/2010 + Feeds updated by Martin Tarenskeen + ''' + + feeds = [ + (u'Laatste Nieuws', u'http://www.volkskrant.nl/rss/laatstenieuws.rss'), + (u'Binnenland', u'http://www.volkskrant.nl/rss/nederland.rss'), + (u'Buitenland', u'http://www.volkskrant.nl/rss/internationaal.rss'), + (u'Economie', u'http://www.volkskrant.nl/rss/economie.rss'), + (u'Sport', u'http://www.volkskrant.nl/rss/sport.rss'), + (u'Cultuur', u'http://www.volkskrant.nl/rss/kunst.rss'), + (u'Gezondheid & Wetenschap', u'http://www.volkskrant.nl/rss/wetenschap.rss'), + (u'Internet & Media', u'http://www.volkskrant.nl/rss/media.rss') ] - #both of these rss feeds link back to the main volksrant.nl url a.k.a Broken - #If someone happens to know the correct paths then they can put them in here - #(u'Wetenschapsnieuws', u'http://feeds.feedburner.com/DeVolkskrantWetenschap'), - #(u'Technologienieuws', u'http://feeds.feedburner.com/vkmedia') - ] ''' example for formating From 4fc74bdcd0e6403b8d46884a42d6767b0488be3d Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 19:41:55 -0600 Subject: [PATCH 29/30] Content server: Allow variable sized thumbnails and replace use of PIL with ImageMagick --- src/calibre/library/server/content.py | 66 ++++++++++++++------------- src/calibre/utils/magick/draw.py | 8 +++- 2 files changed, 41 insertions(+), 33 deletions(-) diff --git a/src/calibre/library/server/content.py b/src/calibre/library/server/content.py index 59fed03fbd..8c5fef4ee1 100644 --- a/src/calibre/library/server/content.py +++ b/src/calibre/library/server/content.py @@ -5,18 +5,15 @@ __license__ = 'GPL v3' __copyright__ = '2010, Kovid Goyal ' __docformat__ = 'restructuredtext en' -import re, os, cStringIO +import re, os import cherrypy -try: - from PIL import Image as PILImage - PILImage -except ImportError: - import Image as PILImage from calibre import fit_image, guess_type from calibre.utils.date import fromtimestamp from calibre.library.caches import SortKeyGenerator +from calibre.utils.magick.draw import save_cover_data_to, Image, \ + thumbnail as generate_thumbnail class CSSortKeyGenerator(SortKeyGenerator): @@ -77,8 +74,13 @@ class ContentServer(object): id = int(match.group()) if not self.db.has_id(id): raise cherrypy.HTTPError(400, 'id:%d does not exist in database'%id) - if what == 'thumb': - return self.get_cover(id, thumbnail=True) + if what == 'thumb' or what.startswith('thumb_'): + try: + width, height = map(int, what.split('_')[1:]) + except: + width, height = 60, 80 + return self.get_cover(id, thumbnail=True, thumb_width=width, + thumb_height=height) if what == 'cover': return self.get_cover(id) return self.get_format(id, what) @@ -128,37 +130,39 @@ class ContentServer(object): return self.static('index.html') # Actually get content from the database {{{ - def get_cover(self, id, thumbnail=False): - cover = self.db.cover(id, index_is_id=True, as_file=False) - if cover is None: - cover = self.default_cover - cherrypy.response.headers['Content-Type'] = 'image/jpeg' - cherrypy.response.timeout = 3600 - path = getattr(cover, 'name', False) - updated = fromtimestamp(os.stat(path).st_mtime) if path and \ - os.access(path, os.R_OK) else self.build_time - cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) + def get_cover(self, id, thumbnail=False, thumb_width=60, thumb_height=80): try: - f = cStringIO.StringIO(cover) - try: - im = PILImage.open(f) - except IOError: - raise cherrypy.HTTPError(404, 'No valid cover found') - width, height = im.size + cherrypy.response.headers['Content-Type'] = 'image/jpeg' + cherrypy.response.timeout = 3600 + cover = self.db.cover(id, index_is_id=True, as_file=True) + if cover is None: + cover = self.default_cover + updated = self.build_time + else: + with cover as f: + updated = fromtimestamp(os.stat(f.name).st_mtime) + cover = f.read() + cherrypy.response.headers['Last-Modified'] = self.last_modified(updated) + + if thumbnail: + return generate_thumbnail(cover, + width=thumb_width, height=thumb_height)[-1] + + img = Image() + img.load(cover) + width, height = img.size scaled, width, height = fit_image(width, height, - 60 if thumbnail else self.max_cover_width, - 80 if thumbnail else self.max_cover_height) + thumb_width if thumbnail else self.max_cover_width, + thumb_height if thumbnail else self.max_cover_height) if not scaled: return cover - im = im.resize((int(width), int(height)), PILImage.ANTIALIAS) - of = cStringIO.StringIO() - im.convert('RGB').save(of, 'JPEG') - return of.getvalue() + return save_cover_data_to(img, 'img.jpg', return_data=True, + resize_to=(width, height)) except Exception, err: import traceback cherrypy.log.error('Failed to generate cover:') cherrypy.log.error(traceback.print_exc()) - raise cherrypy.HTTPError(404, 'Failed to generate cover: %s'%err) + raise cherrypy.HTTPError(404, 'Failed to generate cover: %r'%err) def get_format(self, id, format): format = format.upper() diff --git a/src/calibre/utils/magick/draw.py b/src/calibre/utils/magick/draw.py index 6808215554..5c978a27e0 100644 --- a/src/calibre/utils/magick/draw.py +++ b/src/calibre/utils/magick/draw.py @@ -25,6 +25,7 @@ def save_cover_data_to(data, path, bgcolor='#ffffff', resize_to=None, resize and the input and output image formats are the same, no changes are made. + :param data: Image data as bytestring or Image object :param compression_quality: The quality of the image after compression. Number between 1 and 100. 1 means highest compression, 100 means no compression (lossless). @@ -33,8 +34,11 @@ def save_cover_data_to(data, path, bgcolor='#ffffff', resize_to=None, ''' changed = False - img = Image() - img.load(data) + if isinstance(data, Image): + img = data + else: + img = Image() + img.load(data) orig_fmt = normalize_format_name(img.format) fmt = os.path.splitext(path)[1] fmt = normalize_format_name(fmt[1:]) From 217eedf8feaa443819b3467fc90acedc6566ca04 Mon Sep 17 00:00:00 2001 From: Kovid Goyal Date: Thu, 14 Oct 2010 19:42:12 -0600 Subject: [PATCH 30/30] ... --- src/calibre/manual/faq.rst | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/calibre/manual/faq.rst b/src/calibre/manual/faq.rst index 51660d2620..359cc4755f 100644 --- a/src/calibre/manual/faq.rst +++ b/src/calibre/manual/faq.rst @@ -387,6 +387,12 @@ solve it, look for a corrupted font file on your system, in ~/Library/Fonts or t check for corrupted fonts in OS X is to start the "Font Book" application, select all fonts and then in the File menu, choose "Validate fonts". + +I downloaded the installer, but it is not working? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Downloading from the internet can sometimes result in a corrupted download. If the |app| installer you downloaded is not opening, try downloading it again. If re-downloading it does not work, download it from `an alternate location `_. If the installer still doesn't work, then something on your computer is preventing it from running. Best place to ask for more help is in the `forums `_. + My antivirus program claims |app| is a virus/trojan? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~