Commits

pi11 committed 2a6059d Merge

update stable version with default

  • Participants
  • Parent commits 52eb016, 08ac1ab
  • Branches stable

Comments (0)

Files changed (354)

+#!/bin/bash
+dir=$(dirname $(which $0));
+cd $dir
+#JSDIR="./media/xxxflash/js"
+#cat $JSDIR/jquery-1.3.2.min.js \
+#$JSDIR/jquery-ui-1.8.11.custom.min.js \
+#$JSDIR/jquery.qtip-1.0.0-rc3.min.js \
+#$JSDIR/main.js > $JSDIR/builded.js
+
+CSSDIR="./media/xxxflash/css"
+cat $CSSDIR/style.css > $CSSDIR/builded.css
+python utils/slimcss.py $CSSDIR/builded.css
+
+
+
 class CustomUserAdmin(UserAdmin):
     list_display = ('username', 'email', 'is_staff','is_active',)
     list_filter = ('is_staff', 'is_superuser', 'is_active',)
+
 admin.site.register(User, CustomUserAdmin)
 
 class FlashAdmin(admin.ModelAdmin):
         }),
         ('Advanced options', {
             'classes': ('collapse',),
-            'fields': ('rate', 'views', 'active', 'publication_date',)
+            'fields': ('rate', 'views', 'active', 'publication_date', 'get_preview',)
         }),
     )
-    list_display = ('name',  'flashfile', 'game_type', 'user', 'rate', 'views',  'publication_date',)
-    list_filter = ('user', 'rate', 'publication_date', 'active')
+    readonly_fields = ('get_preview', )
+    list_display = ('name',  'flashfile', 'game_type', 'user', 'rate', 'views',  'publication_date', )
+    list_filter = ('theme', 'rate', 'publication_date', 'active')
     search_fields = ('name', "flashfile",)
     ordering = ('-publication_date', )
 
     pass
 
 class CommentAdmin(admin.ModelAdmin):
-    list_filter = ('user',)
     search_fields = ('text',)
     list_display = ("text", "publication_date")
     date_hierarchy = 'publication_date'
     pass
 
 class BanAdmin(admin.ModelAdmin):
-    pass
+    list_display = ("ip", "publication_date",)
+    search_fields = ("ip", )
+    ordering = ('-publication_date', )
+
+class BannedWordAdmin(admin.ModelAdmin):
+    list_display = ("word", "publication_date",)
+    search_fields = ("word", )
+    ordering = ('-publication_date', )
 
 admin.site.register(Flash,   FlashAdmin)
 admin.site.register(Theme,   ThemeAdmin)
 admin.site.register(Profile, ProfileAdmin)
 admin.site.register(Ban, BanAdmin)
+admin.site.register(BannedWord, BannedWordAdmin)

flash/management/commands/load_flash.py

 from flash.models import *
 from django.contrib.auth.models import User
 from django.core.management.base import BaseCommand, CommandError
-from local_settings import MEDIA_ROOT
+from django.conf import settings
+
 import hashlib, os, shutil
 import Image
 
-
-def get_size(infile):
-    try:
-        im = Image.open(infile)
-    except IOError,e:
-        print e.message
-        return False
-    return im.size
-
 def get_hash(filename):
     """
  
     dh=str(dh1)+str(dh2)
     return dh
 
-def create_thumb(infile, outfile):
-    try:
-        im = Image.open(infile)
-    except IOError,e:
-        print "Error opening image, deleting: ", infile
-        print e.message
-        os.remove(infile)
-        return False
-    size = im.size
-    ns = 150, 150
-    if im.mode != "RGB":
-        print "Trying to convert:",infile
-        try:
-            im = im.convert("RGB")
-        except Exception, e:
-    	    os.remove(infile)
-    	    print "cant convert, - removing ", infile
-    	    return False
-	
-    try:
-        im = im.resize(ns, Image.ANTIALIAS )        
-    except Exception,e:
-	try:
-	    os.remove(outfile)
-	except Exception, e:
-	    pass
-    
-        print "Error resizing", infile
-        print e.message
-        print "Deleting..."
-        os.remove(infile)
-        return False
-        
-    try:
-        im.save(outfile, "JPEG")        
-        #im.close()
-    except IOError, e:
-	os.remove(infile)
-	try:
-	    os.remove(outfile)
-	except Exception, e:
-	    pass
-        print "IOError"
-	print e
-        return False
-    return size
-
 
 class Command(BaseCommand):
     args = ''
     help = 'Load flash games'     
 
+    def handle(self, *args, **options):
+        i = 0
+        user = User.objects.get(username='Anonymous')
+        full_path = args[0] #'media/flashsex.ru/flashgames/'
+        theme_url = 'notheme' #root.replace('media/flashsex.ru/flashgames/tmp/','')
+        theme = Theme.objects.get(url=theme_url)
 
-    def handle(self, *args, **options):
-        i=0
-        user = User.objects.get(username='Anonymous')
-        full_path = 'media/flashsex.ru/flashgames/'
-        for root, dirs, files in os.walk('media/flashsex.ru/flashgames/tmp'):
+        for root, dirs, files in os.walk(full_path):
             for filename in files:
-                i = i + 1
+                i += 1
                 full_name = os.path.join(root, filename)
                 name, ext = os.path.splitext(filename)
-                if ext.lower()=='.swf':
-                    size = os.path.getsize(full_name)//1024
-                    if size>1000:
-                        size = str(size//1024)+" Mb"
-                    else:
-                        size = str(size)+" Kb"
-                    #print size
-                    theme_url = root.replace('media/flashsex.ru/flashgames/tmp/','')
-                    theme = Theme.objects.get(url=theme_url)
-                    dst_file = full_path+str(i)+".swf"
-                    #print dst_file
-                    #shutil.copyfile(full_name, dst_file)
-                    try:
-                        ft = open(full_name+".txt")
-                    except IOError:
-                        name = "Эротическая игра без названия"
-                        text = "Описания для этой порно игры пока нет."
-                    else:
-                        text = ft.read()
-                        ft.close()
-                        name = text.split('.')[0]
-                        text= text #unicode(text.split('.')[1:])
-                    im_filename = full_name+".jpg"
-                    im_size = get_size(im_filename)
-                    if im_size== False:
-                        im_filename = full_name+".png"
-                        im_size = get_size(im_filename)
-                    print im_size
-                    thumb = False
-                    if im_size!=False:
-                        output_im_filename = 'th/'+filename+".jpg"
-                        if im_size[0]!=150 and im_size[0]>100 and im_size[1]>100:
-                            res = create_thumb(im_filename, 'media/flashsex.ru/'+output_im_filename)
-                            if res:
-                                thumb = output_im_filename
-                        elif im_size[0]==150:
-                            shutil.copyfile(im_filename, 'media/flashsex.ru/'+output_im_filename)
-                            thumb = output_im_filename
-                    print thumb
+                if ext.lower() == '.swf':
+                    name = "Игра без названия"
+                    text = "Описания для этой порно игры пока нет."
                     fhash = get_hash(full_name)
                     flashes = Flash.objects.filter(datahash=fhash)
-                    if len(flashes)>0:
-                        if theme.url == 'notheme':
-                            pass
-                        else:
-                            new_theme = True
-                            for tmp_theme in flashes[0].theme.all():
-                                if tmp_theme == theme:
-                                    new_theme = False
-                            if new_theme:
-                                print "New theme! %s" %theme
-                                flashes[0].theme.add(theme)
+                    if len(flashes) > 0:
+                        pass
                     else:
-                        print "New flash!!! Ololololol"
-                        dst_file = full_path+str(i)+".swf"
+                        print "New flash - %s" % full_name
+                        dst_file = "%sswf/all/game-%s.swf" % (settings.MEDIA_ROOT, i)
                         print dst_file
-                        flashfile = "flashgames/%s.swf" %i
+                        #flashfile = "flashgames/%s.swf" % i
                         shutil.copyfile(full_name, dst_file)
-                        if thumb:
-                            tt = Flash(name = name[:150], description = text, user = user, flashfile = flashfile, thumbfile = thumb, filesize =size, datahash = fhash)
-                        else:
-                            tt = Flash(name = name[:150], description = text, user = user, flashfile = flashfile, filesize =size, datahash = fhash)
+                        mroot = settings.MEDIA_ROOT.replace("//", "/")
+                        tt = Flash(name=name, description=text, user=user, 
+                                   flashfile=dst_file.replace(mroot, ''), 
+                                   datahash=fhash, active=False)
                         tt.save()
                         tt.theme.add(theme)
 
-
-                                  
-                                
-                    
-                    
-        
-
-
-            
-
-

flash/management/commands/update_games_count.py

+# -*- coding: utf-8 -*-
+
+from flash.models import Theme, Flash
+from django.core.management.base import BaseCommand, CommandError
+
+
+
+class Command(BaseCommand):
+    args = ''
+    help = 'update games count'     
+
+
+    def handle(self, *args, **options):
+        for t in Theme.objects.all():
+            t.count = Flash.objects.filter(theme=t).count()
+            t.save()
+
     url = models.CharField(max_length=100)
     active = models.BooleanField()
     publication_date = models.DateField()
+    count = models.IntegerField(default=0)
+    order = models.IntegerField(default=0)
 
     def __unicode__(self):
         return self.name
         return ("theme", [self.url])
 
     class Meta:
-        ordering = ["name"]
+        ordering = ["-order", "name"]
 
     class Admin:
         list_display = ('name', 'active', 'publication_date',)
     publication_date = models.DateField(default=datetime.today())
     datahash = models.CharField(max_length=512, unique=True)
     is_posted = models.BooleanField(default=False)
+    width = models.IntegerField(default=0)
+    height = models.IntegerField(default=0)
+
+
+
+    def get_preview(self):
+        pr = """
+        <a style="cursor:pointer;" onclick="django.jQuery('#pr-%s').toggle()">Toggle View</a>
+        <div id="pr-%s" style="display:none;">
+        <object type="application/x-shockwave-flash" style="width:450px; height:450px;" data="%s%s"><param name="movie" value="%s%s" />
+	</object>
+        </div>
+        """ % (self.pk, self.pk, settings.MEDIA_URL, 
+               self.flashfile, settings.MEDIA_URL, 
+               self.flashfile)
+        return pr
+
+    get_preview.allow_tags = True
 
     def save(self, force_insert=False, force_update=False):
-
         if self.id is None:
             new = True
         else:
             new = False
+
+        if self.width == 0 or self.width is None:
+            try:
+                import hexagonit.swfheader
+            except ImportError:
+                pass
+            else:
+                self.flashfile.open()
+                try:
+                    metadata = hexagonit.swfheader.parse(self.flashfile)
+                except: 
+                    pass
+                else:
+                    self.width, self.height = metadata['width'], metadata['height']
+                    self.size = metadata['size']
+                finally:
+                    self.flashfile.close()
+
         super(Flash, self).save(force_insert, force_update)
-
         if new:
             if self.thumbfile and os.path.exists(self.thumbfile.path):
                 image = Image.open(self.thumbfile.path)
                 image = image.resize((350, 350), Image.ANTIALIAS)
                 image.save(self.thumbfile.path)
 
-
     def __unicode__(self):
         return self.name
 
 
     def clean(self):
         f = self.flashfile
-        data=f.read()
+        data = f.read()
         f.close()
-        m=hashlib.new("sha512")
-        m2=hashlib.new("sha512")
-        l=len(data)
+        m = hashlib.new("sha512")
+        m2 = hashlib.new("sha512")
+        l = len(data)
         m.update(data[:l])
         m2.update(data[l:])
         dh1 = m.hexdigest()
         dh2 = m2.hexdigest()
-        dh=str(dh1)+str(dh2)
+        dh = str(dh1)+str(dh2)
         self.datahash=dh
         try:
             f = Flash.objects.get(datahash=dh)
         return ('profiles_profile_detail', (), { 'username': self.user.username })
     get_absolute_url = models.permalink(get_absolute_url)
 
+
+class BannedWord(models.Model):
+    word = models.CharField(max_length=100, unique=True)
+    publication_date = models.DateTimeField(auto_now=True)
+
+    def __unicode__(self):
+        return self.word
 
 urlpatterns = patterns('',
 
-
     (r'^$', 'flash.views.index'),                       
     (r'^/upload$', 'views.upload'),
                        
     page_id = int(page_id)
     if page_id==1:
         first_page=True
-    themes = Theme.objects.all()
+    themes = Theme.objects.filter(active=True)
     #f = Flash.objects.filter(active=True, publication_date__lte=datetime.now())
     #total = f.count()
 
-    f = Flash.objects.filter(rate__gt=-2, active=True, publication_date__lte=datetime.now()).order_by(INDEX_ORDER_BY)
+    f = Flash.objects.filter(rate__gt=-2, active=True, publication_date__lte=datetime.now()).order_by(*INDEX_ORDER_BY)
     best = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by('-rate')[:5]
     random2 = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by('?')[:5]
     random = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by('?')[:7]
     theme = get_object_or_404(Theme, url=theme_url)
     user = get_user_object(request)
     profile = get_profile_object(user)
-    themes = Theme.objects.all()
+    themes = Theme.objects.filter(active=True)
     f = Flash.objects.filter(theme=theme, active=True, publication_date__lte=datetime.now()).order_by("-rate")
 
     paginator = Paginator(f, 10)
     pages = get_page_range(paginator, page_id)
     return locals()
 
+@never_cache
 @render_to("game.html")
 def game(request, game_id):
     random = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by('?')[:7]
     form = CommentForm()
-    themes = Theme.objects.all()
+    themes = Theme.objects.filter(active=True)
 
     try:
         g = Flash.objects.get(pk__exact=game_id)
     user = get_user_object(request)
     profile = get_profile_object(user)
     if g.active == False:
+        raise Http404
         game_under_moderation = True
         return locals()
 
     c, i = Ban.objects.get_or_create(ip=comment.ip)
     return HttpResponseRedirect("/?user_was_banned")
 
+@never_cache
 def add_comment(request):
     ua = request.META.get('HTTP_USER_AGENT', 'No user agent')[:250]
     ip = request.META.get('REMOTE_ADDR', 'No ip')
     is_baned = Ban.objects.filter(ip=ip).count()
-    if is_baned>0:
+    if is_baned > 0:
         return HttpResponseRedirect("http://natribu.org/")
 
     if request.method == 'POST':
         if form.is_valid():
             if request.POST["email"] != "":
                 return HttpResponseRedirect("/")
+            comment_text = form.cleaned_data["text"]
+            badwords = BannedWord.objects.all()
+            for bw in badwords:
+                if bw.word.lower() in comment_text.lower():
+                    # banned word
+                    return HttpResponseRedirect("http://natribu.org/")
+
             user = get_user_object(request)
             profile = get_profile_object(user)
             if profile is not None:
                 profile.score = profile.score + 3
                 profile.save()
             flash = Flash.objects.get(pk__exact = form.cleaned_data["flash_id"])
-            c = Comment(text = form.cleaned_data["text"], user=user, flash=flash, ip=ip, ua=ua)
+            c = Comment(text = comment_text, user=user, flash=flash, ip=ip, ua=ua)
             c.save()
             #return HttpResponse(json, mimetype='application/json')
             return HttpResponseRedirect("/game/"+str(form.cleaned_data["flash_id"])+"/?new")
         c.delete()
     return HttpResponseRedirect('/')
 
+@never_cache
 def mark(request):
     results = {'success':False}
     if is_anonymous(request):
         c = CMark(ip=request.META['REMOTE_ADDR'], mark=mark, flash=flash, publication_date=datetime.now())
         c.save()
     m = Mark.objects.filter(flash=flash)
-    if m.count()==1:
+    if m.count() == 1:
         m = Mark.objects.get(flash=flash)
         m.mark=m.mark + mark
         m.save()
 @render_to("best_and_popular.html")
 def best(request, page_id=1):
     base_url = '/best'
-    themes = Theme.objects.all()
+    themes = Theme.objects.filter(active=True)
     page_id = int(page_id)
     best = True
     f = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by("-rate")
 def popular(request, page_id=1):
     base_url = '/popular'
     popular = True
-    themes = Theme.objects.all()
+    themes = Theme.objects.filter(active=True)
     page_id = int(page_id)
     f = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by("-views")
     paginator = Paginator(f, _BEST_GAMES_COUNT)
 @never_cache
 @render_to('index.html')
 def random(request):
-    themes = Theme.objects.all()
+    themes = Theme.objects.filter(active=True)
     flashes = Flash.objects.filter(active=True, publication_date__lte=datetime.now()).order_by('?')[:GAMES_PER_PAGE]
     return locals()
 

local_settings.py.example

+DEBUG = True
+TEMPLATE_DEBUG = DEBUG
+DATABASE_ENGINE = 'postgresql_psycopg2'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_USER = ''             # Not used with sqlite3.
+DATABASE_PASSWORD = ''         # Not used with sqlite3.
+DATABASE_HOST = 'localhost'             # Set to empty string for localhost. Not used with sqlite3.
+DATABASE_PORT = ''             # Set to empty string for default. Not used with sqlite3.
+
+ABS_ROOT = ""
+
+TEMPLATE_DIRS = (
+    ABS_ROOT+"templates/flashsex.ru",
+)
+
+                
+MEDIA_URL = ""
+MEDIA_ROOT = ABS_ROOT+"media/flashsex.ru/"
+
+ADMINS = (
+    # ('Your Name', 'your_email@domain.com'),
+)
+MANAGERS = ADMINS
+                    
+ADMIN_MEDIA_PREFIX = "/amedia/"
+
+GAMES_PER_PAGE = 10
+INDEX_ORDER_BY = ["-publication_date", "-rate", "-views", "-id"]
+
+_BEST_GAMES_COUNT = 50
+#INSTALLED_APPS += ('uwsgi_admin',)
+SITE_URL = ""
+_PAGE_LINKS = 10

local_settings.py.template

+import os
 DEBUG = True
 #TEMPLATE_DEBUG = DEBUG
 DATABASES = {
 CACHE_MIDDLEWARE_SECONDS = 60*30
 CACHE_MIDDLEWARE_KEY_PREFIX = "flash_xxx"
 
-ABS_ROOT = "/work/htdocs/xxxflash/"
+ABS_ROOT = os.path.abspath(os.path.dirname(__file__))
 
 TEMPLATE_DIRS = (
-    ABS_ROOT+"templates/detskie-igry/",
+    os.path.join(ABS_ROOT, "templates/detskie-igry/"),
 )
 
 
 SITE_URL = "http://sitename/"
 MEDIA_URL = "http://localhost/xxxflash/media/detskie-igry/"
-MEDIA_ROOT = "/work/htdocs/xxxflash/media/detskie-igry/"
+MEDIA_ROOT = os.path.join(ABS_ROOT, "media/detskie-igry/")
 
 ADMINS = (
     # ('Your Name', 'your_email@domain.com'),
 B_USERNAME=""
 B_PASSWORD=""
 
+#TWITTER_CONSUMER_KEY = ""
+#TWITTER_CONSUMER_SECRET = ""
+
+#VKONTAKTE_APP_ID = 1234567
+#VKONTAKTE_API_KEY = "XXXX"
+#VKONTAKTE_SECRET_KEY = "XXXXXXXXX"

media/detskie-igry/images/Facebook.png

Added
New image

media/detskie-igry/images/Foursquare.png

Added
New image

media/detskie-igry/images/Google-Oauth.png

Added
New image

media/detskie-igry/images/Google-Oauth2.png

Added
New image

media/detskie-igry/images/Google.png

Added
New image

media/detskie-igry/images/Linkedin.png

Added
New image

media/detskie-igry/images/Livejournal.png

Added
New image

media/detskie-igry/images/OpenId.png

Added
New image

media/detskie-igry/images/Twitter.png

Added
New image

media/detskie-igry/images/Yahoo.png

Added
New image

media/detskie-igry/images/down.gif

Added
New image

media/detskie-igry/images/favicon.png

Added
New image

media/detskie-igry/images/games.png

Added
New image

media/detskie-igry/images/up.gif

Added
New image

media/detskie-igry/style.css

     font-family: "Trebuchet MS", "Palatino Linotype", Verdana, "Courier New", sans-serif; 
     font-size:16px; 
     border-top:4px #fff solid;
+    background-position:right bottom; 
+    background-repeat:no-repeat;
+    background-image: url("/images/games.png");
 }
 
 a {
-    color:#2e8b57; 
-    text-decoration:none
+    color:#00056C;/*#FFFE00;/*#2e8b57; */
+    text-decoration:none;
 }
 
+
 a:hover {
-    text-decoration:underline
+    text-decoration:underline;
+}
+.best ul li a {
+    font-size:18px;
+}
+
+
+.left_menu ul li a {
+    padding:3px;
+    color:#FF5B00;
+}
+.left_menu ul li {
+    padding:3px;
+}
+.left_menu ul li a:hover {
+    border:1px solid #FF5B00;
+    color: #fff;
+    background-color:#FF5B00;
+    border-radius:4px;
+    text-decoration:none;
 }
 
 a.mark{
 }
 a.title{
     font-size:20px;
+    padding:3px;
+    color:#FF5B00;
+
 }
+
+
 .root{ 
     width:980px; 
     margin:0 auto;
 }
 .top_container{
-	background-position:0 0;
-	background-repeat:no-repeat;
-	height:60px;
-	position:relative;
+    height:80px;
+    position:relative;
+
 }
 
 .top_text{
-	color:#afcd86;
+	color:#FF5B00;
 	font-size:25px;
-	clear:both
+	clear:both;
+}
+
+
+.top_text a{
+	color:#FF5B00;
 }
 
 .my_put { border:1px gray solid; }
 .tum1{border:1px #0000ff solid;}
 
 .footer{ 
-    border:1px #a0a0f5 solid; 
-    border-bottom:2px #a0a0f5 solid; 
+    border-top:1px #a0a0f5 solid; 
+/*    border-bottom:2px #a0a0f5 solid; */
     height:30px; 
     float:left; 
-    width:923px; 
+    width:100%; 
     margin-top:40px; 
     background-color:#fbfbfb;
     padding: 10px;
 }
 
 .title-1{
-    color: #FF0000;
+    color: #FF0000!important;
 }
 .title-2{
-    color: #02DA00;
+    color: #02DA00!important;
 }
 .title-3{
-    color: #FFF700;
+    color: #FFF700!important;
 }
 .title-4{
-    color: #000BFF;
+    color: #000BFF!important;
 }
 .title-5{
-    color: #FF00EF;
+    color: #FF00EF!important;
 }
 

media/flashsex.en/css/style.css

+* {margin:0; padding:0;}
+
+
+
+html {
+	margin:0;
+	padding:0;
+}
+
+
+img {
+border: 0;
+}
+
+#container {
+width: 1000px;
+margin: 0 auto;
+overflow: hidden;
+}
+
+#header {
+position: relative;
+height: 81px;
+width: 1000px;
+overflow: hidden;
+clear: both;
+}
+
+#logo {
+position: absolute;
+top: 15px;
+left: 17px;
+width: 261px;
+height: 56px;
+}
+
+#slogo {
+position: absolute;
+bottom: 10px;
+left: 290px;
+width: 280px;
+height: 20px;
+color: #d8b2d1;
+font-size: 14px;
+font-family: Myriad Pro;
+}
+
+#spanel {
+padding: 2px 0 0 22px;
+}
+
+#panel table {
+overflow: hidden;
+height: 30px;
+display: inline-block;
+}
+
+
+#panel p {
+padding: 0 0 0 30px;
+line-height: 1;
+}
+
+#panel td {
+}
+
+
+
+.sinput input{
+ background: none;
+ width: 124px;
+ padding: 4px 0 0 7px;
+ border: none;
+}
+
+#panel a {
+color: #f3d0ea;
+font-size: 12px;
+}
+
+
+#sidebar {
+width: 209px;
+float: left;
+padding: 0 0 0 7px;
+}
+
+#mainint {
+width: 730px;
+float: left;
+}
+
+
+#sidebar ul {
+padding: 15px 0 0 15px;
+}
+
+
+#sidebar li a {
+font-size: 14px;
+color: #654988;
+text-decoration: none;
+}
+
+#sidebar li a:hover {
+color: #b036b0;
+}
+
+.sidbtn {
+padding: 15px 0 35px 13px;
+}
+
+#info {
+color: #3a2b36;
+}
+
+#info p {
+padding: 5px 80px 10px 15px;
+}
+
+.cb {
+clear: both;
+overflow: hidden;
+width: 734px;
+margin: 0 0 10px 15px;
+}
+
+
+.cmen {
+text-align: center;
+}
+
+.cmen li {
+list-style: none;
+display: inline-block;
+}
+
+*:first-child+html .cmen li {
+display: block;
+float: left;
+}
+
+.cmen a {
+font-size: 14px;
+color: #654988;
+padding: 0 15px 0 25px;
+}
+
+.cmen a:hover {
+text-decoration: none;
+}
+
+
+.cb h3 {
+color: #b036b0;
+font-size: 18px;
+font-weight: normal;
+padding: 20px 0 5px 0;
+}
+
+
+.game_thumb {
+width: 310px;
+float: left;
+}
+
+.game_rate {
+padding: 15px 0 0 0;
+}
+
+.game_thumb a img {
+border: 5px solid #ffffff;
+}
+
+.game_thumb a:hover img {
+border: 5px solid #dd51dd;
+}
+
+.gameblock {
+    clear: both;
+    overflow: hidden;
+}
+
+.paging {
+float: right;
+padding: 10px 20px 20px 0;
+}
+
+.paging li {
+list-style: none;
+display: inline-block;
+}
+
+*:first-child+html .paging li  {
+display: block;
+float: left;
+}
+
+.paging a {
+font-size: 14px;
+color: #634489;
+padding: 3px 5px;
+}
+
+.paging a:hover, .paging .act {
+ text-decoration: none;
+ color: #ffffff;
+ background: #9e83c0;
+}
+
+#comments {
+padding: 0 10px;
+clear: both;
+overflow: hidden;
+color: #3d2b54;
+}
+
+#comments b {
+color: #634489;
+font-size: 14px;
+font-weight: normal;
+}
+
+#comments p {
+padding: 5px 0 13px 0;
+}
+
+#comments h3 {
+padding-bottom: 13px;
+}
+
+.ban3 {
+
+}
+
+.ban3 img {
+padding: 5px 0 2px 12px;
+}
+
+#footer a {
+color: #342a41;
+}
+
+#footer {
+padding: 10px 0 20px 255px;
+clear: both;
+overflow: hidden;
+}
+
+#footer p {
+padding: 0 0 2px 0;
+}
+
+
+.cb.inside h3 {
+padding: 3px 0 5px 6px;
+}
+
+.gameb_thumb img {
+border: 3px solid #ff6dde;
+}
+
+.gameb_thumb {
+padding: 0 0 0 10px;
+}
+
+.gameb_rate {
+text-align: right;
+padding: 0 13px 0 0;
+}
+
+.inser {
+padding: 0 15px;
+}
+
+.inser p{
+padding: 5px 0 0 0;
+}
+
+.inside .inser h3 {
+padding: 10px 0 15px 0;
+}
+
+.insercom {
+color: #441e44;
+}
+
+.insercom b {
+font-size: 14px;
+color: #441e44;
+}
+
+.insercom p {
+padding-bottom: 15px;
+}
+
+
+.forma table {
+padding: 8px 0 0 10px;
+}
+
+.forma input, .forma textarea {
+border: 1px solid #d0cdce;
+ -moz-border-radius: 10px;
+  border-radius: 10px;
+  padding: 1px 2px;
+}
+
+.off {
+    display:none;
+}
+a {
+    color: #654988;
+}
+div.avatar {
+float: left;
+    padding:20px;
+}
+div.profile_text{
+      text-align: left;
+}
+div.avatar {
+    float: left;
+    padding:10px;
+}
+
+.comment {
+    width:100%;
+    float:left;
+}
+.comment_header {
+    background-color:#F0E7F3;
+    -moz-border-radius: 5px;
+    border-radius: 5px;
+}
+
+.error {
+    color:red;
+    font-weight:bold;
+    padding:5px;
+    margin:10px;
+}
+fieldset {
+    padding: 10px;
+    border: 1px solid #D6D6D6;
+
+}
+.login {
+    padding:15px;
+    border: 1px solid #D6D6D6;
+    -moz-box-shadow: 10px 10px 5px #888;
+    -webkit-box-shadow: 10px 10px 5px #888;
+    box-shadow: 10px 10px 5px #888;
+    margin:5px;
+}
+.top {
+    width:98%;
+    background-color:#FFFAF0;
+    padding:5px;
+    -moz-border-radius: 15px;
+    border-radius: 15px;
+    border:1px solid #FFE0A4;
+
+}
+
+
+
+body {
+	margin: 0;
+	padding: 0;
+	background: url(/images/bg.jpg);
+	color: #443a51;
+	font-family: arial, tahoma, verdana;
+	font-size: 12px;
+	line-height: 1.5;
+}
+
+
+#panel {
+position: absolute;
+top: 0px;
+right: 3px;
+width: 420px;
+height: 62px;
+background: url(/images/panel.png) no-repeat;
+color: #f3d0ea;
+
+}
+
+.sinput {
+background: url(/images/sinput.gif) no-repeat;
+width: 144px;
+height: 26px;
+padding: 0 4px 0 0;
+}
+#main {
+background: url(/images/mt.png) repeat-y;
+overflow: hidden;
+}
+
+#maintop {
+background: url(/images/mttop.png) no-repeat top left;
+height: 29px;
+overflow: hidden;
+clear: both;
+}
+
+#main2 {
+background: url(/images/mainint.jpg) no-repeat center top;
+overflow: hidden;
+width: 981px;
+margin: 0 0 0 9px;
+}
+#sidebar h2 {
+background: url(/images/he.gif) no-repeat;
+width: 179px;
+height: 41px;
+font-size: 18px;
+color: #634489;
+font-weight: normal;
+text-align: center;
+padding: 6px 0 0 0;
+margin: 0 0 0 10px;
+overflow: hidden;
+}
+#sidebar li {
+ background: url(/images/sel.gif) no-repeat left center;
+padding: 0 0 0 23px;
+list-style: none;
+}
+.cb_top {
+background: url(/images/cbt.png) no-repeat left;
+height: 13px;
+}
+
+.cb_bot {
+background: url(/images/cbb.png) no-repeat left;
+height: 13px;
+}
+
+.cb_cen {
+background: url(/images/cbc.png) repeat-y center;
+overflow: hidden;
+padding: 0 10px;
+}
+.game {
+width: 100%;
+overflow: hidden;
+float: left;
+background: url(/images/bl.gif) no-repeat 0 bottom;
+margin: 0 15px 10px 0;
+}
+
+.game_des {
+background: url(/images/bl2.gif) repeat-y right;
+float: left;
+width: 280px;
+padding: 0px 28px 0 10px;
+}
+
+#c1 {
+background: url(/images/c1.gif) no-repeat left center;
+font-size:20px;
+paddging-top:5px;
+}
+
+#c2 {
+background: url(/images/c2.gif) no-repeat left center;
+font-size:20px;
+paddging-top:5px;
+}
+
+#c3 {
+background: url(/images/c3.gif) no-repeat left center;
+}
+#mainbot {
+background: url(/images/mtbot.png) no-repeat left;
+height: 26px;
+margin: 0 0 50px 0;
+}
+
+.forma {
+background: url(/images/form.gif) no-repeat;
+width: 413px;
+height: 213px;
+font-size: 12px;
+color: #614377;
+}
+

media/flashsex.en/images/Facebook.png

Added
New image

media/flashsex.en/images/Foursquare.png

Added
New image

media/flashsex.en/images/Google-Oauth.png

Added
New image

media/flashsex.en/images/Google-Oauth2.png

Added
New image

media/flashsex.en/images/Google.png

Added
New image

media/flashsex.en/images/Linkedin.png

Added
New image

media/flashsex.en/images/Livejournal.png

Added
New image

media/flashsex.en/images/OpenId.png

Added
New image

media/flashsex.en/images/Twitter.png

Added
New image

media/flashsex.en/images/Yahoo.png

Added
New image

media/flashsex.en/images/bg.jpg

Added
New image

media/flashsex.en/images/bl.gif

Added
New image

media/flashsex.en/images/bl2.gif

Added
New image

media/flashsex.en/images/c1.gif

Added
New image

media/flashsex.en/images/c2.gif

Added
New image

media/flashsex.en/images/c3.gif

Added
New image

media/flashsex.en/images/cbb.png

Added
New image

media/flashsex.en/images/cbc.png

Added
New image

media/flashsex.en/images/cbt.png

Added
New image

media/flashsex.en/images/enter.gif

Added
New image

media/flashsex.en/images/favicon.png

Added
New image

media/flashsex.en/images/form.gif

Added
New image

media/flashsex.en/images/he.gif

Added
New image

media/flashsex.en/images/logo.gif

Added
New image

media/flashsex.en/images/mainint.jpg

Added
New image

media/flashsex.en/images/mt.png

Added
New image

media/flashsex.en/images/mtbot.png

Added
New image

media/flashsex.en/images/mttop.png

Added
New image

media/flashsex.en/images/noimage.jpg

Added
New image

media/flashsex.en/images/panel.png

Added
New image

media/flashsex.en/images/re.gif

Added
New image

media/flashsex.en/images/rf.gif

Added
New image

media/flashsex.en/images/sample.jpg

Added
New image

media/flashsex.en/images/sample2.jpg

Added
New image

media/flashsex.en/images/sample3.jpg

Added
New image

media/flashsex.en/images/sample4.jpg

Added
New image

media/flashsex.en/images/sel.gif

Added
New image

media/flashsex.en/images/send.gif

Added
New image

media/flashsex.en/images/sinput.gif

Added
New image

media/flashsex.en/images/star.png

Added
New image

media/flashsex.en/images/upload.gif

Added
New image

media/flashsex.en/js/bookmark.js

+function getBrowserInfo() {
+ var t,v = undefined;
+ if (window.opera) t = 'Opera';
+ else if (document.all) {
+  t = 'IE';
+  var nv = navigator.appVersion;
+  var s = nv.indexOf('MSIE')+5;
+  v = nv.substring(s,s+1);
+ }
+ else if (navigator.appName) t = 'Netscape';
+ return {type:t,version:v};
+}
+ 
+function bookmark(a){
+ var url = window.document.location;
+ var title = window.document.title;
+ var b = getBrowserInfo();
+ if (b.type == 'IE' && 7 > b.version && b.version >= 4) window.external.AddFavorite(url,title);
+ else if (b.type == 'Opera') {
+  a.href = url;
+  a.rel = "sidebar";
+  a.title = url+','+title;
+  return true;
+ }
+ else if (b.type == "Netscape") window.sidebar.addPanel(title,url,"");
+ else alert("Нажмите CTRL-D, чтобы добавить страницу в закладки.");
+ return false;
+}

media/flashsex.en/js/jquery-1.3.2.js

+/*!
+ * jQuery JavaScript Library v1.3.2
+ * http://jquery.com/
+ *
+ * Copyright (c) 2009 John Resig
+ * Dual licensed under the MIT and GPL licenses.
+ * http://docs.jquery.com/License
+ *
+ * Date: 2009-02-19 17:34:21 -0500 (Thu, 19 Feb 2009)
+ * Revision: 6246
+ */
+(function(){
+
+var 
+	// Will speed up references to window, and allows munging its name.
+	window = this,
+	// Will speed up references to undefined, and allows munging its name.
+	undefined,
+	// Map over jQuery in case of overwrite
+	_jQuery = window.jQuery,
+	// Map over the $ in case of overwrite
+	_$ = window.$,
+
+	jQuery = window.jQuery = window.$ = function( selector, context ) {
+		// The jQuery object is actually just the init constructor 'enhanced'
+		return new jQuery.fn.init( selector, context );
+	},
+
+	// A simple way to check for HTML strings or ID strings
+	// (both of which we optimize for)
+	quickExpr = /^[^<]*(<(.|\s)+>)[^>]*$|^#([\w-]+)$/,
+	// Is it a simple selector
+	isSimple = /^.[^:#\[\.,]*$/;
+
+jQuery.fn = jQuery.prototype = {
+	init: function( selector, context ) {
+		// Make sure that a selection was provided
+		selector = selector || document;
+
+		// Handle $(DOMElement)
+		if ( selector.nodeType ) {
+			this[0] = selector;
+			this.length = 1;
+			this.context = selector;
+			return this;
+		}
+		// Handle HTML strings
+		if ( typeof selector === "string" ) {
+			// Are we dealing with HTML string or an ID?
+			var match = quickExpr.exec( selector );
+
+			// Verify a match, and that no context was specified for #id
+			if ( match && (match[1] || !context) ) {
+
+				// HANDLE: $(html) -> $(array)
+				if ( match[1] )
+					selector = jQuery.clean( [ match[1] ], context );
+
+				// HANDLE: $("#id")
+				else {
+					var elem = document.getElementById( match[3] );
+
+					// Handle the case where IE and Opera return items
+					// by name instead of ID
+					if ( elem && elem.id != match[3] )
+						return jQuery().find( selector );
+
+					// Otherwise, we inject the element directly into the jQuery object
+					var ret = jQuery( elem || [] );
+					ret.context = document;
+					ret.selector = selector;
+					return ret;
+				}
+
+			// HANDLE: $(expr, [context])
+			// (which is just equivalent to: $(content).find(expr)
+			} else
+				return jQuery( context ).find( selector );
+
+		// HANDLE: $(function)
+		// Shortcut for document ready
+		} else if ( jQuery.isFunction( selector ) )
+			return jQuery( document ).ready( selector );
+
+		// Make sure that old selector state is passed along
+		if ( selector.selector && selector.context ) {
+			this.selector = selector.selector;
+			this.context = selector.context;
+		}
+
+		return this.setArray(jQuery.isArray( selector ) ?
+			selector :
+			jQuery.makeArray(selector));
+	},
+
+	// Start with an empty selector
+	selector: "",
+
+	// The current version of jQuery being used
+	jquery: "1.3.2",
+
+	// The number of elements contained in the matched element set
+	size: function() {
+		return this.length;
+	},
+
+	// Get the Nth element in the matched element set OR
+	// Get the whole matched element set as a clean array
+	get: function( num ) {
+		return num === undefined ?
+
+			// Return a 'clean' array
+			Array.prototype.slice.call( this ) :
+
+			// Return just the object
+			this[ num ];
+	},
+
+	// Take an array of elements and push it onto the stack
+	// (returning the new matched element set)
+	pushStack: function( elems, name, selector ) {
+		// Build a new jQuery matched element set
+		var ret = jQuery( elems );
+
+		// Add the old object onto the stack (as a reference)
+		ret.prevObject = this;
+
+		ret.context = this.context;
+
+		if ( name === "find" )
+			ret.selector = this.selector + (this.selector ? " " : "") + selector;
+		else if ( name )
+			ret.selector = this.selector + "." + name + "(" + selector + ")";
+
+		// Return the newly-formed element set
+		return ret;
+	},
+
+	// Force the current matched set of elements to become
+	// the specified array of elements (destroying the stack in the process)
+	// You should use pushStack() in order to do this, but maintain the stack
+	setArray: function( elems ) {
+		// Resetting the length to 0, then using the native Array push
+		// is a super-fast way to populate an object with array-like properties
+		this.length = 0;