# HG changeset patch # User Yves-Marie Haussonne <1218002+ymph@users.noreply.github.com> # Date 1302104319 -7200 # Node ID 1ea5f985e9f0790d8ecc04fa9110a38731a905dd # Parent 263ea20d9bfd4a45c5de717d0f5fbd144de9af90# Parent ca1822004e89a2037b5d86b61971fa03d32bcf90 Merge with c26dec204590b851bb9f427c75453313ee32ae22 diff -r ca1822004e89 -r 1ea5f985e9f0 script/lib/iri_tweet/models.py --- a/script/lib/iri_tweet/models.py Wed Apr 06 17:34:27 2011 +0200 +++ b/script/lib/iri_tweet/models.py Wed Apr 06 17:38:39 2011 +0200 @@ -1,10 +1,10 @@ -from sqlalchemy import Boolean, Table, Column, BigInteger, Integer, String, \ - MetaData, ForeignKey, DateTime, create_engine +from sqlalchemy import (Boolean, Column, BigInteger, Integer, String, ForeignKey, + DateTime, create_engine) from sqlalchemy.ext.declarative import declarative_base -from sqlalchemy.orm import relationship, backref +from sqlalchemy.orm import relationship +import anyjson import datetime import email.utils -import anyjson Base = declarative_base() @@ -12,11 +12,13 @@ APPLICATION_NAME = "IRI_TWITTER" CONSUMER_KEY = "54ThDZhpEjokcMgHJOMnQA" CONSUMER_SECRET = "wUoL9UL2T87tfc97R0Dff2EaqRzpJ5XGdmaN2XK3udA" +ACCESS_TOKEN_KEY = None +ACCESS_TOKEN_SECRET = None #ACCESS_TOKEN_KEY= "47312923-LiNTtz0I18YXMVIrFeTuhmH7bOvYsK6p3Ln2Dc" #ACCESS_TOKEN_SECRET = "r3LoXVcjImNAElUpWqTu2SG2xCdWFHkva7xeQoncA" def adapt_date(date_str): - ts = email.utils.parsedate_tz(date_str) + ts = email.utils.parsedate_tz(date_str) #@UndefinedVariable return datetime.datetime(*ts[0:7]) def adapt_json(obj): @@ -72,7 +74,24 @@ for key, value in kwargs.items(): if hasattr(self,key): setattr(self,key,value) + +class UserMessage(Base): + __tablename__ = "tweet_user_message" + + id = Column(Integer, primary_key = True) + user_id = Column(Integer, ForeignKey('tweet_user.id')) + created_at = Column(DateTime, default=datetime.datetime.now()) + message_id = Column(Integer, ForeignKey('tweet_message.id')) + +class Message(Base): + __tablename__ = "tweet_message" + + id = Column(Integer, primary_key = True) + created_at = Column(DateTime, default=datetime.datetime.now()) + text = Column(String) + users = relationship(UserMessage, backref='message') + class User(Base): __tablename__ = "tweet_user" @@ -112,12 +131,12 @@ utc_offset = Column(Integer) verified= Column(Boolean) tweets = relationship(Tweet, backref='user') + messages = relationship(UserMessage, backref='user') def __init__(self, **kwargs): for key, value in kwargs.items(): if hasattr(self,key): - setattr(self,key,value) - + setattr(self,key,value) class Hashtag(Base): diff -r ca1822004e89 -r 1ea5f985e9f0 script/lib/iri_tweet/models.pyc Binary file script/lib/iri_tweet/models.pyc has changed diff -r ca1822004e89 -r 1ea5f985e9f0 script/lib/iri_tweet/tweet_twitter_user.py --- a/script/lib/iri_tweet/tweet_twitter_user.py Wed Apr 06 17:34:27 2011 +0200 +++ b/script/lib/iri_tweet/tweet_twitter_user.py Wed Apr 06 17:38:39 2011 +0200 @@ -1,11 +1,16 @@ -from optparse import OptionParser -from utils import * -import models -from sqlalchemy.orm import sessionmaker, mapper -import logging +from iri_tweet.models import setup_database, Message, UserMessage, User +from iri_tweet.utils import (get_oauth_token, get_user_query, set_logging_options, + set_logging, parse_date) +from optparse import OptionParser #@UnresolvedImport +from sqlalchemy import BigInteger +from sqlalchemy.orm import sessionmaker +from sqlalchemy.schema import MetaData, Table, Column +from sqlalchemy.sql import and_ +import datetime +import logging #@UnresolvedImport +import sys import time import twitter -import sys APPLICATION_NAME = "Tweet recorder user" CONSUMER_KEY = "Vdr5ZcsjI1G3esTPI8yDg" @@ -34,6 +39,8 @@ help="password", metavar="PASSWORD") parser.add_option("-t", dest="token_filename", metavar="TOKEN_FILENAME", default=".oauth_token", help="Token file name") + parser.add_option("-S", dest="simulate", metavar="SIMULATE", default=False, action="store_true", help="Simulate call to twitter. Do not change the database") + parser.add_option("-f", dest="force", metavar="FORCE", default=False, action="store_true", help="force sending message to all user even if it has already been sent") set_logging_options(parser) @@ -47,21 +54,20 @@ set_logging(options) - logging.debug("OPTIONS : " + repr(options)) + logging.debug("OPTIONS : " + repr(options)) #@UndefinedVariable if not options.message or len(options.message) == 0: sys.exit() - engine, metadata = setup_database('sqlite:///'+options.database, echo=((options.verbose-options.quiet)>0), create_all = False) + engine, metadata = setup_database('sqlite:///'+options.database, echo=((options.verbose-options.quiet)>0), create_all = True) Session = sessionmaker() conn = engine.connect() try : - session = Session(bind=conn) + session = Session(bind=conn, autoflush=True, autocommit=True) try: metadata = MetaData(bind=conn) tweet_exclude_table = Table("tweet_exclude", metadata, Column('id', BigInteger, primary_key=True), prefixes=['TEMPORARY']) - #mapper(TweetExclude, tweet_exclude_table) metadata.create_all() start_date_str = options.start_date @@ -80,8 +86,18 @@ te = ts + duration end_date = start_date + datetime.timedelta(seconds=duration) + base_message = options.message.decode(sys.getfilesystemencoding()) + #get or create message + message_obj = session.query(Message).filter(Message.text == base_message).first() + if not message_obj : + message_obj = Message(text=base_message) + session.add(message_obj) + session.flush() + query = get_user_query(session, start_date, end_date, hashtags, tweet_exclude_table) - #query = query.filter(User.screen_name == "tibo_c") + + if not options.force: + query = query.outerjoin(UserMessage, and_(User.id == UserMessage.user_id, UserMessage.message_id == message_obj.id)).filter(UserMessage.message_id == None) query_res = query.all() @@ -91,12 +107,15 @@ for user in query_res: screen_name = user.screen_name - message = u"@%s: %s" % (screen_name, options.message.decode(sys.getfilesystemencoding())) - logging.debug("new status : " + message) - t.statuses.update(status=message) - - + message = u"@%s: %s" % (screen_name, base_message) + logging.debug("new status : " + message) #@UndefinedVariable + if not options.simulate: + t.statuses.update(status=message) + user_message = UserMessage(user_id=user.id, message_id=message_obj.id) + session.add(user_message) + session.flush() finally: + # if message created and simulate, do not session.close() finally: conn.close() diff -r ca1822004e89 -r 1ea5f985e9f0 script/lib/iri_tweet/utils.py --- a/script/lib/iri_tweet/utils.py Wed Apr 06 17:34:27 2011 +0200 +++ b/script/lib/iri_tweet/utils.py Wed Apr 06 17:38:39 2011 +0200 @@ -1,15 +1,17 @@ -from models import * -from sqlalchemy.sql import select, or_ -import anyjson +from models import Tweet, User, Hashtag, EntityHashtag, EntityUser, Url, \ + EntityUrl, CONSUMER_KEY, CONSUMER_SECRET, APPLICATION_NAME, ACCESS_TOKEN_KEY, \ + ACCESS_TOKEN_SECRET, adapt_date, adapt_json +from sqlalchemy.sql import select, or_ #@UnresolvedImport +import anyjson #@UnresolvedImport import datetime import email.utils -import logging +import logging #@UnresolvedImport import os.path import sys -import twitter -import twitter.oauth -import twitter.oauth_dance -import twitter_text +import twitter.oauth #@UnresolvedImport +import twitter.oauth_dance #@UnresolvedImport +import twitter_text #@UnresolvedImport + CACHE_ACCESS_TOKEN = {} @@ -22,7 +24,7 @@ return CACHE_ACCESS_TOKEN[application_name] if token_file_path and os.path.exists(token_file_path): - logging.debug("reading token from file %s" % token_file_path) + logging.debug("reading token from file %s" % token_file_path) #@UndefinedVariable CACHE_ACCESS_TOKEN[application_name] = twitter.oauth.read_token_file(token_file_path) return CACHE_ACCESS_TOKEN[application_name] #read access token info from path @@ -34,7 +36,7 @@ return CACHE_ACCESS_TOKEN[application_name] def parse_date(date_str): - ts = email.utils.parsedate_tz(date_str) + ts = email.utils.parsedate_tz(date_str) #@UndefinedVariable return datetime.datetime(*ts[0:7]) def clean_keys(dict_val): @@ -103,7 +105,7 @@ self.token_filename = token_filename def __get_user(self, user_dict): - logging.debug("Get user : " + repr(user_dict)) + logging.debug("Get user : " + repr(user_dict)) #@UndefinedVariable user_id = user_dict.get("id",None) user_name = user_dict.get("screen_name", user_dict.get("name", None)) @@ -130,8 +132,8 @@ else: user_dict = t.users.show(screen_name=user_name) except Exception as e: - logging.info("get_user : TWITTER ERROR : " + repr(e)) - logging.info("get_user : TWITTER ERROR : " + str(e)) + logging.info("get_user : TWITTER ERROR : " + repr(e)) #@UndefinedVariable + logging.info("get_user : TWITTER ERROR : " + str(e)) #@UndefinedVariable user_dict = adapt_fields(user_dict, fields_adapter["stream"]["user"]) if "id" not in user_dict: @@ -145,7 +147,7 @@ return user def __process_entity(self, ind, ind_type): - logging.debug("Process_entity : " + repr(ind) + " : " + repr(ind_type)) + logging.debug("Process_entity : " + repr(ind) + " : " + repr(ind_type)) #@UndefinedVariable ind = clean_keys(ind) @@ -200,7 +202,7 @@ 'urls' : process_urls }[ind_type]() - logging.debug("Process_entity entity_dict: " + repr(entity_dict)) + logging.debug("Process_entity entity_dict: " + repr(entity_dict)) #@UndefinedVariable if entity: self.session.add(entity) self.session.flush() @@ -217,7 +219,7 @@ # get or create user user = self.__get_user(self.json_dict["user"]) if user is None: - logging.warning("USER not found " + repr(self.json_dict["user"])) + logging.warning("USER not found " + repr(self.json_dict["user"])) #@UndefinedVariable ts_copy["user"] = None ts_copy["user_id"] = None else: @@ -265,7 +267,7 @@ user = self.__get_user(user_fields) if user is None: - logging.warning("USER not found " + repr(user_fields)) + logging.warning("USER not found " + repr(user_fields)) #@UndefinedVariable tweet_fields["user"] = None tweet_fields["user_id"] = None else: @@ -310,8 +312,8 @@ else: logging_config["filename"] = options.logfile - logging_config["level"] = max(logging.NOTSET, min(logging.CRITICAL, logging.WARNING - 10 * options.verbose + 10 * options.quiet)) - logging.basicConfig(**logging_config) + logging_config["level"] = max(logging.NOTSET, min(logging.CRITICAL, logging.WARNING - 10 * options.verbose + 10 * options.quiet)) #@UndefinedVariable + logging.basicConfig(**logging_config) #@UndefinedVariable options.debug = (options.verbose-options.quiet > 0) @@ -328,7 +330,7 @@ query = session.query(Tweet).join(EntityHashtag).join(Hashtag) if tweet_exclude_table is not None: - query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id]))) + query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id]))) #@UndefinedVariable query = query.filter(Tweet.created_at >= start_date).filter(Tweet.created_at <= end_date) @@ -338,7 +340,7 @@ return l htags = reduce(merge_hash, hashtags, []) - query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags))) + query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags))) #@UndefinedVariable return query @@ -347,7 +349,7 @@ query = session.query(User).join(Tweet).join(EntityHashtag).join(Hashtag) if tweet_exclude_table is not None: - query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id]))) + query = query.filter(~Tweet.id.in_(select([tweet_exclude_table.c.id]))) #@UndefinedVariable query = query.filter(Tweet.created_at >= start_date).filter(Tweet.created_at <= end_date) @@ -357,7 +359,7 @@ return l htags = reduce(merge_hash, hashtags, []) - query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags))) + query = query.filter(or_(*map(lambda h: Hashtag.text.contains(h), htags))) #@UndefinedVariable return query.distinct() diff -r ca1822004e89 -r 1ea5f985e9f0 script/lib/iri_tweet/utils.pyc Binary file script/lib/iri_tweet/utils.pyc has changed diff -r ca1822004e89 -r 1ea5f985e9f0 web/about.php --- a/web/about.php Wed Apr 06 17:34:27 2011 +0200 +++ b/web/about.php Wed Apr 06 17:38:39 2011 +0200 @@ -14,8 +14,8 @@ - - + + diff -r ca1822004e89 -r 1ea5f985e9f0 web/client.php --- a/web/client.php Wed Apr 06 17:34:27 2011 +0200 +++ b/web/client.php Wed Apr 06 17:38:39 2011 +0200 @@ -60,7 +60,7 @@ - + diff -r ca1822004e89 -r 1ea5f985e9f0 web/custom.css --- a/web/custom.css Wed Apr 06 17:34:27 2011 +0200 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,117 +0,0 @@ -/* ----------------------------------------------------------------------- - - - IRI - Live tweet annotation CSS - http://www.iri.centrepompidou.fr - - * Copyright (c) 2010-Present. See LICENSE for more info. (cecill-C) - * Contributor : Samuel Huron - ------------------------------------------------------------------------ */ - -body {background-image:url(images/bgd.jpg);background-repeat:repeat-x;background-color:#f7f6f6;font-family: 'PT Sans', arial, serif; } -textarea {margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdTxtArea.gif);background-repeat:no-repeat;border: none;} -.loginbutton{margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdUnconnect.gif);background-repeat:no-repeat;border: none;margin-bottom:10px;color:#fff;} -.loginlink{text-decoration:none;color:#fff;} -.menuLink:active {text-decoration:none;} -.menuLink:visited {text-decoration:none;} -h3{font-size: 1.5em;line-height: 1;margin-bottom: 0.3em;} - -#Aboutbox{background-image:url(images/about_bgd.jpg);background-repeat:no-repeat;width:600px;height:360px;overflow:auto; border:1px solid #fff;} -.lightBorder{padding:20px;} -.lightTitle{font-size: 48px;font-weight:900;color:#e6e6e6;font-family: 'Geo', arial, serif;line-height:80%} -.lightSubTitle{font-size: 24px;font-weight:bold;color:#262626; width:250px;line-height:80%} -.lightDescription{font-size: 12px;color:#000; width:288px;text-align:justify;margin-top:15px;} -.lightButton{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;} -.lightButton:active{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;} -.lightButton:over{text-decoration:none;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;} - - -.logo{padding-right:10px;float:left;} -.menu{float:left;height:62px;border-left:1px solid #c3c3c3;list-style-type:none;padding:0px;margin:0px;} -.menuUnderline{margin-left:0px;padding-left:0px;background-image:url(images/menu_underline.gif);background-repeat:no-repeat;background-position:left bottom; width:205px;margin-top:3px;} -.menuLink{text-decoration:none; margin:5px; color:#000} -.menuLink:active {text-decoration:none;} -.menuLink:visited {text-decoration:none;} - -.tweetContainer{position:absolute; margin-top:70px;} -.tweetWriter{background-image:url(images/tweetWriterBgd.gif);width:359px;height:136px;padding:10px;position:absolute; margin-top:70px;} -.tweetWriterTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;} -.tweetExplain{background-image:url(images/tweetExplainBgd.gif);width:359px;height:510px;padding:10px;position:absolute; margin-top:70px;} - -.tweetReader{width:377px;height:450px;position:absolute; margin-top:225px;border:1px solid #c3c3c3;background:#ffffff;} -.tweetButton{float:right;margin-right:5px;} - -.timelinePlayer{border:1px solid #c3c3c3;width:650px;height:650px;} -.videoLivePlayer{border:1px solid #c3c3c3;width:500px;height:375px;} -.videoLive{width:500px;height:378px;background:#fff;float:left;margin-top:20px;padding:5px;} -.videoLiveProgram{width:500px;margin-top:425px;margin-left:392px;position:absolute;} -.videoLiveProgram2{width:500px;margin-top:470px;margin-left:392px;position:absolute;} - -.videoLiveProgramTitle{color:#4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.5em;padding:5px;border:1px solid #c3c3c3;background-color:#efefef;background-image:url(images/bgdTitle.jpg);background-repeat:no-repeat;} -.videoLiveProgramDescription{padding:5px;border:1px solid #c3c3c3;padding:5px;border-top:none;background-color:#fff;background-image:url(images/bgdDescription.jpg);background-repeat:no-repeat;height:193px;overflow:scroll;} - - -.footer{margin-top:770px;width:900px;height:20px;position:absolute;text-align:center;} -.footerLink{text-decoration:none; margin:5px; color:#000;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.1em;} -.footerLink:active {text-decoration:none;} -.footerLink:visited {text-decoration:none;} - -.tooltip {display:none;background:transparent url(images/white_arrow.png);font-size:12px;height:70px;width:160px;padding:25px;color:#000;} - -.timeline{height:28px;border: 1px solid #ccc;} -.timeFragment {float:left;position:relative;float:left;} -.timeFrame {border-left: 1px solid #AAA;border-right: 1px solid #AAA;height:10px;float:left;position:relative;} -.bigTimeFrame {border-right: 1px solid #ccc;float:left;position:relative;} - -.arrowContainer{height:10px;width:100%;} - -.cleaner {clear:both;} -.txt{visibility:hidden;} - - -.clear { /* generic container (i.e. div) for floating buttons */ - overflow: hidden; - width: 100%; -} - -a.button_w { background: transparent url('images/bg_button_a_w.png') no-repeat scroll top right; color: #444;display: block;float: left;font: normal 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;} -a.button_w span { background: transparent url('images/bg_button_span_w.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;} - -a.button_b { background: transparent url('images/bg_button_a_b.png') no-repeat scroll top right; color: #fff;display: block;float: left;font: bold 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;} -a.button_b span { background: transparent url('images/bg_button_span_b.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;} - -#question{background: transparent url('images/bt_blue.png') no-repeat; width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } -#question:active {text-decoration:none;} -#question:visited {text-decoration:none;} -#reference{background: transparent url('images/bt_yellow.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } -#reference:active {text-decoration:none;} -#reference:visited {text-decoration:none;} -#positive{background: transparent url('images/bt_green.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } -#positive:active {text-decoration:none;} -#positive:visited {text-decoration:none;} -#negative{background: transparent url('images/bt_red.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } -#negative:active {text-decoration:none;} -#negative:visited {text-decoration:none;} - -.introBox{width:880px;height:280px;padding:10px;position:absolute; margin-top:70px;} -.aboutBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:70px;} -.archivesBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:450px;} -.archivesBoxContainer{padding:10px;width:880px;padding-bottom:0px;display:block; } -.archivesBoxClear { /* generic container (i.e. div) for floating buttons */ - overflow: hidden; - width: 100%; - background-image:url(images/archivesBoxBody.gif); - height:10px; -} -.archivesBoxFooter{background-repeat:no-repeat;background-position:left bottom;background-image:url(images/archivesBoxFooter.gif);width:100%;height:3px;} -.archivesBoxHeader{background-repeat:no-repeat;background-position:left top;background-image:url(images/archivesBoxHeader.gif);width:100%;height:3px;} - -.archivesTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size:24px;} -.archivesVideoBox{margin:5px;padding:5px;position:relative;display:inline-block;float:left;border: solid 1px #ccc;background:#f2f2f2;cursor:pointer;} -.AVBtitle{font-weight:bold;font-family: 'PT Sans Narrow', arial, serif; font-size:18px;} - -.slideTitle{font-size:20px;} -.slideText{font-size:15px;} -.slides{background-repeat:no-repeat;background-position:right top;} -#minilogo{background-repeat:no-repeat;background-position:left top;background-image:url(images/pol_color.gif);width:46px;height:10px;margin-top:50px;z-index:9;position:absolute;margin-left:100px;}} \ No newline at end of file diff -r ca1822004e89 -r 1ea5f985e9f0 web/index.php --- a/web/index.php Wed Apr 06 17:34:27 2011 +0200 +++ b/web/index.php Wed Apr 06 17:38:39 2011 +0200 @@ -39,8 +39,8 @@ - - + + @@ -199,10 +199,12 @@

Les derniers événements qui ont utilisé le tweet polemic :

- + + +
ENMI 2010
- par IRI au Centre Pompidou + par IRI au Centre Pompidou
les 14 et 15 décembre 2010 |· 08:30 - 10:30
@@ -213,7 +215,7 @@
Clay Shirky le net, le surplus cognitif
- par RSLN à Micorsoft France + par RSLN à Micorsoft France
le lundi 31 janvier 2011·| 08:30 - 10:30
@@ -224,7 +226,7 @@
OPENDATA
- par RSLN à Micorsoft France + par RSLN à Micorsoft France
le jeudi 17 mars 2011 | 14:30 - 17:15
diff -r ca1822004e89 -r 1ea5f985e9f0 web/res/css/custom.css --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/res/css/custom.css Wed Apr 06 17:38:39 2011 +0200 @@ -0,0 +1,117 @@ +/* ----------------------------------------------------------------------- + + + IRI - Live tweet annotation CSS + http://www.iri.centrepompidou.fr + + * Copyright (c) 2010-Present. See LICENSE for more info. (cecill-C) + * Contributor : Samuel Huron + +----------------------------------------------------------------------- */ + +body {background-image:url(images/bgd.jpg);background-repeat:repeat-x;background-color:#f7f6f6;font-family: 'PT Sans', arial, serif; } +textarea {margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdTxtArea.gif);background-repeat:no-repeat;border: none;} +.loginbutton{margin-left:3px;height: 60px;width: 330px;padding:5px;background-image:url(images/tweetWriterBgdUnconnect.gif);background-repeat:no-repeat;border: none;margin-bottom:10px;color:#fff;} +.loginlink{text-decoration:none;color:#fff;} +.menuLink:active {text-decoration:none;} +.menuLink:visited {text-decoration:none;} +h3{font-size: 1.5em;line-height: 1;margin-bottom: 0.3em;} + +#Aboutbox{background-image:url(images/about_bgd.jpg);background-repeat:no-repeat;width:600px;height:360px;overflow:auto; border:1px solid #fff;} +.lightBorder{padding:20px;} +.lightTitle{font-size: 48px;font-weight:900;color:#e6e6e6;font-family: 'Geo', arial, serif;line-height:80%} +.lightSubTitle{font-size: 24px;font-weight:bold;color:#262626; width:250px;line-height:80%} +.lightDescription{font-size: 12px;color:#000; width:288px;text-align:justify;margin-top:15px;} +.lightButton{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;} +.lightButton:active{width:134px;height:22px;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;} +.lightButton:over{text-decoration:none;background-image:url(images/bt_bgd_grey.jpg);background-repeat:no-repeat;} + + +.logo{padding-right:10px;float:left;} +.menu{float:left;height:62px;border-left:1px solid #c3c3c3;list-style-type:none;padding:0px;margin:0px;} +.menuUnderline{margin-left:0px;padding-left:0px;background-image:url(images/menu_underline.gif);background-repeat:no-repeat;background-position:left bottom; width:205px;margin-top:3px;} +.menuLink{text-decoration:none; margin:5px; color:#000} +.menuLink:active {text-decoration:none;} +.menuLink:visited {text-decoration:none;} + +.tweetContainer{position:absolute; margin-top:70px;} +.tweetWriter{background-image:url(images/tweetWriterBgd.gif);width:359px;height:136px;padding:10px;position:absolute; margin-top:70px;} +.tweetWriterTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;} +.tweetExplain{background-image:url(images/tweetExplainBgd.gif);width:359px;height:510px;padding:10px;position:absolute; margin-top:70px;} + +.tweetReader{width:377px;height:450px;position:absolute; margin-top:225px;border:1px solid #c3c3c3;background:#ffffff;} +.tweetButton{float:right;margin-right:5px;} + +.timelinePlayer{border:1px solid #c3c3c3;width:650px;height:650px;} +.videoLivePlayer{border:1px solid #c3c3c3;width:500px;height:375px;} +.videoLive{width:500px;height:378px;background:#fff;float:left;margin-top:20px;padding:5px;} +.videoLiveProgram{width:500px;margin-top:425px;margin-left:392px;position:absolute;} +.videoLiveProgram2{width:500px;margin-top:470px;margin-left:392px;position:absolute;} + +.videoLiveProgramTitle{color:#4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.5em;padding:5px;border:1px solid #c3c3c3;background-color:#efefef;background-image:url(images/bgdTitle.jpg);background-repeat:no-repeat;} +.videoLiveProgramDescription{padding:5px;border:1px solid #c3c3c3;padding:5px;border-top:none;background-color:#fff;background-image:url(images/bgdDescription.jpg);background-repeat:no-repeat;height:193px;overflow:scroll;} + + +.footer{margin-top:770px;width:900px;height:20px;position:absolute;text-align:center;} +.footerLink{text-decoration:none; margin:5px; color:#000;font-family: 'PT Sans Narrow', arial, serif;font-size: 1.1em;} +.footerLink:active {text-decoration:none;} +.footerLink:visited {text-decoration:none;} + +.tooltip {display:none;background:transparent url(images/white_arrow.png);font-size:12px;height:70px;width:160px;padding:25px;color:#000;} + +.timeline{height:28px;border: 1px solid #ccc;} +.timeFragment {float:left;position:relative;float:left;} +.timeFrame {border-left: 1px solid #AAA;border-right: 1px solid #AAA;height:10px;float:left;position:relative;} +.bigTimeFrame {border-right: 1px solid #ccc;float:left;position:relative;} + +.arrowContainer{height:10px;width:100%;} + +.cleaner {clear:both;} +.txt{visibility:hidden;} + + +.clear { /* generic container (i.e. div) for floating buttons */ + overflow: hidden; + width: 100%; +} + +a.button_w { background: transparent url('images/bg_button_a_w.png') no-repeat scroll top right; color: #444;display: block;float: left;font: normal 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;} +a.button_w span { background: transparent url('images/bg_button_span_w.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;} + +a.button_b { background: transparent url('images/bg_button_a_b.png') no-repeat scroll top right; color: #fff;display: block;float: left;font: bold 12px arial, sans-serif;height: 24px;margin-right: 6px;padding-right: 18px; text-decoration: none;} +a.button_b span { background: transparent url('images/bg_button_span_b.png') no-repeat; display: block;line-height: 14px; padding: 5px 0 5px 18px;} + +#question{background: transparent url('images/bt_blue.png') no-repeat; width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } +#question:active {text-decoration:none;} +#question:visited {text-decoration:none;} +#reference{background: transparent url('images/bt_yellow.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } +#reference:active {text-decoration:none;} +#reference:visited {text-decoration:none;} +#positive{background: transparent url('images/bt_green.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } +#positive:active {text-decoration:none;} +#positive:visited {text-decoration:none;} +#negative{background: transparent url('images/bt_red.png') no-repeat;width:32px;height:20px;text-decoration: none;font: normal 12px;color: #444;text-align:center; } +#negative:active {text-decoration:none;} +#negative:visited {text-decoration:none;} + +.introBox{width:880px;height:280px;padding:10px;position:absolute; margin-top:70px;} +.aboutBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:70px;} +.archivesBox{background-image:url(images/archivesBoxBody.gif);width:900px;position:absolute; margin-top:450px;} +.archivesBoxContainer{padding:10px;width:880px;padding-bottom:0px;display:block; } +.archivesBoxClear { /* generic container (i.e. div) for floating buttons */ + overflow: hidden; + width: 100%; + background-image:url(images/archivesBoxBody.gif); + height:10px; +} +.archivesBoxFooter{background-repeat:no-repeat;background-position:left bottom;background-image:url(images/archivesBoxFooter.gif);width:100%;height:3px;} +.archivesBoxHeader{background-repeat:no-repeat;background-position:left top;background-image:url(images/archivesBoxHeader.gif);width:100%;height:3px;} + +.archivesTitle{color:4b4b4b;font-family: 'PT Sans Narrow', arial, serif;font-size:24px;} +.archivesVideoBox{margin:5px;padding:5px;position:relative;display:inline-block;float:left;border: solid 1px #ccc;background:#f2f2f2;cursor:pointer;} +.AVBtitle{font-weight:bold;font-family: 'PT Sans Narrow', arial, serif; font-size:18px;} + +.slideTitle{font-size:20px;} +.slideText{font-size:15px;} +.slides{background-repeat:no-repeat;background-position:right top;} +#minilogo{background-repeat:no-repeat;background-position:left top;background-image:url(images/pol_color.gif);width:46px;height:10px;margin-top:50px;z-index:9;position:absolute;margin-left:100px;}} \ No newline at end of file diff -r ca1822004e89 -r 1ea5f985e9f0 web/res/metadataplayer/src/js/LdtPlayer.js diff -r ca1822004e89 -r 1ea5f985e9f0 web/res/metadataplayer/src/js/LdtPlayer.old.js diff -r ca1822004e89 -r 1ea5f985e9f0 web/rsln-opendata/index - Copie.php diff -r ca1822004e89 -r 1ea5f985e9f0 web/rsln/index.php.orig diff -r ca1822004e89 -r 1ea5f985e9f0 web/rsln/polemicaltimeline2.php diff -r ca1822004e89 -r 1ea5f985e9f0 web/rsln/polemicaltimeline3.php