@ -1,5 +0,0 @@ |
||||
*.pyc |
||||
*.pyo |
||||
*.~ |
||||
*.egg-info |
||||
.idea/ |
||||
@ -1,4 +0,0 @@ |
||||
*.pyc |
||||
*.pyo |
||||
*.~ |
||||
*.egg-info |
||||
@ -1,36 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.contrib import admin |
||||
from django.contrib.auth.models import Group |
||||
from django.contrib.auth.admin import UserAdmin |
||||
|
||||
from models import User |
||||
from forms import UserCreationForm, UserChangeForm |
||||
|
||||
|
||||
|
||||
|
||||
|
||||
class UserAdmin(UserAdmin): |
||||
|
||||
form = UserChangeForm |
||||
add_form = UserCreationForm |
||||
|
||||
list_display = ('email', 'first_name', 'last_name', 'is_admin',) |
||||
list_filter = ('is_admin',) |
||||
|
||||
fieldsets = ( |
||||
(None, {'fields': ('email', 'first_name', 'last_name', 'password')}), |
||||
(None, {'fields': ('url', 'country', 'city', 'position', |
||||
'about', 'phone', 'avatar', 'web_page', |
||||
'social', 'title', 'descriptions', 'keywords', |
||||
'is_admin', 'is_active')}), |
||||
|
||||
) |
||||
add_fieldsets = ( |
||||
(None, {'classes': ('wide',), 'fields': ('email','first_name', 'last_name', 'password1', 'password2')}), |
||||
) |
||||
ordering = ('email',) |
||||
filter_horizontal = () |
||||
|
||||
admin.site.register(User, UserAdmin) |
||||
admin.site.unregister(Group) |
||||
@ -1,101 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django import forms |
||||
from django.contrib.auth.forms import ReadOnlyPasswordHashField |
||||
from models import User, TranslatorProfile |
||||
from country.models import Country |
||||
from city.models import City |
||||
from company.models import Company |
||||
from organiser.models import Organiser |
||||
|
||||
class UserCreationForm(forms.ModelForm): |
||||
password1 = forms.CharField(label='Пароль', widget=forms.PasswordInput(render_value=False)) |
||||
password2 = forms.CharField(label='Повторите пароль', widget=forms.PasswordInput(render_value=False)) |
||||
|
||||
class Meta: |
||||
model = User |
||||
fields = ('email', 'first_name', 'last_name') |
||||
|
||||
def clean_email(self): |
||||
""" |
||||
checking if user already exist |
||||
""" |
||||
email = self.cleaned_data.get('email') |
||||
try: |
||||
User.objects.get(email=email) |
||||
except User.DoesNotExist: |
||||
return email |
||||
raise forms.ValidationError('Пользователь с таким email уже существует') |
||||
|
||||
def clean_password2(self): |
||||
password1 = self.cleaned_data.get('password1') |
||||
password2 = self.cleaned_data.get('password2') |
||||
|
||||
if password1 and password2 and password1 != password2: |
||||
raise forms.ValidationError('Пароли не совпадают') |
||||
return password2 |
||||
|
||||
|
||||
|
||||
def save(self, commit=True): |
||||
user = super(UserCreationForm, self).save(commit=False) |
||||
user.set_password(self.cleaned_data['password2']) |
||||
|
||||
if commit: |
||||
user.save() |
||||
|
||||
return user |
||||
|
||||
class UserChangeForm(forms.ModelForm): |
||||
password = ReadOnlyPasswordHashField() |
||||
|
||||
class Meta: |
||||
model = User |
||||
|
||||
def clean_password(self): |
||||
return self.initial['password'] |
||||
|
||||
class UserForm(forms.ModelForm): |
||||
country = forms.ModelChoiceField(label='Страна', queryset=Country.objects.all(), empty_label=None, required=False) |
||||
city = forms.ModelChoiceField(label='Город', queryset=City.objects.all(), empty_label=None, required=False) |
||||
company = forms.ModelChoiceField(label='Компания', queryset=Company.objects.all(), empty_label=None, required=False) |
||||
organiser = forms.ModelChoiceField(label='Организатор', queryset=Organiser.objects.all(), empty_label=None, required=False) |
||||
title = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) |
||||
descriptions = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) |
||||
keywords = forms.CharField(widget=forms.TextInput(attrs={'style':'width: 550px'}), required=False) |
||||
class Meta: |
||||
model = User |
||||
exclude = ('last_login', 'password', 'is_active', 'is_admin', 'is_superuser', 'is_staff' |
||||
'date_joined', 'date_registered', 'date_modified') |
||||
|
||||
|
||||
def clean_phone(self): |
||||
""" |
||||
phone code checking |
||||
""" |
||||
cleaned_data = super(UserForm, self).clean() |
||||
phone = cleaned_data.get('phone') |
||||
if not phone: |
||||
return |
||||
|
||||
deduct = ('-','(',')','.',' ') |
||||
for elem in deduct: |
||||
phone = phone.replace(elem, '') |
||||
if phone.isdigit(): |
||||
return phone |
||||
else: |
||||
raise forms.ValidationError('Введите правильный код страны') |
||||
|
||||
def clean_web_page(self): |
||||
cleaned_data = super(UserForm, self).clean() |
||||
web_page = cleaned_data.get('web_page') |
||||
import socket |
||||
try: |
||||
socket.getaddrinfo(web_page, 80) |
||||
return web_page |
||||
except: |
||||
return forms.ValidationError('Введите правильный адрес страници') |
||||
|
||||
class TranslatorForm(forms.ModelForm): |
||||
class Meta: |
||||
model = TranslatorProfile |
||||
exclude = ('user') |
||||
@ -1,188 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.db import models |
||||
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser, PermissionsMixin |
||||
from django.core.mail import send_mail |
||||
from django.utils import timezone |
||||
from django.db.models.signals import post_save |
||||
""" |
||||
from django.contrib.auth.hashers import check_password |
||||
from hashlib import md5 |
||||
from django.contrib.auth import get_user_model |
||||
|
||||
from django.db.models import get_model |
||||
""" |
||||
|
||||
class UserManager(BaseUserManager): |
||||
""" |
||||
Creates and saves a User with the given email, first_name, last_name and password. |
||||
""" |
||||
def create_user(self, email, first_name, last_name, password=None, **extra_fields): |
||||
now = timezone.now() |
||||
if not email: |
||||
raise ValueError('Вы должни ввести электронную почту') |
||||
|
||||
user= self.model( |
||||
email = UserManager.normalize_email(email),first_name = first_name,last_name = last_name, |
||||
is_staff=False, is_active=True, is_superuser=False, |
||||
last_login=now, date_joined=now, **extra_fields |
||||
) |
||||
|
||||
user.set_password(password) |
||||
user.save(using=self._db) |
||||
return user |
||||
|
||||
def create_superuser(self, email, first_name, last_name, password, **extra_fields): |
||||
if not email: |
||||
raise ValueError('Вы должни ввести электронную почту') |
||||
|
||||
user = self.create_user( |
||||
email = UserManager.normalize_email(email), |
||||
first_name = first_name,last_name = last_name, |
||||
password = password, **extra_fields |
||||
) |
||||
|
||||
user.is_staff = True |
||||
user.is_active = True |
||||
user.is_superuser = True |
||||
user.is_admin = True |
||||
user.save(using=self._db) |
||||
return user |
||||
|
||||
|
||||
class User(AbstractBaseUser, PermissionsMixin): |
||||
""" |
||||
Implementing a fully featured User model with |
||||
admin-compliant permissions. |
||||
|
||||
Email, first name, last name and password are required. Other fields are optional. |
||||
""" |
||||
email = models.EmailField( |
||||
verbose_name = 'Электронная почта', |
||||
max_length = 255, |
||||
unique = True, |
||||
db_index = True, |
||||
) |
||||
first_name = models.CharField(verbose_name='Имя', max_length=255) |
||||
last_name = models.CharField(verbose_name='Фамилия', max_length=255) |
||||
# |
||||
is_active = models.BooleanField(default=1) # СДЕЛАТЬ проверку на емейле |
||||
is_staff = models.BooleanField(default=0) |
||||
is_admin = models.BooleanField(default=0) |
||||
is_translator = models.BooleanField(verbose_name='Переводчик', default=0) |
||||
date_joined = models.DateTimeField(auto_now_add=True) |
||||
date_registered = models.DateTimeField(blank=True, null=True)# |
||||
date_modified = models.DateTimeField(auto_now=True) |
||||
#relations |
||||
country = models.ForeignKey('country.Country', verbose_name='Страна', blank=True, null=True, related_name='users') |
||||
city = models.ForeignKey('city.City', verbose_name='Город', blank=True, null=True) |
||||
company = models.ForeignKey('company.Company', blank=True, null=True) |
||||
organiser = models.ForeignKey('organiser.Organiser', blank=True, null=True) |
||||
#other user information |
||||
phone = models.PositiveIntegerField(verbose_name='Телефон', blank=True, null=True) |
||||
url = models.CharField(verbose_name='URL', max_length=255, blank=True) |
||||
position = models.CharField(verbose_name='Должность', max_length=255, blank=True) |
||||
about = models.TextField(verbose_name='О себе', blank=True) |
||||
avatar = models.ImageField(verbose_name='Фото', upload_to='/accounts/avatar/', blank=True) |
||||
web_page = models.CharField(verbose_name='Вебсайт', max_length=255, blank=True) |
||||
social = models.TextField(verbose_name='Социальные страници', blank=True) |
||||
#meta |
||||
title = models.CharField(max_length=255, blank=True) |
||||
descriptions = models.CharField(max_length=255, blank=True) |
||||
keywords = models.CharField(max_length=255, blank=True) |
||||
# |
||||
objects = UserManager() |
||||
|
||||
USERNAME_FIELD = 'email' |
||||
REQUIRED_FIELDS = ['first_name', 'last_name'] |
||||
|
||||
def get_full_name(self): |
||||
""" |
||||
Returns the first_name plus the last_name, with a space in between. |
||||
""" |
||||
return u'%s %s'%(self.first_name, self.last_name) |
||||
|
||||
def __unicode__(self): |
||||
return self.email |
||||
|
||||
def get_short_name(self): |
||||
"Returns the short name for the user." |
||||
return self.first_name |
||||
|
||||
def email_user(self, subject, message, from_email=None): |
||||
""" |
||||
Sends an email to this User. |
||||
""" |
||||
send_mail(subject, message, from_email, [self.email]) |
||||
|
||||
def has_perm(self, perm, obj=None): |
||||
return True |
||||
|
||||
def has_module_perms(self, app_label): |
||||
return True |
||||
|
||||
""" |
||||
class MyUserAuthBackend(object): |
||||
def check_md5_password(self, db_password, supplied_password): |
||||
return md5(supplied_password).hex_digest(), db_password |
||||
|
||||
def authenticate(self, username=None, password=None, **kwargs): |
||||
# Authenticate a user based on email address as the user name. |
||||
UserModel = get_user_model() |
||||
if username is None: |
||||
username = kwargs.get(UserModel.USERNAME_FIELD) |
||||
try: |
||||
user = UserModel._default_manager.get_by_natural_key(username) |
||||
if check_password(password, user.password): |
||||
# user.set_password(password) |
||||
# user.save() |
||||
return user |
||||
#if user.check_password(password): |
||||
# return user |
||||
except UserModel.DoesNotExist: |
||||
return None |
||||
|
||||
|
||||
|
||||
def get_user(self, user_id): |
||||
try: |
||||
UserModel = get_user_model() |
||||
return UserModel._default_manager.get(pk=user_id) |
||||
except UserModel.DoesNotExist: |
||||
return None |
||||
""" |
||||
|
||||
class TranslatorProfile(models.Model): |
||||
""" |
||||
Extra information about tranlators |
||||
""" |
||||
#required field, relation with user model |
||||
user = models.ForeignKey(User, related_name='translator') |
||||
#other fields |
||||
education = models.CharField(verbose_name='Образование', max_length=255, blank=True) |
||||
specialization = models.CharField(verbose_name='Специализация', max_length=255, blank=True) |
||||
languages = models.CharField(verbose_name='Языки', max_length=255, blank=True) |
||||
native_language= models.CharField(verbose_name='Родной язык', max_length=255, blank=True) |
||||
car = models.BooleanField(verbose_name='Личный автомобиль', default=0) |
||||
prices = models.TextField(verbose_name='Тарифы', blank=True) |
||||
discounts = models.TextField(verbose_name='Скидки', blank=True) |
||||
|
||||
def __unicode__(self): |
||||
return self.user.email |
||||
|
||||
|
||||
def create_translator_profile(sender, **kw): |
||||
""" |
||||
create Translator profile if "is_translator" field in User model true |
||||
if it's false delete Translator profile connected to User |
||||
""" |
||||
user = kw["instance"] |
||||
if user.is_translator: |
||||
translator = TranslatorProfile(user=user) |
||||
translator.save() |
||||
else: |
||||
try: |
||||
TranslatorProfile.objects.get(user = user).delete() |
||||
except: pass |
||||
|
||||
|
||||
post_save.connect(create_translator_profile, sender=User) |
||||
@ -1,68 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
{% load static %} |
||||
|
||||
{% block scripts %} |
||||
{% endblock %} |
||||
|
||||
{% block body%} |
||||
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} |
||||
<fieldset> |
||||
<legend><i class="icon-edit"></i>Создать администратора</legend> |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i> </h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# email #} |
||||
<div class="control-group {% if form.email.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.email.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.email }} |
||||
<span class="help-inline">{{ form.email.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# password1 #} |
||||
<div class="control-group {% if form.password1.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.password1.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.password1 }} |
||||
<span class="help-inline">{{ form.password1.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# password2 #} |
||||
<div class="control-group {% if form.password2.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.password2.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.password2 }} |
||||
<span class="help-inline">{{ form.password2.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# first_name #} |
||||
<div class="control-group {% if form.first_name.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.first_name.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.first_name }} |
||||
<span class="help-inline">{{ form.first_name.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# last_name #} |
||||
<div class="control-group {% if form.last_name.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.last_name.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.last_name }} |
||||
<span class="help-inline">{{ form.last_name.errors }}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="controls"> |
||||
<input class="btn btn-large btn-primary" type="submit" value="Добавить"> |
||||
<input class="btn btn-large" type="reset" value="Отмена"> |
||||
</div> |
||||
|
||||
</fieldset> |
||||
</form> |
||||
|
||||
{% endblock %} |
||||
@ -1,75 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
|
||||
|
||||
{% block body %} |
||||
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} |
||||
<fieldset> |
||||
<legend><i class="icon-edit"></i>Изменить переводчика</legend> |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i>Информация</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# education #} |
||||
<div class="control-group {% if form.education.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.education.label }}:</label> |
||||
<div class="controls">{{ form.education }} |
||||
<span class="help-inline">{{ form.education.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# specialization #} |
||||
<div class="control-group {% if form.specialization.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.specialization.label }}:</label> |
||||
<div class="controls">{{ form.specialization }} |
||||
<span class="help-inline">{{ form.specialization.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# languages #} |
||||
<div class="control-group {% if form.languages.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.languages.label }}:</label> |
||||
<div class="controls">{{ form.languages }} |
||||
<span class="help-inline">{{ form.languages.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# native_language #} |
||||
<div class="control-group {% if form.native_language.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.native_language.label }}:</label> |
||||
<div class="controls">{{ form.native_language }} |
||||
<span class="help-inline">{{ form.native_language.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# car #} |
||||
<div class="control-group {% if form.car.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.car.label }}:</label> |
||||
<div class="controls">{{ form.car }} |
||||
<span class="help-inline">{{ form.car.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# prices #} |
||||
<div class="control-group {% if form.prices.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.prices.label }}:</label> |
||||
<div class="controls">{{ form.prices }} |
||||
<span class="help-inline">{{ form.prices.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# discounts #} |
||||
<div class="control-group {% if form.discounts.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.discounts.label }}:</label> |
||||
<div class="controls">{{ form.discounts }} |
||||
<span class="help-inline">{{ form.discounts.errors }}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="controls"> |
||||
<input class="btn btn-large btn-primary" type="submit" value="Добавить"> |
||||
<input class="btn btn-large" type="reset" value="Отмена"> |
||||
</div> |
||||
</div> |
||||
|
||||
</fieldset> |
||||
</form> |
||||
|
||||
{% endblock %} |
||||
@ -1,60 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
|
||||
{% block body %} |
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-arrow-down"></i>Список переводчиков</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
<table class="table table-hover"> |
||||
<thead> |
||||
<tr> |
||||
<th>id</th> |
||||
<th>Email</th> |
||||
<th>Полное имя</th> |
||||
<th>Переводчик</th> |
||||
<th> </th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for item in users %} |
||||
|
||||
<tr> |
||||
<td>{{ item.id }}</td> |
||||
<td>{{ item.email }}</td> |
||||
<td>{{ item.get_full_name }}</td> |
||||
|
||||
{% if item.is_translator %} |
||||
<td>Да</td> |
||||
{% else %} |
||||
<td> </td> |
||||
{% endif %} |
||||
<td class="center sorting_1"> |
||||
<a class="btn btn-info" href="/accounts/translators/{{ item.id }}"> |
||||
<i class="icon-edit icon-white"></i> Изменить |
||||
</a> |
||||
</td> |
||||
</tr> |
||||
|
||||
{% endfor %} |
||||
</tbody> |
||||
</table> |
||||
|
||||
</div> |
||||
{# pagination #} |
||||
<div class="pagination pagination-centered"> |
||||
<ul> |
||||
{% if users.has_previous %} |
||||
<li> <a href="?page={{ users.previous_page_number }}">←</a></li> |
||||
{% endif %} |
||||
|
||||
{% if users.has_next %} |
||||
<li><a href="?page={{ users.next_page_number }}">→</a></li> |
||||
{% endif %} |
||||
</ul> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
{% endblock %} |
||||
@ -1,68 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
{% load static %} |
||||
|
||||
{% block body %} |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-arrow-down"></i>Список пользователей</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
<table class="table table-hover"> |
||||
<thead> |
||||
<tr> |
||||
<th>id</th> |
||||
<th>Email</th> |
||||
<th>Полное имя</th> |
||||
<th>Админ</th> |
||||
<th>Переводчик</th> |
||||
<th> </th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for item in users %} |
||||
|
||||
<tr> |
||||
<td>{{ item.id }}</td> |
||||
<td>{{ item.email }}</td> |
||||
<td>{{ item.get_full_name }}</td> |
||||
{% if item.is_admin %} |
||||
<td>Да</td> |
||||
{% else %} |
||||
<td> </td> |
||||
{% endif %} |
||||
|
||||
{% if item.is_translator %} |
||||
<td>Да</td> |
||||
{% else %} |
||||
<td> </td> |
||||
{% endif %} |
||||
<td class="center sorting_1"> |
||||
<a class="btn btn-info" href="/accounts/change/{{ item.id }}"> |
||||
<i class="icon-edit icon-white"></i> Изменить |
||||
</a> |
||||
</td> |
||||
</tr> |
||||
|
||||
{% endfor %} |
||||
</tbody> |
||||
</table> |
||||
|
||||
</div> |
||||
{# pagination #} |
||||
<div class="pagination pagination-centered"> |
||||
<ul> |
||||
{% if users.has_previous %} |
||||
<li> <a href="?page={{ users.previous_page_number }}">←</a></li> |
||||
{% endif %} |
||||
|
||||
{% if users.has_next %} |
||||
<li><a href="?page={{ users.next_page_number }}">→</a></li> |
||||
{% endif %} |
||||
</ul> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
|
||||
{% endblock %} |
||||
@ -1,219 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
{% load static %} |
||||
|
||||
{% block scripts %} |
||||
|
||||
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
||||
{# selects #} |
||||
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||
<script src="{% static 'js/select/select2.js' %}"></script> |
||||
<script src="{% static 'custom_js/make_select.js' %}"></script> |
||||
|
||||
<script> |
||||
$(document).ready(function(){ |
||||
$('#rst_pswd').click(function(){ |
||||
$.get( |
||||
"/accounts/reset_password_email/", {'email': $('#id_email').val()}, function(j){ |
||||
alert(j); |
||||
}); |
||||
return false; |
||||
}) |
||||
}) |
||||
|
||||
</script> |
||||
|
||||
|
||||
{% endblock %} |
||||
|
||||
{% block body %} |
||||
<form method="post" class="form-horizontal" enctype="multipart/form-data"> {% csrf_token %} |
||||
<fieldset> |
||||
<legend><i class="icon-edit"></i>Изменить пользователя</legend> |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i> Основная информация</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# email #} |
||||
<div class="control-group {% if form.email.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.email.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.email }} |
||||
<span class="help-inline">{{ form.email.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# first_name #} |
||||
<div class="control-group {% if form.first_name.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.first_name.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.first_name }} |
||||
<span class="help-inline">{{ form.first_name.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# last_name #} |
||||
<div class="control-group {% if form.last_name.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.last_name.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.last_name }} |
||||
<span class="help-inline">{{ form.last_name.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# url #} |
||||
<div class="control-group {% if form.url.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.url.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.url }} |
||||
<span class="help-inline">{{ form.url.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# country #} |
||||
<div class="control-group {% if form.country.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.country.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.country }} |
||||
<span class="help-inline">{{ form.country.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# city #} |
||||
<div class="control-group {% if form.city.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.city.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.city }} |
||||
<span class="help-inline">{{ form.city.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# position #} |
||||
<div class="control-group {% if form.position.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.position.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.position }} |
||||
<span class="help-inline">{{ form.position.errors }}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i> Дополнительная информация</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# avatar #} |
||||
<div class="control-group {% if form.avatar.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.avatar.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.avatar }} |
||||
<span class="help-inline">{{ form.avatar.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# about #} |
||||
<div class="control-group {% if form.about.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.about.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.about }} |
||||
<span class="help-inline">{{ form.about.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# phone #} |
||||
<div class="control-group {% if form.phone.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.phone.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.phone }} |
||||
<span class="help-inline">{{ form.phone.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# web_page #} |
||||
<div class="control-group {% if form.web_page.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.web_page.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.web_page }} |
||||
<span class="help-inline">{{ form.web_page.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# social #} |
||||
<div class="control-group {% if form.social.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.social.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.social }} |
||||
<span class="help-inline">{{ form.social.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# company #} |
||||
<div class="control-group {% if form.company.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.company.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.company }} |
||||
<span class="help-inline">{{ form.company.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# organiser #} |
||||
<div class="control-group {% if form.organiser.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.organiser.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.organiser }} |
||||
<span class="help-inline">{{ form.organiser.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# is_translator #} |
||||
<div class="control-group {% if form.is_translator.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.is_translator.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.is_translator }} |
||||
<span class="help-inline">{{ form.is_translator.errors }}</span> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i>Мета данные</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# descriptions #} |
||||
<div class="control-group {% if form.descriptions.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.descriptions.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.descriptions }} |
||||
<span class="help-inline">{{ form.descriptions.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# title #} |
||||
<div class="control-group {% if form.title.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.title.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.title }} |
||||
<span class="help-inline">{{ form.title.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# keywords #} |
||||
<d iv class="control-group {% if form.keywords.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.keywords.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.keywords }} |
||||
<span class="help-inline">{{ form.keywords.errors }}</span> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
<div class="controls"> |
||||
<input class="btn btn-large btn-primary" type="submit" value="Добавить"> |
||||
<input class="btn btn-large" type="reset" value="Отмена"> |
||||
</div> |
||||
</div> |
||||
|
||||
</fieldset> |
||||
</form> |
||||
|
||||
|
||||
|
||||
{% comment %} |
||||
{% for field in form %} |
||||
|
||||
{{ field }} |
||||
|
||||
{% endfor %} |
||||
{% endcomment %} |
||||
|
||||
{% endblock %} |
||||
@ -1,16 +0,0 @@ |
||||
""" |
||||
This file demonstrates writing tests using the unittest module. These will pass |
||||
when you run "manage.py test". |
||||
|
||||
Replace this with more appropriate tests for your application. |
||||
""" |
||||
|
||||
from django.test import TestCase |
||||
|
||||
|
||||
class SimpleTest(TestCase): |
||||
def test_basic_addition(self): |
||||
""" |
||||
Tests that 1 + 1 always equals 2. |
||||
""" |
||||
self.assertEqual(1 + 1, 2) |
||||
@ -1,16 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, include, url |
||||
from django.contrib.auth.views import login, logout |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^login/', login, {'template_name': 'admin/login.html' }), |
||||
url(r'^logout', logout, {'next_page': '/accounts/login/'}), |
||||
url(r'^create_admin/$', 'accounts.views.create_admin'), |
||||
url(r'^create_md5user/$', 'accounts.views.create_md5'), |
||||
url(r'^change/(?P<user_id>\d+).*/$', 'accounts.views.user_change'), |
||||
url(r'^all/$', 'accounts.views.user_all'), |
||||
url(r'^translators/$', 'accounts.views.translators'), |
||||
url(r'^translators/(?P<user_id>\d+)/$', 'accounts.views.translator_change'), |
||||
url(r'^reset_password_email/$', 'accounts.views.reset_password_email'), |
||||
|
||||
) |
||||
@ -1,157 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.shortcuts import render_to_response |
||||
from django.http import HttpResponseRedirect, HttpResponse |
||||
from django.core.context_processors import csrf |
||||
from django.conf import settings |
||||
from django.contrib.auth.decorators import login_required |
||||
from django.core.mail import send_mail |
||||
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage |
||||
#models and forms |
||||
from models import User |
||||
from forms import UserForm, UserCreationForm, TranslatorForm |
||||
|
||||
from hashlib import md5 |
||||
|
||||
@login_required |
||||
def user_all(request): |
||||
""" |
||||
Return list of all users with pagination |
||||
""" |
||||
user_list = User.objects.all() |
||||
paginator = Paginator(user_list, 10)#show 10 items per page |
||||
page = request.GET.get('page') |
||||
try: |
||||
users = paginator.page(page) |
||||
except PageNotAnInteger: |
||||
# If page is not an integer, deliver first page. |
||||
users = paginator.page(1) |
||||
except EmptyPage: |
||||
# If page is out of range (e.g. 9999), deliver last page of results. |
||||
users = paginator.page(paginator._num_pages) |
||||
return render_to_response('user_all.html', {'users': users}) |
||||
|
||||
def translators(request): |
||||
""" |
||||
Return list of user filtered by "is_translator" field (list of translators) |
||||
""" |
||||
user_list = User.objects.filter(is_translator='True') |
||||
paginator = Paginator(user_list, 10)#show 10 items per page |
||||
page = request.GET.get('page') |
||||
try: |
||||
users = paginator.page(page) |
||||
except PageNotAnInteger: |
||||
# If page is not an integer, deliver first page. |
||||
users = paginator.page(1) |
||||
except EmptyPage: |
||||
# If page is out of range (e.g. 9999), deliver last page of results. |
||||
users = paginator.page(paginator._num_pages) |
||||
return render_to_response('translators.html', {'users': users}) |
||||
|
||||
|
||||
def translator_change(request, user_id): |
||||
""" |
||||
Return form of translator and post it on the server. |
||||
If form is posted redirect on the page of all translators. |
||||
""" |
||||
try: |
||||
user = User.objects.get(id=user_id) |
||||
#get translator information by reverse relation |
||||
#related_name="translator" in TranslatorProfile model |
||||
translator = user.translator.get(user=user) |
||||
except: |
||||
return HttpResponseRedirect('/accounts/translators/') |
||||
|
||||
if request.POST: |
||||
form = TranslatorForm(request.POST, instance=translator) |
||||
if form.is_valid(): |
||||
form.save() |
||||
return HttpResponseRedirect('/accounts/translators') |
||||
else: |
||||
form = TranslatorForm(instance=translator) |
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
|
||||
args['form'] = form |
||||
|
||||
return render_to_response('translator_change.html', args) |
||||
|
||||
|
||||
|
||||
def user_change(request, user_id): |
||||
""" |
||||
Return form of user and post it on the server. |
||||
If form is posted redirect on the page of all users. |
||||
""" |
||||
try: |
||||
user = User.objects.get(id=user_id) |
||||
except: |
||||
return HttpResponseRedirect('/accounts/all') |
||||
|
||||
if request.POST: |
||||
form = UserForm(request.POST, instance=user) |
||||
if form.is_valid(): |
||||
form.save() |
||||
return HttpResponseRedirect('/accounts/all') |
||||
else: |
||||
form = UserForm(instance=user) |
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
|
||||
args['form'] = form |
||||
|
||||
return render_to_response('user_change.html', args) |
||||
|
||||
def create_admin(request): |
||||
if request.POST: |
||||
form = UserCreationForm(request.POST) |
||||
if form.is_valid(): |
||||
user = form.save(commit=False) |
||||
user.is_admin = False |
||||
user.save() |
||||
return HttpResponseRedirect('/accounts/all') |
||||
|
||||
else: |
||||
form = UserCreationForm() |
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
args['form'] = form |
||||
|
||||
return render_to_response('create_admin.html', args) |
||||
|
||||
def create_md5(request): |
||||
if request.POST: |
||||
form = UserCreationForm(request.POST) |
||||
if form.is_valid(): |
||||
user = User() |
||||
user.email = request.POST['email'] |
||||
user.first_name = request.POST['first_name'] |
||||
user.last_name = request.POST['last_name'] |
||||
user.password = md5(request.POST['password2']).hexdigest() |
||||
user.is_admin = True |
||||
user.save() |
||||
|
||||
return HttpResponseRedirect('/accounts/all') |
||||
|
||||
else: |
||||
form = UserCreationForm() |
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
args['form'] = form |
||||
|
||||
return render_to_response('create_admin.html', args) |
||||
|
||||
def reset_password_email(request): |
||||
""" |
||||
|
||||
""" |
||||
if request.GET: |
||||
user = User.objects.get(email=request.GET['email']) |
||||
user.set_password(u'qwerty') |
||||
user.save() |
||||
return HttpResponse('success') |
||||
else: |
||||
return HttpResponse('error') |
||||
@ -1,839 +0,0 @@ |
||||
/* |
||||
DJANGO Admin styles |
||||
*/ |
||||
|
||||
body { |
||||
margin: 0; |
||||
padding: 0; |
||||
font-size: 12px; |
||||
font-family: "Lucida Grande","DejaVu Sans","Bitstream Vera Sans",Verdana,Arial,sans-serif; |
||||
color: #333; |
||||
background: #fff; |
||||
} |
||||
|
||||
/* LINKS */ |
||||
|
||||
a:link, a:visited { |
||||
color: #5b80b2; |
||||
text-decoration: none; |
||||
} |
||||
|
||||
a:hover { |
||||
color: #036; |
||||
} |
||||
|
||||
a img { |
||||
border: none; |
||||
} |
||||
|
||||
a.section:link, a.section:visited { |
||||
color: white; |
||||
text-decoration: none; |
||||
} |
||||
|
||||
/* GLOBAL DEFAULTS */ |
||||
|
||||
p, ol, ul, dl { |
||||
margin: .2em 0 .8em 0; |
||||
} |
||||
|
||||
p { |
||||
padding: 0; |
||||
line-height: 140%; |
||||
} |
||||
|
||||
h1,h2,h3,h4,h5 { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
h1 { |
||||
font-size: 18px; |
||||
color: #666; |
||||
padding: 0 6px 0 0; |
||||
margin: 0 0 .2em 0; |
||||
} |
||||
|
||||
h2 { |
||||
font-size: 16px; |
||||
margin: 1em 0 .5em 0; |
||||
} |
||||
|
||||
h2.subhead { |
||||
font-weight: normal; |
||||
margin-top: 0; |
||||
} |
||||
|
||||
h3 { |
||||
font-size: 14px; |
||||
margin: .8em 0 .3em 0; |
||||
color: #666; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
h4 { |
||||
font-size: 12px; |
||||
margin: 1em 0 .8em 0; |
||||
padding-bottom: 3px; |
||||
} |
||||
|
||||
h5 { |
||||
font-size: 10px; |
||||
margin: 1.5em 0 .5em 0; |
||||
color: #666; |
||||
text-transform: uppercase; |
||||
letter-spacing: 1px; |
||||
} |
||||
|
||||
ul li { |
||||
list-style-type: square; |
||||
padding: 1px 0; |
||||
} |
||||
|
||||
ul.plainlist { |
||||
margin-left: 0 !important; |
||||
} |
||||
|
||||
ul.plainlist li { |
||||
list-style-type: none; |
||||
} |
||||
|
||||
li ul { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
li, dt, dd { |
||||
font-size: 11px; |
||||
line-height: 14px; |
||||
} |
||||
|
||||
dt { |
||||
font-weight: bold; |
||||
margin-top: 4px; |
||||
} |
||||
|
||||
dd { |
||||
margin-left: 0; |
||||
} |
||||
|
||||
form { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
fieldset { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
blockquote { |
||||
font-size: 11px; |
||||
color: #777; |
||||
margin-left: 2px; |
||||
padding-left: 10px; |
||||
border-left: 5px solid #ddd; |
||||
} |
||||
|
||||
code, pre { |
||||
font-family: "Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace; |
||||
background: inherit; |
||||
color: #666; |
||||
font-size: 11px; |
||||
} |
||||
|
||||
pre.literal-block { |
||||
margin: 10px; |
||||
background: #eee; |
||||
padding: 6px 8px; |
||||
} |
||||
|
||||
code strong { |
||||
color: #930; |
||||
} |
||||
|
||||
hr { |
||||
clear: both; |
||||
color: #eee; |
||||
background-color: #eee; |
||||
height: 1px; |
||||
border: none; |
||||
margin: 0; |
||||
padding: 0; |
||||
font-size: 1px; |
||||
line-height: 1px; |
||||
} |
||||
|
||||
/* TEXT STYLES & MODIFIERS */ |
||||
|
||||
.small { |
||||
font-size: 11px; |
||||
} |
||||
|
||||
.tiny { |
||||
font-size: 10px; |
||||
} |
||||
|
||||
p.tiny { |
||||
margin-top: -2px; |
||||
} |
||||
|
||||
.mini { |
||||
font-size: 9px; |
||||
} |
||||
|
||||
p.mini { |
||||
margin-top: -3px; |
||||
} |
||||
|
||||
.help, p.help { |
||||
font-size: 10px !important; |
||||
color: #999; |
||||
} |
||||
|
||||
img.help-tooltip { |
||||
cursor: help; |
||||
} |
||||
|
||||
p img, h1 img, h2 img, h3 img, h4 img, td img { |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
.quiet, a.quiet:link, a.quiet:visited { |
||||
color: #999 !important; |
||||
font-weight: normal !important; |
||||
} |
||||
|
||||
.quiet strong { |
||||
font-weight: bold !important; |
||||
} |
||||
|
||||
.float-right { |
||||
float: right; |
||||
} |
||||
|
||||
.float-left { |
||||
float: left; |
||||
} |
||||
|
||||
.clear { |
||||
clear: both; |
||||
} |
||||
|
||||
.align-left { |
||||
text-align: left; |
||||
} |
||||
|
||||
.align-right { |
||||
text-align: right; |
||||
} |
||||
|
||||
.example { |
||||
margin: 10px 0; |
||||
padding: 5px 10px; |
||||
background: #efefef; |
||||
} |
||||
|
||||
.nowrap { |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
/* TABLES */ |
||||
|
||||
table { |
||||
border-collapse: collapse; |
||||
border-color: #ccc; |
||||
} |
||||
|
||||
td, th { |
||||
font-size: 11px; |
||||
line-height: 13px; |
||||
border-bottom: 1px solid #eee; |
||||
vertical-align: top; |
||||
padding: 5px; |
||||
font-family: "Lucida Grande", Verdana, Arial, sans-serif; |
||||
} |
||||
|
||||
th { |
||||
text-align: left; |
||||
font-size: 12px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
thead th, |
||||
tfoot td { |
||||
color: #666; |
||||
padding: 2px 5px; |
||||
font-size: 11px; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; |
||||
border-left: 1px solid #ddd; |
||||
border-bottom: 1px solid #ddd; |
||||
} |
||||
|
||||
tfoot td { |
||||
border-bottom: none; |
||||
border-top: 1px solid #ddd; |
||||
} |
||||
|
||||
thead th:first-child, |
||||
tfoot td:first-child { |
||||
border-left: none !important; |
||||
} |
||||
|
||||
thead th.optional { |
||||
font-weight: normal !important; |
||||
} |
||||
|
||||
fieldset table { |
||||
border-right: 1px solid #eee; |
||||
} |
||||
|
||||
tr.row-label td { |
||||
font-size: 9px; |
||||
padding-top: 2px; |
||||
padding-bottom: 0; |
||||
border-bottom: none; |
||||
color: #666; |
||||
margin-top: -1px; |
||||
} |
||||
|
||||
tr.alt { |
||||
background: #f6f6f6; |
||||
} |
||||
|
||||
.row1 { |
||||
background: #EDF3FE; |
||||
} |
||||
|
||||
.row2 { |
||||
background: white; |
||||
} |
||||
|
||||
/* SORTABLE TABLES */ |
||||
|
||||
thead th { |
||||
padding: 2px 5px; |
||||
line-height: normal; |
||||
} |
||||
|
||||
thead th a:link, thead th a:visited { |
||||
color: #666; |
||||
} |
||||
|
||||
thead th.sorted { |
||||
background: #c5c5c5 url(../img/nav-bg-selected.gif) top left repeat-x; |
||||
} |
||||
|
||||
thead th.sorted .text { |
||||
padding-right: 42px; |
||||
} |
||||
|
||||
table thead th .text span { |
||||
padding: 2px 5px; |
||||
display:block; |
||||
} |
||||
|
||||
table thead th .text a { |
||||
display: block; |
||||
cursor: pointer; |
||||
padding: 2px 5px; |
||||
} |
||||
|
||||
table thead th.sortable:hover { |
||||
background: white url(../img/nav-bg-reverse.gif) 0 -5px repeat-x; |
||||
} |
||||
|
||||
thead th.sorted a.sortremove { |
||||
visibility: hidden; |
||||
} |
||||
|
||||
table thead th.sorted:hover a.sortremove { |
||||
visibility: visible; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions { |
||||
display: block; |
||||
padding: 4px 5px 0 5px; |
||||
float: right; |
||||
text-align: right; |
||||
} |
||||
|
||||
table thead th.sorted .sortpriority { |
||||
font-size: .8em; |
||||
min-width: 12px; |
||||
text-align: center; |
||||
vertical-align: top; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a { |
||||
width: 14px; |
||||
height: 12px; |
||||
display: inline-block; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a.sortremove { |
||||
background: url(../img/sorting-icons.gif) -4px -5px no-repeat; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a.sortremove:hover { |
||||
background: url(../img/sorting-icons.gif) -4px -27px no-repeat; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a.ascending { |
||||
background: url(../img/sorting-icons.gif) -5px -50px no-repeat; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a.ascending:hover { |
||||
background: url(../img/sorting-icons.gif) -5px -72px no-repeat; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a.descending { |
||||
background: url(../img/sorting-icons.gif) -5px -94px no-repeat; |
||||
} |
||||
|
||||
table thead th.sorted .sortoptions a.descending:hover { |
||||
background: url(../img/sorting-icons.gif) -5px -115px no-repeat; |
||||
} |
||||
|
||||
/* ORDERABLE TABLES */ |
||||
|
||||
table.orderable tbody tr td:hover { |
||||
cursor: move; |
||||
} |
||||
|
||||
table.orderable tbody tr td:first-child { |
||||
padding-left: 14px; |
||||
background-image: url(../img/nav-bg-grabber.gif); |
||||
background-repeat: repeat-y; |
||||
} |
||||
|
||||
table.orderable-initalized .order-cell, body>tr>td.order-cell { |
||||
display: none; |
||||
} |
||||
|
||||
/* FORM DEFAULTS */ |
||||
|
||||
input, textarea, select, .form-row p { |
||||
margin: 2px 0; |
||||
padding: 2px 3px; |
||||
vertical-align: middle; |
||||
font-family: "Lucida Grande", Verdana, Arial, sans-serif; |
||||
font-weight: normal; |
||||
font-size: 11px; |
||||
} |
||||
|
||||
textarea { |
||||
vertical-align: top !important; |
||||
} |
||||
|
||||
input[type=text], input[type=password], textarea, select, .vTextField { |
||||
border: 1px solid #ccc; |
||||
} |
||||
|
||||
/* FORM BUTTONS */ |
||||
|
||||
.button, input[type=submit], input[type=button], .submit-row input { |
||||
background: white url(../img/nav-bg.gif) bottom repeat-x; |
||||
padding: 3px 5px; |
||||
color: black; |
||||
border: 1px solid #bbb; |
||||
border-color: #ddd #aaa #aaa #ddd; |
||||
} |
||||
|
||||
.button:active, input[type=submit]:active, input[type=button]:active { |
||||
background-image: url(../img/nav-bg-reverse.gif); |
||||
background-position: top; |
||||
} |
||||
|
||||
.button[disabled], input[type=submit][disabled], input[type=button][disabled] { |
||||
background-image: url(../img/nav-bg.gif); |
||||
background-position: bottom; |
||||
opacity: 0.4; |
||||
} |
||||
|
||||
.button.default, input[type=submit].default, .submit-row input.default { |
||||
border: 2px solid #5b80b2; |
||||
background: #7CA0C7 url(../img/default-bg.gif) bottom repeat-x; |
||||
font-weight: bold; |
||||
color: white; |
||||
float: right; |
||||
} |
||||
|
||||
.button.default:active, input[type=submit].default:active { |
||||
background-image: url(../img/default-bg-reverse.gif); |
||||
background-position: top; |
||||
} |
||||
|
||||
.button[disabled].default, input[type=submit][disabled].default, input[type=button][disabled].default { |
||||
background-image: url(../img/default-bg.gif); |
||||
background-position: bottom; |
||||
opacity: 0.4; |
||||
} |
||||
|
||||
|
||||
/* MODULES */ |
||||
|
||||
.module { |
||||
border: 1px solid #ccc; |
||||
margin-bottom: 5px; |
||||
background: white; |
||||
} |
||||
|
||||
.module p, .module ul, .module h3, .module h4, .module dl, .module pre { |
||||
padding-left: 10px; |
||||
padding-right: 10px; |
||||
} |
||||
|
||||
.module blockquote { |
||||
margin-left: 12px; |
||||
} |
||||
|
||||
.module ul, .module ol { |
||||
margin-left: 1.5em; |
||||
} |
||||
|
||||
.module h3 { |
||||
margin-top: .6em; |
||||
} |
||||
|
||||
.module h2, .module caption, .inline-group h2 { |
||||
margin: 0; |
||||
padding: 2px 5px 3px 5px; |
||||
font-size: 11px; |
||||
text-align: left; |
||||
font-weight: bold; |
||||
background: #7CA0C7 url(../img/default-bg.gif) top left repeat-x; |
||||
color: white; |
||||
} |
||||
|
||||
.module table { |
||||
border-collapse: collapse; |
||||
} |
||||
|
||||
/* MESSAGES & ERRORS */ |
||||
|
||||
ul.messagelist { |
||||
padding: 0 0 5px 0; |
||||
margin: 0; |
||||
} |
||||
|
||||
ul.messagelist li { |
||||
font-size: 12px; |
||||
display: block; |
||||
padding: 4px 5px 4px 25px; |
||||
margin: 0 0 3px 0; |
||||
border-bottom: 1px solid #ddd; |
||||
color: #666; |
||||
background: #ffc url(../img/icon_success.gif) 5px .3em no-repeat; |
||||
} |
||||
|
||||
ul.messagelist li.warning{ |
||||
background-image: url(../img/icon_alert.gif); |
||||
} |
||||
|
||||
ul.messagelist li.error{ |
||||
background-image: url(../img/icon_error.gif); |
||||
} |
||||
|
||||
.errornote { |
||||
font-size: 12px !important; |
||||
display: block; |
||||
padding: 4px 5px 4px 25px; |
||||
margin: 0 0 3px 0; |
||||
border: 1px solid red; |
||||
color: red; |
||||
background: #ffc url(../img/icon_error.gif) 5px .3em no-repeat; |
||||
} |
||||
|
||||
ul.errorlist { |
||||
margin: 0 !important; |
||||
padding: 0 !important; |
||||
} |
||||
|
||||
.errorlist li { |
||||
font-size: 12px !important; |
||||
display: block; |
||||
padding: 4px 5px 4px 25px; |
||||
margin: 0 0 3px 0; |
||||
border: 1px solid red; |
||||
color: white; |
||||
background: red url(../img/icon_alert.gif) 5px .3em no-repeat; |
||||
} |
||||
|
||||
.errorlist li a { |
||||
color: white; |
||||
text-decoration: underline; |
||||
} |
||||
|
||||
td ul.errorlist { |
||||
margin: 0 !important; |
||||
padding: 0 !important; |
||||
} |
||||
|
||||
td ul.errorlist li { |
||||
margin: 0 !important; |
||||
} |
||||
|
||||
.errors { |
||||
background: #ffc; |
||||
} |
||||
|
||||
.errors input, .errors select, .errors textarea { |
||||
border: 1px solid red; |
||||
} |
||||
|
||||
div.system-message { |
||||
background: #ffc; |
||||
margin: 10px; |
||||
padding: 6px 8px; |
||||
font-size: .8em; |
||||
} |
||||
|
||||
div.system-message p.system-message-title { |
||||
padding: 4px 5px 4px 25px; |
||||
margin: 0; |
||||
color: red; |
||||
background: #ffc url(../img/icon_error.gif) 5px .3em no-repeat; |
||||
} |
||||
|
||||
.description { |
||||
font-size: 12px; |
||||
padding: 5px 0 0 12px; |
||||
} |
||||
|
||||
/* BREADCRUMBS */ |
||||
|
||||
div.breadcrumbs { |
||||
background: white url(../img/nav-bg-reverse.gif) 0 -10px repeat-x; |
||||
padding: 2px 8px 3px 8px; |
||||
font-size: 11px; |
||||
color: #999; |
||||
border-top: 1px solid white; |
||||
border-bottom: 1px solid #ccc; |
||||
text-align: left; |
||||
} |
||||
|
||||
/* ACTION ICONS */ |
||||
|
||||
.addlink { |
||||
padding-left: 12px; |
||||
background: url(../img/icon_addlink.gif) 0 .2em no-repeat; |
||||
} |
||||
|
||||
.changelink { |
||||
padding-left: 12px; |
||||
background: url(../img/icon_changelink.gif) 0 .2em no-repeat; |
||||
} |
||||
|
||||
.deletelink { |
||||
padding-left: 12px; |
||||
background: url(../img/icon_deletelink.gif) 0 .25em no-repeat; |
||||
} |
||||
|
||||
a.deletelink:link, a.deletelink:visited { |
||||
color: #CC3434; |
||||
} |
||||
|
||||
a.deletelink:hover { |
||||
color: #993333; |
||||
} |
||||
|
||||
/* OBJECT TOOLS */ |
||||
|
||||
.object-tools { |
||||
font-size: 10px; |
||||
font-weight: bold; |
||||
font-family: Arial,Helvetica,sans-serif; |
||||
padding-left: 0; |
||||
float: right; |
||||
position: relative; |
||||
margin-top: -2.4em; |
||||
margin-bottom: -2em; |
||||
} |
||||
|
||||
.form-row .object-tools { |
||||
margin-top: 5px; |
||||
margin-bottom: 5px; |
||||
float: none; |
||||
height: 2em; |
||||
padding-left: 3.5em; |
||||
} |
||||
|
||||
.object-tools li { |
||||
display: block; |
||||
float: left; |
||||
background: url(../img/tool-left.gif) 0 0 no-repeat; |
||||
padding: 0 0 0 8px; |
||||
margin-left: 2px; |
||||
height: 16px; |
||||
} |
||||
|
||||
.object-tools li:hover { |
||||
background: url(../img/tool-left_over.gif) 0 0 no-repeat; |
||||
} |
||||
|
||||
.object-tools a:link, .object-tools a:visited { |
||||
display: block; |
||||
float: left; |
||||
color: white; |
||||
padding: .1em 14px .1em 8px; |
||||
height: 14px; |
||||
background: #999 url(../img/tool-right.gif) 100% 0 no-repeat; |
||||
} |
||||
|
||||
.object-tools a:hover, .object-tools li:hover a { |
||||
background: #5b80b2 url(../img/tool-right_over.gif) 100% 0 no-repeat; |
||||
} |
||||
|
||||
.object-tools a.viewsitelink, .object-tools a.golink { |
||||
background: #999 url(../img/tooltag-arrowright.gif) top right no-repeat; |
||||
padding-right: 28px; |
||||
} |
||||
|
||||
.object-tools a.viewsitelink:hover, .object-tools a.golink:hover { |
||||
background: #5b80b2 url(../img/tooltag-arrowright_over.gif) top right no-repeat; |
||||
} |
||||
|
||||
.object-tools a.addlink { |
||||
background: #999 url(../img/tooltag-add.gif) top right no-repeat; |
||||
padding-right: 28px; |
||||
} |
||||
|
||||
.object-tools a.addlink:hover { |
||||
background: #5b80b2 url(../img/tooltag-add_over.gif) top right no-repeat; |
||||
} |
||||
|
||||
/* OBJECT HISTORY */ |
||||
|
||||
table#change-history { |
||||
width: 100%; |
||||
} |
||||
|
||||
table#change-history tbody th { |
||||
width: 16em; |
||||
} |
||||
|
||||
/* PAGE STRUCTURE */ |
||||
|
||||
#container { |
||||
position: relative; |
||||
width: 100%; |
||||
min-width: 760px; |
||||
padding: 0; |
||||
} |
||||
|
||||
#content { |
||||
margin: 10px 15px; |
||||
} |
||||
|
||||
#header { |
||||
width: 100%; |
||||
} |
||||
|
||||
#content-main { |
||||
float: left; |
||||
width: 100%; |
||||
} |
||||
|
||||
#content-related { |
||||
float: right; |
||||
width: 18em; |
||||
position: relative; |
||||
margin-right: -19em; |
||||
} |
||||
|
||||
#footer { |
||||
clear: both; |
||||
padding: 10px; |
||||
} |
||||
|
||||
/* COLUMN TYPES */ |
||||
|
||||
.colMS { |
||||
margin-right: 20em !important; |
||||
} |
||||
|
||||
.colSM { |
||||
margin-left: 20em !important; |
||||
} |
||||
|
||||
.colSM #content-related { |
||||
float: left; |
||||
margin-right: 0; |
||||
margin-left: -19em; |
||||
} |
||||
|
||||
.colSM #content-main { |
||||
float: right; |
||||
} |
||||
|
||||
.popup .colM { |
||||
width: 95%; |
||||
} |
||||
|
||||
.subcol { |
||||
float: left; |
||||
width: 46%; |
||||
margin-right: 15px; |
||||
} |
||||
|
||||
.dashboard #content { |
||||
width: 500px; |
||||
} |
||||
|
||||
/* HEADER */ |
||||
|
||||
#header { |
||||
background: #417690; |
||||
color: #ffc; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
#header a:link, #header a:visited { |
||||
color: white; |
||||
} |
||||
|
||||
#header a:hover { |
||||
text-decoration: underline; |
||||
} |
||||
|
||||
#branding h1 { |
||||
padding: 0 10px; |
||||
font-size: 18px; |
||||
margin: 8px 0; |
||||
font-weight: normal; |
||||
color: #f4f379; |
||||
} |
||||
|
||||
#branding h2 { |
||||
padding: 0 10px; |
||||
font-size: 14px; |
||||
margin: -8px 0 8px 0; |
||||
font-weight: normal; |
||||
color: #ffc; |
||||
} |
||||
|
||||
#user-tools { |
||||
position: absolute; |
||||
top: 0; |
||||
right: 0; |
||||
padding: 1.2em 10px; |
||||
font-size: 11px; |
||||
text-align: right; |
||||
} |
||||
|
||||
/* SIDEBAR */ |
||||
|
||||
#content-related h3 { |
||||
font-size: 12px; |
||||
color: #666; |
||||
margin-bottom: 3px; |
||||
} |
||||
|
||||
#content-related h4 { |
||||
font-size: 11px; |
||||
} |
||||
|
||||
#content-related .module h2 { |
||||
background: #eee url(../img/nav-bg.gif) bottom left repeat-x; |
||||
color: #666; |
||||
} |
||||
|
||||
@ -1,289 +0,0 @@ |
||||
/* CHANGELISTS */ |
||||
|
||||
#changelist { |
||||
position: relative; |
||||
width: 100%; |
||||
} |
||||
|
||||
#changelist table { |
||||
width: 100%; |
||||
} |
||||
|
||||
.change-list .hiddenfields { display:none; } |
||||
|
||||
.change-list .filtered table { |
||||
border-right: 1px solid #ddd; |
||||
} |
||||
|
||||
.change-list .filtered { |
||||
min-height: 400px; |
||||
} |
||||
|
||||
.change-list .filtered { |
||||
background: white url(../img/changelist-bg.gif) top right repeat-y !important; |
||||
} |
||||
|
||||
.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { |
||||
margin-right: 160px !important; |
||||
width: auto !important; |
||||
} |
||||
|
||||
.change-list .filtered table tbody th { |
||||
padding-right: 1em; |
||||
} |
||||
|
||||
#changelist .toplinks { |
||||
border-bottom: 1px solid #ccc !important; |
||||
} |
||||
|
||||
#changelist .paginator { |
||||
color: #666; |
||||
border-top: 1px solid #eee; |
||||
border-bottom: 1px solid #eee; |
||||
background: white url(../img/nav-bg.gif) 0 180% repeat-x; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.change-list .filtered .paginator { |
||||
border-right: 1px solid #ddd; |
||||
} |
||||
|
||||
/* CHANGELIST TABLES */ |
||||
|
||||
#changelist table thead th { |
||||
padding: 0; |
||||
white-space: nowrap; |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
#changelist table thead th.action-checkbox-column { |
||||
width: 1.5em; |
||||
text-align: center; |
||||
} |
||||
|
||||
#changelist table tbody td, #changelist table tbody th { |
||||
border-left: 1px solid #ddd; |
||||
} |
||||
|
||||
#changelist table tbody td:first-child, #changelist table tbody th:first-child { |
||||
border-left: 0; |
||||
border-right: 1px solid #ddd; |
||||
} |
||||
|
||||
#changelist table tbody td.action-checkbox { |
||||
text-align:center; |
||||
} |
||||
|
||||
#changelist table tfoot { |
||||
color: #666; |
||||
} |
||||
|
||||
/* TOOLBAR */ |
||||
|
||||
#changelist #toolbar { |
||||
padding: 3px; |
||||
border-bottom: 1px solid #ddd; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; |
||||
color: #666; |
||||
} |
||||
|
||||
#changelist #toolbar form input { |
||||
font-size: 11px; |
||||
padding: 1px 2px; |
||||
} |
||||
|
||||
#changelist #toolbar form #searchbar { |
||||
padding: 2px; |
||||
} |
||||
|
||||
#changelist #changelist-search img { |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
/* FILTER COLUMN */ |
||||
|
||||
#changelist-filter { |
||||
position: absolute; |
||||
top: 0; |
||||
right: 0; |
||||
z-index: 1000; |
||||
width: 160px; |
||||
border-left: 1px solid #ddd; |
||||
background: #efefef; |
||||
margin: 0; |
||||
} |
||||
|
||||
#changelist-filter h2 { |
||||
font-size: 11px; |
||||
padding: 2px 5px; |
||||
border-bottom: 1px solid #ddd; |
||||
} |
||||
|
||||
#changelist-filter h3 { |
||||
font-size: 12px; |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
#changelist-filter ul { |
||||
padding-left: 0; |
||||
margin-left: 10px; |
||||
} |
||||
|
||||
#changelist-filter li { |
||||
list-style-type: none; |
||||
margin-left: 0; |
||||
padding-left: 0; |
||||
} |
||||
|
||||
#changelist-filter a { |
||||
color: #999; |
||||
} |
||||
|
||||
#changelist-filter a:hover { |
||||
color: #036; |
||||
} |
||||
|
||||
#changelist-filter li.selected { |
||||
border-left: 5px solid #ccc; |
||||
padding-left: 5px; |
||||
margin-left: -10px; |
||||
} |
||||
|
||||
#changelist-filter li.selected a { |
||||
color: #5b80b2 !important; |
||||
} |
||||
|
||||
/* DATE DRILLDOWN */ |
||||
|
||||
.change-list ul.toplinks { |
||||
display: block; |
||||
background: white url(../img/nav-bg-reverse.gif) 0 -10px repeat-x; |
||||
border-top: 1px solid white; |
||||
float: left; |
||||
padding: 0 !important; |
||||
margin: 0 !important; |
||||
width: 100%; |
||||
} |
||||
|
||||
.change-list ul.toplinks li { |
||||
padding: 3px 6px; |
||||
font-weight: bold; |
||||
list-style-type: none; |
||||
display: inline-block; |
||||
} |
||||
|
||||
.change-list ul.toplinks .date-back a { |
||||
color: #999; |
||||
} |
||||
|
||||
.change-list ul.toplinks .date-back a:hover { |
||||
color: #036; |
||||
} |
||||
|
||||
/* PAGINATOR */ |
||||
|
||||
.paginator { |
||||
font-size: 11px; |
||||
padding-top: 10px; |
||||
padding-bottom: 10px; |
||||
line-height: 22px; |
||||
margin: 0; |
||||
border-top: 1px solid #ddd; |
||||
} |
||||
|
||||
.paginator a:link, .paginator a:visited { |
||||
padding: 2px 6px; |
||||
border: solid 1px #ccc; |
||||
background: white; |
||||
text-decoration: none; |
||||
} |
||||
|
||||
.paginator a.showall { |
||||
padding: 0 !important; |
||||
border: none !important; |
||||
} |
||||
|
||||
.paginator a.showall:hover { |
||||
color: #036 !important; |
||||
background: transparent !important; |
||||
} |
||||
|
||||
.paginator .end { |
||||
border-width: 2px !important; |
||||
margin-right: 6px; |
||||
} |
||||
|
||||
.paginator .this-page { |
||||
padding: 2px 6px; |
||||
font-weight: bold; |
||||
font-size: 13px; |
||||
vertical-align: top; |
||||
} |
||||
|
||||
.paginator a:hover { |
||||
color: white; |
||||
background: #5b80b2; |
||||
border-color: #036; |
||||
} |
||||
|
||||
/* ACTIONS */ |
||||
|
||||
.filtered .actions { |
||||
margin-right: 160px !important; |
||||
border-right: 1px solid #ddd; |
||||
} |
||||
|
||||
#changelist table input { |
||||
margin: 0; |
||||
} |
||||
|
||||
#changelist table tbody tr.selected { |
||||
background-color: #FFFFCC; |
||||
} |
||||
|
||||
#changelist .actions { |
||||
color: #999; |
||||
padding: 3px; |
||||
border-top: 1px solid #fff; |
||||
border-bottom: 1px solid #ddd; |
||||
background: white url(../img/nav-bg-reverse.gif) 0 -10px repeat-x; |
||||
} |
||||
|
||||
#changelist .actions.selected { |
||||
background: #fffccf; |
||||
border-top: 1px solid #fffee8; |
||||
border-bottom: 1px solid #edecd6; |
||||
} |
||||
|
||||
#changelist .actions span.all, |
||||
#changelist .actions span.action-counter, |
||||
#changelist .actions span.clear, |
||||
#changelist .actions span.question { |
||||
font-size: 11px; |
||||
margin: 0 0.5em; |
||||
display: none; |
||||
} |
||||
|
||||
#changelist .actions:last-child { |
||||
border-bottom: none; |
||||
} |
||||
|
||||
#changelist .actions select { |
||||
border: 1px solid #aaa; |
||||
margin-left: 0.5em; |
||||
padding: 1px 2px; |
||||
} |
||||
|
||||
#changelist .actions label { |
||||
font-size: 11px; |
||||
margin-left: 0.5em; |
||||
} |
||||
|
||||
#changelist #action-toggle { |
||||
display: none; |
||||
} |
||||
|
||||
#changelist .actions .button { |
||||
font-size: 11px; |
||||
padding: 1px 2px; |
||||
} |
||||
@ -1,30 +0,0 @@ |
||||
/* DASHBOARD */ |
||||
|
||||
.dashboard .module table th { |
||||
width: 100%; |
||||
} |
||||
|
||||
.dashboard .module table td { |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
.dashboard .module table td a { |
||||
display: block; |
||||
padding-right: .6em; |
||||
} |
||||
|
||||
/* RECENT ACTIONS MODULE */ |
||||
|
||||
.module ul.actionlist { |
||||
margin-left: 0; |
||||
} |
||||
|
||||
ul.actionlist li { |
||||
list-style-type: none; |
||||
} |
||||
|
||||
ul.actionlist li.changelink { |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
-o-text-overflow: ellipsis; |
||||
} |
||||
@ -1,363 +0,0 @@ |
||||
@import url('widgets.css'); |
||||
|
||||
/* FORM ROWS */ |
||||
|
||||
.form-row { |
||||
overflow: hidden; |
||||
padding: 8px 12px; |
||||
font-size: 11px; |
||||
border-bottom: 1px solid #eee; |
||||
} |
||||
|
||||
.form-row img, .form-row input { |
||||
vertical-align: middle; |
||||
} |
||||
|
||||
form .form-row p { |
||||
padding-left: 0; |
||||
font-size: 11px; |
||||
} |
||||
|
||||
/* FORM LABELS */ |
||||
|
||||
form h4 { |
||||
margin: 0 !important; |
||||
padding: 0 !important; |
||||
border: none !important; |
||||
} |
||||
|
||||
label { |
||||
font-weight: normal !important; |
||||
color: #666; |
||||
font-size: 12px; |
||||
} |
||||
|
||||
.required label, label.required { |
||||
font-weight: bold !important; |
||||
color: #333 !important; |
||||
} |
||||
|
||||
/* RADIO BUTTONS */ |
||||
|
||||
form ul.radiolist li { |
||||
list-style-type: none; |
||||
} |
||||
|
||||
form ul.radiolist label { |
||||
float: none; |
||||
display: inline; |
||||
} |
||||
|
||||
form ul.inline { |
||||
margin-left: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
form ul.inline li { |
||||
float: left; |
||||
padding-right: 7px; |
||||
} |
||||
|
||||
/* ALIGNED FIELDSETS */ |
||||
|
||||
.aligned label { |
||||
display: block; |
||||
padding: 3px 10px 0 0; |
||||
float: left; |
||||
width: 8em; |
||||
} |
||||
|
||||
.aligned ul label { |
||||
display: inline; |
||||
float: none; |
||||
width: auto; |
||||
} |
||||
|
||||
.colMS .aligned .vLargeTextField, .colMS .aligned .vXMLLargeTextField { |
||||
width: 350px; |
||||
} |
||||
|
||||
form .aligned p, form .aligned ul { |
||||
margin-left: 7em; |
||||
padding-left: 30px; |
||||
} |
||||
|
||||
form .aligned table p { |
||||
margin-left: 0; |
||||
padding-left: 0; |
||||
} |
||||
|
||||
form .aligned p.help { |
||||
padding-left: 38px; |
||||
} |
||||
|
||||
.aligned .vCheckboxLabel { |
||||
float: none !important; |
||||
display: inline; |
||||
padding-left: 4px; |
||||
} |
||||
|
||||
.colM .aligned .vLargeTextField, .colM .aligned .vXMLLargeTextField { |
||||
width: 610px; |
||||
} |
||||
|
||||
.checkbox-row p.help { |
||||
margin-left: 0; |
||||
padding-left: 0 !important; |
||||
} |
||||
|
||||
fieldset .field-box { |
||||
float: left; |
||||
margin-right: 20px; |
||||
} |
||||
|
||||
/* WIDE FIELDSETS */ |
||||
|
||||
.wide label { |
||||
width: 15em !important; |
||||
} |
||||
|
||||
form .wide p { |
||||
margin-left: 15em; |
||||
} |
||||
|
||||
form .wide p.help { |
||||
padding-left: 38px; |
||||
} |
||||
|
||||
.colM fieldset.wide .vLargeTextField, .colM fieldset.wide .vXMLLargeTextField { |
||||
width: 450px; |
||||
} |
||||
|
||||
/* COLLAPSED FIELDSETS */ |
||||
|
||||
fieldset.collapsed * { |
||||
display: none; |
||||
} |
||||
|
||||
fieldset.collapsed h2, fieldset.collapsed { |
||||
display: block !important; |
||||
} |
||||
|
||||
fieldset.collapsed h2 { |
||||
background-image: url(../img/nav-bg.gif); |
||||
background-position: bottom left; |
||||
color: #999; |
||||
} |
||||
|
||||
fieldset.collapsed .collapse-toggle { |
||||
background: transparent; |
||||
display: inline !important; |
||||
} |
||||
|
||||
/* MONOSPACE TEXTAREAS */ |
||||
|
||||
fieldset.monospace textarea { |
||||
font-family: "Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace; |
||||
} |
||||
|
||||
/* SUBMIT ROW */ |
||||
|
||||
.submit-row { |
||||
padding: 5px 7px; |
||||
text-align: right; |
||||
background: white url(../img/nav-bg.gif) 0 100% repeat-x; |
||||
border: 1px solid #ccc; |
||||
margin: 5px 0; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
body.popup .submit-row { |
||||
overflow: auto; |
||||
} |
||||
|
||||
.submit-row input { |
||||
margin: 0 0 0 5px; |
||||
} |
||||
|
||||
.submit-row p { |
||||
margin: 0.3em; |
||||
} |
||||
|
||||
.submit-row p.deletelink-box { |
||||
float: left; |
||||
} |
||||
|
||||
.submit-row .deletelink { |
||||
background: url(../img/icon_deletelink.gif) 0 50% no-repeat; |
||||
padding-left: 14px; |
||||
} |
||||
|
||||
/* CUSTOM FORM FIELDS */ |
||||
|
||||
.vSelectMultipleField { |
||||
vertical-align: top !important; |
||||
} |
||||
|
||||
.vCheckboxField { |
||||
border: none; |
||||
} |
||||
|
||||
.vDateField, .vTimeField { |
||||
margin-right: 2px; |
||||
} |
||||
|
||||
.vURLField { |
||||
width: 30em; |
||||
} |
||||
|
||||
.vLargeTextField, .vXMLLargeTextField { |
||||
width: 48em; |
||||
} |
||||
|
||||
.flatpages-flatpage #id_content { |
||||
height: 40.2em; |
||||
} |
||||
|
||||
.module table .vPositiveSmallIntegerField { |
||||
width: 2.2em; |
||||
} |
||||
|
||||
.vTextField { |
||||
width: 20em; |
||||
} |
||||
|
||||
.vIntegerField { |
||||
width: 5em; |
||||
} |
||||
|
||||
.vBigIntegerField { |
||||
width: 10em; |
||||
} |
||||
|
||||
.vForeignKeyRawIdAdminField { |
||||
width: 5em; |
||||
} |
||||
|
||||
/* INLINES */ |
||||
|
||||
.inline-group { |
||||
padding: 0; |
||||
border: 1px solid #ccc; |
||||
margin: 10px 0; |
||||
} |
||||
|
||||
.inline-group .aligned label { |
||||
width: 8em; |
||||
} |
||||
|
||||
.inline-related { |
||||
position: relative; |
||||
} |
||||
|
||||
.inline-related h3 { |
||||
margin: 0; |
||||
color: #666; |
||||
padding: 3px 5px; |
||||
font-size: 11px; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; |
||||
border-bottom: 1px solid #ddd; |
||||
} |
||||
|
||||
.inline-related h3 span.delete { |
||||
float: right; |
||||
} |
||||
|
||||
.inline-related h3 span.delete label { |
||||
margin-left: 2px; |
||||
font-size: 11px; |
||||
} |
||||
|
||||
.inline-related fieldset { |
||||
margin: 0; |
||||
background: #fff; |
||||
border: none; |
||||
width: 100%; |
||||
} |
||||
|
||||
.inline-related fieldset.module h3 { |
||||
margin: 0; |
||||
padding: 2px 5px 3px 5px; |
||||
font-size: 11px; |
||||
text-align: left; |
||||
font-weight: bold; |
||||
background: #bcd; |
||||
color: #fff; |
||||
} |
||||
|
||||
.inline-group .tabular fieldset.module { |
||||
border: none; |
||||
border-bottom: 1px solid #ddd; |
||||
} |
||||
|
||||
.inline-related.tabular fieldset.module table { |
||||
width: 100%; |
||||
} |
||||
|
||||
.last-related fieldset { |
||||
border: none; |
||||
} |
||||
|
||||
.inline-group .tabular tr.has_original td { |
||||
padding-top: 2em; |
||||
} |
||||
|
||||
.inline-group .tabular tr td.original { |
||||
padding: 2px 0 0 0; |
||||
width: 0; |
||||
_position: relative; |
||||
} |
||||
|
||||
.inline-group .tabular th.original { |
||||
width: 0px; |
||||
padding: 0; |
||||
} |
||||
|
||||
.inline-group .tabular td.original p { |
||||
position: absolute; |
||||
left: 0; |
||||
height: 1.1em; |
||||
padding: 2px 7px; |
||||
overflow: hidden; |
||||
font-size: 9px; |
||||
font-weight: bold; |
||||
color: #666; |
||||
_width: 700px; |
||||
} |
||||
|
||||
.inline-group ul.tools { |
||||
padding: 0; |
||||
margin: 0; |
||||
list-style: none; |
||||
} |
||||
|
||||
.inline-group ul.tools li { |
||||
display: inline; |
||||
padding: 0 5px; |
||||
} |
||||
|
||||
.inline-group div.add-row, |
||||
.inline-group .tabular tr.add-row td { |
||||
color: #666; |
||||
padding: 3px 5px; |
||||
border-bottom: 1px solid #ddd; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; |
||||
} |
||||
|
||||
.inline-group .tabular tr.add-row td { |
||||
padding: 4px 5px 3px; |
||||
border-bottom: none; |
||||
} |
||||
|
||||
.inline-group ul.tools a.add, |
||||
.inline-group div.add-row a, |
||||
.inline-group .tabular tr.add-row td a { |
||||
background: url(../img/icon_addlink.gif) 0 50% no-repeat; |
||||
padding-left: 14px; |
||||
font-size: 11px; |
||||
outline: 0; /* Remove dotted border around link */ |
||||
} |
||||
|
||||
.empty-form { |
||||
display: none; |
||||
} |
||||
@ -1,63 +0,0 @@ |
||||
/* IE 6 & 7 */ |
||||
|
||||
/* Proper fixed width for dashboard in IE6 */ |
||||
|
||||
.dashboard #content { |
||||
*width: 768px; |
||||
} |
||||
|
||||
.dashboard #content-main { |
||||
*width: 535px; |
||||
} |
||||
|
||||
/* IE 6 ONLY */ |
||||
|
||||
/* Keep header from flowing off the page */ |
||||
|
||||
#container { |
||||
_position: static; |
||||
} |
||||
|
||||
/* Put the right sidebars back on the page */ |
||||
|
||||
.colMS #content-related { |
||||
_margin-right: 0; |
||||
_margin-left: 10px; |
||||
_position: static; |
||||
} |
||||
|
||||
/* Put the left sidebars back on the page */ |
||||
|
||||
.colSM #content-related { |
||||
_margin-right: 10px; |
||||
_margin-left: -115px; |
||||
_position: static; |
||||
} |
||||
|
||||
.form-row { |
||||
_height: 1%; |
||||
} |
||||
|
||||
/* Fix right margin for changelist filters in IE6 */ |
||||
|
||||
#changelist-filter ul { |
||||
_margin-right: -10px; |
||||
} |
||||
|
||||
/* IE ignores min-height, but treats height as if it were min-height */ |
||||
|
||||
.change-list .filtered { |
||||
_height: 400px; |
||||
} |
||||
|
||||
/* IE doesn't know alpha transparency in PNGs */ |
||||
|
||||
.inline-deletelink { |
||||
background: transparent url(../img/inline-delete-8bit.png) no-repeat; |
||||
} |
||||
|
||||
/* IE7 doesn't support inline-block */ |
||||
.change-list ul.toplinks li { |
||||
zoom: 1; |
||||
*display: inline; |
||||
} |
||||
@ -1,57 +0,0 @@ |
||||
/* LOGIN FORM */ |
||||
|
||||
body.login { |
||||
background: #eee; |
||||
} |
||||
|
||||
.login #container { |
||||
background: white; |
||||
border: 1px solid #ccc; |
||||
width: 28em; |
||||
min-width: 300px; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
margin-top: 100px; |
||||
} |
||||
|
||||
.login #content-main { |
||||
width: 100%; |
||||
} |
||||
|
||||
.login form { |
||||
margin-top: 1em; |
||||
} |
||||
|
||||
.login .form-row { |
||||
padding: 4px 0; |
||||
float: left; |
||||
width: 100%; |
||||
} |
||||
|
||||
.login .form-row label { |
||||
float: left; |
||||
width: 9em; |
||||
padding-right: 0.5em; |
||||
line-height: 2em; |
||||
text-align: right; |
||||
font-size: 1em; |
||||
color: #333; |
||||
} |
||||
|
||||
.login .form-row #id_username, .login .form-row #id_password { |
||||
width: 14em; |
||||
} |
||||
|
||||
.login span.help { |
||||
font-size: 10px; |
||||
display: block; |
||||
} |
||||
|
||||
.login .submit-row { |
||||
clear: both; |
||||
padding: 1em 0 0 9.4em; |
||||
} |
||||
|
||||
.login .password-reset-link { |
||||
text-align: center; |
||||
} |
||||
@ -1,250 +0,0 @@ |
||||
body { |
||||
direction: rtl; |
||||
} |
||||
|
||||
/* LOGIN */ |
||||
|
||||
.login .form-row { |
||||
float: right; |
||||
} |
||||
|
||||
.login .form-row label { |
||||
float: right; |
||||
padding-left: 0.5em; |
||||
padding-right: 0; |
||||
text-align: left; |
||||
} |
||||
|
||||
.login .submit-row { |
||||
clear: both; |
||||
padding: 1em 9.4em 0 0; |
||||
} |
||||
|
||||
/* GLOBAL */ |
||||
|
||||
th { |
||||
text-align: right; |
||||
} |
||||
|
||||
.module h2, .module caption { |
||||
text-align: right; |
||||
} |
||||
|
||||
.addlink, .changelink { |
||||
padding-left: 0px; |
||||
padding-right: 12px; |
||||
background-position: 100% 0.2em; |
||||
} |
||||
|
||||
.deletelink { |
||||
padding-left: 0px; |
||||
padding-right: 12px; |
||||
background-position: 100% 0.25em; |
||||
} |
||||
|
||||
.object-tools { |
||||
float: left; |
||||
} |
||||
|
||||
thead th:first-child, |
||||
tfoot td:first-child { |
||||
border-left: 1px solid #ddd !important; |
||||
} |
||||
|
||||
/* LAYOUT */ |
||||
|
||||
#user-tools { |
||||
right: auto; |
||||
left: 0; |
||||
text-align: left; |
||||
} |
||||
|
||||
div.breadcrumbs { |
||||
text-align: right; |
||||
} |
||||
|
||||
#content-main { |
||||
float: right; |
||||
} |
||||
|
||||
#content-related { |
||||
float: left; |
||||
margin-left: -19em; |
||||
margin-right: auto; |
||||
} |
||||
|
||||
.colMS { |
||||
margin-left: 20em !important; |
||||
margin-right: 10px !important; |
||||
} |
||||
|
||||
/* SORTABLE TABLES */ |
||||
|
||||
table thead th.sorted .sortoptions { |
||||
float: left; |
||||
} |
||||
|
||||
thead th.sorted .text { |
||||
padding-right: 0; |
||||
padding-left: 42px; |
||||
} |
||||
|
||||
/* dashboard styles */ |
||||
|
||||
.dashboard .module table td a { |
||||
padding-left: .6em; |
||||
padding-right: 12px; |
||||
} |
||||
|
||||
/* changelists styles */ |
||||
|
||||
.change-list .filtered { |
||||
background: white url(../img/changelist-bg_rtl.gif) top left repeat-y !important; |
||||
} |
||||
|
||||
.change-list .filtered table { |
||||
border-left: 1px solid #ddd; |
||||
border-right: 0px none; |
||||
} |
||||
|
||||
#changelist-filter { |
||||
right: auto; |
||||
left: 0; |
||||
border-left: 0px none; |
||||
border-right: 1px solid #ddd; |
||||
} |
||||
|
||||
.change-list .filtered .results, .change-list .filtered .paginator, .filtered #toolbar, .filtered div.xfull { |
||||
margin-right: 0px !important; |
||||
margin-left: 160px !important; |
||||
} |
||||
|
||||
#changelist-filter li.selected { |
||||
border-left: 0px none; |
||||
padding-left: 0px; |
||||
margin-left: 0; |
||||
border-right: 5px solid #ccc; |
||||
padding-right: 5px; |
||||
margin-right: -10px; |
||||
} |
||||
|
||||
.filtered .actions { |
||||
border-left:1px solid #DDDDDD; |
||||
margin-left:160px !important; |
||||
border-right: 0 none; |
||||
margin-right:0 !important; |
||||
} |
||||
|
||||
#changelist table tbody td:first-child, #changelist table tbody th:first-child { |
||||
border-right: 0; |
||||
border-left: 1px solid #ddd; |
||||
} |
||||
|
||||
/* FORMS */ |
||||
|
||||
.aligned label { |
||||
padding: 0 0 3px 1em; |
||||
float: right; |
||||
} |
||||
|
||||
.submit-row { |
||||
text-align: left |
||||
} |
||||
|
||||
.submit-row p.deletelink-box { |
||||
float: right; |
||||
} |
||||
|
||||
.submit-row .deletelink { |
||||
background: url(../img/icon_deletelink.gif) 0 50% no-repeat; |
||||
padding-right: 14px; |
||||
} |
||||
|
||||
.vDateField, .vTimeField { |
||||
margin-left: 2px; |
||||
} |
||||
|
||||
form ul.inline li { |
||||
float: right; |
||||
padding-right: 0; |
||||
padding-left: 7px; |
||||
} |
||||
|
||||
input[type=submit].default, .submit-row input.default { |
||||
float: left; |
||||
} |
||||
|
||||
fieldset .field-box { |
||||
float: right; |
||||
margin-left: 20px; |
||||
margin-right: 0; |
||||
} |
||||
|
||||
.errorlist li { |
||||
background-position: 100% .3em; |
||||
padding: 4px 25px 4px 5px; |
||||
} |
||||
|
||||
.errornote { |
||||
background-position: 100% .3em; |
||||
padding: 4px 25px 4px 5px; |
||||
} |
||||
|
||||
/* WIDGETS */ |
||||
|
||||
.calendarnav-previous { |
||||
top: 0; |
||||
left: auto; |
||||
right: 0; |
||||
} |
||||
|
||||
.calendarnav-next { |
||||
top: 0; |
||||
right: auto; |
||||
left: 0; |
||||
} |
||||
|
||||
.calendar caption, .calendarbox h2 { |
||||
text-align: center; |
||||
} |
||||
|
||||
.selector { |
||||
float: right; |
||||
} |
||||
|
||||
.selector .selector-filter { |
||||
text-align: right; |
||||
} |
||||
|
||||
.inline-deletelink { |
||||
float: left; |
||||
} |
||||
|
||||
/* MISC */ |
||||
|
||||
.inline-related h2, .inline-group h2 { |
||||
text-align: right |
||||
} |
||||
|
||||
.inline-related h3 span.delete { |
||||
padding-right: 20px; |
||||
padding-left: inherit; |
||||
left: 10px; |
||||
right: inherit; |
||||
float:left; |
||||
} |
||||
|
||||
.inline-related h3 span.delete label { |
||||
margin-left: inherit; |
||||
margin-right: 2px; |
||||
} |
||||
|
||||
/* IE7 specific bug fixes */ |
||||
|
||||
div.colM { |
||||
position: relative; |
||||
} |
||||
|
||||
.submit-row input { |
||||
float: left; |
||||
} |
||||
@ -1,578 +0,0 @@ |
||||
/* SELECTOR (FILTER INTERFACE) */ |
||||
|
||||
.selector { |
||||
width: 580px; |
||||
float: left; |
||||
} |
||||
|
||||
.selector select { |
||||
width: 270px; |
||||
height: 17.2em; |
||||
} |
||||
|
||||
.selector-available, .selector-chosen { |
||||
float: left; |
||||
width: 270px; |
||||
text-align: center; |
||||
margin-bottom: 5px; |
||||
} |
||||
|
||||
.selector-chosen select { |
||||
border-top: none; |
||||
} |
||||
|
||||
.selector-available h2, .selector-chosen h2 { |
||||
border: 1px solid #ccc; |
||||
} |
||||
|
||||
.selector .selector-available h2 { |
||||
background: white url(../img/nav-bg.gif) bottom left repeat-x; |
||||
color: #666; |
||||
} |
||||
|
||||
.selector .selector-filter { |
||||
background: white; |
||||
border: 1px solid #ccc; |
||||
border-width: 0 1px; |
||||
padding: 3px; |
||||
color: #999; |
||||
font-size: 10px; |
||||
margin: 0; |
||||
text-align: left; |
||||
} |
||||
|
||||
.selector .selector-filter label, |
||||
.inline-group .aligned .selector .selector-filter label { |
||||
width: 16px; |
||||
padding: 2px; |
||||
} |
||||
|
||||
.selector .selector-available input { |
||||
width: 230px; |
||||
} |
||||
|
||||
.selector ul.selector-chooser { |
||||
float: left; |
||||
width: 22px; |
||||
height: 50px; |
||||
background: url(../img/chooser-bg.gif) top center no-repeat; |
||||
margin: 10em 5px 0 5px; |
||||
padding: 0; |
||||
} |
||||
|
||||
.selector-chooser li { |
||||
margin: 0; |
||||
padding: 3px; |
||||
list-style-type: none; |
||||
} |
||||
|
||||
.selector select { |
||||
margin-bottom: 10px; |
||||
margin-top: 0; |
||||
} |
||||
|
||||
.selector-add, .selector-remove { |
||||
width: 16px; |
||||
height: 16px; |
||||
display: block; |
||||
text-indent: -3000px; |
||||
overflow: hidden; |
||||
} |
||||
|
||||
.selector-add { |
||||
background: url(../img/selector-icons.gif) 0 -161px no-repeat; |
||||
cursor: default; |
||||
margin-bottom: 2px; |
||||
} |
||||
|
||||
.active.selector-add { |
||||
background: url(../img/selector-icons.gif) 0 -187px no-repeat; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.selector-remove { |
||||
background: url(../img/selector-icons.gif) 0 -109px no-repeat; |
||||
cursor: default; |
||||
} |
||||
|
||||
.active.selector-remove { |
||||
background: url(../img/selector-icons.gif) 0 -135px no-repeat; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
a.selector-chooseall, a.selector-clearall { |
||||
display: inline-block; |
||||
text-align: left; |
||||
margin-left: auto; |
||||
margin-right: auto; |
||||
font-weight: bold; |
||||
color: #666; |
||||
} |
||||
|
||||
a.selector-chooseall { |
||||
padding: 3px 18px 3px 0; |
||||
} |
||||
|
||||
a.selector-clearall { |
||||
padding: 3px 0 3px 18px; |
||||
} |
||||
|
||||
a.active.selector-chooseall:hover, a.active.selector-clearall:hover { |
||||
color: #036; |
||||
} |
||||
|
||||
a.selector-chooseall { |
||||
background: url(../img/selector-icons.gif) right -263px no-repeat; |
||||
cursor: default; |
||||
} |
||||
|
||||
a.active.selector-chooseall { |
||||
background: url(../img/selector-icons.gif) right -289px no-repeat; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
a.selector-clearall { |
||||
background: url(../img/selector-icons.gif) left -211px no-repeat; |
||||
cursor: default; |
||||
} |
||||
|
||||
a.active.selector-clearall { |
||||
background: url(../img/selector-icons.gif) left -237px no-repeat; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
/* STACKED SELECTORS */ |
||||
|
||||
.stacked { |
||||
float: left; |
||||
width: 500px; |
||||
} |
||||
|
||||
.stacked select { |
||||
width: 480px; |
||||
height: 10.1em; |
||||
} |
||||
|
||||
.stacked .selector-available, .stacked .selector-chosen { |
||||
width: 480px; |
||||
} |
||||
|
||||
.stacked .selector-available { |
||||
margin-bottom: 0; |
||||
} |
||||
|
||||
.stacked .selector-available input { |
||||
width: 442px; |
||||
} |
||||
|
||||
.stacked ul.selector-chooser { |
||||
height: 22px; |
||||
width: 50px; |
||||
margin: 0 0 3px 40%; |
||||
background: url(../img/chooser_stacked-bg.gif) top center no-repeat; |
||||
} |
||||
|
||||
.stacked .selector-chooser li { |
||||
float: left; |
||||
padding: 3px 3px 3px 5px; |
||||
} |
||||
|
||||
.stacked .selector-chooseall, .stacked .selector-clearall { |
||||
display: none; |
||||
} |
||||
|
||||
.stacked .selector-add { |
||||
background: url(../img/selector-icons.gif) 0 -57px no-repeat; |
||||
cursor: default; |
||||
} |
||||
|
||||
.stacked .active.selector-add { |
||||
background: url(../img/selector-icons.gif) 0 -83px no-repeat; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.stacked .selector-remove { |
||||
background: url(../img/selector-icons.gif) 0 -5px no-repeat; |
||||
cursor: default; |
||||
} |
||||
|
||||
.stacked .active.selector-remove { |
||||
background: url(../img/selector-icons.gif) 0 -31px no-repeat; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
/* DATE AND TIME */ |
||||
|
||||
p.datetime { |
||||
line-height: 20px; |
||||
margin: 0; |
||||
padding: 0; |
||||
color: #666; |
||||
font-size: 11px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.datetime span { |
||||
font-size: 11px; |
||||
color: #ccc; |
||||
font-weight: normal; |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
table p.datetime { |
||||
font-size: 10px; |
||||
margin-left: 0; |
||||
padding-left: 0; |
||||
} |
||||
|
||||
/* URL */ |
||||
|
||||
p.url { |
||||
line-height: 20px; |
||||
margin: 0; |
||||
padding: 0; |
||||
color: #666; |
||||
font-size: 11px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.url a { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
/* FILE UPLOADS */ |
||||
|
||||
p.file-upload { |
||||
line-height: 20px; |
||||
margin: 0; |
||||
padding: 0; |
||||
color: #666; |
||||
font-size: 11px; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.file-upload a { |
||||
font-weight: normal; |
||||
} |
||||
|
||||
.file-upload .deletelink { |
||||
margin-left: 5px; |
||||
} |
||||
|
||||
span.clearable-file-input label { |
||||
color: #333; |
||||
font-size: 11px; |
||||
display: inline; |
||||
float: none; |
||||
} |
||||
|
||||
/* CALENDARS & CLOCKS */ |
||||
|
||||
.calendarbox, .clockbox { |
||||
margin: 5px auto; |
||||
font-size: 11px; |
||||
width: 16em; |
||||
text-align: center; |
||||
background: white; |
||||
position: relative; |
||||
} |
||||
|
||||
.clockbox { |
||||
width: auto; |
||||
} |
||||
|
||||
.calendar { |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
.calendar table { |
||||
margin: 0; |
||||
padding: 0; |
||||
border-collapse: collapse; |
||||
background: white; |
||||
width: 100%; |
||||
} |
||||
|
||||
.calendar caption, .calendarbox h2 { |
||||
margin: 0; |
||||
font-size: 11px; |
||||
text-align: center; |
||||
border-top: none; |
||||
} |
||||
|
||||
.calendar th { |
||||
font-size: 10px; |
||||
color: #666; |
||||
padding: 2px 3px; |
||||
text-align: center; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) 0 50% repeat-x; |
||||
border-bottom: 1px solid #ddd; |
||||
} |
||||
|
||||
.calendar td { |
||||
font-size: 11px; |
||||
text-align: center; |
||||
padding: 0; |
||||
border-top: 1px solid #eee; |
||||
border-bottom: none; |
||||
} |
||||
|
||||
.calendar td.selected a { |
||||
background: #C9DBED; |
||||
} |
||||
|
||||
.calendar td.nonday { |
||||
background: #efefef; |
||||
} |
||||
|
||||
.calendar td.today a { |
||||
background: #ffc; |
||||
} |
||||
|
||||
.calendar td a, .timelist a { |
||||
display: block; |
||||
font-weight: bold; |
||||
padding: 4px; |
||||
text-decoration: none; |
||||
color: #444; |
||||
} |
||||
|
||||
.calendar td a:hover, .timelist a:hover { |
||||
background: #5b80b2; |
||||
color: white; |
||||
} |
||||
|
||||
.calendar td a:active, .timelist a:active { |
||||
background: #036; |
||||
color: white; |
||||
} |
||||
|
||||
.calendarnav { |
||||
font-size: 10px; |
||||
text-align: center; |
||||
color: #ccc; |
||||
margin: 0; |
||||
padding: 1px 3px; |
||||
} |
||||
|
||||
.calendarnav a:link, #calendarnav a:visited, #calendarnav a:hover { |
||||
color: #999; |
||||
} |
||||
|
||||
.calendar-shortcuts { |
||||
background: white; |
||||
font-size: 10px; |
||||
line-height: 11px; |
||||
border-top: 1px solid #eee; |
||||
padding: 3px 0 4px; |
||||
color: #ccc; |
||||
} |
||||
|
||||
.calendarbox .calendarnav-previous, .calendarbox .calendarnav-next { |
||||
display: block; |
||||
position: absolute; |
||||
font-weight: bold; |
||||
font-size: 12px; |
||||
background: #C9DBED url(../img/default-bg.gif) bottom left repeat-x; |
||||
padding: 1px 4px 2px 4px; |
||||
color: white; |
||||
} |
||||
|
||||
.calendarnav-previous:hover, .calendarnav-next:hover { |
||||
background: #036; |
||||
} |
||||
|
||||
.calendarnav-previous { |
||||
top: 0; |
||||
left: 0; |
||||
} |
||||
|
||||
.calendarnav-next { |
||||
top: 0; |
||||
right: 0; |
||||
} |
||||
|
||||
.calendar-cancel { |
||||
margin: 0 !important; |
||||
padding: 0 !important; |
||||
font-size: 10px; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) 0 50% repeat-x; |
||||
border-top: 1px solid #ddd; |
||||
} |
||||
|
||||
.calendar-cancel:hover { |
||||
background: #e1e1e1 url(../img/nav-bg-reverse.gif) 0 50% repeat-x; |
||||
} |
||||
|
||||
.calendar-cancel a { |
||||
color: black; |
||||
display: block; |
||||
} |
||||
|
||||
ul.timelist, .timelist li { |
||||
list-style-type: none; |
||||
margin: 0; |
||||
padding: 0; |
||||
} |
||||
|
||||
.timelist a { |
||||
padding: 2px; |
||||
} |
||||
|
||||
/* INLINE ORDERER */ |
||||
|
||||
ul.orderer { |
||||
position: relative; |
||||
padding: 0 !important; |
||||
margin: 0 !important; |
||||
list-style-type: none; |
||||
} |
||||
|
||||
ul.orderer li { |
||||
list-style-type: none; |
||||
display: block; |
||||
padding: 0; |
||||
margin: 0; |
||||
border: 1px solid #bbb; |
||||
border-width: 0 1px 1px 0; |
||||
white-space: nowrap; |
||||
overflow: hidden; |
||||
background: #e2e2e2 url(../img/nav-bg-grabber.gif) repeat-y; |
||||
} |
||||
|
||||
ul.orderer li:hover { |
||||
cursor: move; |
||||
background-color: #ddd; |
||||
} |
||||
|
||||
ul.orderer li a.selector { |
||||
margin-left: 12px; |
||||
overflow: hidden; |
||||
width: 83%; |
||||
font-size: 10px !important; |
||||
padding: 0.6em 0; |
||||
} |
||||
|
||||
ul.orderer li a:link, ul.orderer li a:visited { |
||||
color: #333; |
||||
} |
||||
|
||||
ul.orderer li .inline-deletelink { |
||||
position: absolute; |
||||
right: 4px; |
||||
margin-top: 0.6em; |
||||
} |
||||
|
||||
ul.orderer li.selected { |
||||
background-color: #f8f8f8; |
||||
border-right-color: #f8f8f8; |
||||
} |
||||
|
||||
ul.orderer li.deleted { |
||||
background: #bbb url(../img/deleted-overlay.gif); |
||||
} |
||||
|
||||
ul.orderer li.deleted a:link, ul.orderer li.deleted a:visited { |
||||
color: #888; |
||||
} |
||||
|
||||
ul.orderer li.deleted .inline-deletelink { |
||||
background-image: url(../img/inline-restore.png); |
||||
} |
||||
|
||||
ul.orderer li.deleted:hover, ul.orderer li.deleted a.selector:hover { |
||||
cursor: default; |
||||
} |
||||
|
||||
/* EDIT INLINE */ |
||||
|
||||
.inline-deletelink { |
||||
float: right; |
||||
text-indent: -9999px; |
||||
background: transparent url(../img/inline-delete.png) no-repeat; |
||||
width: 15px; |
||||
height: 15px; |
||||
border: 0px none; |
||||
outline: 0; /* Remove dotted border around link */ |
||||
} |
||||
|
||||
.inline-deletelink:hover { |
||||
background-position: -15px 0; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.editinline button.addlink { |
||||
border: 0px none; |
||||
color: #5b80b2; |
||||
font-size: 100%; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.editinline button.addlink:hover { |
||||
color: #036; |
||||
cursor: pointer; |
||||
} |
||||
|
||||
.editinline table .help { |
||||
text-align: right; |
||||
float: right; |
||||
padding-left: 2em; |
||||
} |
||||
|
||||
.editinline tfoot .addlink { |
||||
white-space: nowrap; |
||||
} |
||||
|
||||
.editinline table thead th:last-child { |
||||
border-left: none; |
||||
} |
||||
|
||||
.editinline tr.deleted { |
||||
background: #ddd url(../img/deleted-overlay.gif); |
||||
} |
||||
|
||||
.editinline tr.deleted .inline-deletelink { |
||||
background-image: url(../img/inline-restore.png); |
||||
} |
||||
|
||||
.editinline tr.deleted td:hover { |
||||
cursor: default; |
||||
} |
||||
|
||||
.editinline tr.deleted td:first-child { |
||||
background-image: none !important; |
||||
} |
||||
|
||||
/* EDIT INLINE - STACKED */ |
||||
|
||||
.editinline-stacked { |
||||
min-width: 758px; |
||||
} |
||||
|
||||
.editinline-stacked .inline-object { |
||||
margin-left: 210px; |
||||
background: white; |
||||
} |
||||
|
||||
.editinline-stacked .inline-source { |
||||
float: left; |
||||
width: 200px; |
||||
background: #f8f8f8; |
||||
} |
||||
|
||||
.editinline-stacked .inline-splitter { |
||||
float: left; |
||||
width: 9px; |
||||
background: #f8f8f8 url(../img/inline-splitter-bg.gif) 50% 50% no-repeat; |
||||
border-right: 1px solid #ccc; |
||||
} |
||||
|
||||
.editinline-stacked .controls { |
||||
clear: both; |
||||
background: #e1e1e1 url(../img/nav-bg.gif) top left repeat-x; |
||||
padding: 3px 4px; |
||||
font-size: 11px; |
||||
border-top: 1px solid #ddd; |
||||
} |
||||
|
||||
@ -1,44 +0,0 @@ |
||||
{% extends base_template %} |
||||
{% load i18n admin_modify %} |
||||
|
||||
{% block extrahead %} |
||||
{{ block.super }} |
||||
<style type="text/css"> |
||||
.nani-language-tabs span { |
||||
display: inline-block; |
||||
padding: 5px 15px; |
||||
border: 1px solid #ccc; |
||||
border-bottom: none; |
||||
position: relative; |
||||
left: 0px; |
||||
top: 1px; |
||||
font-weight: bold; |
||||
} |
||||
.nani-language-tabs span.current { |
||||
border-bottom: 1px solid #fff; |
||||
} |
||||
.nani-language-tabs span.empty { |
||||
opacity: 0.7; |
||||
font-weight: normal; |
||||
} |
||||
.nani-language-tabs a.deletelink { |
||||
right: -17px; |
||||
bottom: 4px; |
||||
position: relative; |
||||
} |
||||
</style> |
||||
{% endblock %} |
||||
|
||||
{% block object-tools %} |
||||
{{ block.super }} |
||||
<div class="nani-language-tabs"> |
||||
{% for url,name,code,status in language_tabs %} |
||||
{% if status == 'current' %} |
||||
<input type="hidden" class="language_button selected" name="{{ code }}" /> |
||||
<span class="current">{{ name }}{% if current_is_translated and allow_deletion %}<a class="deletelink" href="./delete-translation/{{ code }}/" title="{% trans 'Delete Translation' %}"> </a>{% endif %}</span> |
||||
{% else %} |
||||
<span class="{{ status }}"><a href="{{ url }}">{{ name }}</a> {% if status == 'available' and allow_deletion %}<a class="deletelink" href="./delete-translation/{{ code }}/" title="{% trans 'Delete Translation' %}"> </a>{% endif %}</span> |
||||
{% endif %} |
||||
{% endfor %} |
||||
</div> |
||||
{% endblock %} |
||||
@ -1,16 +0,0 @@ |
||||
{% extends "admin/base_site.html" %} |
||||
{% load i18n %} |
||||
|
||||
{% block breadcrumbs %} |
||||
<div class="breadcrumbs"> |
||||
<a href="../../../../../">{% trans "Home" %}</a> › |
||||
<a href="../../../../">{{ app_label|capfirst }}</a> › |
||||
<a href="../../../">{{ opts.verbose_name_plural|capfirst }}</a> › |
||||
<a href="../../">{{ object|truncatewords:"18" }}</a> › |
||||
{% trans 'Delete Translation' %} |
||||
</div> |
||||
{% endblock %} |
||||
|
||||
{% block content %} |
||||
<p>{% blocktrans with object as escaped_object %}Deletion of the {{ language_name }} translation of {{ object_name }} '{{ escaped_object }}' is not allowed, because it is the last available translation of this instance.{% endblocktrans %}</p> |
||||
{% endblock %} |
||||
@ -1,83 +0,0 @@ |
||||
{% load i18n %} |
||||
<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group"> |
||||
<h2>{{ inline_admin_formset.opts.verbose_name_plural|title }}</h2> |
||||
{% include "admin/hvad/includes/translation_tabs.html" %} |
||||
{{ inline_admin_formset.formset.management_form }} |
||||
{{ inline_admin_formset.formset.non_form_errors }} |
||||
|
||||
{% for inline_admin_form in inline_admin_formset %}<div class="inline-related{% if forloop.last %} empty-form last-related{% endif %}" id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}"> |
||||
<h3><b>{{ inline_admin_formset.opts.verbose_name|title }}:</b> <span class="inline_label">{% if inline_admin_form.original %}{{ inline_admin_form.original }}{% else %}#{{ forloop.counter }}{% endif %}</span> |
||||
{% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %} |
||||
{% if inline_admin_formset.formset.can_delete and inline_admin_form.original %}<span class="delete">{{ inline_admin_form.deletion_field.field }} {{ inline_admin_form.deletion_field.label_tag }}</span>{% endif %} |
||||
</h3> |
||||
{% if inline_admin_form.form.non_field_errors %}{{ inline_admin_form.form.non_field_errors }}{% endif %} |
||||
{% for fieldset in inline_admin_form %} |
||||
{% include "admin/includes/fieldset.html" %} |
||||
{% endfor %} |
||||
{% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} |
||||
{{ inline_admin_form.fk_field.field }} |
||||
</div>{% endfor %} |
||||
</div> |
||||
|
||||
<script type="text/javascript"> |
||||
(function($) { |
||||
$(document).ready(function() { |
||||
var rows = "#{{ inline_admin_formset.formset.prefix }}-group .inline-related"; |
||||
var updateInlineLabel = function(row) { |
||||
$(rows).find(".inline_label").each(function(i) { |
||||
var count = i + 1; |
||||
$(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); |
||||
}); |
||||
} |
||||
var reinitDateTimeShortCuts = function() { |
||||
// Reinitialize the calendar and clock widgets by force, yuck. |
||||
if (typeof DateTimeShortcuts != "undefined") { |
||||
$(".datetimeshortcuts").remove(); |
||||
DateTimeShortcuts.init(); |
||||
} |
||||
} |
||||
var updateSelectFilter = function() { |
||||
// If any SelectFilter widgets were added, instantiate a new instance. |
||||
if (typeof SelectFilter != "undefined"){ |
||||
$(".selectfilter").each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], false, "{{ STATIC_URL }}"); |
||||
}); |
||||
$(".selectfilterstacked").each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], true, "{{ STATIC_URL }}"); |
||||
}); |
||||
} |
||||
} |
||||
var initPrepopulatedFields = function(row) { |
||||
row.find('.prepopulated_field').each(function() { |
||||
var field = $(this); |
||||
var input = field.find('input, select, textarea'); |
||||
var dependency_list = input.data('dependency_list') || []; |
||||
var dependencies = []; |
||||
$.each(dependency_list, function(i, field_name) { |
||||
dependencies.push('#' + row.find(field_name).find('input, select, textarea').attr('id')); |
||||
}); |
||||
if (dependencies.length) { |
||||
input.prepopulate(dependencies, input.attr('maxlength')); |
||||
} |
||||
}); |
||||
} |
||||
$(rows).formset({ |
||||
prefix: "{{ inline_admin_formset.formset.prefix }}", |
||||
addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", |
||||
formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}", |
||||
deleteCssClass: "inline-deletelink", |
||||
deleteText: "{% trans "Remove" %}", |
||||
emptyCssClass: "empty-form", |
||||
removed: updateInlineLabel, |
||||
added: (function(row) { |
||||
initPrepopulatedFields(row); |
||||
reinitDateTimeShortCuts(); |
||||
updateSelectFilter(); |
||||
updateInlineLabel(row); |
||||
}) |
||||
}); |
||||
}); |
||||
})(django.jQuery); |
||||
</script> |
||||
@ -1,130 +0,0 @@ |
||||
{% load i18n admin_modify %} |
||||
<div class="inline-group" id="{{ inline_admin_formset.formset.prefix }}-group"> |
||||
<div class="tabular inline-related {% if forloop.last %}last-related{% endif %}"> |
||||
{{ inline_admin_formset.formset.management_form }} |
||||
<fieldset class="module"> |
||||
<a name="{{ inline_admin_formset.opts.verbose_name|slugify }}"></a> |
||||
<h2>{{ inline_admin_formset.opts.verbose_name_plural|capfirst }}</h2> |
||||
{{ inline_admin_formset.formset.non_form_errors }} |
||||
{% include "admin/hvad/includes/translation_tabs.html" %} |
||||
<table> |
||||
<thead><tr> |
||||
{% for field in inline_admin_formset.fields %} |
||||
{% if not field.widget.is_hidden %} |
||||
<th{% if forloop.first %} colspan="2"{% endif %}{% if field.required %} class="required"{% endif %}>{{ field.label|capfirst }}</th> |
||||
{% endif %} |
||||
{% endfor %} |
||||
{% if inline_admin_formset.formset.can_delete %}<th>{% trans "Delete?" %}</th>{% endif %} |
||||
</tr></thead> |
||||
|
||||
<tbody> |
||||
{% for inline_admin_form in inline_admin_formset %} |
||||
{% if inline_admin_form.form.non_field_errors %} |
||||
<tr><td colspan="{{ inline_admin_form|cell_count }}">{{ inline_admin_form.form.non_field_errors }}</td></tr> |
||||
{% endif %} |
||||
<tr class="{% cycle "row1" "row2" %} {% if inline_admin_form.original or inline_admin_form.show_url %}has_original{% endif %}{% if forloop.last %} empty-form{% endif %}" |
||||
id="{{ inline_admin_formset.formset.prefix }}-{% if not forloop.last %}{{ forloop.counter0 }}{% else %}empty{% endif %}"> |
||||
<td class="original"> |
||||
{% if inline_admin_form.original or inline_admin_form.show_url %}<p> |
||||
{% if inline_admin_form.original %} {{ inline_admin_form.original }}{% endif %} |
||||
{% if inline_admin_form.show_url %}<a href="../../../r/{{ inline_admin_form.original_content_type_id }}/{{ inline_admin_form.original.id }}/">{% trans "View on site" %}</a>{% endif %} |
||||
</p>{% endif %} |
||||
{% if inline_admin_form.has_auto_field %}{{ inline_admin_form.pk_field.field }}{% endif %} |
||||
{{ inline_admin_form.fk_field.field }} |
||||
{% spaceless %} |
||||
{% for fieldset in inline_admin_form %} |
||||
{% for line in fieldset %} |
||||
{% for field in line %} |
||||
{% if field.is_hidden %} {{ field.field }} {% endif %} |
||||
{% endfor %} |
||||
{% endfor %} |
||||
{% endfor %} |
||||
{% endspaceless %} |
||||
</td> |
||||
{% for fieldset in inline_admin_form %} |
||||
{% for line in fieldset %} |
||||
{% for field in line %} |
||||
<td class="{{ field.field.name }}"> |
||||
{% if field.is_readonly %} |
||||
<p>{{ field.contents }}</p> |
||||
{% else %} |
||||
{{ field.field.errors.as_ul }} |
||||
{{ field.field }} |
||||
{% endif %} |
||||
</td> |
||||
{% endfor %} |
||||
{% endfor %} |
||||
{% endfor %} |
||||
{% if inline_admin_formset.formset.can_delete %} |
||||
<td class="delete">{% if inline_admin_form.original %}{{ inline_admin_form.deletion_field.field }}{% endif %}</td> |
||||
{% endif %} |
||||
</tr> |
||||
{% endfor %} |
||||
</tbody> |
||||
</table> |
||||
</fieldset> |
||||
</div> |
||||
</div> |
||||
|
||||
<script type="text/javascript"> |
||||
(function($) { |
||||
$(document).ready(function($) { |
||||
var rows = "#{{ inline_admin_formset.formset.prefix }}-group .tabular.inline-related tbody tr"; |
||||
var alternatingRows = function(row) { |
||||
$(rows).not(".add-row").removeClass("row1 row2") |
||||
.filter(":even").addClass("row1").end() |
||||
.filter(rows + ":odd").addClass("row2"); |
||||
} |
||||
var reinitDateTimeShortCuts = function() { |
||||
// Reinitialize the calendar and clock widgets by force |
||||
if (typeof DateTimeShortcuts != "undefined") { |
||||
$(".datetimeshortcuts").remove(); |
||||
DateTimeShortcuts.init(); |
||||
} |
||||
} |
||||
var updateSelectFilter = function() { |
||||
// If any SelectFilter widgets are a part of the new form, |
||||
// instantiate a new SelectFilter instance for it. |
||||
if (typeof SelectFilter != "undefined"){ |
||||
$(".selectfilter").each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], false, "{{ STATIC_URL }}"); |
||||
}); |
||||
$(".selectfilterstacked").each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], true, "{{ STATIC_URL }}"); |
||||
}); |
||||
} |
||||
} |
||||
var initPrepopulatedFields = function(row) { |
||||
row.find('.prepopulated_field').each(function() { |
||||
var field = $(this); |
||||
var input = field.find('input, select, textarea'); |
||||
var dependency_list = input.data('dependency_list') || []; |
||||
var dependencies = []; |
||||
$.each(dependency_list, function(i, field_name) { |
||||
dependencies.push('#' + row.find(field_name).find('input, select, textarea').attr('id')); |
||||
}); |
||||
if (dependencies.length) { |
||||
input.prepopulate(dependencies, input.attr('maxlength')); |
||||
} |
||||
}); |
||||
} |
||||
$(rows).formset({ |
||||
prefix: "{{ inline_admin_formset.formset.prefix }}", |
||||
addText: "{% blocktrans with inline_admin_formset.opts.verbose_name|title as verbose_name %}Add another {{ verbose_name }}{% endblocktrans %}", |
||||
formCssClass: "dynamic-{{ inline_admin_formset.formset.prefix }}", |
||||
deleteCssClass: "inline-deletelink", |
||||
deleteText: "{% trans "Remove" %}", |
||||
emptyCssClass: "empty-form", |
||||
removed: alternatingRows, |
||||
added: (function(row) { |
||||
initPrepopulatedFields(row); |
||||
reinitDateTimeShortCuts(); |
||||
updateSelectFilter(); |
||||
alternatingRows(row); |
||||
}) |
||||
}); |
||||
}); |
||||
})(django.jQuery); |
||||
</script> |
||||
@ -1,11 +0,0 @@ |
||||
{% load i18n %} |
||||
<div class="nani-language-tabs"> |
||||
<a name="{{ inline_admin_formset.opts.verbose_name|slugify }}"></a> |
||||
{% for url,name,code,status in language_tabs %} |
||||
{% if status == 'current' %} |
||||
<span class="current">{{ name }}{% if current_is_translated and allow_deletion %}<a class="deletelink" href="./delete-translation/{{ code }}/" title="{% trans 'Delete Translation' %}"> </a>{% endif %}</span> |
||||
{% else %} |
||||
<span class="{{ status }}"><a href="{{ url }}#{{ inline_admin_formset.opts.verbose_name|slugify }}">{{ name }}</a> {% if status == 'available' and allow_deletion %}<a class="deletelink" href="./delete-translation/{{ code }}/" title="{% trans 'Delete Translation' %}"> </a>{% endif %}</span> |
||||
{% endif %} |
||||
{% endfor %} |
||||
</div> |
||||
|
Before Width: | Height: | Size: 58 B |
|
Before Width: | Height: | Size: 75 B |
|
Before Width: | Height: | Size: 199 B |
|
Before Width: | Height: | Size: 212 B |
|
Before Width: | Height: | Size: 843 B |
|
Before Width: | Height: | Size: 844 B |
|
Before Width: | Height: | Size: 45 B |
|
Before Width: | Height: | Size: 711 B |
|
Before Width: | Height: | Size: 506 B |
|
Before Width: | Height: | Size: 176 B |
|
Before Width: | Height: | Size: 130 B |
|
Before Width: | Height: | Size: 299 B |
|
Before Width: | Height: | Size: 119 B |
|
Before Width: | Height: | Size: 145 B |
|
Before Width: | Height: | Size: 192 B |
|
Before Width: | Height: | Size: 119 B |
|
Before Width: | Height: | Size: 390 B |
|
Before Width: | Height: | Size: 181 B |
|
Before Width: | Height: | Size: 319 B |
|
Before Width: | Height: | Size: 667 B |
|
Before Width: | Height: | Size: 341 B |
|
Before Width: | Height: | Size: 477 B |
|
Before Width: | Height: | Size: 781 B |
|
Before Width: | Height: | Size: 447 B |
|
Before Width: | Height: | Size: 623 B |
|
Before Width: | Height: | Size: 102 B |
|
Before Width: | Height: | Size: 116 B |
|
Before Width: | Height: | Size: 186 B |
|
Before Width: | Height: | Size: 265 B |
|
Before Width: | Height: | Size: 273 B |
|
Before Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 552 B |
|
Before Width: | Height: | Size: 369 B |
|
Before Width: | Height: | Size: 197 B |
|
Before Width: | Height: | Size: 203 B |
|
Before Width: | Height: | Size: 198 B |
|
Before Width: | Height: | Size: 200 B |
|
Before Width: | Height: | Size: 932 B |
|
Before Width: | Height: | Size: 336 B |
|
Before Width: | Height: | Size: 351 B |
|
Before Width: | Height: | Size: 354 B |
@ -1,20 +0,0 @@ |
||||
Copyright (c) 2010 John Resig, http://jquery.com/ |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining |
||||
a copy of this software and associated documentation files (the |
||||
"Software"), to deal in the Software without restriction, including |
||||
without limitation the rights to use, copy, modify, merge, publish, |
||||
distribute, sublicense, and/or sell copies of the Software, and to |
||||
permit persons to whom the Software is furnished to do so, subject to |
||||
the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be |
||||
included in all copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, |
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND |
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE |
||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION |
||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
||||
@ -1,111 +0,0 @@ |
||||
var SelectBox = { |
||||
cache: new Object(), |
||||
init: function(id) { |
||||
var box = document.getElementById(id); |
||||
var node; |
||||
SelectBox.cache[id] = new Array(); |
||||
var cache = SelectBox.cache[id]; |
||||
for (var i = 0; (node = box.options[i]); i++) { |
||||
cache.push({value: node.value, text: node.text, displayed: 1}); |
||||
} |
||||
}, |
||||
redisplay: function(id) { |
||||
// Repopulate HTML select box from cache
|
||||
var box = document.getElementById(id); |
||||
box.options.length = 0; // clear all options
|
||||
for (var i = 0, j = SelectBox.cache[id].length; i < j; i++) { |
||||
var node = SelectBox.cache[id][i]; |
||||
if (node.displayed) { |
||||
box.options[box.options.length] = new Option(node.text, node.value, false, false); |
||||
} |
||||
} |
||||
}, |
||||
filter: function(id, text) { |
||||
// Redisplay the HTML select box, displaying only the choices containing ALL
|
||||
// the words in text. (It's an AND search.)
|
||||
var tokens = text.toLowerCase().split(/\s+/); |
||||
var node, token; |
||||
for (var i = 0; (node = SelectBox.cache[id][i]); i++) { |
||||
node.displayed = 1; |
||||
for (var j = 0; (token = tokens[j]); j++) { |
||||
if (node.text.toLowerCase().indexOf(token) == -1) { |
||||
node.displayed = 0; |
||||
} |
||||
} |
||||
} |
||||
SelectBox.redisplay(id); |
||||
}, |
||||
delete_from_cache: function(id, value) { |
||||
var node, delete_index = null; |
||||
for (var i = 0; (node = SelectBox.cache[id][i]); i++) { |
||||
if (node.value == value) { |
||||
delete_index = i; |
||||
break; |
||||
} |
||||
} |
||||
var j = SelectBox.cache[id].length - 1; |
||||
for (var i = delete_index; i < j; i++) { |
||||
SelectBox.cache[id][i] = SelectBox.cache[id][i+1]; |
||||
} |
||||
SelectBox.cache[id].length--; |
||||
}, |
||||
add_to_cache: function(id, option) { |
||||
SelectBox.cache[id].push({value: option.value, text: option.text, displayed: 1}); |
||||
}, |
||||
cache_contains: function(id, value) { |
||||
// Check if an item is contained in the cache
|
||||
var node; |
||||
for (var i = 0; (node = SelectBox.cache[id][i]); i++) { |
||||
if (node.value == value) { |
||||
return true; |
||||
} |
||||
} |
||||
return false; |
||||
}, |
||||
move: function(from, to) { |
||||
var from_box = document.getElementById(from); |
||||
var to_box = document.getElementById(to); |
||||
var option; |
||||
for (var i = 0; (option = from_box.options[i]); i++) { |
||||
if (option.selected && SelectBox.cache_contains(from, option.value)) { |
||||
SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); |
||||
SelectBox.delete_from_cache(from, option.value); |
||||
} |
||||
} |
||||
SelectBox.redisplay(from); |
||||
SelectBox.redisplay(to); |
||||
}, |
||||
move_all: function(from, to) { |
||||
var from_box = document.getElementById(from); |
||||
var to_box = document.getElementById(to); |
||||
var option; |
||||
for (var i = 0; (option = from_box.options[i]); i++) { |
||||
if (SelectBox.cache_contains(from, option.value)) { |
||||
SelectBox.add_to_cache(to, {value: option.value, text: option.text, displayed: 1}); |
||||
SelectBox.delete_from_cache(from, option.value); |
||||
} |
||||
} |
||||
SelectBox.redisplay(from); |
||||
SelectBox.redisplay(to); |
||||
}, |
||||
sort: function(id) { |
||||
SelectBox.cache[id].sort( function(a, b) { |
||||
a = a.text.toLowerCase(); |
||||
b = b.text.toLowerCase(); |
||||
try { |
||||
if (a > b) return 1; |
||||
if (a < b) return -1; |
||||
} |
||||
catch (e) { |
||||
// silently fail on IE 'unknown' exception
|
||||
} |
||||
return 0; |
||||
} ); |
||||
}, |
||||
select_all: function(id) { |
||||
var box = document.getElementById(id); |
||||
for (var i = 0; i < box.options.length; i++) { |
||||
box.options[i].selected = 'selected'; |
||||
} |
||||
} |
||||
} |
||||
@ -1,161 +0,0 @@ |
||||
/* |
||||
SelectFilter2 - Turns a multiple-select box into a filter interface. |
||||
|
||||
Requires core.js, SelectBox.js and addevent.js. |
||||
*/ |
||||
(function($) { |
||||
function findForm(node) { |
||||
// returns the node of the form containing the given node
|
||||
if (node.tagName.toLowerCase() != 'form') { |
||||
return findForm(node.parentNode); |
||||
} |
||||
return node; |
||||
} |
||||
|
||||
window.SelectFilter = { |
||||
init: function(field_id, field_name, is_stacked, admin_static_prefix) { |
||||
if (field_id.match(/__prefix__/)){ |
||||
// Don't intialize on empty forms.
|
||||
return; |
||||
} |
||||
var from_box = document.getElementById(field_id); |
||||
from_box.id += '_from'; // change its ID
|
||||
from_box.className = 'filtered'; |
||||
|
||||
var ps = from_box.parentNode.getElementsByTagName('p'); |
||||
for (var i=0; i<ps.length; i++) { |
||||
if (ps[i].className.indexOf("info") != -1) { |
||||
// Remove <p class="info">, because it just gets in the way.
|
||||
from_box.parentNode.removeChild(ps[i]); |
||||
} else if (ps[i].className.indexOf("help") != -1) { |
||||
// Move help text up to the top so it isn't below the select
|
||||
// boxes or wrapped off on the side to the right of the add
|
||||
// button:
|
||||
from_box.parentNode.insertBefore(ps[i], from_box.parentNode.firstChild); |
||||
} |
||||
} |
||||
|
||||
// <div class="selector"> or <div class="selector stacked">
|
||||
var selector_div = quickElement('div', from_box.parentNode); |
||||
selector_div.className = is_stacked ? 'selector stacked' : 'selector'; |
||||
|
||||
// <div class="selector-available">
|
||||
var selector_available = quickElement('div', selector_div, ''); |
||||
selector_available.className = 'selector-available'; |
||||
var title_available = quickElement('h2', selector_available, interpolate(gettext('Available %s') + ' ', [field_name])); |
||||
quickElement('img', title_available, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of available %s. You may choose some by selecting them in the box below and then clicking the "Choose" arrow between the two boxes.'), [field_name])); |
||||
|
||||
var filter_p = quickElement('p', selector_available, '', 'id', field_id + '_filter'); |
||||
filter_p.className = 'selector-filter'; |
||||
|
||||
var search_filter_label = quickElement('label', filter_p, '', 'for', field_id + "_input"); |
||||
|
||||
var search_selector_img = quickElement('img', search_filter_label, '', 'src', admin_static_prefix + 'img/selector-search.gif', 'class', 'help-tooltip', 'alt', '', 'title', interpolate(gettext("Type into this box to filter down the list of available %s."), [field_name])); |
||||
|
||||
filter_p.appendChild(document.createTextNode(' ')); |
||||
|
||||
var filter_input = quickElement('input', filter_p, '', 'type', 'text', 'placeholder', gettext("Filter")); |
||||
filter_input.id = field_id + '_input'; |
||||
|
||||
selector_available.appendChild(from_box); |
||||
var choose_all = quickElement('a', selector_available, gettext('Choose all'), 'title', interpolate(gettext('Click to choose all %s at once.'), [field_name]), 'href', 'javascript: (function(){ SelectBox.move_all("' + field_id + '_from", "' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_all_link'); |
||||
choose_all.className = 'selector-chooseall'; |
||||
|
||||
// <ul class="selector-chooser">
|
||||
var selector_chooser = quickElement('ul', selector_div, ''); |
||||
selector_chooser.className = 'selector-chooser'; |
||||
var add_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Choose'), 'title', gettext('Choose'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_from","' + field_id + '_to"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_add_link'); |
||||
add_link.className = 'selector-add'; |
||||
var remove_link = quickElement('a', quickElement('li', selector_chooser, ''), gettext('Remove'), 'title', gettext('Remove'), 'href', 'javascript: (function(){ SelectBox.move("' + field_id + '_to","' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_link'); |
||||
remove_link.className = 'selector-remove'; |
||||
|
||||
// <div class="selector-chosen">
|
||||
var selector_chosen = quickElement('div', selector_div, ''); |
||||
selector_chosen.className = 'selector-chosen'; |
||||
var title_chosen = quickElement('h2', selector_chosen, interpolate(gettext('Chosen %s') + ' ', [field_name])); |
||||
quickElement('img', title_chosen, '', 'src', admin_static_prefix + 'img/icon-unknown.gif', 'width', '10', 'height', '10', 'class', 'help help-tooltip', 'title', interpolate(gettext('This is the list of chosen %s. You may remove some by selecting them in the box below and then clicking the "Remove" arrow between the two boxes.'), [field_name])); |
||||
|
||||
var to_box = quickElement('select', selector_chosen, '', 'id', field_id + '_to', 'multiple', 'multiple', 'size', from_box.size, 'name', from_box.getAttribute('name')); |
||||
to_box.className = 'filtered'; |
||||
var clear_all = quickElement('a', selector_chosen, gettext('Remove all'), 'title', interpolate(gettext('Click to remove all chosen %s at once.'), [field_name]), 'href', 'javascript: (function() { SelectBox.move_all("' + field_id + '_to", "' + field_id + '_from"); SelectFilter.refresh_icons("' + field_id + '");})()', 'id', field_id + '_remove_all_link'); |
||||
clear_all.className = 'selector-clearall'; |
||||
|
||||
from_box.setAttribute('name', from_box.getAttribute('name') + '_old'); |
||||
|
||||
// Set up the JavaScript event handlers for the select box filter interface
|
||||
addEvent(filter_input, 'keyup', function(e) { SelectFilter.filter_key_up(e, field_id); }); |
||||
addEvent(filter_input, 'keydown', function(e) { SelectFilter.filter_key_down(e, field_id); }); |
||||
addEvent(from_box, 'change', function(e) { SelectFilter.refresh_icons(field_id) }); |
||||
addEvent(to_box, 'change', function(e) { SelectFilter.refresh_icons(field_id) }); |
||||
addEvent(from_box, 'dblclick', function() { SelectBox.move(field_id + '_from', field_id + '_to'); SelectFilter.refresh_icons(field_id); }); |
||||
addEvent(to_box, 'dblclick', function() { SelectBox.move(field_id + '_to', field_id + '_from'); SelectFilter.refresh_icons(field_id); }); |
||||
addEvent(findForm(from_box), 'submit', function() { SelectBox.select_all(field_id + '_to'); }); |
||||
SelectBox.init(field_id + '_from'); |
||||
SelectBox.init(field_id + '_to'); |
||||
// Move selected from_box options to to_box
|
||||
SelectBox.move(field_id + '_from', field_id + '_to'); |
||||
|
||||
if (!is_stacked) { |
||||
// In horizontal mode, give the same height to the two boxes.
|
||||
var j_from_box = $(from_box); |
||||
var j_to_box = $(to_box); |
||||
var resize_filters = function() { j_to_box.height($(filter_p).outerHeight() + j_from_box.outerHeight()); } |
||||
if (j_from_box.outerHeight() > 0) { |
||||
resize_filters(); // This fieldset is already open. Resize now.
|
||||
} else { |
||||
// This fieldset is probably collapsed. Wait for its 'show' event.
|
||||
j_to_box.closest('fieldset').one('show.fieldset', resize_filters); |
||||
} |
||||
} |
||||
|
||||
// Initial icon refresh
|
||||
SelectFilter.refresh_icons(field_id); |
||||
}, |
||||
refresh_icons: function(field_id) { |
||||
var from = $('#' + field_id + '_from'); |
||||
var to = $('#' + field_id + '_to'); |
||||
var is_from_selected = from.find('option:selected').length > 0; |
||||
var is_to_selected = to.find('option:selected').length > 0; |
||||
// Active if at least one item is selected
|
||||
$('#' + field_id + '_add_link').toggleClass('active', is_from_selected); |
||||
$('#' + field_id + '_remove_link').toggleClass('active', is_to_selected); |
||||
// Active if the corresponding box isn't empty
|
||||
$('#' + field_id + '_add_all_link').toggleClass('active', from.find('option').length > 0); |
||||
$('#' + field_id + '_remove_all_link').toggleClass('active', to.find('option').length > 0); |
||||
}, |
||||
filter_key_up: function(event, field_id) { |
||||
var from = document.getElementById(field_id + '_from'); |
||||
// don't submit form if user pressed Enter
|
||||
if ((event.which && event.which == 13) || (event.keyCode && event.keyCode == 13)) { |
||||
from.selectedIndex = 0; |
||||
SelectBox.move(field_id + '_from', field_id + '_to'); |
||||
from.selectedIndex = 0; |
||||
return false; |
||||
} |
||||
var temp = from.selectedIndex; |
||||
SelectBox.filter(field_id + '_from', document.getElementById(field_id + '_input').value); |
||||
from.selectedIndex = temp; |
||||
return true; |
||||
}, |
||||
filter_key_down: function(event, field_id) { |
||||
var from = document.getElementById(field_id + '_from'); |
||||
// right arrow -- move across
|
||||
if ((event.which && event.which == 39) || (event.keyCode && event.keyCode == 39)) { |
||||
var old_index = from.selectedIndex; |
||||
SelectBox.move(field_id + '_from', field_id + '_to'); |
||||
from.selectedIndex = (old_index == from.length) ? from.length - 1 : old_index; |
||||
return false; |
||||
} |
||||
// down arrow -- wrap around
|
||||
if ((event.which && event.which == 40) || (event.keyCode && event.keyCode == 40)) { |
||||
from.selectedIndex = (from.length == from.selectedIndex + 1) ? 0 : from.selectedIndex + 1; |
||||
} |
||||
// up arrow -- wrap around
|
||||
if ((event.which && event.which == 38) || (event.keyCode && event.keyCode == 38)) { |
||||
from.selectedIndex = (from.selectedIndex == 0) ? from.length - 1 : from.selectedIndex - 1; |
||||
} |
||||
return true; |
||||
} |
||||
} |
||||
|
||||
})(django.jQuery); |
||||
@ -1,139 +0,0 @@ |
||||
(function($) { |
||||
$.fn.actions = function(opts) { |
||||
var options = $.extend({}, $.fn.actions.defaults, opts); |
||||
var actionCheckboxes = $(this); |
||||
var list_editable_changed = false; |
||||
var checker = function(checked) { |
||||
if (checked) { |
||||
showQuestion(); |
||||
} else { |
||||
reset(); |
||||
} |
||||
$(actionCheckboxes).attr("checked", checked) |
||||
.parent().parent().toggleClass(options.selectedClass, checked); |
||||
}, |
||||
updateCounter = function() { |
||||
var sel = $(actionCheckboxes).filter(":checked").length; |
||||
$(options.counterContainer).html(interpolate( |
||||
ngettext('%(sel)s of %(cnt)s selected', '%(sel)s of %(cnt)s selected', sel), { |
||||
sel: sel, |
||||
cnt: _actions_icnt |
||||
}, true)); |
||||
$(options.allToggle).attr("checked", function() { |
||||
if (sel == actionCheckboxes.length) { |
||||
value = true; |
||||
showQuestion(); |
||||
} else { |
||||
value = false; |
||||
clearAcross(); |
||||
} |
||||
return value; |
||||
}); |
||||
}, |
||||
showQuestion = function() { |
||||
$(options.acrossClears).hide(); |
||||
$(options.acrossQuestions).show(); |
||||
$(options.allContainer).hide(); |
||||
}, |
||||
showClear = function() { |
||||
$(options.acrossClears).show(); |
||||
$(options.acrossQuestions).hide(); |
||||
$(options.actionContainer).toggleClass(options.selectedClass); |
||||
$(options.allContainer).show(); |
||||
$(options.counterContainer).hide(); |
||||
}, |
||||
reset = function() { |
||||
$(options.acrossClears).hide(); |
||||
$(options.acrossQuestions).hide(); |
||||
$(options.allContainer).hide(); |
||||
$(options.counterContainer).show(); |
||||
}, |
||||
clearAcross = function() { |
||||
reset(); |
||||
$(options.acrossInput).val(0); |
||||
$(options.actionContainer).removeClass(options.selectedClass); |
||||
}; |
||||
// Show counter by default
|
||||
$(options.counterContainer).show(); |
||||
// Check state of checkboxes and reinit state if needed
|
||||
$(this).filter(":checked").each(function(i) { |
||||
$(this).parent().parent().toggleClass(options.selectedClass); |
||||
updateCounter(); |
||||
if ($(options.acrossInput).val() == 1) { |
||||
showClear(); |
||||
} |
||||
}); |
||||
$(options.allToggle).show().click(function() { |
||||
checker($(this).attr("checked")); |
||||
updateCounter(); |
||||
}); |
||||
$("div.actions span.question a").click(function(event) { |
||||
event.preventDefault(); |
||||
$(options.acrossInput).val(1); |
||||
showClear(); |
||||
}); |
||||
$("div.actions span.clear a").click(function(event) { |
||||
event.preventDefault(); |
||||
$(options.allToggle).attr("checked", false); |
||||
clearAcross(); |
||||
checker(0); |
||||
updateCounter(); |
||||
}); |
||||
lastChecked = null; |
||||
$(actionCheckboxes).click(function(event) { |
||||
if (!event) { event = window.event; } |
||||
var target = event.target ? event.target : event.srcElement; |
||||
if (lastChecked && $.data(lastChecked) != $.data(target) && event.shiftKey === true) { |
||||
var inrange = false; |
||||
$(lastChecked).attr("checked", target.checked) |
||||
.parent().parent().toggleClass(options.selectedClass, target.checked); |
||||
$(actionCheckboxes).each(function() { |
||||
if ($.data(this) == $.data(lastChecked) || $.data(this) == $.data(target)) { |
||||
inrange = (inrange) ? false : true; |
||||
} |
||||
if (inrange) { |
||||
$(this).attr("checked", target.checked) |
||||
.parent().parent().toggleClass(options.selectedClass, target.checked); |
||||
} |
||||
}); |
||||
} |
||||
$(target).parent().parent().toggleClass(options.selectedClass, target.checked); |
||||
lastChecked = target; |
||||
updateCounter(); |
||||
}); |
||||
$('form#changelist-form table#result_list tr').find('td:gt(0) :input').change(function() { |
||||
list_editable_changed = true; |
||||
}); |
||||
$('form#changelist-form button[name="index"]').click(function(event) { |
||||
if (list_editable_changed) { |
||||
return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost.")); |
||||
} |
||||
}); |
||||
$('form#changelist-form input[name="_save"]').click(function(event) { |
||||
var action_changed = false; |
||||
$('div.actions select option:selected').each(function() { |
||||
if ($(this).val()) { |
||||
action_changed = true; |
||||
} |
||||
}); |
||||
if (action_changed) { |
||||
if (list_editable_changed) { |
||||
return confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")); |
||||
} else { |
||||
return confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button.")); |
||||
} |
||||
} |
||||
}); |
||||
}; |
||||
/* Setup plugin defaults */ |
||||
$.fn.actions.defaults = { |
||||
actionContainer: "div.actions", |
||||
counterContainer: "span.action-counter", |
||||
allContainer: "div.actions span.all", |
||||
acrossInput: "div.actions input.select-across", |
||||
acrossQuestions: "div.actions span.question", |
||||
acrossClears: "div.actions span.clear", |
||||
allToggle: "#action-toggle", |
||||
selectedClass: "selected" |
||||
}; |
||||
})(django.jQuery); |
||||
@ -1,6 +0,0 @@ |
||||
(function(a){a.fn.actions=function(n){var b=a.extend({},a.fn.actions.defaults,n),e=a(this),g=false,k=function(c){c?i():j();a(e).attr("checked",c).parent().parent().toggleClass(b.selectedClass,c)},f=function(){var c=a(e).filter(":checked").length;a(b.counterContainer).html(interpolate(ngettext("%(sel)s of %(cnt)s selected","%(sel)s of %(cnt)s selected",c),{sel:c,cnt:_actions_icnt},true));a(b.allToggle).attr("checked",function(){if(c==e.length){value=true;i()}else{value=false;l()}return value})},i= |
||||
function(){a(b.acrossClears).hide();a(b.acrossQuestions).show();a(b.allContainer).hide()},m=function(){a(b.acrossClears).show();a(b.acrossQuestions).hide();a(b.actionContainer).toggleClass(b.selectedClass);a(b.allContainer).show();a(b.counterContainer).hide()},j=function(){a(b.acrossClears).hide();a(b.acrossQuestions).hide();a(b.allContainer).hide();a(b.counterContainer).show()},l=function(){j();a(b.acrossInput).val(0);a(b.actionContainer).removeClass(b.selectedClass)};a(b.counterContainer).show(); |
||||
a(this).filter(":checked").each(function(){a(this).parent().parent().toggleClass(b.selectedClass);f();a(b.acrossInput).val()==1&&m()});a(b.allToggle).show().click(function(){k(a(this).attr("checked"));f()});a("div.actions span.question a").click(function(c){c.preventDefault();a(b.acrossInput).val(1);m()});a("div.actions span.clear a").click(function(c){c.preventDefault();a(b.allToggle).attr("checked",false);l();k(0);f()});lastChecked=null;a(e).click(function(c){if(!c)c=window.event;var d=c.target? |
||||
c.target:c.srcElement;if(lastChecked&&a.data(lastChecked)!=a.data(d)&&c.shiftKey===true){var h=false;a(lastChecked).attr("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked);a(e).each(function(){if(a.data(this)==a.data(lastChecked)||a.data(this)==a.data(d))h=h?false:true;h&&a(this).attr("checked",d.checked).parent().parent().toggleClass(b.selectedClass,d.checked)})}a(d).parent().parent().toggleClass(b.selectedClass,d.checked);lastChecked=d;f()});a("form#changelist-form table#result_list tr").find("td:gt(0) :input").change(function(){g= |
||||
true});a('form#changelist-form button[name="index"]').click(function(){if(g)return confirm(gettext("You have unsaved changes on individual editable fields. If you run an action, your unsaved changes will be lost."))});a('form#changelist-form input[name="_save"]').click(function(){var c=false;a("div.actions select option:selected").each(function(){if(a(this).val())c=true});if(c)return g?confirm(gettext("You have selected an action, but you haven't saved your changes to individual fields yet. Please click OK to save. You'll need to re-run the action.")): |
||||
confirm(gettext("You have selected an action, and you haven't made any changes on individual fields. You're probably looking for the Go button rather than the Save button."))})};a.fn.actions.defaults={actionContainer:"div.actions",counterContainer:"span.action-counter",allContainer:"div.actions span.all",acrossInput:"div.actions input.select-across",acrossQuestions:"div.actions span.question",acrossClears:"div.actions span.clear",allToggle:"#action-toggle",selectedClass:"selected"}})(django.jQuery); |
||||
@ -1,288 +0,0 @@ |
||||
// Inserts shortcut buttons after all of the following:
|
||||
// <input type="text" class="vDateField">
|
||||
// <input type="text" class="vTimeField">
|
||||
|
||||
var DateTimeShortcuts = { |
||||
calendars: [], |
||||
calendarInputs: [], |
||||
clockInputs: [], |
||||
calendarDivName1: 'calendarbox', // name of calendar <div> that gets toggled
|
||||
calendarDivName2: 'calendarin', // name of <div> that contains calendar
|
||||
calendarLinkName: 'calendarlink',// name of the link that is used to toggle
|
||||
clockDivName: 'clockbox', // name of clock <div> that gets toggled
|
||||
clockLinkName: 'clocklink', // name of the link that is used to toggle
|
||||
shortCutsClass: 'datetimeshortcuts', // class of the clock and cal shortcuts
|
||||
admin_media_prefix: '', |
||||
init: function() { |
||||
// Get admin_media_prefix by grabbing it off the window object. It's
|
||||
// set in the admin/base.html template, so if it's not there, someone's
|
||||
// overridden the template. In that case, we'll set a clearly-invalid
|
||||
// value in the hopes that someone will examine HTTP requests and see it.
|
||||
if (window.__admin_media_prefix__ != undefined) { |
||||
DateTimeShortcuts.admin_media_prefix = window.__admin_media_prefix__; |
||||
} else { |
||||
DateTimeShortcuts.admin_media_prefix = '/missing-admin-media-prefix/'; |
||||
} |
||||
|
||||
var inputs = document.getElementsByTagName('input'); |
||||
for (i=0; i<inputs.length; i++) { |
||||
var inp = inputs[i]; |
||||
if (inp.getAttribute('type') == 'text' && inp.className.match(/vTimeField/)) { |
||||
DateTimeShortcuts.addClock(inp); |
||||
} |
||||
else if (inp.getAttribute('type') == 'text' && inp.className.match(/vDateField/)) { |
||||
DateTimeShortcuts.addCalendar(inp); |
||||
} |
||||
} |
||||
}, |
||||
// Add clock widget to a given field
|
||||
addClock: function(inp) { |
||||
var num = DateTimeShortcuts.clockInputs.length; |
||||
DateTimeShortcuts.clockInputs[num] = inp; |
||||
|
||||
// Shortcut links (clock icon and "Now" link)
|
||||
var shortcuts_span = document.createElement('span'); |
||||
shortcuts_span.className = DateTimeShortcuts.shortCutsClass; |
||||
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); |
||||
var now_link = document.createElement('a'); |
||||
now_link.setAttribute('href', "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().strftime('" + get_format('TIME_INPUT_FORMATS')[0] + "'));"); |
||||
now_link.appendChild(document.createTextNode(gettext('Now'))); |
||||
var clock_link = document.createElement('a'); |
||||
clock_link.setAttribute('href', 'javascript:DateTimeShortcuts.openClock(' + num + ');'); |
||||
clock_link.id = DateTimeShortcuts.clockLinkName + num; |
||||
quickElement('img', clock_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_clock.gif', 'alt', gettext('Clock')); |
||||
shortcuts_span.appendChild(document.createTextNode('\240')); |
||||
shortcuts_span.appendChild(now_link); |
||||
shortcuts_span.appendChild(document.createTextNode('\240|\240')); |
||||
shortcuts_span.appendChild(clock_link); |
||||
|
||||
// Create clock link div
|
||||
//
|
||||
// Markup looks like:
|
||||
// <div id="clockbox1" class="clockbox module">
|
||||
// <h2>Choose a time</h2>
|
||||
// <ul class="timelist">
|
||||
// <li><a href="#">Now</a></li>
|
||||
// <li><a href="#">Midnight</a></li>
|
||||
// <li><a href="#">6 a.m.</a></li>
|
||||
// <li><a href="#">Noon</a></li>
|
||||
// </ul>
|
||||
// <p class="calendar-cancel"><a href="#">Cancel</a></p>
|
||||
// </div>
|
||||
|
||||
var clock_box = document.createElement('div'); |
||||
clock_box.style.display = 'none'; |
||||
clock_box.style.position = 'absolute'; |
||||
clock_box.className = 'clockbox module'; |
||||
clock_box.setAttribute('id', DateTimeShortcuts.clockDivName + num); |
||||
document.body.appendChild(clock_box); |
||||
addEvent(clock_box, 'click', DateTimeShortcuts.cancelEventPropagation); |
||||
|
||||
quickElement('h2', clock_box, gettext('Choose a time')); |
||||
var time_list = quickElement('ul', clock_box, ''); |
||||
time_list.className = 'timelist'; |
||||
var time_format = get_format('TIME_INPUT_FORMATS')[0]; |
||||
quickElement("a", quickElement("li", time_list, ""), gettext("Now"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date().strftime('" + time_format + "'));"); |
||||
quickElement("a", quickElement("li", time_list, ""), gettext("Midnight"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,0,0,0,0).strftime('" + time_format + "'));"); |
||||
quickElement("a", quickElement("li", time_list, ""), gettext("6 a.m."), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,6,0,0,0).strftime('" + time_format + "'));"); |
||||
quickElement("a", quickElement("li", time_list, ""), gettext("Noon"), "href", "javascript:DateTimeShortcuts.handleClockQuicklink(" + num + ", new Date(1970,1,1,12,0,0,0).strftime('" + time_format + "'));"); |
||||
|
||||
var cancel_p = quickElement('p', clock_box, ''); |
||||
cancel_p.className = 'calendar-cancel'; |
||||
quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissClock(' + num + ');'); |
||||
django.jQuery(document).bind('keyup', function(event) { |
||||
if (event.which == 27) { |
||||
// ESC key closes popup
|
||||
DateTimeShortcuts.dismissClock(num); |
||||
event.preventDefault(); |
||||
} |
||||
}); |
||||
}, |
||||
openClock: function(num) { |
||||
var clock_box = document.getElementById(DateTimeShortcuts.clockDivName+num) |
||||
var clock_link = document.getElementById(DateTimeShortcuts.clockLinkName+num) |
||||
|
||||
// Recalculate the clockbox position
|
||||
// is it left-to-right or right-to-left layout ?
|
||||
if (getStyle(document.body,'direction')!='rtl') { |
||||
clock_box.style.left = findPosX(clock_link) + 17 + 'px'; |
||||
} |
||||
else { |
||||
// since style's width is in em, it'd be tough to calculate
|
||||
// px value of it. let's use an estimated px for now
|
||||
// TODO: IE returns wrong value for findPosX when in rtl mode
|
||||
// (it returns as it was left aligned), needs to be fixed.
|
||||
clock_box.style.left = findPosX(clock_link) - 110 + 'px'; |
||||
} |
||||
clock_box.style.top = Math.max(0, findPosY(clock_link) - 30) + 'px'; |
||||
|
||||
// Show the clock box
|
||||
clock_box.style.display = 'block'; |
||||
addEvent(window.document, 'click', function() { DateTimeShortcuts.dismissClock(num); return true; }); |
||||
}, |
||||
dismissClock: function(num) { |
||||
document.getElementById(DateTimeShortcuts.clockDivName + num).style.display = 'none'; |
||||
window.document.onclick = null; |
||||
}, |
||||
handleClockQuicklink: function(num, val) { |
||||
DateTimeShortcuts.clockInputs[num].value = val; |
||||
DateTimeShortcuts.clockInputs[num].focus(); |
||||
DateTimeShortcuts.dismissClock(num); |
||||
}, |
||||
// Add calendar widget to a given field.
|
||||
addCalendar: function(inp) { |
||||
var num = DateTimeShortcuts.calendars.length; |
||||
|
||||
DateTimeShortcuts.calendarInputs[num] = inp; |
||||
|
||||
// Shortcut links (calendar icon and "Today" link)
|
||||
var shortcuts_span = document.createElement('span'); |
||||
shortcuts_span.className = DateTimeShortcuts.shortCutsClass; |
||||
inp.parentNode.insertBefore(shortcuts_span, inp.nextSibling); |
||||
var today_link = document.createElement('a'); |
||||
today_link.setAttribute('href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);'); |
||||
today_link.appendChild(document.createTextNode(gettext('Today'))); |
||||
var cal_link = document.createElement('a'); |
||||
cal_link.setAttribute('href', 'javascript:DateTimeShortcuts.openCalendar(' + num + ');'); |
||||
cal_link.id = DateTimeShortcuts.calendarLinkName + num; |
||||
quickElement('img', cal_link, '', 'src', DateTimeShortcuts.admin_media_prefix + 'img/icon_calendar.gif', 'alt', gettext('Calendar')); |
||||
shortcuts_span.appendChild(document.createTextNode('\240')); |
||||
shortcuts_span.appendChild(today_link); |
||||
shortcuts_span.appendChild(document.createTextNode('\240|\240')); |
||||
shortcuts_span.appendChild(cal_link); |
||||
|
||||
// Create calendarbox div.
|
||||
//
|
||||
// Markup looks like:
|
||||
//
|
||||
// <div id="calendarbox3" class="calendarbox module">
|
||||
// <h2>
|
||||
// <a href="#" class="link-previous">‹</a>
|
||||
// <a href="#" class="link-next">›</a> February 2003
|
||||
// </h2>
|
||||
// <div class="calendar" id="calendarin3">
|
||||
// <!-- (cal) -->
|
||||
// </div>
|
||||
// <div class="calendar-shortcuts">
|
||||
// <a href="#">Yesterday</a> | <a href="#">Today</a> | <a href="#">Tomorrow</a>
|
||||
// </div>
|
||||
// <p class="calendar-cancel"><a href="#">Cancel</a></p>
|
||||
// </div>
|
||||
var cal_box = document.createElement('div'); |
||||
cal_box.style.display = 'none'; |
||||
cal_box.style.position = 'absolute'; |
||||
cal_box.className = 'calendarbox module'; |
||||
cal_box.setAttribute('id', DateTimeShortcuts.calendarDivName1 + num); |
||||
document.body.appendChild(cal_box); |
||||
addEvent(cal_box, 'click', DateTimeShortcuts.cancelEventPropagation); |
||||
|
||||
// next-prev links
|
||||
var cal_nav = quickElement('div', cal_box, ''); |
||||
var cal_nav_prev = quickElement('a', cal_nav, '<', 'href', 'javascript:DateTimeShortcuts.drawPrev('+num+');'); |
||||
cal_nav_prev.className = 'calendarnav-previous'; |
||||
var cal_nav_next = quickElement('a', cal_nav, '>', 'href', 'javascript:DateTimeShortcuts.drawNext('+num+');'); |
||||
cal_nav_next.className = 'calendarnav-next'; |
||||
|
||||
// main box
|
||||
var cal_main = quickElement('div', cal_box, '', 'id', DateTimeShortcuts.calendarDivName2 + num); |
||||
cal_main.className = 'calendar'; |
||||
DateTimeShortcuts.calendars[num] = new Calendar(DateTimeShortcuts.calendarDivName2 + num, DateTimeShortcuts.handleCalendarCallback(num)); |
||||
DateTimeShortcuts.calendars[num].drawCurrent(); |
||||
|
||||
// calendar shortcuts
|
||||
var shortcuts = quickElement('div', cal_box, ''); |
||||
shortcuts.className = 'calendar-shortcuts'; |
||||
quickElement('a', shortcuts, gettext('Yesterday'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', -1);'); |
||||
shortcuts.appendChild(document.createTextNode('\240|\240')); |
||||
quickElement('a', shortcuts, gettext('Today'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', 0);'); |
||||
shortcuts.appendChild(document.createTextNode('\240|\240')); |
||||
quickElement('a', shortcuts, gettext('Tomorrow'), 'href', 'javascript:DateTimeShortcuts.handleCalendarQuickLink(' + num + ', +1);'); |
||||
|
||||
// cancel bar
|
||||
var cancel_p = quickElement('p', cal_box, ''); |
||||
cancel_p.className = 'calendar-cancel'; |
||||
quickElement('a', cancel_p, gettext('Cancel'), 'href', 'javascript:DateTimeShortcuts.dismissCalendar(' + num + ');'); |
||||
django.jQuery(document).bind('keyup', function(event) { |
||||
if (event.which == 27) { |
||||
// ESC key closes popup
|
||||
DateTimeShortcuts.dismissCalendar(num); |
||||
event.preventDefault(); |
||||
} |
||||
}); |
||||
}, |
||||
openCalendar: function(num) { |
||||
var cal_box = document.getElementById(DateTimeShortcuts.calendarDivName1+num) |
||||
var cal_link = document.getElementById(DateTimeShortcuts.calendarLinkName+num) |
||||
var inp = DateTimeShortcuts.calendarInputs[num]; |
||||
|
||||
// Determine if the current value in the input has a valid date.
|
||||
// If so, draw the calendar with that date's year and month.
|
||||
if (inp.value) { |
||||
var date_parts = inp.value.split('-'); |
||||
var year = date_parts[0]; |
||||
var month = parseFloat(date_parts[1]); |
||||
if (year.match(/\d\d\d\d/) && month >= 1 && month <= 12) { |
||||
DateTimeShortcuts.calendars[num].drawDate(month, year); |
||||
} |
||||
} |
||||
|
||||
// Recalculate the clockbox position
|
||||
// is it left-to-right or right-to-left layout ?
|
||||
if (getStyle(document.body,'direction')!='rtl') { |
||||
cal_box.style.left = findPosX(cal_link) + 17 + 'px'; |
||||
} |
||||
else { |
||||
// since style's width is in em, it'd be tough to calculate
|
||||
// px value of it. let's use an estimated px for now
|
||||
// TODO: IE returns wrong value for findPosX when in rtl mode
|
||||
// (it returns as it was left aligned), needs to be fixed.
|
||||
cal_box.style.left = findPosX(cal_link) - 180 + 'px'; |
||||
} |
||||
cal_box.style.top = Math.max(0, findPosY(cal_link) - 75) + 'px'; |
||||
|
||||
cal_box.style.display = 'block'; |
||||
addEvent(window.document, 'click', function() { DateTimeShortcuts.dismissCalendar(num); return true; }); |
||||
}, |
||||
dismissCalendar: function(num) { |
||||
document.getElementById(DateTimeShortcuts.calendarDivName1+num).style.display = 'none'; |
||||
window.document.onclick = null; |
||||
}, |
||||
drawPrev: function(num) { |
||||
DateTimeShortcuts.calendars[num].drawPreviousMonth(); |
||||
}, |
||||
drawNext: function(num) { |
||||
DateTimeShortcuts.calendars[num].drawNextMonth(); |
||||
}, |
||||
handleCalendarCallback: function(num) { |
||||
format = get_format('DATE_INPUT_FORMATS')[0]; |
||||
// the format needs to be escaped a little
|
||||
format = format.replace('\\', '\\\\'); |
||||
format = format.replace('\r', '\\r'); |
||||
format = format.replace('\n', '\\n'); |
||||
format = format.replace('\t', '\\t'); |
||||
format = format.replace("'", "\\'"); |
||||
return ["function(y, m, d) { DateTimeShortcuts.calendarInputs[", |
||||
num, |
||||
"].value = new Date(y, m-1, d).strftime('", |
||||
format, |
||||
"');DateTimeShortcuts.calendarInputs[", |
||||
num, |
||||
"].focus();document.getElementById(DateTimeShortcuts.calendarDivName1+", |
||||
num, |
||||
").style.display='none';}"].join(''); |
||||
}, |
||||
handleCalendarQuickLink: function(num, offset) { |
||||
var d = new Date(); |
||||
d.setDate(d.getDate() + offset) |
||||
DateTimeShortcuts.calendarInputs[num].value = d.strftime(get_format('DATE_INPUT_FORMATS')[0]); |
||||
DateTimeShortcuts.calendarInputs[num].focus(); |
||||
DateTimeShortcuts.dismissCalendar(num); |
||||
}, |
||||
cancelEventPropagation: function(e) { |
||||
if (!e) e = window.event; |
||||
e.cancelBubble = true; |
||||
if (e.stopPropagation) e.stopPropagation(); |
||||
} |
||||
} |
||||
|
||||
addEvent(window, 'load', DateTimeShortcuts.init); |
||||
@ -1,97 +0,0 @@ |
||||
// Handles related-objects functionality: lookup link for raw_id_fields
|
||||
// and Add Another links.
|
||||
|
||||
function html_unescape(text) { |
||||
// Unescape a string that was escaped using django.utils.html.escape.
|
||||
text = text.replace(/</g, '<'); |
||||
text = text.replace(/>/g, '>'); |
||||
text = text.replace(/"/g, '"'); |
||||
text = text.replace(/'/g, "'"); |
||||
text = text.replace(/&/g, '&'); |
||||
return text; |
||||
} |
||||
|
||||
// IE doesn't accept periods or dashes in the window name, but the element IDs
|
||||
// we use to generate popup window names may contain them, therefore we map them
|
||||
// to allowed characters in a reversible way so that we can locate the correct
|
||||
// element when the popup window is dismissed.
|
||||
function id_to_windowname(text) { |
||||
text = text.replace(/\./g, '__dot__'); |
||||
text = text.replace(/\-/g, '__dash__'); |
||||
return text; |
||||
} |
||||
|
||||
function windowname_to_id(text) { |
||||
text = text.replace(/__dot__/g, '.'); |
||||
text = text.replace(/__dash__/g, '-'); |
||||
return text; |
||||
} |
||||
|
||||
function showRelatedObjectLookupPopup(triggeringLink) { |
||||
var name = triggeringLink.id.replace(/^lookup_/, ''); |
||||
name = id_to_windowname(name); |
||||
var href; |
||||
if (triggeringLink.href.search(/\?/) >= 0) { |
||||
href = triggeringLink.href + '&pop=1'; |
||||
} else { |
||||
href = triggeringLink.href + '?pop=1'; |
||||
} |
||||
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); |
||||
win.focus(); |
||||
return false; |
||||
} |
||||
|
||||
function dismissRelatedLookupPopup(win, chosenId) { |
||||
var name = windowname_to_id(win.name); |
||||
var elem = document.getElementById(name); |
||||
if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { |
||||
elem.value += ',' + chosenId; |
||||
} else { |
||||
document.getElementById(name).value = chosenId; |
||||
} |
||||
win.close(); |
||||
} |
||||
|
||||
function showAddAnotherPopup(triggeringLink) { |
||||
var name = triggeringLink.id.replace(/^add_/, ''); |
||||
name = id_to_windowname(name); |
||||
href = triggeringLink.href |
||||
if (href.indexOf('?') == -1) { |
||||
href += '?_popup=1'; |
||||
} else { |
||||
href += '&_popup=1'; |
||||
} |
||||
var win = window.open(href, name, 'height=500,width=800,resizable=yes,scrollbars=yes'); |
||||
win.focus(); |
||||
return false; |
||||
} |
||||
|
||||
function dismissAddAnotherPopup(win, newId, newRepr) { |
||||
// newId and newRepr are expected to have previously been escaped by
|
||||
// django.utils.html.escape.
|
||||
newId = html_unescape(newId); |
||||
newRepr = html_unescape(newRepr); |
||||
var name = windowname_to_id(win.name); |
||||
var elem = document.getElementById(name); |
||||
if (elem) { |
||||
var elemName = elem.nodeName.toUpperCase(); |
||||
if (elemName == 'SELECT') { |
||||
var o = new Option(newRepr, newId); |
||||
elem.options[elem.options.length] = o; |
||||
o.selected = true; |
||||
} else if (elemName == 'INPUT') { |
||||
if (elem.className.indexOf('vManyToManyRawIdAdminField') != -1 && elem.value) { |
||||
elem.value += ',' + newId; |
||||
} else { |
||||
elem.value = newId; |
||||
} |
||||
} |
||||
} else { |
||||
var toId = name + "_to"; |
||||
elem = document.getElementById(toId); |
||||
var o = new Option(newRepr, newId); |
||||
SelectBox.add_to_cache(toId, o); |
||||
SelectBox.redisplay(toId); |
||||
} |
||||
win.close(); |
||||
} |
||||
@ -1,137 +0,0 @@ |
||||
addEvent(window, 'load', reorder_init); |
||||
|
||||
var lis; |
||||
var top = 0; |
||||
var left = 0; |
||||
var height = 30; |
||||
|
||||
function reorder_init() { |
||||
lis = document.getElementsBySelector('ul#orderthese li'); |
||||
var input = document.getElementsBySelector('input[name=order_]')[0]; |
||||
setOrder(input.value.split(',')); |
||||
input.disabled = true; |
||||
draw(); |
||||
// Now initialize the dragging behavior
|
||||
var limit = (lis.length - 1) * height; |
||||
for (var i = 0; i < lis.length; i++) { |
||||
var li = lis[i]; |
||||
var img = document.getElementById('handle'+li.id); |
||||
li.style.zIndex = 1; |
||||
Drag.init(img, li, left + 10, left + 10, top + 10, top + 10 + limit); |
||||
li.onDragStart = startDrag; |
||||
li.onDragEnd = endDrag; |
||||
img.style.cursor = 'move'; |
||||
} |
||||
} |
||||
|
||||
function submitOrderForm() { |
||||
var inputOrder = document.getElementsBySelector('input[name=order_]')[0]; |
||||
inputOrder.value = getOrder(); |
||||
inputOrder.disabled=false; |
||||
} |
||||
|
||||
function startDrag() { |
||||
this.style.zIndex = '10'; |
||||
this.className = 'dragging'; |
||||
} |
||||
|
||||
function endDrag(x, y) { |
||||
this.style.zIndex = '1'; |
||||
this.className = ''; |
||||
// Work out how far along it has been dropped, using x co-ordinate
|
||||
var oldIndex = this.index; |
||||
var newIndex = Math.round((y - 10 - top) / height); |
||||
// 'Snap' to the correct position
|
||||
this.style.top = (10 + top + newIndex * height) + 'px'; |
||||
this.index = newIndex; |
||||
moveItem(oldIndex, newIndex); |
||||
} |
||||
|
||||
function moveItem(oldIndex, newIndex) { |
||||
// Swaps two items, adjusts the index and left co-ord for all others
|
||||
if (oldIndex == newIndex) { |
||||
return; // Nothing to swap;
|
||||
} |
||||
var direction, lo, hi; |
||||
if (newIndex > oldIndex) { |
||||
lo = oldIndex; |
||||
hi = newIndex; |
||||
direction = -1; |
||||
} else { |
||||
direction = 1; |
||||
hi = oldIndex; |
||||
lo = newIndex; |
||||
} |
||||
var lis2 = new Array(); // We will build the new order in this array
|
||||
for (var i = 0; i < lis.length; i++) { |
||||
if (i < lo || i > hi) { |
||||
// Position of items not between the indexes is unaffected
|
||||
lis2[i] = lis[i]; |
||||
continue; |
||||
} else if (i == newIndex) { |
||||
lis2[i] = lis[oldIndex]; |
||||
continue; |
||||
} else { |
||||
// Item is between the two indexes - move it along 1
|
||||
lis2[i] = lis[i - direction]; |
||||
} |
||||
} |
||||
// Re-index everything
|
||||
reIndex(lis2); |
||||
lis = lis2; |
||||
draw(); |
||||
// document.getElementById('hiddenOrder').value = getOrder();
|
||||
document.getElementsBySelector('input[name=order_]')[0].value = getOrder(); |
||||
} |
||||
|
||||
function reIndex(lis) { |
||||
for (var i = 0; i < lis.length; i++) { |
||||
lis[i].index = i; |
||||
} |
||||
} |
||||
|
||||
function draw() { |
||||
for (var i = 0; i < lis.length; i++) { |
||||
var li = lis[i]; |
||||
li.index = i; |
||||
li.style.position = 'absolute'; |
||||
li.style.left = (10 + left) + 'px'; |
||||
li.style.top = (10 + top + (i * height)) + 'px'; |
||||
} |
||||
} |
||||
|
||||
function getOrder() { |
||||
var order = new Array(lis.length); |
||||
for (var i = 0; i < lis.length; i++) { |
||||
order[i] = lis[i].id.substring(1, 100); |
||||
} |
||||
return order.join(','); |
||||
} |
||||
|
||||
function setOrder(id_list) { |
||||
/* Set the current order to match the lsit of IDs */ |
||||
var temp_lis = new Array(); |
||||
for (var i = 0; i < id_list.length; i++) { |
||||
var id = 'p' + id_list[i]; |
||||
temp_lis[temp_lis.length] = document.getElementById(id); |
||||
} |
||||
reIndex(temp_lis); |
||||
lis = temp_lis; |
||||
draw(); |
||||
} |
||||
|
||||
function addEvent(elm, evType, fn, useCapture) |
||||
// addEvent and removeEvent
|
||||
// cross-browser event handling for IE5+, NS6 and Mozilla
|
||||
// By Scott Andrew
|
||||
{ |
||||
if (elm.addEventListener){ |
||||
elm.addEventListener(evType, fn, useCapture); |
||||
return true; |
||||
} else if (elm.attachEvent){ |
||||
var r = elm.attachEvent("on"+evType, fn); |
||||
return r; |
||||
} else { |
||||
elm['on'+evType] = fn; |
||||
} |
||||
} |
||||
@ -1,156 +0,0 @@ |
||||
/* |
||||
calendar.js - Calendar functions by Adrian Holovaty |
||||
*/ |
||||
|
||||
function removeChildren(a) { // "a" is reference to an object
|
||||
while (a.hasChildNodes()) a.removeChild(a.lastChild); |
||||
} |
||||
|
||||
// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
|
||||
function quickElement() { |
||||
var obj = document.createElement(arguments[0]); |
||||
if (arguments[2] != '' && arguments[2] != null) { |
||||
var textNode = document.createTextNode(arguments[2]); |
||||
obj.appendChild(textNode); |
||||
} |
||||
var len = arguments.length; |
||||
for (var i = 3; i < len; i += 2) { |
||||
obj.setAttribute(arguments[i], arguments[i+1]); |
||||
} |
||||
arguments[1].appendChild(obj); |
||||
return obj; |
||||
} |
||||
|
||||
// CalendarNamespace -- Provides a collection of HTML calendar-related helper functions
|
||||
var CalendarNamespace = { |
||||
monthsOfYear: gettext('January February March April May June July August September October November December').split(' '), |
||||
daysOfWeek: gettext('S M T W T F S').split(' '), |
||||
firstDayOfWeek: parseInt(get_format('FIRST_DAY_OF_WEEK')), |
||||
isLeapYear: function(year) { |
||||
return (((year % 4)==0) && ((year % 100)!=0) || ((year % 400)==0)); |
||||
}, |
||||
getDaysInMonth: function(month,year) { |
||||
var days; |
||||
if (month==1 || month==3 || month==5 || month==7 || month==8 || month==10 || month==12) { |
||||
days = 31; |
||||
} |
||||
else if (month==4 || month==6 || month==9 || month==11) { |
||||
days = 30; |
||||
} |
||||
else if (month==2 && CalendarNamespace.isLeapYear(year)) { |
||||
days = 29; |
||||
} |
||||
else { |
||||
days = 28; |
||||
} |
||||
return days; |
||||
}, |
||||
draw: function(month, year, div_id, callback) { // month = 1-12, year = 1-9999
|
||||
var today = new Date(); |
||||
var todayDay = today.getDate(); |
||||
var todayMonth = today.getMonth()+1; |
||||
var todayYear = today.getFullYear(); |
||||
var todayClass = ''; |
||||
|
||||
month = parseInt(month); |
||||
year = parseInt(year); |
||||
var calDiv = document.getElementById(div_id); |
||||
removeChildren(calDiv); |
||||
var calTable = document.createElement('table'); |
||||
quickElement('caption', calTable, CalendarNamespace.monthsOfYear[month-1] + ' ' + year); |
||||
var tableBody = quickElement('tbody', calTable); |
||||
|
||||
// Draw days-of-week header
|
||||
var tableRow = quickElement('tr', tableBody); |
||||
for (var i = 0; i < 7; i++) { |
||||
quickElement('th', tableRow, CalendarNamespace.daysOfWeek[(i + CalendarNamespace.firstDayOfWeek) % 7]); |
||||
} |
||||
|
||||
var startingPos = new Date(year, month-1, 1 - CalendarNamespace.firstDayOfWeek).getDay(); |
||||
var days = CalendarNamespace.getDaysInMonth(month, year); |
||||
|
||||
// Draw blanks before first of month
|
||||
tableRow = quickElement('tr', tableBody); |
||||
for (var i = 0; i < startingPos; i++) { |
||||
var _cell = quickElement('td', tableRow, ' '); |
||||
_cell.style.backgroundColor = '#f3f3f3'; |
||||
} |
||||
|
||||
// Draw days of month
|
||||
var currentDay = 1; |
||||
for (var i = startingPos; currentDay <= days; i++) { |
||||
if (i%7 == 0 && currentDay != 1) { |
||||
tableRow = quickElement('tr', tableBody); |
||||
} |
||||
if ((currentDay==todayDay) && (month==todayMonth) && (year==todayYear)) { |
||||
todayClass='today'; |
||||
} else { |
||||
todayClass=''; |
||||
} |
||||
var cell = quickElement('td', tableRow, '', 'class', todayClass); |
||||
|
||||
quickElement('a', cell, currentDay, 'href', 'javascript:void(' + callback + '('+year+','+month+','+currentDay+'));'); |
||||
currentDay++; |
||||
} |
||||
|
||||
// Draw blanks after end of month (optional, but makes for valid code)
|
||||
while (tableRow.childNodes.length < 7) { |
||||
var _cell = quickElement('td', tableRow, ' '); |
||||
_cell.style.backgroundColor = '#f3f3f3'; |
||||
} |
||||
|
||||
calDiv.appendChild(calTable); |
||||
} |
||||
} |
||||
|
||||
// Calendar -- A calendar instance
|
||||
function Calendar(div_id, callback) { |
||||
// div_id (string) is the ID of the element in which the calendar will
|
||||
// be displayed
|
||||
// callback (string) is the name of a JavaScript function that will be
|
||||
// called with the parameters (year, month, day) when a day in the
|
||||
// calendar is clicked
|
||||
this.div_id = div_id; |
||||
this.callback = callback; |
||||
this.today = new Date(); |
||||
this.currentMonth = this.today.getMonth() + 1; |
||||
this.currentYear = this.today.getFullYear(); |
||||
} |
||||
Calendar.prototype = { |
||||
drawCurrent: function() { |
||||
CalendarNamespace.draw(this.currentMonth, this.currentYear, this.div_id, this.callback); |
||||
}, |
||||
drawDate: function(month, year) { |
||||
this.currentMonth = month; |
||||
this.currentYear = year; |
||||
this.drawCurrent(); |
||||
}, |
||||
drawPreviousMonth: function() { |
||||
if (this.currentMonth == 1) { |
||||
this.currentMonth = 12; |
||||
this.currentYear--; |
||||
} |
||||
else { |
||||
this.currentMonth--; |
||||
} |
||||
this.drawCurrent(); |
||||
}, |
||||
drawNextMonth: function() { |
||||
if (this.currentMonth == 12) { |
||||
this.currentMonth = 1; |
||||
this.currentYear++; |
||||
} |
||||
else { |
||||
this.currentMonth++; |
||||
} |
||||
this.drawCurrent(); |
||||
}, |
||||
drawPreviousYear: function() { |
||||
this.currentYear--; |
||||
this.drawCurrent(); |
||||
}, |
||||
drawNextYear: function() { |
||||
this.currentYear++; |
||||
this.drawCurrent(); |
||||
} |
||||
} |
||||
@ -1,24 +0,0 @@ |
||||
(function($) { |
||||
$(document).ready(function() { |
||||
// Add anchor tag for Show/Hide link
|
||||
$("fieldset.collapse").each(function(i, elem) { |
||||
// Don't hide if fields in this fieldset have errors
|
||||
if ($(elem).find("div.errors").length == 0) { |
||||
$(elem).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser' + |
||||
i +'" class="collapse-toggle" href="#">' + gettext("Show") + |
||||
'</a>)'); |
||||
} |
||||
}); |
||||
// Add toggle to anchor tag
|
||||
$("fieldset.collapse a.collapse-toggle").toggle( |
||||
function() { // Show
|
||||
$(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset", [$(this).attr("id")]); |
||||
return false; |
||||
}, |
||||
function() { // Hide
|
||||
$(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", [$(this).attr("id")]); |
||||
return false; |
||||
} |
||||
); |
||||
}); |
||||
})(django.jQuery); |
||||
@ -1,2 +0,0 @@ |
||||
(function(a){a(document).ready(function(){a("fieldset.collapse").each(function(c,b){a(b).find("div.errors").length==0&&a(b).addClass("collapsed").find("h2").first().append(' (<a id="fieldsetcollapser'+c+'" class="collapse-toggle" href="#">'+gettext("Show")+"</a>)")});a("fieldset.collapse a.collapse-toggle").toggle(function(){a(this).text(gettext("Hide")).closest("fieldset").removeClass("collapsed").trigger("show.fieldset",[a(this).attr("id")]);return false},function(){a(this).text(gettext("Show")).closest("fieldset").addClass("collapsed").trigger("hide.fieldset", |
||||
[a(this).attr("id")]);return false})})})(django.jQuery); |
||||
@ -1,211 +0,0 @@ |
||||
// Core javascript helper functions
|
||||
|
||||
// basic browser identification & version
|
||||
var isOpera = (navigator.userAgent.indexOf("Opera")>=0) && parseFloat(navigator.appVersion); |
||||
var isIE = ((document.all) && (!isOpera)) && parseFloat(navigator.appVersion.split("MSIE ")[1].split(";")[0]); |
||||
|
||||
// Cross-browser event handlers.
|
||||
function addEvent(obj, evType, fn) { |
||||
if (obj.addEventListener) { |
||||
obj.addEventListener(evType, fn, false); |
||||
return true; |
||||
} else if (obj.attachEvent) { |
||||
var r = obj.attachEvent("on" + evType, fn); |
||||
return r; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
function removeEvent(obj, evType, fn) { |
||||
if (obj.removeEventListener) { |
||||
obj.removeEventListener(evType, fn, false); |
||||
return true; |
||||
} else if (obj.detachEvent) { |
||||
obj.detachEvent("on" + evType, fn); |
||||
return true; |
||||
} else { |
||||
return false; |
||||
} |
||||
} |
||||
|
||||
// quickElement(tagType, parentReference, textInChildNode, [, attribute, attributeValue ...]);
|
||||
function quickElement() { |
||||
var obj = document.createElement(arguments[0]); |
||||
if (arguments[2] != '' && arguments[2] != null) { |
||||
var textNode = document.createTextNode(arguments[2]); |
||||
obj.appendChild(textNode); |
||||
} |
||||
var len = arguments.length; |
||||
for (var i = 3; i < len; i += 2) { |
||||
obj.setAttribute(arguments[i], arguments[i+1]); |
||||
} |
||||
arguments[1].appendChild(obj); |
||||
return obj; |
||||
} |
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Cross-browser xmlhttp object
|
||||
// from http://jibbering.com/2002/4/httprequest.html
|
||||
// ----------------------------------------------------------------------------
|
||||
var xmlhttp; |
||||
/*@cc_on @*/ |
||||
/*@if (@_jscript_version >= 5) |
||||
try { |
||||
xmlhttp = new ActiveXObject("Msxml2.XMLHTTP"); |
||||
} catch (e) { |
||||
try { |
||||
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); |
||||
} catch (E) { |
||||
xmlhttp = false; |
||||
} |
||||
} |
||||
@else |
||||
xmlhttp = false; |
||||
@end @*/ |
||||
if (!xmlhttp && typeof XMLHttpRequest != 'undefined') { |
||||
xmlhttp = new XMLHttpRequest(); |
||||
} |
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Find-position functions by PPK
|
||||
// See http://www.quirksmode.org/js/findpos.html
|
||||
// ----------------------------------------------------------------------------
|
||||
function findPosX(obj) { |
||||
var curleft = 0; |
||||
if (obj.offsetParent) { |
||||
while (obj.offsetParent) { |
||||
curleft += obj.offsetLeft - ((isOpera) ? 0 : obj.scrollLeft); |
||||
obj = obj.offsetParent; |
||||
} |
||||
// IE offsetParent does not include the top-level
|
||||
if (isIE && obj.parentElement){ |
||||
curleft += obj.offsetLeft - obj.scrollLeft; |
||||
} |
||||
} else if (obj.x) { |
||||
curleft += obj.x; |
||||
} |
||||
return curleft; |
||||
} |
||||
|
||||
function findPosY(obj) { |
||||
var curtop = 0; |
||||
if (obj.offsetParent) { |
||||
while (obj.offsetParent) { |
||||
curtop += obj.offsetTop - ((isOpera) ? 0 : obj.scrollTop); |
||||
obj = obj.offsetParent; |
||||
} |
||||
// IE offsetParent does not include the top-level
|
||||
if (isIE && obj.parentElement){ |
||||
curtop += obj.offsetTop - obj.scrollTop; |
||||
} |
||||
} else if (obj.y) { |
||||
curtop += obj.y; |
||||
} |
||||
return curtop; |
||||
} |
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Date object extensions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
Date.prototype.getTwelveHours = function() { |
||||
hours = this.getHours(); |
||||
if (hours == 0) { |
||||
return 12; |
||||
} |
||||
else { |
||||
return hours <= 12 ? hours : hours-12 |
||||
} |
||||
} |
||||
|
||||
Date.prototype.getTwoDigitMonth = function() { |
||||
return (this.getMonth() < 9) ? '0' + (this.getMonth()+1) : (this.getMonth()+1); |
||||
} |
||||
|
||||
Date.prototype.getTwoDigitDate = function() { |
||||
return (this.getDate() < 10) ? '0' + this.getDate() : this.getDate(); |
||||
} |
||||
|
||||
Date.prototype.getTwoDigitTwelveHour = function() { |
||||
return (this.getTwelveHours() < 10) ? '0' + this.getTwelveHours() : this.getTwelveHours(); |
||||
} |
||||
|
||||
Date.prototype.getTwoDigitHour = function() { |
||||
return (this.getHours() < 10) ? '0' + this.getHours() : this.getHours(); |
||||
} |
||||
|
||||
Date.prototype.getTwoDigitMinute = function() { |
||||
return (this.getMinutes() < 10) ? '0' + this.getMinutes() : this.getMinutes(); |
||||
} |
||||
|
||||
Date.prototype.getTwoDigitSecond = function() { |
||||
return (this.getSeconds() < 10) ? '0' + this.getSeconds() : this.getSeconds(); |
||||
} |
||||
|
||||
Date.prototype.getHourMinute = function() { |
||||
return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute(); |
||||
} |
||||
|
||||
Date.prototype.getHourMinuteSecond = function() { |
||||
return this.getTwoDigitHour() + ':' + this.getTwoDigitMinute() + ':' + this.getTwoDigitSecond(); |
||||
} |
||||
|
||||
Date.prototype.strftime = function(format) { |
||||
var fields = { |
||||
c: this.toString(), |
||||
d: this.getTwoDigitDate(), |
||||
H: this.getTwoDigitHour(), |
||||
I: this.getTwoDigitTwelveHour(), |
||||
m: this.getTwoDigitMonth(), |
||||
M: this.getTwoDigitMinute(), |
||||
p: (this.getHours() >= 12) ? 'PM' : 'AM', |
||||
S: this.getTwoDigitSecond(), |
||||
w: '0' + this.getDay(), |
||||
x: this.toLocaleDateString(), |
||||
X: this.toLocaleTimeString(), |
||||
y: ('' + this.getFullYear()).substr(2, 4), |
||||
Y: '' + this.getFullYear(), |
||||
'%' : '%' |
||||
}; |
||||
var result = '', i = 0; |
||||
while (i < format.length) { |
||||
if (format.charAt(i) === '%') { |
||||
result = result + fields[format.charAt(i + 1)]; |
||||
++i; |
||||
} |
||||
else { |
||||
result = result + format.charAt(i); |
||||
} |
||||
++i; |
||||
} |
||||
return result; |
||||
} |
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// String object extensions
|
||||
// ----------------------------------------------------------------------------
|
||||
String.prototype.pad_left = function(pad_length, pad_string) { |
||||
var new_string = this; |
||||
for (var i = 0; new_string.length < pad_length; i++) { |
||||
new_string = pad_string + new_string; |
||||
} |
||||
return new_string; |
||||
} |
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
// Get the computed style for and element
|
||||
// ----------------------------------------------------------------------------
|
||||
function getStyle(oElm, strCssRule){ |
||||
var strValue = ""; |
||||
if(document.defaultView && document.defaultView.getComputedStyle){ |
||||
strValue = document.defaultView.getComputedStyle(oElm, "").getPropertyValue(strCssRule); |
||||
} |
||||
else if(oElm.currentStyle){ |
||||
strCssRule = strCssRule.replace(/\-(\w)/g, function (strMatch, p1){ |
||||
return p1.toUpperCase(); |
||||
}); |
||||
strValue = oElm.currentStyle[strCssRule]; |
||||
} |
||||
return strValue; |
||||
} |
||||
@ -1,167 +0,0 @@ |
||||
/* document.getElementsBySelector(selector) |
||||
- returns an array of element objects from the current document |
||||
matching the CSS selector. Selectors can contain element names,
|
||||
class names and ids and can be nested. For example: |
||||
|
||||
elements = document.getElementsBySelect('div#main p a.external') |
||||
|
||||
Will return an array of all 'a' elements with 'external' in their
|
||||
class attribute that are contained inside 'p' elements that are
|
||||
contained inside the 'div' element which has id="main" |
||||
|
||||
New in version 0.4: Support for CSS2 and CSS3 attribute selectors: |
||||
See http://www.w3.org/TR/css3-selectors/#attribute-selectors
|
||||
|
||||
Version 0.4 - Simon Willison, March 25th 2003 |
||||
-- Works in Phoenix 0.5, Mozilla 1.3, Opera 7, Internet Explorer 6, Internet Explorer 5 on Windows |
||||
-- Opera 7 fails
|
||||
*/ |
||||
|
||||
function getAllChildren(e) { |
||||
// Returns all children of element. Workaround required for IE5/Windows. Ugh.
|
||||
return e.all ? e.all : e.getElementsByTagName('*'); |
||||
} |
||||
|
||||
document.getElementsBySelector = function(selector) { |
||||
// Attempt to fail gracefully in lesser browsers
|
||||
if (!document.getElementsByTagName) { |
||||
return new Array(); |
||||
} |
||||
// Split selector in to tokens
|
||||
var tokens = selector.split(' '); |
||||
var currentContext = new Array(document); |
||||
for (var i = 0; i < tokens.length; i++) { |
||||
token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');; |
||||
if (token.indexOf('#') > -1) { |
||||
// Token is an ID selector
|
||||
var bits = token.split('#'); |
||||
var tagName = bits[0]; |
||||
var id = bits[1]; |
||||
var element = document.getElementById(id); |
||||
if (!element || (tagName && element.nodeName.toLowerCase() != tagName)) { |
||||
// ID not found or tag with that ID not found, return false.
|
||||
return new Array(); |
||||
} |
||||
// Set currentContext to contain just this element
|
||||
currentContext = new Array(element); |
||||
continue; // Skip to next token
|
||||
} |
||||
if (token.indexOf('.') > -1) { |
||||
// Token contains a class selector
|
||||
var bits = token.split('.'); |
||||
var tagName = bits[0]; |
||||
var className = bits[1]; |
||||
if (!tagName) { |
||||
tagName = '*'; |
||||
} |
||||
// Get elements matching tag, filter them for class selector
|
||||
var found = new Array; |
||||
var foundCount = 0; |
||||
for (var h = 0; h < currentContext.length; h++) { |
||||
var elements; |
||||
if (tagName == '*') { |
||||
elements = getAllChildren(currentContext[h]); |
||||
} else { |
||||
try { |
||||
elements = currentContext[h].getElementsByTagName(tagName); |
||||
} |
||||
catch(e) { |
||||
elements = []; |
||||
} |
||||
} |
||||
for (var j = 0; j < elements.length; j++) { |
||||
found[foundCount++] = elements[j]; |
||||
} |
||||
} |
||||
currentContext = new Array; |
||||
var currentContextIndex = 0; |
||||
for (var k = 0; k < found.length; k++) { |
||||
if (found[k].className && found[k].className.match(new RegExp('\\b'+className+'\\b'))) { |
||||
currentContext[currentContextIndex++] = found[k]; |
||||
} |
||||
} |
||||
continue; // Skip to next token
|
||||
} |
||||
// Code to deal with attribute selectors
|
||||
if (token.match(/^(\w*)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/)) { |
||||
var tagName = RegExp.$1; |
||||
var attrName = RegExp.$2; |
||||
var attrOperator = RegExp.$3; |
||||
var attrValue = RegExp.$4; |
||||
if (!tagName) { |
||||
tagName = '*'; |
||||
} |
||||
// Grab all of the tagName elements within current context
|
||||
var found = new Array; |
||||
var foundCount = 0; |
||||
for (var h = 0; h < currentContext.length; h++) { |
||||
var elements; |
||||
if (tagName == '*') { |
||||
elements = getAllChildren(currentContext[h]); |
||||
} else { |
||||
elements = currentContext[h].getElementsByTagName(tagName); |
||||
} |
||||
for (var j = 0; j < elements.length; j++) { |
||||
found[foundCount++] = elements[j]; |
||||
} |
||||
} |
||||
currentContext = new Array; |
||||
var currentContextIndex = 0; |
||||
var checkFunction; // This function will be used to filter the elements
|
||||
switch (attrOperator) { |
||||
case '=': // Equality
|
||||
checkFunction = function(e) { return (e.getAttribute(attrName) == attrValue); }; |
||||
break; |
||||
case '~': // Match one of space seperated words
|
||||
checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('\\b'+attrValue+'\\b'))); }; |
||||
break; |
||||
case '|': // Match start with value followed by optional hyphen
|
||||
checkFunction = function(e) { return (e.getAttribute(attrName).match(new RegExp('^'+attrValue+'-?'))); }; |
||||
break; |
||||
case '^': // Match starts with value
|
||||
checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) == 0); }; |
||||
break; |
||||
case '$': // Match ends with value - fails with "Warning" in Opera 7
|
||||
checkFunction = function(e) { return (e.getAttribute(attrName).lastIndexOf(attrValue) == e.getAttribute(attrName).length - attrValue.length); }; |
||||
break; |
||||
case '*': // Match ends with value
|
||||
checkFunction = function(e) { return (e.getAttribute(attrName).indexOf(attrValue) > -1); }; |
||||
break; |
||||
default : |
||||
// Just test for existence of attribute
|
||||
checkFunction = function(e) { return e.getAttribute(attrName); }; |
||||
} |
||||
currentContext = new Array; |
||||
var currentContextIndex = 0; |
||||
for (var k = 0; k < found.length; k++) { |
||||
if (checkFunction(found[k])) { |
||||
currentContext[currentContextIndex++] = found[k]; |
||||
} |
||||
} |
||||
// alert('Attribute Selector: '+tagName+' '+attrName+' '+attrOperator+' '+attrValue);
|
||||
continue; // Skip to next token
|
||||
} |
||||
// If we get here, token is JUST an element (not a class or ID selector)
|
||||
tagName = token; |
||||
var found = new Array; |
||||
var foundCount = 0; |
||||
for (var h = 0; h < currentContext.length; h++) { |
||||
var elements = currentContext[h].getElementsByTagName(tagName); |
||||
for (var j = 0; j < elements.length; j++) { |
||||
found[foundCount++] = elements[j]; |
||||
} |
||||
} |
||||
currentContext = found; |
||||
} |
||||
return currentContext; |
||||
} |
||||
|
||||
/* That revolting regular expression explained |
||||
/^(\w+)\[(\w+)([=~\|\^\$\*]?)=?"?([^\]"]*)"?\]$/ |
||||
\---/ \---/\-------------/ \-------/ |
||||
| | | | |
||||
| | | The value |
||||
| | ~,|,^,$,* or = |
||||
| Attribute
|
||||
Tag |
||||
*/ |
||||
@ -1,272 +0,0 @@ |
||||
/** |
||||
* Django admin inlines |
||||
* |
||||
* Based on jQuery Formset 1.1 |
||||
* @author Stanislaus Madueke (stan DOT madueke AT gmail DOT com) |
||||
* @requires jQuery 1.2.6 or later |
||||
* |
||||
* Copyright (c) 2009, Stanislaus Madueke |
||||
* All rights reserved. |
||||
* |
||||
* Spiced up with Code from Zain Memon's GSoC project 2009 |
||||
* and modified for Django by Jannis Leidel, Travis Swicegood and Julien Phalip. |
||||
* |
||||
* Licensed under the New BSD License |
||||
* See: http://www.opensource.org/licenses/bsd-license.php
|
||||
*/ |
||||
(function($) { |
||||
$.fn.formset = function(opts) { |
||||
var options = $.extend({}, $.fn.formset.defaults, opts); |
||||
var $this = $(this); |
||||
var $parent = $this.parent(); |
||||
var updateElementIndex = function(el, prefix, ndx) { |
||||
var id_regex = new RegExp("(" + prefix + "-(\\d+|__prefix__))"); |
||||
var replacement = prefix + "-" + ndx; |
||||
if ($(el).attr("for")) { |
||||
$(el).attr("for", $(el).attr("for").replace(id_regex, replacement)); |
||||
} |
||||
if (el.id) { |
||||
el.id = el.id.replace(id_regex, replacement); |
||||
} |
||||
if (el.name) { |
||||
el.name = el.name.replace(id_regex, replacement); |
||||
} |
||||
}; |
||||
var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS").attr("autocomplete", "off"); |
||||
var nextIndex = parseInt(totalForms.val(), 10); |
||||
var maxForms = $("#id_" + options.prefix + "-MAX_NUM_FORMS").attr("autocomplete", "off"); |
||||
// only show the add button if we are allowed to add more items,
|
||||
// note that max_num = None translates to a blank string.
|
||||
var showAddButton = maxForms.val() === '' || (maxForms.val()-totalForms.val()) > 0; |
||||
$this.each(function(i) { |
||||
$(this).not("." + options.emptyCssClass).addClass(options.formCssClass); |
||||
}); |
||||
if ($this.length && showAddButton) { |
||||
var addButton; |
||||
if ($this.attr("tagName") == "TR") { |
||||
// If forms are laid out as table rows, insert the
|
||||
// "add" button in a new table row:
|
||||
var numCols = this.eq(-1).children().length; |
||||
$parent.append('<tr class="' + options.addCssClass + '"><td colspan="' + numCols + '"><a href="javascript:void(0)">' + options.addText + "</a></tr>"); |
||||
addButton = $parent.find("tr:last a"); |
||||
} else { |
||||
// Otherwise, insert it immediately after the last form:
|
||||
$this.filter(":last").after('<div class="' + options.addCssClass + '"><a href="javascript:void(0)">' + options.addText + "</a></div>"); |
||||
addButton = $this.filter(":last").next().find("a"); |
||||
} |
||||
addButton.click(function(e) { |
||||
e.preventDefault(); |
||||
var totalForms = $("#id_" + options.prefix + "-TOTAL_FORMS"); |
||||
var template = $("#" + options.prefix + "-empty"); |
||||
var row = template.clone(true); |
||||
row.removeClass(options.emptyCssClass) |
||||
.addClass(options.formCssClass) |
||||
.attr("id", options.prefix + "-" + nextIndex); |
||||
if (row.is("tr")) { |
||||
// If the forms are laid out in table rows, insert
|
||||
// the remove button into the last table cell:
|
||||
row.children(":last").append('<div><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></div>"); |
||||
} else if (row.is("ul") || row.is("ol")) { |
||||
// If they're laid out as an ordered/unordered list,
|
||||
// insert an <li> after the last list item:
|
||||
row.append('<li><a class="' + options.deleteCssClass +'" href="javascript:void(0)">' + options.deleteText + "</a></li>"); |
||||
} else { |
||||
// Otherwise, just insert the remove button as the
|
||||
// last child element of the form's container:
|
||||
row.children(":first").append('<span><a class="' + options.deleteCssClass + '" href="javascript:void(0)">' + options.deleteText + "</a></span>"); |
||||
} |
||||
row.find("*").each(function() { |
||||
updateElementIndex(this, options.prefix, totalForms.val()); |
||||
}); |
||||
// Insert the new form when it has been fully edited
|
||||
row.insertBefore($(template)); |
||||
// Update number of total forms
|
||||
$(totalForms).val(parseInt(totalForms.val(), 10) + 1); |
||||
nextIndex += 1; |
||||
// Hide add button in case we've hit the max, except we want to add infinitely
|
||||
if ((maxForms.val() !== '') && (maxForms.val()-totalForms.val()) <= 0) { |
||||
addButton.parent().hide(); |
||||
} |
||||
// The delete button of each row triggers a bunch of other things
|
||||
row.find("a." + options.deleteCssClass).click(function(e) { |
||||
e.preventDefault(); |
||||
// Remove the parent form containing this button:
|
||||
var row = $(this).parents("." + options.formCssClass); |
||||
row.remove(); |
||||
nextIndex -= 1; |
||||
// If a post-delete callback was provided, call it with the deleted form:
|
||||
if (options.removed) { |
||||
options.removed(row); |
||||
} |
||||
// Update the TOTAL_FORMS form count.
|
||||
var forms = $("." + options.formCssClass); |
||||
$("#id_" + options.prefix + "-TOTAL_FORMS").val(forms.length); |
||||
// Show add button again once we drop below max
|
||||
if ((maxForms.val() === '') || (maxForms.val()-forms.length) > 0) { |
||||
addButton.parent().show(); |
||||
} |
||||
// Also, update names and ids for all remaining form controls
|
||||
// so they remain in sequence:
|
||||
for (var i=0, formCount=forms.length; i<formCount; i++) |
||||
{ |
||||
updateElementIndex($(forms).get(i), options.prefix, i); |
||||
$(forms.get(i)).find("*").each(function() { |
||||
updateElementIndex(this, options.prefix, i); |
||||
}); |
||||
} |
||||
}); |
||||
// If a post-add callback was supplied, call it with the added form:
|
||||
if (options.added) { |
||||
options.added(row); |
||||
} |
||||
}); |
||||
} |
||||
return this; |
||||
}; |
||||
|
||||
/* Setup plugin defaults */ |
||||
$.fn.formset.defaults = { |
||||
prefix: "form", // The form prefix for your django formset
|
||||
addText: "add another", // Text for the add link
|
||||
deleteText: "remove", // Text for the delete link
|
||||
addCssClass: "add-row", // CSS class applied to the add link
|
||||
deleteCssClass: "delete-row", // CSS class applied to the delete link
|
||||
emptyCssClass: "empty-row", // CSS class applied to the empty row
|
||||
formCssClass: "dynamic-form", // CSS class applied to each form in a formset
|
||||
added: null, // Function called each time a new form is added
|
||||
removed: null // Function called each time a form is deleted
|
||||
}; |
||||
|
||||
|
||||
// Tabular inlines ---------------------------------------------------------
|
||||
$.fn.tabularFormset = function(options) { |
||||
var $rows = $(this); |
||||
var alternatingRows = function(row) { |
||||
$($rows.selector).not(".add-row").removeClass("row1 row2") |
||||
.filter(":even").addClass("row1").end() |
||||
.filter(":odd").addClass("row2"); |
||||
}; |
||||
|
||||
var reinitDateTimeShortCuts = function() { |
||||
// Reinitialize the calendar and clock widgets by force
|
||||
if (typeof DateTimeShortcuts != "undefined") { |
||||
$(".datetimeshortcuts").remove(); |
||||
DateTimeShortcuts.init(); |
||||
} |
||||
}; |
||||
|
||||
var updateSelectFilter = function() { |
||||
// If any SelectFilter widgets are a part of the new form,
|
||||
// instantiate a new SelectFilter instance for it.
|
||||
if (typeof SelectFilter != 'undefined'){ |
||||
$('.selectfilter').each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix ); |
||||
}); |
||||
$('.selectfilterstacked').each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix ); |
||||
}); |
||||
} |
||||
}; |
||||
|
||||
var initPrepopulatedFields = function(row) { |
||||
row.find('.prepopulated_field').each(function() { |
||||
var field = $(this), |
||||
input = field.find('input, select, textarea'), |
||||
dependency_list = input.data('dependency_list') || [], |
||||
dependencies = []; |
||||
$.each(dependency_list, function(i, field_name) { |
||||
dependencies.push('#' + row.find('.field-' + field_name).find('input, select, textarea').attr('id')); |
||||
}); |
||||
if (dependencies.length) { |
||||
input.prepopulate(dependencies, input.attr('maxlength')); |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
$rows.formset({ |
||||
prefix: options.prefix, |
||||
addText: options.addText, |
||||
formCssClass: "dynamic-" + options.prefix, |
||||
deleteCssClass: "inline-deletelink", |
||||
deleteText: options.deleteText, |
||||
emptyCssClass: "empty-form", |
||||
removed: alternatingRows, |
||||
added: function(row) { |
||||
initPrepopulatedFields(row); |
||||
reinitDateTimeShortCuts(); |
||||
updateSelectFilter(); |
||||
alternatingRows(row); |
||||
} |
||||
}); |
||||
|
||||
return $rows; |
||||
}; |
||||
|
||||
// Stacked inlines ---------------------------------------------------------
|
||||
$.fn.stackedFormset = function(options) { |
||||
var $rows = $(this); |
||||
var updateInlineLabel = function(row) { |
||||
$($rows.selector).find(".inline_label").each(function(i) { |
||||
var count = i + 1; |
||||
$(this).html($(this).html().replace(/(#\d+)/g, "#" + count)); |
||||
}); |
||||
}; |
||||
|
||||
var reinitDateTimeShortCuts = function() { |
||||
// Reinitialize the calendar and clock widgets by force, yuck.
|
||||
if (typeof DateTimeShortcuts != "undefined") { |
||||
$(".datetimeshortcuts").remove(); |
||||
DateTimeShortcuts.init(); |
||||
} |
||||
}; |
||||
|
||||
var updateSelectFilter = function() { |
||||
// If any SelectFilter widgets were added, instantiate a new instance.
|
||||
if (typeof SelectFilter != "undefined"){ |
||||
$(".selectfilter").each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], false, options.adminStaticPrefix); |
||||
}); |
||||
$(".selectfilterstacked").each(function(index, value){ |
||||
var namearr = value.name.split('-'); |
||||
SelectFilter.init(value.id, namearr[namearr.length-1], true, options.adminStaticPrefix); |
||||
}); |
||||
} |
||||
}; |
||||
|
||||
var initPrepopulatedFields = function(row) { |
||||
row.find('.prepopulated_field').each(function() { |
||||
var field = $(this), |
||||
input = field.find('input, select, textarea'), |
||||
dependency_list = input.data('dependency_list') || [], |
||||
dependencies = []; |
||||
$.each(dependency_list, function(i, field_name) { |
||||
dependencies.push('#' + row.find('.form-row .field-' + field_name).find('input, select, textarea').attr('id')); |
||||
}); |
||||
if (dependencies.length) { |
||||
input.prepopulate(dependencies, input.attr('maxlength')); |
||||
} |
||||
}); |
||||
}; |
||||
|
||||
$rows.formset({ |
||||
prefix: options.prefix, |
||||
addText: options.addText, |
||||
formCssClass: "dynamic-" + options.prefix, |
||||
deleteCssClass: "inline-deletelink", |
||||
deleteText: options.deleteText, |
||||
emptyCssClass: "empty-form", |
||||
removed: updateInlineLabel, |
||||
added: (function(row) { |
||||
initPrepopulatedFields(row); |
||||
reinitDateTimeShortCuts(); |
||||
updateSelectFilter(); |
||||
updateInlineLabel(row); |
||||
}) |
||||
}); |
||||
|
||||
return $rows; |
||||
}; |
||||
})(django.jQuery); |
||||
@ -1,9 +0,0 @@ |
||||
(function(b){b.fn.formset=function(d){var a=b.extend({},b.fn.formset.defaults,d),c=b(this),d=c.parent(),i=function(a,e,g){var d=RegExp("("+e+"-(\\d+|__prefix__))"),e=e+"-"+g;b(a).attr("for")&&b(a).attr("for",b(a).attr("for").replace(d,e));a.id&&(a.id=a.id.replace(d,e));a.name&&(a.name=a.name.replace(d,e))},f=b("#id_"+a.prefix+"-TOTAL_FORMS").attr("autocomplete","off"),g=parseInt(f.val(),10),e=b("#id_"+a.prefix+"-MAX_NUM_FORMS").attr("autocomplete","off"),f=""===e.val()||0<e.val()-f.val();c.each(function(){b(this).not("."+ |
||||
a.emptyCssClass).addClass(a.formCssClass)});if(c.length&&f){var h;"TR"==c.attr("tagName")?(c=this.eq(-1).children().length,d.append('<tr class="'+a.addCssClass+'"><td colspan="'+c+'"><a href="javascript:void(0)">'+a.addText+"</a></tr>"),h=d.find("tr:last a")):(c.filter(":last").after('<div class="'+a.addCssClass+'"><a href="javascript:void(0)">'+a.addText+"</a></div>"),h=c.filter(":last").next().find("a"));h.click(function(d){d.preventDefault();var f=b("#id_"+a.prefix+"-TOTAL_FORMS"),d=b("#"+a.prefix+ |
||||
"-empty"),c=d.clone(true);c.removeClass(a.emptyCssClass).addClass(a.formCssClass).attr("id",a.prefix+"-"+g);c.is("tr")?c.children(":last").append('<div><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></div>"):c.is("ul")||c.is("ol")?c.append('<li><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></li>"):c.children(":first").append('<span><a class="'+a.deleteCssClass+'" href="javascript:void(0)">'+a.deleteText+"</a></span>");c.find("*").each(function(){i(this, |
||||
a.prefix,f.val())});c.insertBefore(b(d));b(f).val(parseInt(f.val(),10)+1);g=g+1;e.val()!==""&&e.val()-f.val()<=0&&h.parent().hide();c.find("a."+a.deleteCssClass).click(function(d){d.preventDefault();d=b(this).parents("."+a.formCssClass);d.remove();g=g-1;a.removed&&a.removed(d);d=b("."+a.formCssClass);b("#id_"+a.prefix+"-TOTAL_FORMS").val(d.length);(e.val()===""||e.val()-d.length>0)&&h.parent().show();for(var c=0,f=d.length;c<f;c++){i(b(d).get(c),a.prefix,c);b(d.get(c)).find("*").each(function(){i(this, |
||||
a.prefix,c)})}});a.added&&a.added(c)})}return this};b.fn.formset.defaults={prefix:"form",addText:"add another",deleteText:"remove",addCssClass:"add-row",deleteCssClass:"delete-row",emptyCssClass:"empty-row",formCssClass:"dynamic-form",added:null,removed:null};b.fn.tabularFormset=function(d){var a=b(this),c=function(){b(a.selector).not(".add-row").removeClass("row1 row2").filter(":even").addClass("row1").end().filter(":odd").addClass("row2")};a.formset({prefix:d.prefix,addText:d.addText,formCssClass:"dynamic-"+ |
||||
d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:c,added:function(a){a.find(".prepopulated_field").each(function(){var d=b(this).find("input, select, textarea"),c=d.data("dependency_list")||[],e=[];b.each(c,function(d,b){e.push("#"+a.find(".field-"+b).find("input, select, textarea").attr("id"))});e.length&&d.prepopulate(e,d.attr("maxlength"))});"undefined"!=typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(),DateTimeShortcuts.init());"undefined"!= |
||||
typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],false,d.adminStaticPrefix)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],true,d.adminStaticPrefix)}));c(a)}});return a};b.fn.stackedFormset=function(d){var a=b(this),c=function(){b(a.selector).find(".inline_label").each(function(a){a+=1;b(this).html(b(this).html().replace(/(#\d+)/g,"#"+a))})};a.formset({prefix:d.prefix, |
||||
addText:d.addText,formCssClass:"dynamic-"+d.prefix,deleteCssClass:"inline-deletelink",deleteText:d.deleteText,emptyCssClass:"empty-form",removed:c,added:function(a){a.find(".prepopulated_field").each(function(){var d=b(this).find("input, select, textarea"),c=d.data("dependency_list")||[],e=[];b.each(c,function(d,b){e.push("#"+a.find(".form-row .field-"+b).find("input, select, textarea").attr("id"))});e.length&&d.prepopulate(e,d.attr("maxlength"))});"undefined"!=typeof DateTimeShortcuts&&(b(".datetimeshortcuts").remove(), |
||||
DateTimeShortcuts.init());"undefined"!=typeof SelectFilter&&(b(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],false,d.adminStaticPrefix)}),b(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],true,d.adminStaticPrefix)}));c(a)}});return a}})(django.jQuery); |
||||
@ -1,8 +0,0 @@ |
||||
/* Puts the included jQuery into our own namespace using noConflict and passing |
||||
* it 'true'. This ensures that the included jQuery doesn't pollute the global |
||||
* namespace (i.e. this preserves pre-existing values for both window.$ and |
||||
* window.jQuery). |
||||
*/ |
||||
var django = { |
||||
"jQuery": jQuery.noConflict(true) |
||||
}; |
||||
@ -1,154 +0,0 @@ |
||||
/*! |
||||
* jQuery JavaScript Library v1.4.2 |
||||
* http://jquery.com/
|
||||
* |
||||
* Copyright 2010, John Resig |
||||
* Dual licensed under the MIT or GPL Version 2 licenses. |
||||
* http://jquery.org/license
|
||||
* |
||||
* Includes Sizzle.js |
||||
* http://sizzlejs.com/
|
||||
* Copyright 2010, The Dojo Foundation |
||||
* Released under the MIT, BSD, and GPL Licenses. |
||||
* |
||||
* Date: Sat Feb 13 22:33:48 2010 -0500 |
||||
*/ |
||||
(function(A,w){function ma(){if(!c.isReady){try{s.documentElement.doScroll("left")}catch(a){setTimeout(ma,1);return}c.ready()}}function Qa(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,j){var i=a.length;if(typeof b==="object"){for(var o in b)X(a,o,b[o],f,e,d);return a}if(d!==w){f=!j&&f&&c.isFunction(d);for(o=0;o<i;o++)e(a[o],b,f?d.call(a[o],o,e(a[o],b)):d,j);return a}return i? |
||||
e(a[0],b):w}function J(){return(new Date).getTime()}function Y(){return false}function Z(){return true}function na(a,b,d){d[0].type=a;return c.event.handle.apply(b,d)}function oa(a){var b,d=[],f=[],e=arguments,j,i,o,k,n,r;i=c.data(this,"events");if(!(a.liveFired===this||!i||!i.live||a.button&&a.type==="click")){a.liveFired=this;var u=i.live.slice(0);for(k=0;k<u.length;k++){i=u[k];i.origType.replace(O,"")===a.type?f.push(i.selector):u.splice(k--,1)}j=c(a.target).closest(f,a.currentTarget);n=0;for(r= |
||||
j.length;n<r;n++)for(k=0;k<u.length;k++){i=u[k];if(j[n].selector===i.selector){o=j[n].elem;f=null;if(i.preType==="mouseenter"||i.preType==="mouseleave")f=c(a.relatedTarget).closest(i.selector)[0];if(!f||f!==o)d.push({elem:o,handleObj:i})}}n=0;for(r=d.length;n<r;n++){j=d[n];a.currentTarget=j.elem;a.data=j.handleObj.data;a.handleObj=j.handleObj;if(j.handleObj.origHandler.apply(j.elem,e)===false){b=false;break}}return b}}function pa(a,b){return"live."+(a&&a!=="*"?a+".":"")+b.replace(/\./g,"`").replace(/ /g, |
||||
"&")}function qa(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function ra(a,b){var d=0;b.each(function(){if(this.nodeName===(a[d]&&a[d].nodeName)){var f=c.data(a[d++]),e=c.data(this,f);if(f=f&&f.events){delete e.handle;e.events={};for(var j in f)for(var i in f[j])c.event.add(this,j,f[j][i],f[j][i].data)}}})}function sa(a,b,d){var f,e,j;b=b&&b[0]?b[0].ownerDocument||b[0]:s;if(a.length===1&&typeof a[0]==="string"&&a[0].length<512&&b===s&&!ta.test(a[0])&&(c.support.checkClone||!ua.test(a[0]))){e= |
||||
true;if(j=c.fragments[a[0]])if(j!==1)f=j}if(!f){f=b.createDocumentFragment();c.clean(a,b,f,d)}if(e)c.fragments[a[0]]=j?f:1;return{fragment:f,cacheable:e}}function K(a,b){var d={};c.each(va.concat.apply([],va.slice(0,b)),function(){d[this]=a});return d}function wa(a){return"scrollTo"in a&&a.document?a:a.nodeType===9?a.defaultView||a.parentWindow:false}var c=function(a,b){return new c.fn.init(a,b)},Ra=A.jQuery,Sa=A.$,s=A.document,T,Ta=/^[^<]*(<[\w\W]+>)[^>]*$|^#([\w-]+)$/,Ua=/^.[^:#\[\.,]*$/,Va=/\S/, |
||||
Wa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Xa=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,P=navigator.userAgent,xa=false,Q=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,R=Array.prototype.slice,ya=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(a==="body"&&!b){this.context=s;this[0]=s.body;this.selector="body";this.length=1;return this}if(typeof a==="string")if((d=Ta.exec(a))&& |
||||
(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:s;if(a=Xa.exec(a))if(c.isPlainObject(b)){a=[s.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=sa([d[1]],[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}return c.merge(this,a)}else{if(b=s.getElementById(d[2])){if(b.id!==d[2])return T.find(a);this.length=1;this[0]=b}this.context=s;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=s;a=s.getElementsByTagName(a);return c.merge(this, |
||||
a)}else return!b||b.jquery?(b||T).find(a):c(b).find(a);else if(c.isFunction(a))return T.ready(a);if(a.selector!==w){this.selector=a.selector;this.context=a.context}return c.makeArray(a,this)},selector:"",jquery:"1.4.2",length:0,size:function(){return this.length},toArray:function(){return R.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){var f=c();c.isArray(a)?ba.apply(f,a):c.merge(f,a);f.prevObject=this;f.context=this.context;if(b=== |
||||
"find")f.selector=this.selector+(this.selector?" ":"")+d;else if(b)f.selector=this.selector+"."+b+"("+d+")";return f},each:function(a,b){return c.each(this,a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(s,c);else Q&&Q.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(R.apply(this,arguments),"slice",R.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this, |
||||
function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice};c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,j,i,o;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b<d;b++)if((e=arguments[b])!=null)for(j in e){i=a[j];o=e[j];if(a!==o)if(f&&o&&(c.isPlainObject(o)||c.isArray(o))){i=i&&(c.isPlainObject(i)|| |
||||
c.isArray(i))?i:c.isArray(o)?[]:{};a[j]=c.extend(f,i,o)}else if(o!==w)a[j]=o}return a};c.extend({noConflict:function(a){A.$=Sa;if(a)A.jQuery=Ra;return c},isReady:false,ready:function(){if(!c.isReady){if(!s.body)return setTimeout(c.ready,13);c.isReady=true;if(Q){for(var a,b=0;a=Q[b++];)a.call(s,c);Q=null}c.fn.triggerHandler&&c(s).triggerHandler("ready")}},bindReady:function(){if(!xa){xa=true;if(s.readyState==="complete")return c.ready();if(s.addEventListener){s.addEventListener("DOMContentLoaded", |
||||
L,false);A.addEventListener("load",c.ready,false)}else if(s.attachEvent){s.attachEvent("onreadystatechange",L);A.attachEvent("onload",c.ready);var a=false;try{a=A.frameElement==null}catch(b){}s.documentElement.doScroll&&a&&ma()}}},isFunction:function(a){return $.call(a)==="[object Function]"},isArray:function(a){return $.call(a)==="[object Array]"},isPlainObject:function(a){if(!a||$.call(a)!=="[object Object]"||a.nodeType||a.setInterval)return false;if(a.constructor&&!aa.call(a,"constructor")&&!aa.call(a.constructor.prototype, |
||||
"isPrototypeOf"))return false;var b;for(b in a);return b===w||aa.call(a,b)},isEmptyObject:function(a){for(var b in a)return false;return true},error:function(a){throw a;},parseJSON:function(a){if(typeof a!=="string"||!a)return null;a=c.trim(a);if(/^[\],:{}\s]*$/.test(a.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return A.JSON&&A.JSON.parse?A.JSON.parse(a):(new Function("return "+ |
||||
a))();else c.error("Invalid JSON: "+a)},noop:function(){},globalEval:function(a){if(a&&Va.test(a)){var b=s.getElementsByTagName("head")[0]||s.documentElement,d=s.createElement("script");d.type="text/javascript";if(c.support.scriptEval)d.appendChild(s.createTextNode(a));else d.text=a;b.insertBefore(d,b.firstChild);b.removeChild(d)}},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,b,d){var f,e=0,j=a.length,i=j===w||c.isFunction(a);if(d)if(i)for(f in a){if(b.apply(a[f], |
||||
d)===false)break}else for(;e<j;){if(b.apply(a[e++],d)===false)break}else if(i)for(f in a){if(b.call(a[f],f,a[f])===false)break}else for(d=a[0];e<j&&b.call(d,e,d)!==false;d=a[++e]);return a},trim:function(a){return(a||"").replace(Wa,"")},makeArray:function(a,b){b=b||[];if(a!=null)a.length==null||typeof a==="string"||c.isFunction(a)||typeof a!=="function"&&a.setInterval?ba.call(b,a):c.merge(b,a);return b},inArray:function(a,b){if(b.indexOf)return b.indexOf(a);for(var d=0,f=b.length;d<f;d++)if(b[d]=== |
||||
a)return d;return-1},merge:function(a,b){var d=a.length,f=0;if(typeof b.length==="number")for(var e=b.length;f<e;f++)a[d++]=b[f];else for(;b[f]!==w;)a[d++]=b[f++];a.length=d;return a},grep:function(a,b,d){for(var f=[],e=0,j=a.length;e<j;e++)!d!==!b(a[e],e)&&f.push(a[e]);return f},map:function(a,b,d){for(var f=[],e,j=0,i=a.length;j<i;j++){e=b(a[j],j,d);if(e!=null)f[f.length]=e}return f.concat.apply([],f)},guid:1,proxy:function(a,b,d){if(arguments.length===2)if(typeof b==="string"){d=a;a=d[b];b=w}else if(b&& |
||||
!c.isFunction(b)){d=b;b=w}if(!b&&a)b=function(){return a.apply(d||this,arguments)};if(a)b.guid=a.guid=a.guid||b.guid||c.guid++;return b},uaMatch:function(a){a=a.toLowerCase();a=/(webkit)[ \/]([\w.]+)/.exec(a)||/(opera)(?:.*version)?[ \/]([\w.]+)/.exec(a)||/(msie) ([\w.]+)/.exec(a)||!/compatible/.test(a)&&/(mozilla)(?:.*? rv:([\w.]+))?/.exec(a)||[];return{browser:a[1]||"",version:a[2]||"0"}},browser:{}});P=c.uaMatch(P);if(P.browser){c.browser[P.browser]=true;c.browser.version=P.version}if(c.browser.webkit)c.browser.safari= |
||||
true;if(ya)c.inArray=function(a,b){return ya.call(b,a)};T=c(s);if(s.addEventListener)L=function(){s.removeEventListener("DOMContentLoaded",L,false);c.ready()};else if(s.attachEvent)L=function(){if(s.readyState==="complete"){s.detachEvent("onreadystatechange",L);c.ready()}};(function(){c.support={};var a=s.documentElement,b=s.createElement("script"),d=s.createElement("div"),f="script"+J();d.style.display="none";d.innerHTML=" <link/><table></table><a href='/a' style='color:red;float:left;opacity:.55;'>a</a><input type='checkbox'/>"; |
||||
var e=d.getElementsByTagName("*"),j=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!j)){c.support={leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(j.getAttribute("style")),hrefNormalized:j.getAttribute("href")==="/a",opacity:/^0.55$/.test(j.style.opacity),cssFloat:!!j.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:s.createElement("select").appendChild(s.createElement("option")).selected, |
||||
parentNode:d.removeChild(d.appendChild(s.createElement("div"))).parentNode===null,deleteExpando:true,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null};b.type="text/javascript";try{b.appendChild(s.createTextNode("window."+f+"=1;"))}catch(i){}a.insertBefore(b,a.firstChild);if(A[f]){c.support.scriptEval=true;delete A[f]}try{delete b.test}catch(o){c.support.deleteExpando=false}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function k(){c.support.noCloneEvent= |
||||
false;d.detachEvent("onclick",k)});d.cloneNode(true).fireEvent("onclick")}d=s.createElement("div");d.innerHTML="<input type='radio' name='radiotest' checked='checked'/>";a=s.createDocumentFragment();a.appendChild(d.firstChild);c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var k=s.createElement("div");k.style.width=k.style.paddingLeft="1px";s.body.appendChild(k);c.boxModel=c.support.boxModel=k.offsetWidth===2;s.body.removeChild(k).style.display="none"});a=function(k){var n= |
||||
s.createElement("div");k="on"+k;var r=k in n;if(!r){n.setAttribute(k,"return;");r=typeof n[k]==="function"}return r};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=j=null}})();c.props={"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ya=0,za={};c.extend({cache:{},expando:G,noData:{embed:true,object:true, |
||||
applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var f=a[G],e=c.cache;if(!f&&typeof b==="string"&&d===w)return null;f||(f=++Ya);if(typeof b==="object"){a[G]=f;e[f]=c.extend(true,{},b)}else if(!e[f]){a[G]=f;e[f]={}}a=e[f];if(d!==w)a[b]=d;return typeof b==="string"?a[b]:a}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==A?za:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{if(c.support.deleteExpando)delete a[c.expando]; |
||||
else a.removeAttribute&&a.removeAttribute(c.expando);delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this,a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===w){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===w&&this.length)f=c.data(this[0],a);return f===w&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this, |
||||
a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d);return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b=== |
||||
w)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]||a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var Aa=/[\n\t]/g,ca=/\s+/,Za=/\r/g,$a=/href|src|style/,ab=/(button|input)/i,bb=/(button|input|object|select|textarea)/i, |
||||
cb=/^(a|area)$/i,Ba=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(n){var r=c(this);r.addClass(a.call(this,n,r.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1)if(e.className){for(var j=" "+e.className+" ", |
||||
i=e.className,o=0,k=b.length;o<k;o++)if(j.indexOf(" "+b[o]+" ")<0)i+=" "+b[o];e.className=c.trim(i)}else e.className=a}return this},removeClass:function(a){if(c.isFunction(a))return this.each(function(k){var n=c(this);n.removeClass(a.call(this,k,n.attr("class")))});if(a&&typeof a==="string"||a===w)for(var b=(a||"").split(ca),d=0,f=this.length;d<f;d++){var e=this[d];if(e.nodeType===1&&e.className)if(a){for(var j=(" "+e.className+" ").replace(Aa," "),i=0,o=b.length;i<o;i++)j=j.replace(" "+b[i]+" ", |
||||
" ");e.className=c.trim(j)}else e.className=""}return this},toggleClass:function(a,b){var d=typeof a,f=typeof b==="boolean";if(c.isFunction(a))return this.each(function(e){var j=c(this);j.toggleClass(a.call(this,e,j.attr("class"),b),b)});return this.each(function(){if(d==="string")for(var e,j=0,i=c(this),o=b,k=a.split(ca);e=k[j++];){o=f?o:!i.hasClass(e);i[o?"addClass":"removeClass"](e)}else if(d==="undefined"||d==="boolean"){this.className&&c.data(this,"__className__",this.className);this.className= |
||||
this.className||a===false?"":c.data(this,"__className__")||""}})},hasClass:function(a){a=" "+a+" ";for(var b=0,d=this.length;b<d;b++)if((" "+this[b].className+" ").replace(Aa," ").indexOf(a)>-1)return true;return false},val:function(a){if(a===w){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value||{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var j=b?d:0;for(d=b?d+1:e.length;j<d;j++){var i= |
||||
e[j];if(i.selected){a=c(i).val();if(b)return a;f.push(a)}}return f}if(Ba.test(b.type)&&!c.support.checkOn)return b.getAttribute("value")===null?"on":b.value;return(b.value||"").replace(Za,"")}return w}var o=c.isFunction(a);return this.each(function(k){var n=c(this),r=a;if(this.nodeType===1){if(o)r=a.call(this,k,n.val());if(typeof r==="number")r+="";if(c.isArray(r)&&Ba.test(this.type))this.checked=c.inArray(n.val(),r)>=0;else if(c.nodeName(this,"select")){var u=c.makeArray(r);c("option",this).each(function(){this.selected= |
||||
c.inArray(c(this).val(),u)>=0});if(!u.length)this.selectedIndex=-1}else this.value=r}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return w;if(f&&b in c.attrFn)return c(a)[b](d);f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==w;b=f&&c.props[b]||b;if(a.nodeType===1){var j=$a.test(b);if(b in a&&f&&!j){if(e){b==="type"&&ab.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed"); |
||||
a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:bb.test(a.nodeName)||cb.test(a.nodeName)&&a.href?0:w;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText=""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&j?a.getAttribute(b,2):a.getAttribute(b);return a===null?w:a}return c.style(a,b,d)}});var O=/\.(.*)$/,db=function(a){return a.replace(/[^\w\s\.\|`]/g, |
||||
function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==A&&!a.frameElement)a=A;var e,j;if(d.handler){e=d;d=e.handler}if(!d.guid)d.guid=c.guid++;if(j=c.data(a)){var i=j.events=j.events||{},o=j.handle;if(!o)j.handle=o=function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(o.elem,arguments):w};o.elem=a;b=b.split(" ");for(var k,n=0,r;k=b[n++];){j=e?c.extend({},e):{handler:d,data:f};if(k.indexOf(".")>-1){r=k.split("."); |
||||
k=r.shift();j.namespace=r.slice(0).sort().join(".")}else{r=[];j.namespace=""}j.type=k;j.guid=d.guid;var u=i[k],z=c.event.special[k]||{};if(!u){u=i[k]=[];if(!z.setup||z.setup.call(a,f,r,o)===false)if(a.addEventListener)a.addEventListener(k,o,false);else a.attachEvent&&a.attachEvent("on"+k,o)}if(z.add){z.add.call(a,j);if(!j.handler.guid)j.handler.guid=d.guid}u.push(j);c.event.global[k]=true}a=null}}},global:{},remove:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){var e,j=0,i,o,k,n,r,u,z=c.data(a), |
||||
C=z&&z.events;if(z&&C){if(b&&b.type){d=b.handler;b=b.type}if(!b||typeof b==="string"&&b.charAt(0)==="."){b=b||"";for(e in C)c.event.remove(a,e+b)}else{for(b=b.split(" ");e=b[j++];){n=e;i=e.indexOf(".")<0;o=[];if(!i){o=e.split(".");e=o.shift();k=new RegExp("(^|\\.)"+c.map(o.slice(0).sort(),db).join("\\.(?:.*\\.)?")+"(\\.|$)")}if(r=C[e])if(d){n=c.event.special[e]||{};for(B=f||0;B<r.length;B++){u=r[B];if(d.guid===u.guid){if(i||k.test(u.namespace)){f==null&&r.splice(B--,1);n.remove&&n.remove.call(a,u)}if(f!= |
||||
null)break}}if(r.length===0||f!=null&&r.length===1){if(!n.teardown||n.teardown.call(a,o)===false)Ca(a,e,z.handle);delete C[e]}}else for(var B=0;B<r.length;B++){u=r[B];if(i||k.test(u.namespace)){c.event.remove(a,n,u.handler,B);r.splice(B--,1)}}}if(c.isEmptyObject(C)){if(b=z.handle)b.elem=null;delete z.events;delete z.handle;c.isEmptyObject(z)&&c.removeData(a)}}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type= |
||||
e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();c.event.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return w;a.result=w;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d,b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(j){}if(!a.isPropagationStopped()&& |
||||
f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){f=a.target;var i,o=c.nodeName(f,"a")&&e==="click",k=c.event.special[e]||{};if((!k._default||k._default.call(d,a)===false)&&!o&&!(f&&f.nodeName&&c.noData[f.nodeName.toLowerCase()])){try{if(f[e]){if(i=f["on"+e])f["on"+e]=null;c.event.triggered=true;f[e]()}}catch(n){}if(i)f["on"+e]=i;c.event.triggered=false}}},handle:function(a){var b,d,f,e;a=arguments[0]=c.event.fix(a||A.event);a.currentTarget=this;b=a.type.indexOf(".")<0&&!a.exclusive; |
||||
if(!b){d=a.type.split(".");a.type=d.shift();f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)")}e=c.data(this,"events");d=e[a.type];if(e&&d){d=d.slice(0);e=0;for(var j=d.length;e<j;e++){var i=d[e];if(b||f.test(i.namespace)){a.handler=i.handler;a.data=i.data;a.handleObj=i;i=i.handler.apply(this,arguments);if(i!==w){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), |
||||
fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||s;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=s.documentElement;d=s.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| |
||||
d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==w)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a){c.event.add(this,a.origType,c.extend({},a,{handler:oa}))},remove:function(a){var b=true,d=a.origType.replace(O,"");c.each(c.data(this, |
||||
"events").live||[],function(){if(d===this.origType.replace(O,""))return b=false});b&&c.event.remove(this,a.origType,oa)}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};var Ca=s.removeEventListener?function(a,b,d){a.removeEventListener(b,d,false)}:function(a,b,d){a.detachEvent("on"+b,d)};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent= |
||||
a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true};c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y, |
||||
isImmediatePropagationStopped:Y};var Da=function(a){var b=a.relatedTarget;try{for(;b&&b!==this;)b=b.parentNode;if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}}catch(d){}},Ea=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ea:Da,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ea:Da)}}});if(!c.support.submitBubbles)c.event.special.submit= |
||||
{setup:function(){if(this.nodeName.toLowerCase()!=="form"){c.event.add(this,"click.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="submit"||d==="image")&&c(b).closest("form").length)return na("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit",function(a){var b=a.target,d=b.type;if((d==="text"||d==="password")&&c(b).closest("form").length&&a.keyCode===13)return na("submit",this,arguments)})}else return false},teardown:function(){c.event.remove(this,".specialSubmit")}}; |
||||
if(!c.support.changeBubbles){var da=/textarea|input|select/i,ea,Fa=function(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d},fa=function(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Fa(d);if(a.type!=="focusout"||d.type!=="radio")c.data(d,"_change_data", |
||||
e);if(!(f===w||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}};c.event.special.change={filters:{focusout:fa,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return fa.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return fa.call(this,a)},beforeactivate:function(a){a=a.target;c.data(a, |
||||
"_change_data",Fa(a))}},setup:function(){if(this.type==="file")return false;for(var a in ea)c.event.add(this,a+".specialChange",ea[a]);return da.test(this.nodeName)},teardown:function(){c.event.remove(this,".specialChange");return da.test(this.nodeName)}};ea=c.event.special.change.filters}s.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this,f)}c.event.special[b]={setup:function(){this.addEventListener(a, |
||||
d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var j in d)this[b](j,f,d[j],e);return this}if(c.isFunction(f)){e=f;f=w}var i=b==="one"?c.proxy(e,function(k){c(this).unbind(k,i);return e.apply(this,arguments)}):e;if(d==="unload"&&b!=="one")this.one(d,f,e);else{j=0;for(var o=this.length;j<o;j++)c.event.add(this[j],d,i,f)}return this}});c.fn.extend({unbind:function(a,b){if(typeof a==="object"&& |
||||
!a.preventDefault)for(var d in a)this.unbind(d,a[d]);else{d=0;for(var f=this.length;d<f;d++)c.event.remove(this[d],a,b)}return this},delegate:function(a,b,d,f){return this.live(b,d,f,a)},undelegate:function(a,b,d){return arguments.length===0?this.unbind("live"):this.die(b,null,d,a)},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}}, |
||||
toggle:function(a){for(var b=arguments,d=1;d<b.length;)c.proxy(a,b[d++]);return this.click(c.proxy(a,function(f){var e=(c.data(this,"lastToggle"+a.guid)||0)%d;c.data(this,"lastToggle"+a.guid,e+1);f.preventDefault();return b[e].apply(this,arguments)||false}))},hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}});var Ga={focus:"focusin",blur:"focusout",mouseenter:"mouseover",mouseleave:"mouseout"};c.each(["live","die"],function(a,b){c.fn[b]=function(d,f,e,j){var i,o=0,k,n,r=j||this.selector, |
||||
u=j?this:c(this.context);if(c.isFunction(f)){e=f;f=w}for(d=(d||"").split(" ");(i=d[o++])!=null;){j=O.exec(i);k="";if(j){k=j[0];i=i.replace(O,"")}if(i==="hover")d.push("mouseenter"+k,"mouseleave"+k);else{n=i;if(i==="focus"||i==="blur"){d.push(Ga[i]+k);i+=k}else i=(Ga[i]||i)+k;b==="live"?u.each(function(){c.event.add(this,pa(i,r),{data:f,selector:r,handler:e,origType:i,origHandler:e,preType:n})}):u.unbind(pa(i,r),e)}}return this}});c.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error".split(" "), |
||||
function(a,b){c.fn[b]=function(d){return d?this.bind(b,d):this.trigger(b)};if(c.attrFn)c.attrFn[b]=true});A.attachEvent&&!A.addEventListener&&A.attachEvent("onunload",function(){for(var a in c.cache)if(c.cache[a].handle)try{c.event.remove(c.cache[a].handle.elem)}catch(b){}});(function(){function a(g){for(var h="",l,m=0;g[m];m++){l=g[m];if(l.nodeType===3||l.nodeType===4)h+=l.nodeValue;else if(l.nodeType!==8)h+=a(l.childNodes)}return h}function b(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q]; |
||||
if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1&&!p){t.sizcache=l;t.sizset=q}if(t.nodeName.toLowerCase()===h){y=t;break}t=t[g]}m[q]=y}}}function d(g,h,l,m,q,p){q=0;for(var v=m.length;q<v;q++){var t=m[q];if(t){t=t[g];for(var y=false;t;){if(t.sizcache===l){y=m[t.sizset];break}if(t.nodeType===1){if(!p){t.sizcache=l;t.sizset=q}if(typeof h!=="string"){if(t===h){y=true;break}}else if(k.filter(h,[t]).length>0){y=t;break}}t=t[g]}m[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g, |
||||
e=0,j=Object.prototype.toString,i=false,o=true;[0,0].sort(function(){o=false;return 0});var k=function(g,h,l,m){l=l||[];var q=h=h||s;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g||typeof g!=="string")return l;for(var p=[],v,t,y,S,H=true,M=x(h),I=g;(f.exec(""),v=f.exec(I))!==null;){I=v[3];p.push(v[1]);if(v[2]){S=v[3];break}}if(p.length>1&&r.exec(g))if(p.length===2&&n.relative[p[0]])t=ga(p[0]+p[1],h);else for(t=n.relative[p[0]]?[h]:k(p.shift(),h);p.length;){g=p.shift();if(n.relative[g])g+=p.shift(); |
||||
t=ga(g,t)}else{if(!m&&p.length>1&&h.nodeType===9&&!M&&n.match.ID.test(p[0])&&!n.match.ID.test(p[p.length-1])){v=k.find(p.shift(),h,M);h=v.expr?k.filter(v.expr,v.set)[0]:v.set[0]}if(h){v=m?{expr:p.pop(),set:z(m)}:k.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=v.expr?k.filter(v.expr,v.set):v.set;if(p.length>0)y=z(t);else H=false;for(;p.length;){var D=p.pop();v=D;if(n.relative[D])v=p.pop();else D="";if(v==null)v=h;n.relative[D](y,v,M)}}else y=[]}y||(y=t);y||k.error(D|| |
||||
g);if(j.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))l.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&&y[g].nodeType===1&&l.push(t[g]);else l.push.apply(l,y);else z(y,l);if(S){k(S,q,l,m);k.uniqueSort(l)}return l};k.uniqueSort=function(g){if(B){i=o;g.sort(B);if(i)for(var h=1;h<g.length;h++)g[h]===g[h-1]&&g.splice(h--,1)}return g};k.matches=function(g,h){return k(g,null,null,h)};k.find=function(g,h,l){var m,q;if(!g)return[]; |
||||
for(var p=0,v=n.order.length;p<v;p++){var t=n.order[p];if(q=n.leftMatch[t].exec(g)){var y=q[1];q.splice(1,1);if(y.substr(y.length-1)!=="\\"){q[1]=(q[1]||"").replace(/\\/g,"");m=n.find[t](q,h,l);if(m!=null){g=g.replace(n.match[t],"");break}}}}m||(m=h.getElementsByTagName("*"));return{set:m,expr:g}};k.filter=function(g,h,l,m){for(var q=g,p=[],v=h,t,y,S=h&&h[0]&&x(h[0]);g&&h.length;){for(var H in n.filter)if((t=n.leftMatch[H].exec(g))!=null&&t[2]){var M=n.filter[H],I,D;D=t[1];y=false;t.splice(1,1);if(D.substr(D.length- |
||||
1)!=="\\"){if(v===p)p=[];if(n.preFilter[H])if(t=n.preFilter[H](t,v,l,p,m,S)){if(t===true)continue}else y=I=true;if(t)for(var U=0;(D=v[U])!=null;U++)if(D){I=M(D,t,U,v);var Ha=m^!!I;if(l&&I!=null)if(Ha)y=true;else v[U]=false;else if(Ha){p.push(D);y=true}}if(I!==w){l||(v=p);g=g.replace(n.match[H],"");if(!y)return[];break}}}if(g===q)if(y==null)k.error(g);else break;q=g}return v};k.error=function(g){throw"Syntax error, unrecognized expression: "+g;};var n=k.selectors={order:["ID","NAME","TAG"],match:{ID:/#((?:[\w\u00c0-\uFFFF-]|\\.)+)/, |
||||
CLASS:/\.((?:[\w\u00c0-\uFFFF-]|\\.)+)/,NAME:/\[name=['"]*((?:[\w\u00c0-\uFFFF-]|\\.)+)['"]*\]/,ATTR:/\[\s*((?:[\w\u00c0-\uFFFF-]|\\.)+)\s*(?:(\S?=)\s*(['"]*)(.*?)\3|)\s*\]/,TAG:/^((?:[\w\u00c0-\uFFFF\*-]|\\.)+)/,CHILD:/:(only|nth|last|first)-child(?:\((even|odd|[\dn+-]*)\))?/,POS:/:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^-]|$)/,PSEUDO:/:((?:[\w\u00c0-\uFFFF-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/},leftMatch:{},attrMap:{"class":"className","for":"htmlFor"},attrHandle:{href:function(g){return g.getAttribute("href")}}, |
||||
relative:{"+":function(g,h){var l=typeof h==="string",m=l&&!/\W/.test(h);l=l&&!m;if(m)h=h.toLowerCase();m=0;for(var q=g.length,p;m<q;m++)if(p=g[m]){for(;(p=p.previousSibling)&&p.nodeType!==1;);g[m]=l||p&&p.nodeName.toLowerCase()===h?p||false:p===h}l&&k.filter(h,g,true)},">":function(g,h){var l=typeof h==="string";if(l&&!/\W/.test(h)){h=h.toLowerCase();for(var m=0,q=g.length;m<q;m++){var p=g[m];if(p){l=p.parentNode;g[m]=l.nodeName.toLowerCase()===h?l:false}}}else{m=0;for(q=g.length;m<q;m++)if(p=g[m])g[m]= |
||||
l?p.parentNode:p.parentNode===h;l&&k.filter(h,g,true)}},"":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("parentNode",h,m,g,p,l)},"~":function(g,h,l){var m=e++,q=d;if(typeof h==="string"&&!/\W/.test(h)){var p=h=h.toLowerCase();q=b}q("previousSibling",h,m,g,p,l)}},find:{ID:function(g,h,l){if(typeof h.getElementById!=="undefined"&&!l)return(g=h.getElementById(g[1]))?[g]:[]},NAME:function(g,h){if(typeof h.getElementsByName!=="undefined"){var l=[]; |
||||
h=h.getElementsByName(g[1]);for(var m=0,q=h.length;m<q;m++)h[m].getAttribute("name")===g[1]&&l.push(h[m]);return l.length===0?null:l}},TAG:function(g,h){return h.getElementsByTagName(g[1])}},preFilter:{CLASS:function(g,h,l,m,q,p){g=" "+g[1].replace(/\\/g,"")+" ";if(p)return g;p=0;for(var v;(v=h[p])!=null;p++)if(v)if(q^(v.className&&(" "+v.className+" ").replace(/[\t\n]/g," ").indexOf(g)>=0))l||m.push(v);else if(l)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()}, |
||||
CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&&"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,l,m,q,p){h=g[1].replace(/\\/g,"");if(!p&&n.attrMap[h])g[1]=n.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,l,m,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=k(g[3],null,null,h);else{g=k.filter(g[3],h,l,true^q);l||m.push.apply(m, |
||||
g);return false}else if(n.match.POS.test(g[0])||n.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true);return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,l){return!!k(l[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)}, |
||||
text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"===g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}}, |
||||
setFilters:{first:function(g,h){return h===0},last:function(g,h,l,m){return h===m.length-1},even:function(g,h){return h%2===0},odd:function(g,h){return h%2===1},lt:function(g,h,l){return h<l[3]-0},gt:function(g,h,l){return h>l[3]-0},nth:function(g,h,l){return l[3]-0===h},eq:function(g,h,l){return l[3]-0===h}},filter:{PSEUDO:function(g,h,l,m){var q=h[1],p=n.filters[q];if(p)return p(g,l,h,m);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h= |
||||
h[3];l=0;for(m=h.length;l<m;l++)if(h[l]===g)return false;return true}else k.error("Syntax error, unrecognized expression: "+q)},CHILD:function(g,h){var l=h[1],m=g;switch(l){case "only":case "first":for(;m=m.previousSibling;)if(m.nodeType===1)return false;if(l==="first")return true;m=g;case "last":for(;m=m.nextSibling;)if(m.nodeType===1)return false;return true;case "nth":l=h[2];var q=h[3];if(l===1&&q===0)return true;h=h[0];var p=g.parentNode;if(p&&(p.sizcache!==h||!g.nodeIndex)){var v=0;for(m=p.firstChild;m;m= |
||||
m.nextSibling)if(m.nodeType===1)m.nodeIndex=++v;p.sizcache=h}g=g.nodeIndex-q;return l===0?g===0:g%l===0&&g/l>=0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var l=h[1];g=n.attrHandle[l]?n.attrHandle[l](g):g[l]!=null?g[l]:g.getAttribute(l);l=g+"";var m=h[2];h=h[4];return g==null?m==="!=":m=== |
||||
"="?l===h:m==="*="?l.indexOf(h)>=0:m==="~="?(" "+l+" ").indexOf(h)>=0:!h?l&&g!==false:m==="!="?l!==h:m==="^="?l.indexOf(h)===0:m==="$="?l.substr(l.length-h.length)===h:m==="|="?l===h||l.substr(0,h.length+1)===h+"-":false},POS:function(g,h,l,m){var q=n.setFilters[h[2]];if(q)return q(g,l,h,m)}}},r=n.match.POS;for(var u in n.match){n.match[u]=new RegExp(n.match[u].source+/(?![^\[]*\])(?![^\(]*\))/.source);n.leftMatch[u]=new RegExp(/(^(?:.|\r|\n)*?)/.source+n.match[u].source.replace(/\\(\d+)/g,function(g, |
||||
h){return"\\"+(h-0+1)}))}var z=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g};try{Array.prototype.slice.call(s.documentElement.childNodes,0)}catch(C){z=function(g,h){h=h||[];if(j.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var l=0,m=g.length;l<m;l++)h.push(g[l]);else for(l=0;g[l];l++)h.push(g[l]);return h}}var B;if(s.documentElement.compareDocumentPosition)B=function(g,h){if(!g.compareDocumentPosition|| |
||||
!h.compareDocumentPosition){if(g==h)i=true;return g.compareDocumentPosition?-1:1}g=g.compareDocumentPosition(h)&4?-1:g===h?0:1;if(g===0)i=true;return g};else if("sourceIndex"in s.documentElement)B=function(g,h){if(!g.sourceIndex||!h.sourceIndex){if(g==h)i=true;return g.sourceIndex?-1:1}g=g.sourceIndex-h.sourceIndex;if(g===0)i=true;return g};else if(s.createRange)B=function(g,h){if(!g.ownerDocument||!h.ownerDocument){if(g==h)i=true;return g.ownerDocument?-1:1}var l=g.ownerDocument.createRange(),m= |
||||
h.ownerDocument.createRange();l.setStart(g,0);l.setEnd(g,0);m.setStart(h,0);m.setEnd(h,0);g=l.compareBoundaryPoints(Range.START_TO_END,m);if(g===0)i=true;return g};(function(){var g=s.createElement("div"),h="script"+(new Date).getTime();g.innerHTML="<a name='"+h+"'/>";var l=s.documentElement;l.insertBefore(g,l.firstChild);if(s.getElementById(h)){n.find.ID=function(m,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(m[1]))?q.id===m[1]||typeof q.getAttributeNode!=="undefined"&& |
||||
q.getAttributeNode("id").nodeValue===m[1]?[q]:w:[]};n.filter.ID=function(m,q){var p=typeof m.getAttributeNode!=="undefined"&&m.getAttributeNode("id");return m.nodeType===1&&p&&p.nodeValue===q}}l.removeChild(g);l=g=null})();(function(){var g=s.createElement("div");g.appendChild(s.createComment(""));if(g.getElementsByTagName("*").length>0)n.find.TAG=function(h,l){l=l.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var m=0;l[m];m++)l[m].nodeType===1&&h.push(l[m]);l=h}return l};g.innerHTML="<a href='#'></a>"; |
||||
if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")n.attrHandle.href=function(h){return h.getAttribute("href",2)};g=null})();s.querySelectorAll&&function(){var g=k,h=s.createElement("div");h.innerHTML="<p class='TEST'></p>";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){k=function(m,q,p,v){q=q||s;if(!v&&q.nodeType===9&&!x(q))try{return z(q.querySelectorAll(m),p)}catch(t){}return g(m,q,p,v)};for(var l in g)k[l]=g[l];h=null}}(); |
||||
(function(){var g=s.createElement("div");g.innerHTML="<div class='test e'></div><div class='test'></div>";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length===0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){n.order.splice(1,0,"CLASS");n.find.CLASS=function(h,l,m){if(typeof l.getElementsByClassName!=="undefined"&&!m)return l.getElementsByClassName(h[1])};g=null}}})();var E=s.compareDocumentPosition?function(g,h){return!!(g.compareDocumentPosition(h)&16)}: |
||||
function(g,h){return g!==h&&(g.contains?g.contains(h):true)},x=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},ga=function(g,h){var l=[],m="",q;for(h=h.nodeType?[h]:h;q=n.match.PSEUDO.exec(g);){m+=q[0];g=g.replace(n.match.PSEUDO,"")}g=n.relative[g]?g+"*":g;q=0;for(var p=h.length;q<p;q++)k(g,h[q],l);return k.filter(m,l)};c.find=k;c.expr=k.selectors;c.expr[":"]=c.expr.filters;c.unique=k.uniqueSort;c.text=a;c.isXMLDoc=x;c.contains=E})();var eb=/Until$/,fb=/^(?:parents|prevUntil|prevAll)/, |
||||
gb=/,/;R=Array.prototype.slice;var Ia=function(a,b,d){if(c.isFunction(b))return c.grep(a,function(e,j){return!!b.call(e,j,e)===d});else if(b.nodeType)return c.grep(a,function(e){return e===b===d});else if(typeof b==="string"){var f=c.grep(a,function(e){return e.nodeType===1});if(Ua.test(b))return c.filter(b,f,!d);else b=c.filter(b,f)}return c.grep(a,function(e){return c.inArray(e,b)>=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f<e;f++){d=b.length; |
||||
c.find(a,this[f],b);if(f>0)for(var j=d;j<b.length;j++)for(var i=0;i<d;i++)if(b[i]===b[j]){b.splice(j--,1);break}}return b},has:function(a){var b=c(a);return this.filter(function(){for(var d=0,f=b.length;d<f;d++)if(c.contains(this,b[d]))return true})},not:function(a){return this.pushStack(Ia(this,a,false),"not",a)},filter:function(a){return this.pushStack(Ia(this,a,true),"filter",a)},is:function(a){return!!a&&c.filter(a,this).length>0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,j= |
||||
{},i;if(f&&a.length){e=0;for(var o=a.length;e<o;e++){i=a[e];j[i]||(j[i]=c.expr.match.POS.test(i)?c(i,b||this.context):i)}for(;f&&f.ownerDocument&&f!==b;){for(i in j){e=j[i];if(e.jquery?e.index(f)>-1:c(f).is(e)){d.push({selector:i,elem:f});delete j[i]}}f=f.parentNode}}return d}var k=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(n,r){for(;r&&r.ownerDocument&&r!==b;){if(k?k.index(r)>-1:c(r).is(a))return r;r=r.parentNode}return null})},index:function(a){if(!a||typeof a=== |
||||
"string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(),a);return this.pushStack(qa(a[0])||qa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode", |
||||
d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")},nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")? |
||||
a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);eb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e):e;if((this.length>1||gb.test(f))&&fb.test(a))e=e.reverse();return this.pushStack(e,a,R.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===w||a.nodeType!==1||!c(a).is(d));){a.nodeType=== |
||||
1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!==b&&d.push(a);return d}});var Ja=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ka=/(<([\w:]+)[^>]*?)\/>/g,hb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,La=/<([\w:]+)/,ib=/<tbody/i,jb=/<|&#?\w+;/,ta=/<script|<object|<embed|<option|<style/i,ua=/checked\s*(?:[^=]|=\s*.checked.)/i,Ma=function(a,b,d){return hb.test(d)? |
||||
a:b+"></"+d+">"},F={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],area:[1,"<map>","</map>"],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div<div>","</div>"];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d= |
||||
c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==w)return this.empty().append((this[0]&&this[0].ownerDocument||s).createTextNode(a));return c.text(this)},wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this}, |
||||
wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length?d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})}, |
||||
prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b, |
||||
this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},remove:function(a,b){for(var d=0,f;(f=this[d])!=null;d++)if(!a||c.filter(a,[f]).length){if(!b&&f.nodeType===1){c.cleanData(f.getElementsByTagName("*"));c.cleanData([f])}f.parentNode&&f.parentNode.removeChild(f)}return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++)for(b.nodeType===1&&c.cleanData(b.getElementsByTagName("*"));b.firstChild;)b.removeChild(b.firstChild); |
||||
return this},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&&!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Ja,"").replace(/=([^="'>\s]+\/)>/g,'="$1">').replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){ra(this,b);ra(this.find("*"),b.find("*"))}return b},html:function(a){if(a===w)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Ja, |
||||
""):null;else if(typeof a==="string"&&!ta.test(a)&&(c.support.leadingWhitespace||!V.test(a))&&!F[(La.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Ka,Ma);try{for(var b=0,d=this.length;b<d;b++)if(this[b].nodeType===1){c.cleanData(this[b].getElementsByTagName("*"));this[b].innerHTML=a}}catch(f){this.empty().append(a)}}else c.isFunction(a)?this.each(function(e){var j=c(this),i=j.html();j.empty().append(function(){return a.call(this,e,i)})}):this.empty().append(a);return this},replaceWith:function(a){if(this[0]&& |
||||
this[0].parentNode){if(c.isFunction(a))return this.each(function(b){var d=c(this),f=d.html();d.replaceWith(a.call(this,b,f))});if(typeof a!=="string")a=c(a).detach();return this.each(function(){var b=this.nextSibling,d=this.parentNode;c(this).remove();b?c(b).before(a):c(d).append(a)})}else return this.pushStack(c(c.isFunction(a)?a():a),"replaceWith",a)},detach:function(a){return this.remove(a,true)},domManip:function(a,b,d){function f(u){return c.nodeName(u,"table")?u.getElementsByTagName("tbody")[0]|| |
||||
u.appendChild(u.ownerDocument.createElement("tbody")):u}var e,j,i=a[0],o=[],k;if(!c.support.checkClone&&arguments.length===3&&typeof i==="string"&&ua.test(i))return this.each(function(){c(this).domManip(a,b,d,true)});if(c.isFunction(i))return this.each(function(u){var z=c(this);a[0]=i.call(this,u,b?z.html():w);z.domManip(a,b,d)});if(this[0]){e=i&&i.parentNode;e=c.support.parentNode&&e&&e.nodeType===11&&e.childNodes.length===this.length?{fragment:e}:sa(a,this,o);k=e.fragment;if(j=k.childNodes.length=== |
||||
1?(k=k.firstChild):k.firstChild){b=b&&c.nodeName(j,"tr");for(var n=0,r=this.length;n<r;n++)d.call(b?f(this[n],j):this[n],n>0||e.cacheable||this.length>1?k.cloneNode(true):k)}o.length&&c.each(o,Qa)}return this}});c.fragments={};c.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){c.fn[a]=function(d){var f=[];d=c(d);var e=this.length===1&&this[0].parentNode;if(e&&e.nodeType===11&&e.childNodes.length===1&&d.length===1){d[b](this[0]); |
||||
return this}else{e=0;for(var j=d.length;e<j;e++){var i=(e>0?this.clone(true):this).get();c.fn[b].apply(c(d[e]),i);f=f.concat(i)}return this.pushStack(f,a,d.selector)}}});c.extend({clean:function(a,b,d,f){b=b||s;if(typeof b.createElement==="undefined")b=b.ownerDocument||b[0]&&b[0].ownerDocument||s;for(var e=[],j=0,i;(i=a[j])!=null;j++){if(typeof i==="number")i+="";if(i){if(typeof i==="string"&&!jb.test(i))i=b.createTextNode(i);else if(typeof i==="string"){i=i.replace(Ka,Ma);var o=(La.exec(i)||["", |
||||
""])[1].toLowerCase(),k=F[o]||F._default,n=k[0],r=b.createElement("div");for(r.innerHTML=k[1]+i+k[2];n--;)r=r.lastChild;if(!c.support.tbody){n=ib.test(i);o=o==="table"&&!n?r.firstChild&&r.firstChild.childNodes:k[1]==="<table>"&&!n?r.childNodes:[];for(k=o.length-1;k>=0;--k)c.nodeName(o[k],"tbody")&&!o[k].childNodes.length&&o[k].parentNode.removeChild(o[k])}!c.support.leadingWhitespace&&V.test(i)&&r.insertBefore(b.createTextNode(V.exec(i)[0]),r.firstChild);i=r.childNodes}if(i.nodeType)e.push(i);else e= |
||||
c.merge(e,i)}}if(d)for(j=0;e[j];j++)if(f&&c.nodeName(e[j],"script")&&(!e[j].type||e[j].type.toLowerCase()==="text/javascript"))f.push(e[j].parentNode?e[j].parentNode.removeChild(e[j]):e[j]);else{e[j].nodeType===1&&e.splice.apply(e,[j+1,0].concat(c.makeArray(e[j].getElementsByTagName("script"))));d.appendChild(e[j])}return e},cleanData:function(a){for(var b,d,f=c.cache,e=c.event.special,j=c.support.deleteExpando,i=0,o;(o=a[i])!=null;i++)if(d=o[c.expando]){b=f[d];if(b.events)for(var k in b.events)e[k]? |
||||
c.event.remove(o,k):Ca(o,k,b.handle);if(j)delete o[c.expando];else o.removeAttribute&&o.removeAttribute(c.expando);delete f[d]}}});var kb=/z-?index|font-?weight|opacity|zoom|line-?height/i,Na=/alpha\([^)]*\)/,Oa=/opacity=([^)]*)/,ha=/float/i,ia=/-([a-z])/ig,lb=/([A-Z])/g,mb=/^-?\d+(?:px)?$/i,nb=/^-?\d/,ob={position:"absolute",visibility:"hidden",display:"block"},pb=["Left","Right"],qb=["Top","Bottom"],rb=s.defaultView&&s.defaultView.getComputedStyle,Pa=c.support.cssFloat?"cssFloat":"styleFloat",ja= |
||||
function(a,b){return b.toUpperCase()};c.fn.css=function(a,b){return X(this,a,b,true,function(d,f,e){if(e===w)return c.curCSS(d,f);if(typeof e==="number"&&!kb.test(f))e+="px";c.style(d,f,e)})};c.extend({style:function(a,b,d){if(!a||a.nodeType===3||a.nodeType===8)return w;if((b==="width"||b==="height")&&parseFloat(d)<0)d=w;var f=a.style||a,e=d!==w;if(!c.support.opacity&&b==="opacity"){if(e){f.zoom=1;b=parseInt(d,10)+""==="NaN"?"":"alpha(opacity="+d*100+")";a=f.filter||c.curCSS(a,"filter")||"";f.filter= |
||||
Na.test(a)?a.replace(Na,b):b}return f.filter&&f.filter.indexOf("opacity=")>=0?parseFloat(Oa.exec(f.filter)[1])/100+"":""}if(ha.test(b))b=Pa;b=b.replace(ia,ja);if(e)f[b]=d;return f[b]},css:function(a,b,d,f){if(b==="width"||b==="height"){var e,j=b==="width"?pb:qb;function i(){e=b==="width"?a.offsetWidth:a.offsetHeight;f!=="border"&&c.each(j,function(){f||(e-=parseFloat(c.curCSS(a,"padding"+this,true))||0);if(f==="margin")e+=parseFloat(c.curCSS(a,"margin"+this,true))||0;else e-=parseFloat(c.curCSS(a, |
||||
"border"+this+"Width",true))||0})}a.offsetWidth!==0?i():c.swap(a,ob,i);return Math.max(0,Math.round(e))}return c.curCSS(a,b,d)},curCSS:function(a,b,d){var f,e=a.style;if(!c.support.opacity&&b==="opacity"&&a.currentStyle){f=Oa.test(a.currentStyle.filter||"")?parseFloat(RegExp.$1)/100+"":"";return f===""?"1":f}if(ha.test(b))b=Pa;if(!d&&e&&e[b])f=e[b];else if(rb){if(ha.test(b))b="float";b=b.replace(lb,"-$1").toLowerCase();e=a.ownerDocument.defaultView;if(!e)return null;if(a=e.getComputedStyle(a,null))f= |
||||
a.getPropertyValue(b);if(b==="opacity"&&f==="")f="1"}else if(a.currentStyle){d=b.replace(ia,ja);f=a.currentStyle[b]||a.currentStyle[d];if(!mb.test(f)&&nb.test(f)){b=e.left;var j=a.runtimeStyle.left;a.runtimeStyle.left=a.currentStyle.left;e.left=d==="fontSize"?"1em":f||0;f=e.pixelLeft+"px";e.left=b;a.runtimeStyle.left=j}}return f},swap:function(a,b,d){var f={};for(var e in b){f[e]=a.style[e];a.style[e]=b[e]}d.call(a);for(e in b)a.style[e]=f[e]}});if(c.expr&&c.expr.filters){c.expr.filters.hidden=function(a){var b= |
||||
a.offsetWidth,d=a.offsetHeight,f=a.nodeName.toLowerCase()==="tr";return b===0&&d===0&&!f?true:b>0&&d>0&&!f?false:c.curCSS(a,"display")==="none"};c.expr.filters.visible=function(a){return!c.expr.filters.hidden(a)}}var sb=J(),tb=/<script(.|\s)*?\/script>/gi,ub=/select|textarea/i,vb=/color|date|datetime|email|hidden|month|number|password|range|search|tel|text|time|url|week/i,N=/=\?(&|$)/,ka=/\?/,wb=/(\?|&)_=.*?(&|$)/,xb=/^(\w+:)?\/\/([^\/?#]+)/,yb=/%20/g,zb=c.fn.load;c.fn.extend({load:function(a,b,d){if(typeof a!== |
||||
"string")return zb.call(this,a);else if(!this.length)return this;var f=a.indexOf(" ");if(f>=0){var e=a.slice(f,a.length);a=a.slice(0,f)}f="GET";if(b)if(c.isFunction(b)){d=b;b=null}else if(typeof b==="object"){b=c.param(b,c.ajaxSettings.traditional);f="POST"}var j=this;c.ajax({url:a,type:f,dataType:"html",data:b,complete:function(i,o){if(o==="success"||o==="notmodified")j.html(e?c("<div />").append(i.responseText.replace(tb,"")).find(e):i.responseText);d&&j.each(d,[i.responseText,o,i])}});return this}, |
||||
serialize:function(){return c.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?c.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||ub.test(this.nodeName)||vb.test(this.type))}).map(function(a,b){a=c(this).val();return a==null?null:c.isArray(a)?c.map(a,function(d){return{name:b.name,value:d}}):{name:b.name,value:a}}).get()}});c.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "), |
||||
function(a,b){c.fn[b]=function(d){return this.bind(b,d)}});c.extend({get:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b=null}return c.ajax({type:"GET",url:a,data:b,success:d,dataType:f})},getScript:function(a,b){return c.get(a,null,b,"script")},getJSON:function(a,b,d){return c.get(a,b,d,"json")},post:function(a,b,d,f){if(c.isFunction(b)){f=f||d;d=b;b={}}return c.ajax({type:"POST",url:a,data:b,success:d,dataType:f})},ajaxSetup:function(a){c.extend(c.ajaxSettings,a)},ajaxSettings:{url:location.href, |
||||
global:true,type:"GET",contentType:"application/x-www-form-urlencoded",processData:true,async:true,xhr:A.XMLHttpRequest&&(A.location.protocol!=="file:"||!A.ActiveXObject)?function(){return new A.XMLHttpRequest}:function(){try{return new A.ActiveXObject("Microsoft.XMLHTTP")}catch(a){}},accepts:{xml:"application/xml, text/xml",html:"text/html",script:"text/javascript, application/javascript",json:"application/json, text/javascript",text:"text/plain",_default:"*/*"}},lastModified:{},etag:{},ajax:function(a){function b(){e.success&& |
||||
e.success.call(k,o,i,x);e.global&&f("ajaxSuccess",[x,e])}function d(){e.complete&&e.complete.call(k,x,i);e.global&&f("ajaxComplete",[x,e]);e.global&&!--c.active&&c.event.trigger("ajaxStop")}function f(q,p){(e.context?c(e.context):c.event).trigger(q,p)}var e=c.extend(true,{},c.ajaxSettings,a),j,i,o,k=a&&a.context||e,n=e.type.toUpperCase();if(e.data&&e.processData&&typeof e.data!=="string")e.data=c.param(e.data,e.traditional);if(e.dataType==="jsonp"){if(n==="GET")N.test(e.url)||(e.url+=(ka.test(e.url)? |
||||
"&":"?")+(e.jsonp||"callback")+"=?");else if(!e.data||!N.test(e.data))e.data=(e.data?e.data+"&":"")+(e.jsonp||"callback")+"=?";e.dataType="json"}if(e.dataType==="json"&&(e.data&&N.test(e.data)||N.test(e.url))){j=e.jsonpCallback||"jsonp"+sb++;if(e.data)e.data=(e.data+"").replace(N,"="+j+"$1");e.url=e.url.replace(N,"="+j+"$1");e.dataType="script";A[j]=A[j]||function(q){o=q;b();d();A[j]=w;try{delete A[j]}catch(p){}z&&z.removeChild(C)}}if(e.dataType==="script"&&e.cache===null)e.cache=false;if(e.cache=== |
||||
false&&n==="GET"){var r=J(),u=e.url.replace(wb,"$1_="+r+"$2");e.url=u+(u===e.url?(ka.test(e.url)?"&":"?")+"_="+r:"")}if(e.data&&n==="GET")e.url+=(ka.test(e.url)?"&":"?")+e.data;e.global&&!c.active++&&c.event.trigger("ajaxStart");r=(r=xb.exec(e.url))&&(r[1]&&r[1]!==location.protocol||r[2]!==location.host);if(e.dataType==="script"&&n==="GET"&&r){var z=s.getElementsByTagName("head")[0]||s.documentElement,C=s.createElement("script");C.src=e.url;if(e.scriptCharset)C.charset=e.scriptCharset;if(!j){var B= |
||||
false;C.onload=C.onreadystatechange=function(){if(!B&&(!this.readyState||this.readyState==="loaded"||this.readyState==="complete")){B=true;b();d();C.onload=C.onreadystatechange=null;z&&C.parentNode&&z.removeChild(C)}}}z.insertBefore(C,z.firstChild);return w}var E=false,x=e.xhr();if(x){e.username?x.open(n,e.url,e.async,e.username,e.password):x.open(n,e.url,e.async);try{if(e.data||a&&a.contentType)x.setRequestHeader("Content-Type",e.contentType);if(e.ifModified){c.lastModified[e.url]&&x.setRequestHeader("If-Modified-Since", |
||||
c.lastModified[e.url]);c.etag[e.url]&&x.setRequestHeader("If-None-Match",c.etag[e.url])}r||x.setRequestHeader("X-Requested-With","XMLHttpRequest");x.setRequestHeader("Accept",e.dataType&&e.accepts[e.dataType]?e.accepts[e.dataType]+", */*":e.accepts._default)}catch(ga){}if(e.beforeSend&&e.beforeSend.call(k,x,e)===false){e.global&&!--c.active&&c.event.trigger("ajaxStop");x.abort();return false}e.global&&f("ajaxSend",[x,e]);var g=x.onreadystatechange=function(q){if(!x||x.readyState===0||q==="abort"){E|| |
||||
d();E=true;if(x)x.onreadystatechange=c.noop}else if(!E&&x&&(x.readyState===4||q==="timeout")){E=true;x.onreadystatechange=c.noop;i=q==="timeout"?"timeout":!c.httpSuccess(x)?"error":e.ifModified&&c.httpNotModified(x,e.url)?"notmodified":"success";var p;if(i==="success")try{o=c.httpData(x,e.dataType,e)}catch(v){i="parsererror";p=v}if(i==="success"||i==="notmodified")j||b();else c.handleError(e,x,i,p);d();q==="timeout"&&x.abort();if(e.async)x=null}};try{var h=x.abort;x.abort=function(){x&&h.call(x); |
||||
g("abort")}}catch(l){}e.async&&e.timeout>0&&setTimeout(function(){x&&!E&&g("timeout")},e.timeout);try{x.send(n==="POST"||n==="PUT"||n==="DELETE"?e.data:null)}catch(m){c.handleError(e,x,null,m);d()}e.async||g();return x}},handleError:function(a,b,d,f){if(a.error)a.error.call(a.context||a,b,d,f);if(a.global)(a.context?c(a.context):c.event).trigger("ajaxError",[b,a,f])},active:0,httpSuccess:function(a){try{return!a.status&&location.protocol==="file:"||a.status>=200&&a.status<300||a.status===304||a.status=== |
||||
1223||a.status===0}catch(b){}return false},httpNotModified:function(a,b){var d=a.getResponseHeader("Last-Modified"),f=a.getResponseHeader("Etag");if(d)c.lastModified[b]=d;if(f)c.etag[b]=f;return a.status===304||a.status===0},httpData:function(a,b,d){var f=a.getResponseHeader("content-type")||"",e=b==="xml"||!b&&f.indexOf("xml")>=0;a=e?a.responseXML:a.responseText;e&&a.documentElement.nodeName==="parsererror"&&c.error("parsererror");if(d&&d.dataFilter)a=d.dataFilter(a,b);if(typeof a==="string")if(b=== |
||||
"json"||!b&&f.indexOf("json")>=0)a=c.parseJSON(a);else if(b==="script"||!b&&f.indexOf("javascript")>=0)c.globalEval(a);return a},param:function(a,b){function d(i,o){if(c.isArray(o))c.each(o,function(k,n){b||/\[\]$/.test(i)?f(i,n):d(i+"["+(typeof n==="object"||c.isArray(n)?k:"")+"]",n)});else!b&&o!=null&&typeof o==="object"?c.each(o,function(k,n){d(i+"["+k+"]",n)}):f(i,o)}function f(i,o){o=c.isFunction(o)?o():o;e[e.length]=encodeURIComponent(i)+"="+encodeURIComponent(o)}var e=[];if(b===w)b=c.ajaxSettings.traditional; |
||||
if(c.isArray(a)||a.jquery)c.each(a,function(){f(this.name,this.value)});else for(var j in a)d(j,a[j]);return e.join("&").replace(yb,"+")}});var la={},Ab=/toggle|show|hide/,Bb=/^([+-]=)?([\d+-.]+)(.*)$/,W,va=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]];c.fn.extend({show:function(a,b){if(a||a===0)return this.animate(K("show",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay"); |
||||
this[a].style.display=d||"";if(c.css(this[a],"display")==="none"){d=this[a].nodeName;var f;if(la[d])f=la[d];else{var e=c("<"+d+" />").appendTo("body");f=e.css("display");if(f==="none")f="block";e.remove();la[d]=f}c.data(this[a],"olddisplay",f)}}a=0;for(b=this.length;a<b;a++)this[a].style.display=c.data(this[a],"olddisplay")||"";return this}},hide:function(a,b){if(a||a===0)return this.animate(K("hide",3),a,b);else{a=0;for(b=this.length;a<b;a++){var d=c.data(this[a],"olddisplay");!d&&d!=="none"&&c.data(this[a], |
||||
"olddisplay",c.css(this[a],"display"))}a=0;for(b=this.length;a<b;a++)this[a].style.display="none";return this}},_toggle:c.fn.toggle,toggle:function(a,b){var d=typeof a==="boolean";if(c.isFunction(a)&&c.isFunction(b))this._toggle.apply(this,arguments);else a==null||d?this.each(function(){var f=d?a:c(this).is(":hidden");c(this)[f?"show":"hide"]()}):this.animate(K("toggle",3),a,b);return this},fadeTo:function(a,b,d){return this.filter(":hidden").css("opacity",0).show().end().animate({opacity:b},a,d)}, |
||||
animate:function(a,b,d,f){var e=c.speed(b,d,f);if(c.isEmptyObject(a))return this.each(e.complete);return this[e.queue===false?"each":"queue"](function(){var j=c.extend({},e),i,o=this.nodeType===1&&c(this).is(":hidden"),k=this;for(i in a){var n=i.replace(ia,ja);if(i!==n){a[n]=a[i];delete a[i];i=n}if(a[i]==="hide"&&o||a[i]==="show"&&!o)return j.complete.call(this);if((i==="height"||i==="width")&&this.style){j.display=c.css(this,"display");j.overflow=this.style.overflow}if(c.isArray(a[i])){(j.specialEasing= |
||||
j.specialEasing||{})[i]=a[i][1];a[i]=a[i][0]}}if(j.overflow!=null)this.style.overflow="hidden";j.curAnim=c.extend({},a);c.each(a,function(r,u){var z=new c.fx(k,j,r);if(Ab.test(u))z[u==="toggle"?o?"show":"hide":u](a);else{var C=Bb.exec(u),B=z.cur(true)||0;if(C){u=parseFloat(C[2]);var E=C[3]||"px";if(E!=="px"){k.style[r]=(u||1)+E;B=(u||1)/z.cur(true)*B;k.style[r]=B+E}if(C[1])u=(C[1]==="-="?-1:1)*u+B;z.custom(B,u,E)}else z.custom(B,u,"")}});return true})},stop:function(a,b){var d=c.timers;a&&this.queue([]); |
||||
this.each(function(){for(var f=d.length-1;f>=0;f--)if(d[f].elem===this){b&&d[f](true);d.splice(f,1)}});b||this.dequeue();return this}});c.each({slideDown:K("show",1),slideUp:K("hide",1),slideToggle:K("toggle",1),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"}},function(a,b){c.fn[a]=function(d,f){return this.animate(b,d,f)}});c.extend({speed:function(a,b,d){var f=a&&typeof a==="object"?a:{complete:d||!d&&b||c.isFunction(a)&&a,duration:a,easing:d&&b||b&&!c.isFunction(b)&&b};f.duration=c.fx.off?0:typeof f.duration=== |
||||
"number"?f.duration:c.fx.speeds[f.duration]||c.fx.speeds._default;f.old=f.complete;f.complete=function(){f.queue!==false&&c(this).dequeue();c.isFunction(f.old)&&f.old.call(this)};return f},easing:{linear:function(a,b,d,f){return d+f*a},swing:function(a,b,d,f){return(-Math.cos(a*Math.PI)/2+0.5)*f+d}},timers:[],fx:function(a,b,d){this.options=b;this.elem=a;this.prop=d;if(!b.orig)b.orig={}}});c.fx.prototype={update:function(){this.options.step&&this.options.step.call(this.elem,this.now,this);(c.fx.step[this.prop]|| |
||||
c.fx.step._default)(this);if((this.prop==="height"||this.prop==="width")&&this.elem.style)this.elem.style.display="block"},cur:function(a){if(this.elem[this.prop]!=null&&(!this.elem.style||this.elem.style[this.prop]==null))return this.elem[this.prop];return(a=parseFloat(c.css(this.elem,this.prop,a)))&&a>-10000?a:parseFloat(c.curCSS(this.elem,this.prop))||0},custom:function(a,b,d){function f(j){return e.step(j)}this.startTime=J();this.start=a;this.end=b;this.unit=d||this.unit||"px";this.now=this.start; |
||||
this.pos=this.state=0;var e=this;f.elem=this.elem;if(f()&&c.timers.push(f)&&!W)W=setInterval(c.fx.tick,13)},show:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.show=true;this.custom(this.prop==="width"||this.prop==="height"?1:0,this.cur());c(this.elem).show()},hide:function(){this.options.orig[this.prop]=c.style(this.elem,this.prop);this.options.hide=true;this.custom(this.cur(),0)},step:function(a){var b=J(),d=true;if(a||b>=this.options.duration+this.startTime){this.now= |
||||
this.end;this.pos=this.state=1;this.update();this.options.curAnim[this.prop]=true;for(var f in this.options.curAnim)if(this.options.curAnim[f]!==true)d=false;if(d){if(this.options.display!=null){this.elem.style.overflow=this.options.overflow;a=c.data(this.elem,"olddisplay");this.elem.style.display=a?a:this.options.display;if(c.css(this.elem,"display")==="none")this.elem.style.display="block"}this.options.hide&&c(this.elem).hide();if(this.options.hide||this.options.show)for(var e in this.options.curAnim)c.style(this.elem, |
||||
e,this.options.orig[e]);this.options.complete.call(this.elem)}return false}else{e=b-this.startTime;this.state=e/this.options.duration;a=this.options.easing||(c.easing.swing?"swing":"linear");this.pos=c.easing[this.options.specialEasing&&this.options.specialEasing[this.prop]||a](this.state,e,0,1,this.options.duration);this.now=this.start+(this.end-this.start)*this.pos;this.update()}return true}};c.extend(c.fx,{tick:function(){for(var a=c.timers,b=0;b<a.length;b++)a[b]()||a.splice(b--,1);a.length|| |
||||
c.fx.stop()},stop:function(){clearInterval(W);W=null},speeds:{slow:600,fast:200,_default:400},step:{opacity:function(a){c.style(a.elem,"opacity",a.now)},_default:function(a){if(a.elem.style&&a.elem.style[a.prop]!=null)a.elem.style[a.prop]=(a.prop==="width"||a.prop==="height"?Math.max(0,a.now):a.now)+a.unit;else a.elem[a.prop]=a.now}}});if(c.expr&&c.expr.filters)c.expr.filters.animated=function(a){return c.grep(c.timers,function(b){return a===b.elem}).length};c.fn.offset="getBoundingClientRect"in s.documentElement? |
||||
function(a){var b=this[0];if(a)return this.each(function(e){c.offset.setOffset(this,a,e)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);var d=b.getBoundingClientRect(),f=b.ownerDocument;b=f.body;f=f.documentElement;return{top:d.top+(self.pageYOffset||c.support.boxModel&&f.scrollTop||b.scrollTop)-(f.clientTop||b.clientTop||0),left:d.left+(self.pageXOffset||c.support.boxModel&&f.scrollLeft||b.scrollLeft)-(f.clientLeft||b.clientLeft||0)}}:function(a){var b= |
||||
this[0];if(a)return this.each(function(r){c.offset.setOffset(this,a,r)});if(!b||!b.ownerDocument)return null;if(b===b.ownerDocument.body)return c.offset.bodyOffset(b);c.offset.initialize();var d=b.offsetParent,f=b,e=b.ownerDocument,j,i=e.documentElement,o=e.body;f=(e=e.defaultView)?e.getComputedStyle(b,null):b.currentStyle;for(var k=b.offsetTop,n=b.offsetLeft;(b=b.parentNode)&&b!==o&&b!==i;){if(c.offset.supportsFixedPosition&&f.position==="fixed")break;j=e?e.getComputedStyle(b,null):b.currentStyle; |
||||
k-=b.scrollTop;n-=b.scrollLeft;if(b===d){k+=b.offsetTop;n+=b.offsetLeft;if(c.offset.doesNotAddBorder&&!(c.offset.doesAddBorderForTableAndCells&&/^t(able|d|h)$/i.test(b.nodeName))){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=d;d=b.offsetParent}if(c.offset.subtractsBorderForOverflowNotVisible&&j.overflow!=="visible"){k+=parseFloat(j.borderTopWidth)||0;n+=parseFloat(j.borderLeftWidth)||0}f=j}if(f.position==="relative"||f.position==="static"){k+=o.offsetTop;n+=o.offsetLeft}if(c.offset.supportsFixedPosition&& |
||||
f.position==="fixed"){k+=Math.max(i.scrollTop,o.scrollTop);n+=Math.max(i.scrollLeft,o.scrollLeft)}return{top:k,left:n}};c.offset={initialize:function(){var a=s.body,b=s.createElement("div"),d,f,e,j=parseFloat(c.curCSS(a,"marginTop",true))||0;c.extend(b.style,{position:"absolute",top:0,left:0,margin:0,border:0,width:"1px",height:"1px",visibility:"hidden"});b.innerHTML="<div style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;'><div></div></div><table style='position:absolute;top:0;left:0;margin:0;border:5px solid #000;padding:0;width:1px;height:1px;' cellpadding='0' cellspacing='0'><tr><td></td></tr></table>"; |
||||
a.insertBefore(b,a.firstChild);d=b.firstChild;f=d.firstChild;e=d.nextSibling.firstChild.firstChild;this.doesNotAddBorder=f.offsetTop!==5;this.doesAddBorderForTableAndCells=e.offsetTop===5;f.style.position="fixed";f.style.top="20px";this.supportsFixedPosition=f.offsetTop===20||f.offsetTop===15;f.style.position=f.style.top="";d.style.overflow="hidden";d.style.position="relative";this.subtractsBorderForOverflowNotVisible=f.offsetTop===-5;this.doesNotIncludeMarginInBodyOffset=a.offsetTop!==j;a.removeChild(b); |
||||
c.offset.initialize=c.noop},bodyOffset:function(a){var b=a.offsetTop,d=a.offsetLeft;c.offset.initialize();if(c.offset.doesNotIncludeMarginInBodyOffset){b+=parseFloat(c.curCSS(a,"marginTop",true))||0;d+=parseFloat(c.curCSS(a,"marginLeft",true))||0}return{top:b,left:d}},setOffset:function(a,b,d){if(/static/.test(c.curCSS(a,"position")))a.style.position="relative";var f=c(a),e=f.offset(),j=parseInt(c.curCSS(a,"top",true),10)||0,i=parseInt(c.curCSS(a,"left",true),10)||0;if(c.isFunction(b))b=b.call(a, |
||||
d,e);d={top:b.top-e.top+j,left:b.left-e.left+i};"using"in b?b.using.call(a,d):f.css(d)}};c.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),d=this.offset(),f=/^body|html$/i.test(b[0].nodeName)?{top:0,left:0}:b.offset();d.top-=parseFloat(c.curCSS(a,"marginTop",true))||0;d.left-=parseFloat(c.curCSS(a,"marginLeft",true))||0;f.top+=parseFloat(c.curCSS(b[0],"borderTopWidth",true))||0;f.left+=parseFloat(c.curCSS(b[0],"borderLeftWidth",true))||0;return{top:d.top- |
||||
f.top,left:d.left-f.left}},offsetParent:function(){return this.map(function(){for(var a=this.offsetParent||s.body;a&&!/^body|html$/i.test(a.nodeName)&&c.css(a,"position")==="static";)a=a.offsetParent;return a})}});c.each(["Left","Top"],function(a,b){var d="scroll"+b;c.fn[d]=function(f){var e=this[0],j;if(!e)return null;if(f!==w)return this.each(function(){if(j=wa(this))j.scrollTo(!a?f:c(j).scrollLeft(),a?f:c(j).scrollTop());else this[d]=f});else return(j=wa(e))?"pageXOffset"in j?j[a?"pageYOffset": |
||||
"pageXOffset"]:c.support.boxModel&&j.document.documentElement[d]||j.document.body[d]:e[d]}});c.each(["Height","Width"],function(a,b){var d=b.toLowerCase();c.fn["inner"+b]=function(){return this[0]?c.css(this[0],d,false,"padding"):null};c.fn["outer"+b]=function(f){return this[0]?c.css(this[0],d,false,f?"margin":"border"):null};c.fn[d]=function(f){var e=this[0];if(!e)return f==null?null:this;if(c.isFunction(f))return this.each(function(j){var i=c(this);i[d](f.call(this,j,i[d]()))});return"scrollTo"in |
||||
e&&e.document?e.document.compatMode==="CSS1Compat"&&e.document.documentElement["client"+b]||e.document.body["client"+b]:e.nodeType===9?Math.max(e.documentElement["client"+b],e.body["scroll"+b],e.documentElement["scroll"+b],e.body["offset"+b],e.documentElement["offset"+b]):f===w?c.css(e,d):this.css(d,typeof f==="string"?f:f+"px")}});A.jQuery=A.$=c})(window); |
||||
@ -1,34 +0,0 @@ |
||||
(function($) { |
||||
$.fn.prepopulate = function(dependencies, maxLength) { |
||||
/* |
||||
Depends on urlify.js |
||||
Populates a selected field with the values of the dependent fields, |
||||
URLifies and shortens the string.
|
||||
dependencies - array of dependent fields id's
|
||||
maxLength - maximum length of the URLify'd string
|
||||
*/ |
||||
return this.each(function() { |
||||
var field = $(this); |
||||
|
||||
field.data('_changed', false); |
||||
field.change(function() { |
||||
field.data('_changed', true); |
||||
}); |
||||
|
||||
var populate = function () { |
||||
// Bail if the fields value has changed
|
||||
if (field.data('_changed') == true) return; |
||||
|
||||
var values = []; |
||||
$.each(dependencies, function(i, field) { |
||||
if ($(field).val().length > 0) { |
||||
values.push($(field).val()); |
||||
} |
||||
}) |
||||
field.val(URLify(values.join(' '), maxLength)); |
||||
}; |
||||
|
||||
$(dependencies.join(',')).keyup(populate).change(populate).focus(populate); |
||||
}); |
||||
}; |
||||
})(django.jQuery); |
||||
@ -1 +0,0 @@ |
||||
(function(a){a.fn.prepopulate=function(d,g){return this.each(function(){var b=a(this);b.data("_changed",false);b.change(function(){b.data("_changed",true)});var c=function(){if(b.data("_changed")!=true){var e=[];a.each(d,function(h,f){a(f).val().length>0&&e.push(a(f).val())});b.val(URLify(e.join(" "),g))}};a(d.join(",")).keyup(c).change(c).focus(c)})}})(django.jQuery); |
||||
@ -1,94 +0,0 @@ |
||||
var timeParsePatterns = [ |
||||
// 9
|
||||
{ re: /^\d{1,2}$/i, |
||||
handler: function(bits) { |
||||
if (bits[0].length == 1) { |
||||
return '0' + bits[0] + ':00'; |
||||
} else { |
||||
return bits[0] + ':00'; |
||||
} |
||||
} |
||||
}, |
||||
// 13:00
|
||||
{ re: /^\d{2}[:.]\d{2}$/i, |
||||
handler: function(bits) { |
||||
return bits[0].replace('.', ':'); |
||||
} |
||||
}, |
||||
// 9:00
|
||||
{ re: /^\d[:.]\d{2}$/i, |
||||
handler: function(bits) { |
||||
return '0' + bits[0].replace('.', ':'); |
||||
} |
||||
}, |
||||
// 3 am / 3 a.m. / 3am
|
||||
{ re: /^(\d+)\s*([ap])(?:.?m.?)?$/i, |
||||
handler: function(bits) { |
||||
var hour = parseInt(bits[1]); |
||||
if (hour == 12) { |
||||
hour = 0; |
||||
} |
||||
if (bits[2].toLowerCase() == 'p') { |
||||
if (hour == 12) { |
||||
hour = 0; |
||||
} |
||||
return (hour + 12) + ':00'; |
||||
} else { |
||||
if (hour < 10) { |
||||
return '0' + hour + ':00'; |
||||
} else { |
||||
return hour + ':00'; |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
// 3.30 am / 3:15 a.m. / 3.00am
|
||||
{ re: /^(\d+)[.:](\d{2})\s*([ap]).?m.?$/i, |
||||
handler: function(bits) { |
||||
var hour = parseInt(bits[1]); |
||||
var mins = parseInt(bits[2]); |
||||
if (mins < 10) { |
||||
mins = '0' + mins; |
||||
} |
||||
if (hour == 12) { |
||||
hour = 0; |
||||
} |
||||
if (bits[3].toLowerCase() == 'p') { |
||||
if (hour == 12) { |
||||
hour = 0; |
||||
} |
||||
return (hour + 12) + ':' + mins; |
||||
} else { |
||||
if (hour < 10) { |
||||
return '0' + hour + ':' + mins; |
||||
} else { |
||||
return hour + ':' + mins; |
||||
} |
||||
} |
||||
} |
||||
}, |
||||
// noon
|
||||
{ re: /^no/i, |
||||
handler: function(bits) { |
||||
return '12:00'; |
||||
} |
||||
}, |
||||
// midnight
|
||||
{ re: /^mid/i, |
||||
handler: function(bits) { |
||||
return '00:00'; |
||||
} |
||||
} |
||||
]; |
||||
|
||||
function parseTimeString(s) { |
||||
for (var i = 0; i < timeParsePatterns.length; i++) { |
||||
var re = timeParsePatterns[i].re; |
||||
var handler = timeParsePatterns[i].handler; |
||||
var bits = re.exec(s); |
||||
if (bits) { |
||||
return handler(bits); |
||||
} |
||||
} |
||||
return s; |
||||
} |
||||
@ -1,140 +0,0 @@ |
||||
var LATIN_MAP = { |
||||
'À': 'A', 'Á': 'A', 'Â': 'A', 'Ã': 'A', 'Ä': 'A', 'Å': 'A', 'Æ': 'AE', 'Ç': |
||||
'C', 'È': 'E', 'É': 'E', 'Ê': 'E', 'Ë': 'E', 'Ì': 'I', 'Í': 'I', 'Î': 'I', |
||||
'Ï': 'I', 'Ð': 'D', 'Ñ': 'N', 'Ò': 'O', 'Ó': 'O', 'Ô': 'O', 'Õ': 'O', 'Ö': |
||||
'O', 'Ő': 'O', 'Ø': 'O', 'Ù': 'U', 'Ú': 'U', 'Û': 'U', 'Ü': 'U', 'Ű': 'U', |
||||
'Ý': 'Y', 'Þ': 'TH', 'ß': 'ss', 'à':'a', 'á':'a', 'â': 'a', 'ã': 'a', 'ä': |
||||
'a', 'å': 'a', 'æ': 'ae', 'ç': 'c', 'è': 'e', 'é': 'e', 'ê': 'e', 'ë': 'e', |
||||
'ì': 'i', 'í': 'i', 'î': 'i', 'ï': 'i', 'ð': 'd', 'ñ': 'n', 'ò': 'o', 'ó': |
||||
'o', 'ô': 'o', 'õ': 'o', 'ö': 'o', 'ő': 'o', 'ø': 'o', 'ù': 'u', 'ú': 'u', |
||||
'û': 'u', 'ü': 'u', 'ű': 'u', 'ý': 'y', 'þ': 'th', 'ÿ': 'y' |
||||
} |
||||
var LATIN_SYMBOLS_MAP = { |
||||
'©':'(c)' |
||||
} |
||||
var GREEK_MAP = { |
||||
'α':'a', 'β':'b', 'γ':'g', 'δ':'d', 'ε':'e', 'ζ':'z', 'η':'h', 'θ':'8', |
||||
'ι':'i', 'κ':'k', 'λ':'l', 'μ':'m', 'ν':'n', 'ξ':'3', 'ο':'o', 'π':'p', |
||||
'ρ':'r', 'σ':'s', 'τ':'t', 'υ':'y', 'φ':'f', 'χ':'x', 'ψ':'ps', 'ω':'w', |
||||
'ά':'a', 'έ':'e', 'ί':'i', 'ό':'o', 'ύ':'y', 'ή':'h', 'ώ':'w', 'ς':'s', |
||||
'ϊ':'i', 'ΰ':'y', 'ϋ':'y', 'ΐ':'i', |
||||
'Α':'A', 'Β':'B', 'Γ':'G', 'Δ':'D', 'Ε':'E', 'Ζ':'Z', 'Η':'H', 'Θ':'8', |
||||
'Ι':'I', 'Κ':'K', 'Λ':'L', 'Μ':'M', 'Ν':'N', 'Ξ':'3', 'Ο':'O', 'Π':'P', |
||||
'Ρ':'R', 'Σ':'S', 'Τ':'T', 'Υ':'Y', 'Φ':'F', 'Χ':'X', 'Ψ':'PS', 'Ω':'W', |
||||
'Ά':'A', 'Έ':'E', 'Ί':'I', 'Ό':'O', 'Ύ':'Y', 'Ή':'H', 'Ώ':'W', 'Ϊ':'I', |
||||
'Ϋ':'Y' |
||||
} |
||||
var TURKISH_MAP = { |
||||
'ş':'s', 'Ş':'S', 'ı':'i', 'İ':'I', 'ç':'c', 'Ç':'C', 'ü':'u', 'Ü':'U', |
||||
'ö':'o', 'Ö':'O', 'ğ':'g', 'Ğ':'G' |
||||
} |
||||
var RUSSIAN_MAP = { |
||||
'а':'a', 'б':'b', 'в':'v', 'г':'g', 'д':'d', 'е':'e', 'ё':'yo', 'ж':'zh', |
||||
'з':'z', 'и':'i', 'й':'j', 'к':'k', 'л':'l', 'м':'m', 'н':'n', 'о':'o', |
||||
'п':'p', 'р':'r', 'с':'s', 'т':'t', 'у':'u', 'ф':'f', 'х':'h', 'ц':'c', |
||||
'ч':'ch', 'ш':'sh', 'щ':'sh', 'ъ':'', 'ы':'y', 'ь':'', 'э':'e', 'ю':'yu', |
||||
'я':'ya', |
||||
'А':'A', 'Б':'B', 'В':'V', 'Г':'G', 'Д':'D', 'Е':'E', 'Ё':'Yo', 'Ж':'Zh', |
||||
'З':'Z', 'И':'I', 'Й':'J', 'К':'K', 'Л':'L', 'М':'M', 'Н':'N', 'О':'O', |
||||
'П':'P', 'Р':'R', 'С':'S', 'Т':'T', 'У':'U', 'Ф':'F', 'Х':'H', 'Ц':'C', |
||||
'Ч':'Ch', 'Ш':'Sh', 'Щ':'Sh', 'Ъ':'', 'Ы':'Y', 'Ь':'', 'Э':'E', 'Ю':'Yu', |
||||
'Я':'Ya' |
||||
} |
||||
var UKRAINIAN_MAP = { |
||||
'Є':'Ye', 'І':'I', 'Ї':'Yi', 'Ґ':'G', 'є':'ye', 'і':'i', 'ї':'yi', 'ґ':'g' |
||||
} |
||||
var CZECH_MAP = { |
||||
'č':'c', 'ď':'d', 'ě':'e', 'ň': 'n', 'ř':'r', 'š':'s', 'ť':'t', 'ů':'u', |
||||
'ž':'z', 'Č':'C', 'Ď':'D', 'Ě':'E', 'Ň': 'N', 'Ř':'R', 'Š':'S', 'Ť':'T', |
||||
'Ů':'U', 'Ž':'Z' |
||||
} |
||||
|
||||
var POLISH_MAP = { |
||||
'ą':'a', 'ć':'c', 'ę':'e', 'ł':'l', 'ń':'n', 'ó':'o', 'ś':'s', 'ź':'z', |
||||
'ż':'z', 'Ą':'A', 'Ć':'C', 'Ę':'e', 'Ł':'L', 'Ń':'N', 'Ó':'o', 'Ś':'S', |
||||
'Ź':'Z', 'Ż':'Z' |
||||
} |
||||
|
||||
var LATVIAN_MAP = { |
||||
'ā':'a', 'č':'c', 'ē':'e', 'ģ':'g', 'ī':'i', 'ķ':'k', 'ļ':'l', 'ņ':'n', |
||||
'š':'s', 'ū':'u', 'ž':'z', 'Ā':'A', 'Č':'C', 'Ē':'E', 'Ģ':'G', 'Ī':'i', |
||||
'Ķ':'k', 'Ļ':'L', 'Ņ':'N', 'Š':'S', 'Ū':'u', 'Ž':'Z' |
||||
} |
||||
|
||||
var ALL_DOWNCODE_MAPS=new Array() |
||||
ALL_DOWNCODE_MAPS[0]=LATIN_MAP |
||||
ALL_DOWNCODE_MAPS[1]=LATIN_SYMBOLS_MAP |
||||
ALL_DOWNCODE_MAPS[2]=GREEK_MAP |
||||
ALL_DOWNCODE_MAPS[3]=TURKISH_MAP |
||||
ALL_DOWNCODE_MAPS[4]=RUSSIAN_MAP |
||||
ALL_DOWNCODE_MAPS[5]=UKRAINIAN_MAP |
||||
ALL_DOWNCODE_MAPS[6]=CZECH_MAP |
||||
ALL_DOWNCODE_MAPS[7]=POLISH_MAP |
||||
ALL_DOWNCODE_MAPS[8]=LATVIAN_MAP |
||||
|
||||
var Downcoder = new Object(); |
||||
Downcoder.Initialize = function() |
||||
{ |
||||
if (Downcoder.map) // already made
|
||||
return ; |
||||
Downcoder.map ={} |
||||
Downcoder.chars = '' ; |
||||
for(var i in ALL_DOWNCODE_MAPS) |
||||
{ |
||||
var lookup = ALL_DOWNCODE_MAPS[i] |
||||
for (var c in lookup) |
||||
{ |
||||
Downcoder.map[c] = lookup[c] ; |
||||
Downcoder.chars += c ; |
||||
} |
||||
} |
||||
Downcoder.regex = new RegExp('[' + Downcoder.chars + ']|[^' + Downcoder.chars + ']+','g') ; |
||||
} |
||||
|
||||
downcode= function( slug ) |
||||
{ |
||||
Downcoder.Initialize() ; |
||||
var downcoded ="" |
||||
var pieces = slug.match(Downcoder.regex); |
||||
if(pieces) |
||||
{ |
||||
for (var i = 0 ; i < pieces.length ; i++) |
||||
{ |
||||
if (pieces[i].length == 1) |
||||
{ |
||||
var mapped = Downcoder.map[pieces[i]] ; |
||||
if (mapped != null) |
||||
{ |
||||
downcoded+=mapped; |
||||
continue ; |
||||
} |
||||
} |
||||
downcoded+=pieces[i]; |
||||
} |
||||
} |
||||
else |
||||
{ |
||||
downcoded = slug; |
||||
} |
||||
return downcoded; |
||||
} |
||||
|
||||
|
||||
function URLify(s, num_chars) { |
||||
// changes, e.g., "Petty theft" to "petty_theft"
|
||||
// remove all these words from the string before urlifying
|
||||
s = downcode(s); |
||||
removelist = ["a", "an", "as", "at", "before", "but", "by", "for", "from", |
||||
"is", "in", "into", "like", "of", "off", "on", "onto", "per", |
||||
"since", "than", "the", "this", "that", "to", "up", "via", |
||||
"with"]; |
||||
r = new RegExp('\\b(' + removelist.join('|') + ')\\b', 'gi'); |
||||
s = s.replace(r, ''); |
||||
// if downcode doesn't hit, the char will be stripped here
|
||||
s = s.replace(/[^-\w\s]/g, ''); // remove unneeded chars
|
||||
s = s.replace(/^\s+|\s+$/g, ''); // trim leading/trailing spaces
|
||||
s = s.replace(/[-\s]+/g, '-'); // convert spaces to hyphens
|
||||
s = s.toLowerCase(); // convert to lowercase
|
||||
return s.substring(0, num_chars);// trim to first num_chars chars
|
||||
} |
||||
|
||||
@ -1,9 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from hvad.admin import TranslatableAdmin |
||||
from django.contrib import admin |
||||
from models import Article |
||||
|
||||
class ArticleAdmin(TranslatableAdmin): |
||||
pass |
||||
|
||||
admin.site.register(Article, ArticleAdmin) |
||||
@ -1,120 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django import forms |
||||
from django.conf import settings |
||||
from ckeditor.widgets import CKEditorWidget |
||||
from django.core.exceptions import ValidationError |
||||
from django.template.defaultfilters import slugify |
||||
#functions |
||||
from functions.translate import populate_all, fill_trans_fields_all |
||||
from functions.files import check_tmp_files |
||||
from functions.form_check import translit_with_separator |
||||
#models |
||||
from models import Article |
||||
from theme.models import Theme, Tag |
||||
|
||||
|
||||
class ArticleForm(forms.Form): |
||||
""" |
||||
Create Article form for creating conference |
||||
|
||||
__init__ uses for dynamic creates fields |
||||
|
||||
save function saves data in Article object. If it doesnt exist create new object |
||||
""" |
||||
author = forms.CharField(label='Автор', required=False) |
||||
key = forms.CharField(required=False, widget=forms.HiddenInput()) |
||||
theme = forms.ModelMultipleChoiceField(label='Тематики', queryset=Theme.objects.all()) |
||||
#creates select input with empty choices cause it will be filled with ajax |
||||
tag = forms.MultipleChoiceField(label='Теги', required=False) |
||||
|
||||
def __init__(self, *args, **kwargs): |
||||
""" |
||||
create dynamical translated fields fields |
||||
""" |
||||
super(ArticleForm, self).__init__(*args, **kwargs) |
||||
#creates translated forms example: name_ru, name_en |
||||
# len(10) is a hack for detect if settings.LANGUAGES is not configured it return all langs |
||||
if len(settings.LANGUAGES) in range(10): |
||||
for lid, (code, name) in enumerate(settings.LANGUAGES): |
||||
# uses enumerate for detect iteration number |
||||
# first iteration is a default lang so it required fields |
||||
required = True if lid == 0 else False |
||||
self.fields['main_title_%s' % code] = forms.CharField(label='Заголовок', required=required) |
||||
self.fields['preview_%s' % code] = forms.CharField(label='Превью', required=required, widget=CKEditorWidget) |
||||
self.fields['description_%s' % code] = forms.CharField(label='Описание', required=required, widget=CKEditorWidget) |
||||
#meta data |
||||
self.fields['title_%s' % code] = forms.CharField(label='Тайтл', required=False, max_length=255, |
||||
widget=forms.TextInput(attrs={'style':'width: 550px'})) |
||||
self.fields['keywords_%s' % code] = forms.CharField(label='Дескрипшен', required=False, max_length=255, |
||||
widget=forms.TextInput(attrs={'style':'width: 550px'})) |
||||
self.fields['descriptions_%s' % code] = forms.CharField(label='Кейвордс', required=False, max_length=255, |
||||
widget=forms.TextInput(attrs={'style':'width: 550px'})) |
||||
|
||||
def save(self, id=None): |
||||
""" |
||||
change Article object with id = id |
||||
N/A add new Article object |
||||
usage: form.save(obj) - if change article |
||||
form.save() - if add article |
||||
""" |
||||
data = self.cleaned_data |
||||
#create new Article object or get exists |
||||
if not id: |
||||
article = Article() |
||||
else: |
||||
article = Article.objects.get(id=id) |
||||
#clear manytomany relations |
||||
article.theme.clear() |
||||
article.tag.clear() |
||||
|
||||
article.author = data['author'] |
||||
#create slug field from russian language |
||||
article.url = translit_with_separator(data['main_title_ru']) |
||||
|
||||
# uses because in the next loop data will be overwritten |
||||
article.save() |
||||
|
||||
for item in data['theme']: |
||||
article.theme.add(item.id)#.id cause select uses queryset |
||||
|
||||
for item in data['tag']: |
||||
article.tag.add(item) |
||||
# uses because in the next loop data will be overwritten |
||||
article.save() |
||||
#populate fields with zero language |
||||
zero_fields = {} |
||||
|
||||
fill_trans_fields_all(Article, article, data, id, zero_fields) |
||||
|
||||
#autopopulate |
||||
#populate empty fields and fields which was already populated |
||||
article_id = getattr(article, 'id') |
||||
populate_all(Article, data, article_id, zero_fields) |
||||
#save files |
||||
check_tmp_files(article, data['key']) |
||||
|
||||
|
||||
def clean_main_title_ru(self): |
||||
""" |
||||
check main title which must be unique because it generate slug field |
||||
""" |
||||
cleaned_data = super(ArticleForm, self).clean() |
||||
main_title_ru = cleaned_data.get('main_title_ru') |
||||
try: |
||||
Article.objects.get(url=translit_with_separator(main_title_ru)) |
||||
except: |
||||
return main_title_ru |
||||
|
||||
raise ValidationError('Статья с таким названием уже существует') |
||||
|
||||
class ArticleChangeForm(ArticleForm): |
||||
""" |
||||
cancel checking url field |
||||
""" |
||||
def clean_main_title_ru(self): |
||||
""" |
||||
check main title which must be unique because it generate slug field |
||||
""" |
||||
cleaned_data = super(ArticleForm, self).clean() |
||||
main_title_ru = cleaned_data.get('main_title_ru') |
||||
return main_title_ru |
||||
@ -1,31 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.db import models |
||||
from hvad.models import TranslatableModel, TranslatedFields |
||||
from django.template.defaultfilters import slugify |
||||
|
||||
class Article(TranslatableModel): |
||||
""" |
||||
Create Article model |
||||
|
||||
Uses hvad.TranslatableModel which is child of django.db.models class |
||||
|
||||
""" |
||||
url = models.SlugField(unique=True) |
||||
theme = models.ManyToManyField('theme.Theme') |
||||
tag = models.ManyToManyField('theme.Tag', related_name='tags',blank=True, null=True) |
||||
author = models.CharField(max_length=150, blank=True) |
||||
|
||||
#translated fields |
||||
translations = TranslatedFields( |
||||
main_title = models.CharField(max_length=100), |
||||
preview = models.TextField(), |
||||
description = models.TextField(), |
||||
#-----meta |
||||
title = models.CharField(max_length=255, blank=True), |
||||
descriptions = models.CharField(max_length=255, blank=True), |
||||
keywords = models.CharField(max_length=255, blank=True), |
||||
) |
||||
|
||||
def __unicode__(self): |
||||
return self.lazy_translation_getter('main_title', self.pk) |
||||
|
||||
@ -1,190 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
{% load static %} |
||||
{# Displays article form #} |
||||
|
||||
{% block scripts %} |
||||
|
||||
<script src="{% static 'ckeditor/ckeditor/ckeditor.js' %}"></script> |
||||
{# selects #} |
||||
<link href="{% static 'js/select/select2.css' %}" rel="stylesheet"/> |
||||
<script src="{% static 'js/select/select2.js' %}"></script> |
||||
<script src="{% static 'custom_js/make_select.js' %}"></script> |
||||
{# ajax #} |
||||
<script src="{% static 'custom_js/file_post_ajax.js' %}"></script> |
||||
<script src="{% static 'custom_js/file_delete_ajax.js' %}"></script> |
||||
<script src="{% static 'custom_js/select_tag.js' %}"></script> |
||||
|
||||
{% endblock %} |
||||
|
||||
{% block body %} |
||||
|
||||
{# Uses multilang.html template for translated fields #} |
||||
<form method="post" class="form-horizontal" name="form2" id="form2"> {% csrf_token %} |
||||
<fieldset> |
||||
<legend><i class="icon-edit"></i>{% if obj_id %} Изменить {% else %} Добавить {% endif %}статью</legend> |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i> Основная информация</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# Hidden inputs uses for comparing with TmpFile objects #} |
||||
{{ form.key }} |
||||
|
||||
{# main_title #} |
||||
{% with field='main_title' form=form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
{# theme #} |
||||
<div class="control-group {% if form.theme.errors %}error{% endif %}"> |
||||
<label class="control-label"><b>{{ form.theme.label }}:</b></label> |
||||
<div class="controls"> |
||||
{{ form.theme }} |
||||
<span class="help-inline">{{ form.theme.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# tag #} |
||||
<div class="control-group {% if form.tag.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.tag.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.tag }} |
||||
<span class="help-inline">{{ form.tag.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# preview #} |
||||
{% with field='preview' form=form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
{# author #} |
||||
<div class="control-group {% if form.author.errors %}error{% endif %}"> |
||||
<label class="control-label">{{ form.author.label }}:</label> |
||||
<div class="controls"> |
||||
{{ form.author }} |
||||
<span class="help-inline">{{ form.author.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# description #} |
||||
{% with field='description' form=form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
{# keywords #} |
||||
{% with field='keywords' form=form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
{# title #} |
||||
{% with field='title' form=form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
{# descriptions #} |
||||
{% with field='descriptions' form=form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
|
||||
</div> |
||||
|
||||
</div> |
||||
<div class="box span8" id="file"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-pencil"></i> Файлы</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
{# button that shows modal window with file form #} |
||||
<a href="#myModal" id="file_add" role="button" class="btn btn-info" data-toggle="modal">Добавить файл</a> |
||||
{# this div shows list of files and refreshes when new file added #} |
||||
<div id="file_list"> |
||||
<table class="table table-hover"> |
||||
|
||||
<thead> |
||||
<tr> |
||||
<td>id</td> |
||||
<td>Файл</td> |
||||
<td>Имя</td> |
||||
<td>Назначение</td> |
||||
<td></td> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for file in files %} |
||||
|
||||
<tr> |
||||
<td>{{ file.id }}</td> |
||||
<td><img src="{{ file.file_path.url }}"></td> |
||||
<td>{{ file.file_name }}</td> |
||||
<td>{{ file.purpose }}</td> |
||||
<td> |
||||
<button class="btn btn-danger delete_file" value="{{ file.id }}"> |
||||
<i class="icon-trash icon-white"></i> Удалить |
||||
</button> |
||||
</td> |
||||
</tr> |
||||
|
||||
{% endfor %} |
||||
</tbody> |
||||
</table> |
||||
</div> |
||||
|
||||
</div> |
||||
</div> |
||||
|
||||
<div class="controls"> |
||||
|
||||
<input class="btn btn-large btn-primary" type="submit" value="Добавить"> |
||||
<input class="btn btn-large" type="reset" value="Отмена"> |
||||
</div> |
||||
|
||||
</fieldset> |
||||
</form> |
||||
|
||||
|
||||
{# modal window #} |
||||
<div class="modal hide fade" id="myModal" > |
||||
<div class="modal-header"> |
||||
<button type="button" class="close" data-dismiss="modal" aria-hidden="true" id="close">×</button> |
||||
<h3>Добавить файл</h3> |
||||
</div> |
||||
|
||||
<div id="form_body"> |
||||
<div class="modal-body"> |
||||
<form method="post" class="form-horizontal" enctype="multipart/form-data" name="file_form" id="file_form" > {% csrf_token %} |
||||
|
||||
{# hidden inputs uses for comparing with Article form key#} |
||||
{{ file_form.key }} |
||||
{{ file_form.model }} |
||||
<input type="hidden" id="obj_id" value="{{ obj_id }}"> |
||||
{# file_path #} |
||||
<div class="control-group{% if file_form.file_path.errors %}error{% endif %}"> |
||||
<label class="control-label"><b>{{ file_form.file_path.label }}:</b></label> |
||||
<div class="controls">{{ file_form.file_path }} |
||||
<span class="help-inline">{{ file_form.file_path.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# file purpose #} |
||||
<div class="control-group{% if file_form.purpose.errors %}error{% endif %}"> |
||||
<label class="control-label"><b>{{ file_form.purpose.label }}:</b></b></label> |
||||
<div class="controls">{{ file_form.purpose }} |
||||
<span class="help-inline">{{ file_form.purpose.errors }}</span> |
||||
</div> |
||||
</div> |
||||
{# file_name #} |
||||
{% with field='file_name' form=file_form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
{# file_description #} |
||||
{% with field='description' form=file_form languages=languages %} |
||||
{% include 'admin/forms/multilang.html' %} |
||||
{% endwith %} |
||||
|
||||
</div> |
||||
|
||||
<div class="modal-footer"> |
||||
<div class="controls"> |
||||
<input class="btn btn-primary" type="submit" value="Добавить"> |
||||
<input type="reset" class="btn" value="Отменить" data-dismiss="modal"> |
||||
</form> |
||||
</div> |
||||
</div> |
||||
</div> |
||||
|
||||
</div> |
||||
|
||||
{% endblock %} |
||||
@ -1,53 +0,0 @@ |
||||
{% extends 'base.html' %} |
||||
{% block body %} |
||||
{% comment %} |
||||
Displays lists of all articles in the table |
||||
and creating buttons which can change each article |
||||
{% endcomment %} |
||||
|
||||
<div class="box span8"> |
||||
<div class="box-header well"> |
||||
<h2><i class="icon-arrow-down"></i>Список статей</h2> |
||||
</div> |
||||
<div class="box-content"> |
||||
<table class="table table-hover"> |
||||
<thead> |
||||
<tr> |
||||
<th>id</th> |
||||
<th>Заголовок</th> |
||||
<th>Автор</th> |
||||
<th> </th> |
||||
</tr> |
||||
</thead> |
||||
<tbody> |
||||
{% for item in articles %} |
||||
<tr> |
||||
<td>{{ item.id }}</td> |
||||
<td>{{ item.main_title }}</td> |
||||
<td>{% ifnotequal item.author None %}{{ item.author }} {% endifnotequal %}</td> |
||||
<td class="center sorting_1"> |
||||
<a class="btn btn-info" href="/article/change/{{ item.url|lower }}"> |
||||
<i class="icon-edit icon-white"></i> Изменить |
||||
</a> |
||||
</td> |
||||
</tr> |
||||
{% endfor %} |
||||
</tbody> |
||||
</table> |
||||
<a class="btn btn-success" href="/article/add"><i class="icon-plus-sign icon-white"></i> Добавить статью</a> |
||||
</div> |
||||
|
||||
<div class="pagination pagination-centered"> |
||||
<ul> |
||||
{% if articles.has_previous %} |
||||
<li> <a href="?page={{ articles.previous_page_number }}">←</a></li> |
||||
{% endif %} |
||||
|
||||
{% if articles.has_next %} |
||||
<li><a href="?page={{ articles.next_page_number }}">→</a></li> |
||||
{% endif %} |
||||
</ul> |
||||
</div> |
||||
</div> |
||||
|
||||
{% endblock %} |
||||
@ -1,16 +0,0 @@ |
||||
""" |
||||
This file demonstrates writing tests using the unittest module. These will pass |
||||
when you run "manage.py test". |
||||
|
||||
Replace this with more appropriate tests for your application. |
||||
""" |
||||
|
||||
from django.test import TestCase |
||||
|
||||
|
||||
class SimpleTest(TestCase): |
||||
def test_basic_addition(self): |
||||
""" |
||||
Tests that 1 + 1 always equals 2. |
||||
""" |
||||
self.assertEqual(1 + 1, 2) |
||||
@ -1,8 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.conf.urls import patterns, url |
||||
|
||||
urlpatterns = patterns('', |
||||
url(r'^add/$', 'article.views.article_add'), |
||||
url(r'^change/(.*)/$', 'article.views.article_change'), |
||||
url(r'^all/$', 'article.views.article_all'), |
||||
) |
||||
@ -1,126 +0,0 @@ |
||||
# -*- coding: utf-8 -*- |
||||
from django.shortcuts import render_to_response, get_object_or_404 |
||||
from django.http import HttpResponseRedirect |
||||
from django.core.context_processors import csrf |
||||
from django.conf import settings |
||||
from django.contrib.auth.decorators import login_required |
||||
from django.contrib.contenttypes.models import ContentType |
||||
from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage |
||||
#models and forms |
||||
from forms import ArticleForm, Article, ArticleChangeForm |
||||
from theme.models import Tag |
||||
from file.models import FileModel, TmpFile |
||||
from file.forms import FileModelForm |
||||
#pythom |
||||
import random |
||||
|
||||
|
||||
@login_required |
||||
def article_add(request): |
||||
""" |
||||
Return form of article and post it on the server. |
||||
If form is posted redirect on the page of all articles. |
||||
""" |
||||
#if form would be not valid key must be same |
||||
if request.POST.get('key'): |
||||
key = request.POST['key'] |
||||
else: |
||||
key = random.getrandbits(128) |
||||
|
||||
file_form = FileModelForm(initial={'key': key}) |
||||
|
||||
if request.POST: |
||||
form = ArticleForm(request.POST) |
||||
#set choices filled by ajax |
||||
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] |
||||
|
||||
if form.is_valid(): |
||||
form.save() |
||||
return HttpResponseRedirect('/article/all') |
||||
else: |
||||
form = ArticleForm(initial={'key': key}) |
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
|
||||
args['form'] = form |
||||
args['languages'] = settings.LANGUAGES |
||||
args['file_form'] = file_form |
||||
args['files'] = TmpFile.objects.filter(key=key) |
||||
|
||||
return render_to_response('article_add.html', args) |
||||
|
||||
@login_required |
||||
def article_all(request): |
||||
""" |
||||
Return list of all articles with pagination |
||||
""" |
||||
article_list = Article.objects.all() |
||||
paginator = Paginator(article_list, 1)#show 10 items per page |
||||
page = request.GET.get('page') |
||||
try: |
||||
articles = paginator.page(page) |
||||
except PageNotAnInteger: |
||||
# If page is not an integer, deliver first page. |
||||
articles = paginator.page(1) |
||||
except EmptyPage: |
||||
# If page is out of range (e.g. 9999), deliver last page of results. |
||||
articles = paginator.page(paginator._num_pages) |
||||
return render_to_response('article_all.html', {'articles': articles}) |
||||
|
||||
|
||||
|
||||
def article_change(request, url): |
||||
""" |
||||
Return form and fill it with existing Article object data. |
||||
|
||||
If form is posted redirect on the page of all articles. |
||||
""" |
||||
try: |
||||
#check if article_id exists else redirect to the list of cities |
||||
article = Article.objects.get(url=url) |
||||
file_form = FileModelForm(initial={'model': 'article.Article'}) |
||||
except: |
||||
return HttpResponseRedirect('/article/all') |
||||
|
||||
if request.POST: |
||||
form = ArticleChangeForm(request.POST) |
||||
#set choices filled by ajax |
||||
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.all()] |
||||
|
||||
if form.is_valid(): |
||||
form.save(getattr(article, 'id')) |
||||
return HttpResponseRedirect('/article/all') |
||||
else: |
||||
data = {} |
||||
#fill form with data from database |
||||
data['author'] = article.author |
||||
data['theme'] = [item.id for item in article.theme.all()] |
||||
data['tag'] = [item.id for item in article.tag.all()] |
||||
#data from translated fields |
||||
for code, name in settings.LANGUAGES: |
||||
obj = Article._meta.translations_model.objects.get(language_code = code,master__id=getattr(article, 'id')) #access to translated fields |
||||
data['main_title_%s' % code] = obj.main_title |
||||
data['preview_%s' % code] = obj.preview |
||||
data['description_%s' % code] = obj.description |
||||
data['title_%s' % code] = obj.title |
||||
data['keywords_%s' % code] = obj.keywords |
||||
data['descriptions_%s' % code] = obj.descriptions |
||||
#fill form |
||||
form = ArticleChangeForm(initial=data) |
||||
#set choices filled by ajax |
||||
form.fields['tag'].choices = [(item.id, item.name) for item in Tag.objects.filter(theme__in=data['theme'])] |
||||
|
||||
args = {} |
||||
args.update(csrf(request)) |
||||
|
||||
args['form'] = form |
||||
args['languages'] = settings.LANGUAGES |
||||
args['file_form'] = file_form |
||||
|
||||
#get list of files which connected with specific model object |
||||
args['files'] = FileModel.objects.filter(content_type=ContentType.objects.get_for_model(article), object_id=getattr(article, 'id')) |
||||
args['obj_id'] = getattr(article, 'id') |
||||
|
||||
|
||||
return render_to_response('article_add.html', args) |
||||