diff --git a/__pycache__/database.cpython-36.pyc b/__pycache__/database.cpython-36.pyc new file mode 100644 index 0000000..2925592 Binary files /dev/null and b/__pycache__/database.cpython-36.pyc differ diff --git a/__pycache__/models.cpython-36.pyc b/__pycache__/models.cpython-36.pyc new file mode 100644 index 0000000..181a731 Binary files /dev/null and b/__pycache__/models.cpython-36.pyc differ diff --git a/app.py b/app.py new file mode 100644 index 0000000..32ee0ad --- /dev/null +++ b/app.py @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +#from flask import Flask, request, render_template, json, g, redirect, abort, session, jsonify, url_for, make_response, Response + +from flask import Blueprint, Flask, render_template, request, redirect, url_for + +from cart import cart_page +from checkout import checkout_page + +from database import db_session, init_db +from models import User, Adresse, Bestellung, Warenkorb, WarenkorbProdukt, Produkt, Produktbilder, Configtable +from sqlalchemy import func, desc, asc, or_ +from werkzeug.security import generate_password_hash, check_password_hash + +from datetime import datetime, timedelta, date +import random + +import json +import time +import requests + +from flask_login import LoginManager, UserMixin, \ + login_required, login_user, logout_user + +#from flask_weasyprint import HTML, render_pdf + +# Create appF +app = Flask(__name__) +app.register_blueprint(cart_page) +app.register_blueprint(checkout_page) + +app.config['DEBUG'] = True +app.config['TESTING'] = True + +#app.config['MYSQL_DATABASE_CHARSET'] = 'utf8mb4' + +app.config['SECRET_KEY'] = 'shadk67d%sad%DSuad356=0cklasLASdqdadSIDasd/209sadLSmaca)Xaa' +app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+mysqldb://root:ujIyFEznJHib6gH4@localhost/corten' + +#init_db() + +login_manager = LoginManager() +login_manager.init_app(app) + +#_________________________________________________________________________ +#___________________________________Home__________________________________ +#_________________________________________________________________________ + +@login_manager.user_loader +def load_user(user_id): + return User.query.get(user_id) + +#----------------------------------------------------------------------------- +@app.route('/', methods=['POST','GET']) +@app.route('/index.html', methods=['POST','GET']) +def home(): + produkte = Produkt.query.order_by(func.random()).limit(3).all() + return render_template("index.html",produkte=produkte,site="home") + +@app.route('/produkte', methods=['POST','GET']) +def produkte(): + produkte = Produkt.query.order_by(func.random()).all() + return render_template("produkte.html",produkte=produkte,site="produkte") + + +@app.route('//produkt', methods=['GET', 'POST']) +def produkt(id): + produkt = Produkt.query.filter_by(id=id).first() + return render_template("produkt.html",produkt=produkt) + +#----------------------------------------------------------------------------- +@app.route('/loginpanel', methods=['POST','GET']) +def loginpanel(): + return render_template("userpanel.html", site="login") + +@app.route('/login', methods=['POST']) +def login_post(): + email = request.form.get('email') + password = request.form.get('password') + remember = True if request.form.get('remember') else False + + user = User.query.filter_by(mail=email).first() + + # check if the user actually exists + # take the user-supplied password, hash it, and compare it to the hashed password in the database + if not user or not check_password_hash(user.passwort, password): + flash('Bitte logindaten Überprüfen') + return redirect(url_for('home')) # if the user doesn't exist or password is wrong, reload the page + + login_user(user,force=True) + # if the above check passes, then we know the user has the right credentials + return redirect(url_for('home')) + +@app.route('/signup', methods=['POST','GET']) +def signup_post(): + # code to validate and add user to database goes here + name = request.form.get('name') + firma = request.form.get('firma') + tel = request.form.get('tel') + uid = request.form.get('uid') + email = request.form.get('email') + password = request.form.get('password') + + user = User.query.filter_by(mail=email).first() # if this returns a user, then the email already exists in database + + if user: # if a user is found, we want to redirect back to signup page so user can try again + return redirect(url_for('home')) + + # create a new user with the form data. Hash the password so the plaintext version isn't saved. + new_user = User(name=name, firma=firma, tel=tel, uid=uid, mail=email, passwort=generate_password_hash(password, method='sha256'), lang="de", datetime=datetime.now()) + + # add the new user to the database + db_session.add(new_user) + db_session.commit() + db_session.flush() + login_user(new_user,force=True) + + return redirect(url_for('home')) + + +#----------------------------------------------------------------------------- + +@app.route('/kundencenter', methods=['POST','GET']) +def kundencenter(): + return render_template("index.html", site="kundencenter") + +@app.route('/warenkorb', methods=['POST','GET']) +def warenkorb(): + return render_template("warenkorb.html", site="warenkorb") + +@app.route('/impressum', methods=['POST','GET']) +def impressum(): + return render_template("impressum.html") + +@app.route('/agb', methods=['POST','GET']) +def AGB(): + return render_template("agb.html") + +@app.route('/lieferung', methods=['POST','GET']) +def lieferung(): + return render_template("lieferung.html") + +@app.route('/datenschutz', methods=['POST','GET']) +def datenschutz(): + return render_template("datenschutz.html") + +@app.route('/cookie', methods=['POST','GET']) +def cookie(): + return render_template("cookie.html") + +@app.route('/kontakt', methods=['POST','GET']) +def kontakt(): + if request.method == 'POST': + #if recaptcha.verify(): + name = request.form.get('name') + email = request.form.get('email') + subject = request.form.get('subject') + message_user = request.form.get('message') + capture = request.form.get('g-recaptcha-response') + if capture!=None: + url = "https://recaptchaenterprise.googleapis.com?secret=6Lcrd88eAAAAAKpGc4qQDUKDkTGiEmvRQHxbPhfU&response=" + capture + x = requests.post(url) + json_data = json.loads(x.text) + if json_data['success']: + #msg = Message('Usermessage Dive air ' + subject + ' name:' + name+ ' email:' + email, sender=email, recipients=['chris@diveair.eu']) + #msg.body = message_user + #mail.send(msg) + return render_template('kontakt.html', success=True, site="kontakt") + return render_template('kontakt.html', success=False, site="kontakt") + else: + return render_template("kontakt.html",success=None) + + +if __name__ == '__main__': + app.debug = True + app.run(host='localhost',port=8087) diff --git a/cart.py b/cart.py new file mode 100644 index 0000000..3012392 --- /dev/null +++ b/cart.py @@ -0,0 +1,105 @@ +from flask import Blueprint, json, request, url_for, Response, make_response +from database import db_session, init_db +from models import Warenkorb, Produkt, WarenkorbProdukt +from sqlalchemy import func, desc, asc, or_ +from flask_login import current_user + + +from datetime import datetime, timedelta, date + +import requests + +cart_page = Blueprint('cart_pages', __name__, url_prefix="/cart", template_folder='templates') + +def _convert_to_JSON(result): + """Convert result object to a JSON web request.""" + response = make_response(json.dumps(result)) + response.headers['Access-Control-Allow-Origin'] = "*" + response.mimetype = "application/json" + return response + +@cart_page.route("/create", methods=['POST']) +def createcart(): + check = request.form.get('check') + if check == "167209": + user_id = 9999999 # anonymous + if current_user.is_authenticated: + user_id = current_user.get_id() + newcart = Warenkorb(user_id) + db_session.add(newcart) + db_session.commit() + db_session.flush() + return _convert_to_JSON(newcart.id) + return _convert_to_JSON("fail") + +@cart_page.route("/add", methods=['POST']) +def addtocart(): + quant = request.form.get('quant') + produkt_id = request.form.get('produktid') + warenkorb_id = request.form.get('korbid') + if quant and produkt_id and warenkorb_id: + exist = WarenkorbProdukt.query.filter_by(warenkorb_id=warenkorb_id).filter_by(produkt_id=produkt_id).first() + if exist: + exist.quant = exist.quant + int(quant) + db_session.commit() + else: + addprod = WarenkorbProdukt(quant,produkt_id,warenkorb_id) + db_session.add(addprod) + db_session.commit() + return _convert_to_JSON("success") + return _convert_to_JSON("fail") + +@cart_page.route("/changequant", methods=['POST']) +def changequant(): + quant = request.form.get('quant') + produkt_id = request.form.get('produktid') + warenkorb_id = request.form.get('korbid') + if quant and produkt_id and warenkorb_id: + exist = WarenkorbProdukt.query.filter_by(warenkorb_id=warenkorb_id).filter_by(produkt_id=produkt_id).first() + if exist: + exist.quant = quant + db_session.commit() + return _convert_to_JSON("success") + return _convert_to_JSON("fail") + +@cart_page.route("/remove", methods=['POST']) +def removefromcart(): + produkt_id = request.form.get('produktid') + warenkorb_id = request.form.get('korbid') + if produkt_id and warenkorb_id: + exist = WarenkorbProdukt.query.filter_by(warenkorb_id=warenkorb_id).filter_by(produkt_id=produkt_id).first() + if exist: + exist.quant = 0 + db_session.commit() + return _convert_to_JSON("success") + return _convert_to_JSON("fail") + +@cart_page.route("/getcart", methods=['POST']) +def getcart(): + warenkorb_id = request.form.get('korbid') + if warenkorb_id: + produkte = WarenkorbProdukt.query.filter_by(warenkorb_id=warenkorb_id).all() + if produkte: + korb=dict() + i=0 + for produkt in produkte: + korb[i]=[produkt.quant,produkt.produkt_id] + i=i+1 + return _convert_to_JSON(korb) + return _convert_to_JSON("leer") + return _convert_to_JSON("fail") + +@cart_page.route("/getprodukt", methods=['POST']) +def getprodukt(): + produkt_id = request.form.get('produktid') + if produkt_id: + produkt = Produkt.query.filter_by(id=produkt_id).first() + return { + 'id': produkt.id, + 'preis': produkt.preis, + 'titel': produkt.titel, + 'kurzbeschreibung': produkt.kurzbeschreibung, + 'bildlink': produkt.bildlink + } + #return _convert_to_JSON(produkt) + return _convert_to_JSON("fail") diff --git a/checkout.py b/checkout.py new file mode 100644 index 0000000..db3757a --- /dev/null +++ b/checkout.py @@ -0,0 +1,71 @@ +from flask import Blueprint, json, request, url_for, Response, make_response, render_template +from database import db_session, init_db +from models import Warenkorb, Produkt, WarenkorbProdukt, Adresse +from sqlalchemy import func, desc, asc, or_ + +from datetime import datetime, timedelta, date + +import requests + +checkout_page = Blueprint('checkout_pages', __name__, url_prefix="/checkout", template_folder='templates') + +def _convert_to_JSON(result): + """Convert result object to a JSON web request.""" + response = make_response(json.dumps(result)) + response.headers['Access-Control-Allow-Origin'] = "*" + response.mimetype = "application/json" + return response + +@checkout_page.route("/checkout", methods=['POST']) +def checkout(): + netto = request.form.get('netto') + mwst = request.form.get('mwst') + brutto = request.form.get('brutto') + return render_template("checkout.html") + #if netto and mwst and brutto: + +@checkout_page.route("/addaddress", methods=['POST']) +def addaddress(): + name = request.form.get('name') + firma = request.form.get('firma') + uid = request.form.get('uid') + straße = request.form.get('straße') + plz = request.form.get('plz') + land = request.form.get('land') + user_id = request.form.get('user_id') + if plz and land and user_id and straße: + exist = Adresse.query.filter_by(user_id=user_id).filter_by(plz=plz).filter_by(strase=straße).first() + if exist: + return _convert_to_JSON("exist") + else: + newadresse = Adresse(user_id,name,firma,uid,straße,plz,land,datetime.now(),"1","1") + db_session.add(newadresse) + db_session.commit() + return _convert_to_JSON("success") + return _convert_to_JSON("fail") + +@checkout_page.route("/getadress", methods=['POST']) +def getadress(): + userid = request.form.get('userid') + if userid: + addressen = Adresse.query.filter_by(user_id=userid).all() + if addressen: + korb=dict() + i=0 + for adresse in addressen: + if adresse.firma: + korb[i]=[adresse.name,adresse.firma, adresse.strase, adresse.plz + " " + adresse.land, adresse.uid] + else: + korb[i]=[adresse.name, adresse.strase, adresse.plz + " " + adresse.land, "", ""] + i=i+1 + return _convert_to_JSON(korb) + return _convert_to_JSON("leer") + return _convert_to_JSON("fail") + +@checkout_page.route("/order", methods=['POST']) +def order(): + user_id = request.form.get('user_id') + warenkorb_id = request.form.get('warenkorb_id') + return user_id + return render_template("checkout.html") + #if netto and mwst and brutto: diff --git a/database.py b/database.py new file mode 100644 index 0000000..5b8b6ee --- /dev/null +++ b/database.py @@ -0,0 +1,22 @@ +from sqlalchemy import create_engine +from sqlalchemy.orm import scoped_session, sessionmaker +from sqlalchemy.ext.declarative import declarative_base + + +#engine = create_engine('postgres://druckluft:druckluft@localhost/druckluft', \ +# convert_unicode=True) +#engine = create_engine('mysql+pymysql://helmi:QF0mN6uchOFIjHp4Arg41MDa@46.4.85.248/KonfiguratorPooldeck?charset=utf8', pool_recycle=3600, convert_unicode=True) +engine = create_engine('mysql+pymysql://root:ujIyFEznJHib6gH4@localhost/corten?charset=utf8', pool_recycle=3600, convert_unicode=True) +#engine = create_engine('mysql+pymysql://root:ujIyFEznJHib6gH4@202.61.253.44/KonfiguratorPooldeck?charset=utf8', pool_recycle=3600, convert_unicode=True) +db_session = scoped_session(sessionmaker(autocommit=False, + autoflush=False, + bind=engine)) +Base = declarative_base() +Base.query = db_session.query_property() + +def init_db(): + # import all modules here that might define models so that + # they will be registered properly on the metadata. Otherwise + # you will have to import them first before calling init_db() + import models + Base.metadata.create_all(bind=engine) diff --git a/models.py b/models.py new file mode 100644 index 0000000..2168ed2 --- /dev/null +++ b/models.py @@ -0,0 +1,151 @@ +from database import Base +from sqlalchemy.orm import relationship, backref +from sqlalchemy import Boolean, DateTime, Column, Integer, Float ,\ + String, ForeignKey +from flask_login import UserMixin + +class User(Base, UserMixin): + __tablename__ = 'kunde' + id = Column(Integer(), primary_key=True) + name = Column(String(255)) + firma = Column(String(255)) + tel = Column(String(255)) + uid = Column(String(255)) + mail = Column(String(255)) + passwort = Column(String(255)) + lang = Column(String(255)) + datetime = Column(DateTime()) + def __init__(self, name=None, firma=None, tel=None, uid=None, mail=None, passwort=None, lang=None, datetime=None): + self.name = name + self.firma = firma + self.uid = uid + self.mail = mail + self.tel = tel + self.passwort = passwort + self.lang = lang + self.datetime = datetime + +class Adresse(Base): + __tablename__ = 'adresse' + id = Column(Integer(), primary_key=True) + user_id = Column(Integer()) + name = Column(String(255)) + firma = Column(String(255)) + uid = Column(String(255)) + strase = Column(String(255)) + plz = Column(String(255)) + land = Column(String(255)) + datetime = Column(DateTime()) + standard_l = Column(String(255)) + standard_r = Column(String(255)) + def __init__(self, user_id=None, name=None, firma=None, uid=None, strase=None, plz=None, land=None, datetime=None, standard_l=None, standard_r=None): + self.user_id = user_id + self.name = name + self.firma = firma + self.uid = uid + self.strase = strase + self.plz = plz + self.land = land + self.datetime = datetime + self.standard_l = standard_l + self.standard_r = standard_r + +class Bestellung(Base): + __tablename__ = 'bestellung' + id = Column(Integer(), primary_key=True) + user_id = Column(Integer()) + warenkorb_id = Column(Integer()) + bestellzeit = Column(DateTime()) + bezahlzeit = Column(DateTime()) + methode = Column(String(255)) + stripe_id = Column(String(255)) + status = Column(String(255)) + def __init__(self, user_id=None, warenkorb_id=None, bestellzeit=None, bezahlzeit=None, methode=None, stripe_id=None, status=None): + self.user_id = user_id + self.warenkorb_id = warenkorb_id + self.bestellzeit = bestellzeit + self.bezahlzeit = bezahlzeit + self.methode = methode + self.stripe_id = stripe_id + self.status = status + + +class Warenkorb(Base): + __tablename__ = 'warenkorb' + id = Column(Integer(), primary_key=True) + user_id = Column(Integer()) + def __init__(self, user_id=None): + self.user_id = user_id + +class WarenkorbProdukt(Base): + __tablename__ = 'nn' + id = Column(Integer(), primary_key=True) + quant = Column(Integer()) + produkt_id = Column(Integer()) + warenkorb_id = Column(Integer()) + def __init__(self,quant=None, produkt_id=None, warenkorb_id=None): + self.quant = quant + self.produkt_id = produkt_id + self.warenkorb_id = warenkorb_id + +class Produkt(Base): + __tablename__ = 'produkt' + id = Column(Integer(), primary_key=True) + config_id = Column(Integer()) + preis = Column(String(255)) + titel = Column(String(255)) + kurzbeschreibung = Column(String(255)) + bildlink = Column(String(255)) + def __init__(self, config_id=None, preis=None, titel=None, kurzbeschreibung=None, bildlink=None): + self.config_id = config_id + self.preis = preis + self.titel = titel + self.kurzbeschreibung = kurzbeschreibung + self.bildlink = bildlink + +class Kategorie(Base): + __tablename__ = 'kategorie' + id = Column(Integer(), primary_key=True) + name = Column(String(255)) + beschreibung = Column(String(255)) + def __init__(self, name=None, beschreibung=None): + self.name = name + self.beschreibung = beschreibung + +class ProduktKategorie(Base): + __tablename__ = 'pk' + id = Column(Integer(), primary_key=True) + kategorie = Column(Integer()) + produkt_id = Column(Integer()) + def __init__(self, kategorie=None, produkt_id=None): + self.kategorie = kategorie + self.produkt_id = produkt_id + +class Produktbilder(Base): + __tablename__ = 'produktbilder' + id = Column(Integer(), primary_key=True) + produkt_id = Column(Integer()) + link = Column(String(255)) + def __init__(self, produkt_id=None, link=None): + self.produkt_id = produkt_id + self.link = link + +class Rabatt(Base): + __tablename__ = 'rabatt' + id = Column(Integer(), primary_key=True) + produkt_id = Column(Integer()) + rabatt_euro = Column(String(255)) + rabatt_pro = Column(String(255)) + def __init__(self, produkt_id=None, rabatt_euro=None, rabatt_pro=None): + self.produkt_id = produkt_id + self.rabatt_euro = rabatt_euro + self.rabatt_pro = rabatt_pro + +class Configtable(Base): + __tablename__ = 'config' + id = Column(Integer(), primary_key=True) + condigtable_id = Column(Integer()) + text = Column(String(255)) + def __init__(self, condigtable_id=None, text=None): + self.condigtable_id = condigtable_id + self.text = text diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..20efbdb --- /dev/null +++ b/requirements.txt @@ -0,0 +1,21 @@ +certifi==2021.5.30 +charset-normalizer==2.0.10 +click==8.0.3 +colorama==0.4.4 +dataclasses==0.6 +Flask==2.0.2 +Flask-Login==0.5.0 +greenlet==1.1.2 +idna==3.3 +importlib-metadata==4.8.3 +itsdangerous==2.0.1 +Jinja2==3.0.3 +MarkupSafe==2.0.1 +PyMySQL==1.0.2 +requests==2.27.1 +SQLAlchemy==1.4.31 +typing_extensions==4.0.1 +urllib3==1.26.8 +Werkzeug==2.0.2 +wincertstore==0.2 +zipp==3.6.0 diff --git a/static/css/flex-slider.css b/static/css/flex-slider.css new file mode 100644 index 0000000..3bad2b3 --- /dev/null +++ b/static/css/flex-slider.css @@ -0,0 +1,281 @@ +/* + * jQuery FlexSlider v2.7.1 + * http://www.woothemes.com/flexslider/ + * + * Copyright 2012 WooThemes + * Free to use under the GPLv2 and later license. + * http://www.gnu.org/licenses/gpl-2.0.html + * + * Contributing author: Tyler Smith (@mbmufffin) + * + */ +/* ==================================================================================================================== + * FONT-FACE + * ====================================================================================================================*/ +@font-face { + font-family: 'flexslider-icon'; + src: url('../fonts/flexslider-icon.eot'); + src: url('../fonts/flexslider-icon.eot?#iefix') format('embedded-opentype'), url('../fonts/flexslider-icon.woff') format('woff'), url('../fonts/flexslider-icon.ttf') format('truetype'), url('../fonts/flexslider-icon.svg#flexslider-icon') format('svg'); + font-weight: normal; + font-style: normal; +} +/* ==================================================================================================================== + * RESETS + * ====================================================================================================================*/ +.flex-container a:hover, +.flex-slider a:hover { + outline: none; +} +.slides, +.slides > li, +.flex-control-nav, +.flex-direction-nav { + margin: 0; + padding: 0; + list-style: none; +} +.flex-pauseplay span { + text-transform: capitalize; +} +/* ==================================================================================================================== + * BASE STYLES + * ====================================================================================================================*/ +.flexslider { + margin: 0; + padding: 0; +} +.flexslider .slides > li { + display: none; + -webkit-backface-visibility: hidden; +} +.flexslider .slides img { + width: 100%; + display: block; +} +.flexslider .slides:after { + content: "\0020"; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; +} +html[xmlns] .flexslider .slides { + display: block; +} +* html .flexslider .slides { + height: 1%; +} +.no-js .flexslider .slides > li:first-child { + display: block; +} +/* ==================================================================================================================== + * DEFAULT THEME + * ====================================================================================================================*/ +.flexslider { + margin: 0; + background: #fff; + border: 4px solid #fff; + position: relative; + zoom: 1; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + -moz-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + -o-box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); + box-shadow: '' 0 1px 4px rgba(0, 0, 0, 0.2); +} +.flexslider .slides { + zoom: 1; +} +.flexslider .slides img { + height: auto; + -moz-user-select: none; +} +.flex-viewport { + max-height: 2000px; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.loading .flex-viewport { + max-height: 300px; +} +@-moz-document url-prefix() { + .loading .flex-viewport { + max-height: none; + } +} +.carousel li { + margin-right: 5px; +} +.flex-direction-nav { + *height: 0; +} +.flex-direction-nav a { + text-decoration: none; + display: block; + width: 40px; + height: 40px; + line-height: 40px; + margin: -20px 0 0; + position: absolute; + top: 50%; + z-index: 10; + overflow: hidden; + opacity: 0; + cursor: pointer; + color: rgba(0, 0, 0, 0.8); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); + -webkit-transition: all 0.3s ease-in-out; + -moz-transition: all 0.3s ease-in-out; + -ms-transition: all 0.3s ease-in-out; + -o-transition: all 0.3s ease-in-out; + transition: all 0.3s ease-in-out; +} +.flex-direction-nav a:before { + font-family: "flexslider-icon"; + font-size: 26px; + display: inline-block; + content: '\f001'; + color: rgba(0, 0, 0, 0.8); + text-shadow: 1px 1px 0 rgba(255, 255, 255, 0.3); +} +.flex-direction-nav a.flex-next:before { + content: '\f002'; +} +.flex-direction-nav .flex-prev { + left: -50px; +} +.flex-direction-nav .flex-next { + right: -50px; + text-align: right; +} +.flexslider:hover .flex-direction-nav .flex-prev { + opacity: 0.7; + left: 10px; +} +.flexslider:hover .flex-direction-nav .flex-prev:hover { + opacity: 1; +} +.flexslider:hover .flex-direction-nav .flex-next { + opacity: 0.7; + right: 10px; +} +.flexslider:hover .flex-direction-nav .flex-next:hover { + opacity: 1; +} +.flex-direction-nav .flex-disabled { + opacity: 0!important; + filter: alpha(opacity=0); + cursor: default; + z-index: -1; +} +.flex-pauseplay a { + display: block; + width: 20px; + height: 20px; + position: absolute; + bottom: 5px; + left: 10px; + opacity: 0.8; + z-index: 10; + overflow: hidden; + cursor: pointer; + color: #000; +} +.flex-pauseplay a:before { + font-family: "flexslider-icon"; + font-size: 20px; + display: inline-block; + content: '\f004'; +} +.flex-pauseplay a:hover { + opacity: 1; +} +.flex-pauseplay a.flex-play:before { + content: '\f003'; +} +.flex-control-nav { + width: 100%; + position: absolute; + bottom: -40px; + text-align: center; +} +.flex-control-nav li { + margin: 0 6px; + display: inline-block; + zoom: 1; + *display: inline; +} +.flex-control-paging li a { + width: 11px; + height: 11px; + display: block; + background: #666; + background: rgba(0, 0, 0, 0.5); + cursor: pointer; + text-indent: -9999px; + -webkit-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -moz-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -o-box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + box-shadow: inset 0 0 3px rgba(0, 0, 0, 0.3); + -webkit-border-radius: 20px; + -moz-border-radius: 20px; + border-radius: 20px; +} +.flex-control-paging li a:hover { + background: #333; + background: rgba(0, 0, 0, 0.7); +} +.flex-control-paging li a.flex-active { + background: #000; + background: rgba(0, 0, 0, 0.9); + cursor: default; +} +.flex-control-thumbs { + margin: 5px 0 0; + position: static; + overflow: hidden; +} +.flex-control-thumbs li { + width: 25%; + float: left; + margin: 0; +} +.flex-control-thumbs img { + width: 100%; + height: auto; + display: block; + opacity: .7; + cursor: pointer; + -moz-user-select: none; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -ms-transition: all 1s ease; + -o-transition: all 1s ease; + transition: all 1s ease; +} +.flex-control-thumbs img:hover { + opacity: 1; +} +.flex-control-thumbs .flex-active { + opacity: 1; + cursor: default; +} +/* ==================================================================================================================== + * RESPONSIVE + * ====================================================================================================================*/ +@media screen and (max-width: 860px) { + .flex-direction-nav .flex-prev { + opacity: 1; + left: 10px; + } + .flex-direction-nav .flex-next { + opacity: 1; + right: 10px; + } +} diff --git a/static/css/fontawesome.css b/static/css/fontawesome.css new file mode 100644 index 0000000..24fcc04 --- /dev/null +++ b/static/css/fontawesome.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.3.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.3.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.3.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.3.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.3.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.3.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.3.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;transform:translate(0, 0)}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=1);-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2);-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1);-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1);-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-genderless:before,.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"} \ No newline at end of file diff --git a/static/css/owl.css b/static/css/owl.css new file mode 100644 index 0000000..b78c841 --- /dev/null +++ b/static/css/owl.css @@ -0,0 +1,186 @@ +/** + * Owl Carousel v2.3.4 + * Copyright 2013-2018 David Deutsch + * Licensed under: SEE LICENSE IN https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE + */ +/* + * Owl Carousel - Core + */ +.owl-carousel { + display: none; + width: 100%; + -webkit-tap-highlight-color: transparent; + /* position relative and z-index fix webkit rendering fonts issue */ + position: relative; + z-index: 1; } + .owl-carousel .owl-stage { + position: relative; + -ms-touch-action: pan-Y; + touch-action: manipulation; + -moz-backface-visibility: hidden; + /* fix firefox animation glitch */ } + .owl-carousel .owl-stage:after { + content: "."; + display: block; + clear: both; + visibility: hidden; + line-height: 0; + height: 0; } + .owl-carousel .owl-stage-outer { + position: relative; + overflow: hidden; + /* fix for flashing background */ + -webkit-transform: translate3d(0px, 0px, 0px); } + .owl-carousel .owl-wrapper, + .owl-carousel .owl-item { + -webkit-backface-visibility: hidden; + -moz-backface-visibility: hidden; + -ms-backface-visibility: hidden; + -webkit-transform: translate3d(0, 0, 0); + -moz-transform: translate3d(0, 0, 0); + -ms-transform: translate3d(0, 0, 0); } + .owl-carousel .owl-item { + position: relative; + min-height: 1px; + float: left; + -webkit-backface-visibility: hidden; + -webkit-tap-highlight-color: transparent; + -webkit-touch-callout: none; } + .owl-carousel .owl-item img { + display: block; + width: 100%; } + .owl-carousel .owl-nav.disabled, + .owl-carousel .owl-dots.disabled { + display: none; } + .owl-carousel .owl-nav .owl-prev, + .owl-carousel .owl-nav .owl-next, + .owl-carousel .owl-dot { + cursor: pointer; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel .owl-nav button.owl-prev, + .owl-carousel .owl-nav button.owl-next, + .owl-carousel button.owl-dot { + background: none; + color: inherit; + border: none; + padding: 0 !important; + font: inherit; } + .owl-carousel.owl-loaded { + display: block; } + .owl-carousel.owl-loading { + opacity: 0; + display: block; } + .owl-carousel.owl-hidden { + opacity: 0; } + .owl-carousel.owl-refresh .owl-item { + visibility: hidden; } + .owl-carousel.owl-drag .owl-item { + -ms-touch-action: pan-y; + touch-action: pan-y; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + .owl-carousel.owl-grab { + cursor: move; + cursor: grab; } + .owl-carousel.owl-rtl { + direction: rtl; } + .owl-carousel.owl-rtl .owl-item { + float: right; } + +/* No Js */ +.no-js .owl-carousel { + display: block; } + +/* + * Owl Carousel - Animate Plugin + */ +.owl-carousel .animated { + animation-duration: 1000ms; + animation-fill-mode: both; } + +.owl-carousel .owl-animated-in { + z-index: 0; } + +.owl-carousel .owl-animated-out { + z-index: 1; } + +.owl-carousel .fadeOut { + animation-name: fadeOut; } + +@keyframes fadeOut { + 0% { + opacity: 1; } + 100% { + opacity: 0; } } + +/* + * Owl Carousel - Auto Height Plugin + */ +.owl-height { + transition: height 500ms ease-in-out; } + +/* + * Owl Carousel - Lazy Load Plugin + */ +.owl-carousel .owl-item { + /** + This is introduced due to a bug in IE11 where lazy loading combined with autoheight plugin causes a wrong + calculation of the height of the owl-item that breaks page layouts + */ } + .owl-carousel .owl-item .owl-lazy { + opacity: 0; + transition: opacity 400ms ease; } + .owl-carousel .owl-item .owl-lazy[src^=""], .owl-carousel .owl-item .owl-lazy:not([src]) { + max-height: 0; } + .owl-carousel .owl-item img.owl-lazy { + transform-style: preserve-3d; } + +/* + * Owl Carousel - Video Plugin + */ +.owl-carousel .owl-video-wrapper { + position: relative; + height: 100%; + background: #000; } + +.owl-carousel .owl-video-play-icon { + position: absolute; + height: 80px; + width: 80px; + left: 50%; + top: 50%; + margin-left: -40px; + margin-top: -40px; + background: url("owl.video.play.png") no-repeat; + cursor: pointer; + z-index: 1; + -webkit-backface-visibility: hidden; + transition: transform 100ms ease; } + +.owl-carousel .owl-video-play-icon:hover { + -ms-transform: scale(1.3, 1.3); + transform: scale(1.3, 1.3); } + +.owl-carousel .owl-video-playing .owl-video-tn, +.owl-carousel .owl-video-playing .owl-video-play-icon { + display: none; } + +.owl-carousel .owl-video-tn { + opacity: 0; + height: 100%; + background-position: center center; + background-repeat: no-repeat; + background-size: contain; + transition: opacity 400ms ease; } + +.owl-carousel .owl-video-frame { + position: relative; + z-index: 1; + height: 100%; + width: 100%; } \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css new file mode 100644 index 0000000..79d2f3a --- /dev/null +++ b/static/css/style.css @@ -0,0 +1,1223 @@ +body { + font-family: 'Poppins', sans-serif; + overflow-x: hidden; + text-rendering: optimizeLegibility; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +p { + margin-bottom: 0px; + font-size: 14px; + font-weight: 300; + color: #4a4a4a; + line-height: 24px; +} +a { + text-decoration: none!important; +} +ul { + padding: 0; + margin: 0; + list-style: none; +} + +h1,h2,h3,h4,h5,h6 { + margin: 0px; +} + +ul.social-icons li { + display: inline-block; + margin-right: 3px; +} + +ul.social-icons li:last-child { + margin-right: 0px; +} + +ul.social-icons li a { + width: 50px; + height: 50px; + display: inline-block; + line-height: 50px; + background-color: #eee; + color: #121212; + font-size: 18px; + text-align: center; + transition: all .3s; +} + +ul.social-icons li a:hover { + background-color: #f33f3f; + color: #fff; +} + +a.filled-button { + background-color: #f33f3f; + color: #fff; + font-size: 14px; + text-transform: capitalize; + font-weight: 300; + padding: 10px 20px; + border-radius: 5px; + display: inline-block; + transition: all 0.3s; +} + +a.filled-button:hover { + background-color: #121212; + color: #fff; +} + +.section-heading { + text-align: left; + margin-bottom: 60px; + border-bottom: 1px solid #eee; +} + +.section-heading h2 { + font-size: 28px; + font-weight: 400; + color: #1e1e1e; + margin-bottom: 15px; +} + +.products-heading { + background-image: url(../img/products-heading.jpg); +} + +.about-heading { + background-image: url(../img/about-heading.jpg); +} + +.contact-heading { + background-image: url(../img/contact-heading.jpg); +} + +.page-heading { + padding: 210px 0px 130px 0px; + text-align: center; + background-position: center center; + background-repeat: no-repeat; + background-size: cover; +} + +.page-heading .text-content h4 { + color: #f33f3f; + font-size: 22px; + text-transform: uppercase; + font-weight: 700; + margin-bottom: 15px; +} + +.page-heading .text-content h2 { + color: #fff; + font-size: 62px; + text-transform: uppercase; + letter-spacing: 5px; +} + +#preloader { + overflow: hidden; + background: #f33f3f; + left: 0; + right: 0; + top: 0; + bottom: 0; + position: fixed; + z-index: 9999999; + color: #fff; +} + +#preloader .jumper { + left: 0; + top: 0; + right: 0; + bottom: 0; + display: block; + position: absolute; + margin: auto; + width: 50px; + height: 50px; +} + +#preloader .jumper > div { + background-color: #fff; + width: 10px; + height: 10px; + border-radius: 100%; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + position: absolute; + opacity: 0; + width: 50px; + height: 50px; + -webkit-animation: jumper 1s 0s linear infinite; + animation: jumper 1s 0s linear infinite; +} + +#preloader .jumper > div:nth-child(2) { + -webkit-animation-delay: 0.33333s; + animation-delay: 0.33333s; +} + +#preloader .jumper > div:nth-child(3) { + -webkit-animation-delay: 0.66666s; + animation-delay: 0.66666s; +} + +@-webkit-keyframes jumper { + 0% { + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); + } + 5% { + opacity: 1; + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} + +@keyframes jumper { + 0% { + opacity: 0; + -webkit-transform: scale(0); + transform: scale(0); + } + 5% { + opacity: 1; + } + 100% { + opacity: 0; + } +} + +/* Header Style */ +header { + position: absolute; + z-index: 99999; + width: 100%; + height: 80px; + background-color: #232323; + -webkit-transition: all 0.3s ease-in-out 0s; + -moz-transition: all 0.3s ease-in-out 0s; + -o-transition: all 0.3s ease-in-out 0s; + transition: all 0.3s ease-in-out 0s; +} +header .navbar { + padding: 17px 0px; +} +.background-header .navbar { + padding: 17px 0px; +} +.background-header { + top: 0; + position: fixed; + background-color: #fff!important; + box-shadow: 0px 1px 10px rgba(0,0,0,0.1); +} +.background-header .navbar-brand h2 { + color: #121212!important; +} +.background-header .navbar-nav a.nav-link { + color: #1e1e1e!important; +} +.background-header .navbar-nav .nav-link:hover, +.background-header .navbar-nav .active>.nav-link, +.background-header .navbar-nav .nav-link.active, +.background-header .navbar-nav .nav-link.show, +.background-header .navbar-nav .show>.nav-link { + color: #f33f3f!important; +} +.navbar .navbar-brand { + float: left; + margin-top: -12px; + outline: none; +} +.navbar .navbar-brand h2 { + color: #fff; + text-transform: uppercase; + font-size: 24px; + font-weight: 700; + -webkit-transition: all .3s ease 0s; + -moz-transition: all .3s ease 0s; + -o-transition: all .3s ease 0s; + transition: all .3s ease 0s; +} +.navbar .navbar-brand h2 em { + font-style: normal; + color: #f33f3f; +} +#navbarResponsive { + z-index: 999; +} +.navbar-collapse { + text-align: center; +} +.navbar .navbar-nav .nav-item { + margin: 0px 15px; +} +.navbar .navbar-nav a.nav-link { + text-transform: capitalize; + font-size: 15px; + font-weight: 500; + letter-spacing: 0.5px; + color: #fff; + transition: all 0.5s; + margin-top: 5px; +} +.navbar .navbar-nav .nav-link:hover, +.navbar .navbar-nav .active>.nav-link, +.navbar .navbar-nav .nav-link.active, +.navbar .navbar-nav .nav-link.show, +.navbar .navbar-nav .show>.nav-link { + color: #fff; + padding-bottom: 25px; + border-bottom: 3px solid #f33f3f; +} +.navbar .navbar-toggler-icon { + background-image: none; +} +.navbar .navbar-toggler { + border-color: #fff; + background-color: #fff; + height: 36px; + outline: none; + border-radius: 0px; + position: absolute; + right: 30px; + top: 20px; +} +.navbar .navbar-toggler-icon:after { + content: '\f0c9'; + color: #f33f3f; + font-size: 18px; + line-height: 26px; + font-family: 'FontAwesome'; +} + +/* Banner Style */ +.banner { + position: relative; + text-align: center; + padding-top: 80px; +} + +.banner-item-01 { + padding: 300px 0px; + background-image: url(../img/slide_01.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} + +.banner-item-02 { + padding: 300px 0px; + background-image: url(../img/slide_02.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} + +.banner-item-03 { + padding: 300px 0px; + background-image: url(../img/slide_03.jpg); + background-size: cover; + background-repeat: no-repeat; + background-position: center center; +} + +.banner .banner-item { + max-height: 600px; +} + +.banner .text-content { + position: absolute; + top: 50%; + transform: translateY(-50%); + text-align: center; + width: 100%; +} + +.banner .text-content h4 { + color: #f33f3f; + font-size: 22px; + text-transform: uppercase; + font-weight: 700; + margin-bottom: 15px; +} + +.banner .text-content h2 { + color: #fff; + font-size: 62px; + text-transform: uppercase; + letter-spacing: 5px; +} + +.owl-banner .owl-dots .owl-dot { + border-radius: 3px; +} +.owl-banner .owl-dots { + display: -webkit-box; + display: -webkit-flex; + display: -ms-flexbox; + display: flex; + -ms-flex-pack: center; + -webkit-justify-content: center; + justify-content: center; + position: absolute; + left: 50%; + transform: translateX(-50%); + bottom: 30px; +} +.owl-banner .owl-dots .owl-dot { + width: 10px; + height: 10px; + border-radius: 50%; + margin: 0 10px; + background-color: #fff; + opacity: 0.5; +} +.owl-banner .owl-dots .owl-dot:focus { + outline: none +} +.owl-banner .owl-dots .owl-dot.active { + background-color: #fff; + opacity: 1; +} + + + +/* Latest Produtcs */ + +.latest-products { + margin-top: 100px; +} + +.latest-products .section-heading a { + float: right; + margin-top: -35px; + text-transform: uppercase; + font-size: 13px; + font-weight: 700; + color: #f33f3f; +} + +.product-item { + border: 1px solid #eee; + margin-bottom: 30px; +} + +.product-item .down-content { + padding: 30px; + position: relative; +} + +.product-item img { + width: 100%; + overflow: hidden; +} + +.product-item .down-content h4 { + font-size: 17px; + color: #1a6692; + margin-bottom: 20px; +} + +.product-item .down-content h6 { + position: absolute; + top: 30px; + right: 30px; + font-size: 18px; + color: #121212; +} + +.product-item .down-content p { + margin-bottom: 20px; +} + +.product-item .down-content ul li { + display: inline-block; +} + +.product-item .down-content ul li i { + color: #f33f3f; + font-size: 14px; +} + +.product-item .down-content span { + position: absolute; + right: 30px; + bottom: 30px; + font-size: 13px; + color: #f33f3f; + font-weight: 500; +} + + +/* Best Features - über uns section */ + +.best-features { + margin-top: 50px; +} + +.best-features .container .row { + border-bottom: 1px solid #eee; + padding-bottom: 60px; +} + +.best-features img { + width: 100%; + overflow: hidden; +} + +.best-features h4 { + font-size: 17px; + color: #1a6692; + margin-bottom: 20px; +} + +.best-features ul.featured-list li { + display: block; + margin-bottom: 10px; +} + +.best-features p { + margin-bottom: 25px; +} + +.best-features ul.featured-list li a { + font-size: 14px; + color: #4a4a4a; + font-weight: 300; + transition: all .3s; + position: relative; + padding-left: 13px; +} + +.best-features ul.featured-list li a:before { + content: ''; + width: 5px; + height: 5px; + display: inline-block; + background-color: #4a4a4a; + position: absolute; + left: 0; + transition: all .3s; + top: 8px; +} + +.best-features ul.featured-list li a:hover { + color: #f33f3f; +} + +.best-features ul.featured-list li a:hover::before { + background-color: #f33f3f; +} + +.best-features .filled-button { + margin-top: 20px; +} + + +/* Footer */ + +#footer { + background: #eee; + padding: 30px 0; + color: #fff; + font-size: 14px; + width: 100% +} + +#footer a { + color: #000; +} + +#footer p { + padding: 10px 0 10px 0; +} + +#footer .copyright { + text-align: center; +} + + +/* Send Message */ + +.send-message { + margin-top: 100px; +} + +.contact-form input { + font-size: 14px; + width: 100%; + height: 44px; + display: inline-block; + line-height: 42px; + border: 1px solid #eee; + border-radius: 0px; + margin-bottom: 30px; +} + +.contact-form input:focus { + box-shadow: none; + border: 1px solid #eee; +} + +.contact-form textarea { + font-size: 14px; + width: 100%; + min-width: 100%; + min-height: 120px; + height: 120px; + max-height: 180px; + border: 1px solid #eee; + border-radius: 0px; + margin-bottom: 30px; +} + +.contact-form textarea:focus { + box-shadow: none; + border: 1px solid #eee; +} + +.contact-form button.filled-button { + background-color: #f33f3f; + color: #fff; + font-size: 14px; + text-transform: capitalize; + font-weight: 300; + padding: 10px 20px; + border-radius: 5px; + display: inline-block; + transition: all 0.3s; + border: none; + outline: none; + cursor: pointer; +} + +.contact-form button.filled-button:hover { + background-color: #121212; + color: #fff; +} + +.accordion { + margin-left: 30px; +} + +.accordion a { + cursor: pointer; + font-size: 17px; + color: #1a6692!important; + margin-bottom: 20px; + transition: all .3s; +} + +.accordion a:hover { + color: #f33f3f!important; +} + +.accordion a.active { + color: #f33f3f!important; +} + +.accordion li .content { + display: none; + margin-top: 10px; +} + +.accordion li:first-child { + border-top: 1px solid #eee; +} + +.accordion li { + border-bottom: 1px solid #eee; + padding: 15px 0px; +} + +/* Responsive Style */ +@media (max-width: 768px) { + .banner .text-content { + width: 90%; + margin-left: 5%; + } + .banner .text-content h4 { + font-size: 22px; + } + + .banner .text-content h2 { + font-size: 36px; + letter-spacing: 0.5px; + } + .banner-item-01, + .banner-item-02, + .banner-item-03 { + padding: 180px 0px; + } + .page-heading .text-content h4 { + font-size: 22px; + } + + .page-heading .text-content h2 { + font-size: 36px; + letter-spacing: 0.5px; + } + .latest-products .section-heading a { + float: none; + margin-top: 0px; + display: block; + margin-bottom: 20px; + } + .product-item .down-content h4 { + margin-bottom: 20px!important; + } + .product-item .down-content h6 { + position: absolute!important; + top: 30px!important; + right: 30px!important; + } + .product-item .down-content span { + position: absolute!important; + right: 30px!important; + bottom: 30px!important; + } + .best-features .left-content { + margin-bottom: 30px; + } + .about-features img { + margin-bottom: 30px; + } + .service-item { + margin-bottom: 30px; + } + .find-us #map { + margin-bottom: 30px; + } + .find-us .left-content { + margin-left: 0px; + } + .send-message .accordion { + margin-top: 30px; + margin-left: 0px; + } +} + +@media (max-width: 992px) { + .navbar .navbar-brand { + position: absolute; + left: 30px; + top: 32px; + } + .navbar .navbar-brand { + width: auto; + } + .navbar:after { + display: none; + } + #navbarResponsive { + z-index: 99999; + position: absolute; + top: 80px; + left: 0; + width: 100%; + text-align: center; + background-color: #fff; + box-shadow: 0px 10px 10px rgba(0,0,0,0.1); + } + .navbar .navbar-nav .nav-item { + border-bottom: 1px solid #eee; + } + .navbar .navbar-nav .nav-item:last-child { + border-bottom: none; + } + .navbar .navbar-nav a.nav-link { + padding: 15px 0px; + color: #1e1e1e!important; + } + .navbar .navbar-nav .nav-link:hover, + .navbar .navbar-nav .active>.nav-link, + .navbar .navbar-nav .nav-link.active, + .navbar .navbar-nav .nav-link.show, + .navbar .navbar-nav .show>.nav-link { + color: #f33f3f!important; + border-bottom: none!important; + padding-bottom: 15px; + } + .product-item .down-content h4 { + margin-bottom: 10px; + } + .product-item .down-content h6 { + position: relative; + top: 0; + right: 0; + margin-bottom: 20px; + } + .product-item .down-content span { + position: relative; + right: 0; + bottom: 0; + } +} + +.standardpage { + padding-top: 120px; +} +.spacemiddle { + padding: 20px 20px 20px 20px; + text-align: center; + align-content: center; + +} +.formfield { + padding: 5px; +} +.is-large { + width: 250px; + max-width: 90%; +} +.hidden { + display: none; +} + +.margintop{ + padding-top: 20px; +} + +.margindown{ + padding-bottom: 20px; +} + + + +/*-------------------------------*/ + +.produktcontainer { + max-width: 1200px; + margin: 0 auto; + padding: 15px; + display: flex; + padding-bottom: 100px; +} + +/* Columns */ +.left-column { + width: 65%; + position: relative; +} + +.right-column { + width: 35%; + padding: 30px; +} + + +/* Left Column */ +.left-column img { + width: 100%; + position: absolute; + left: 0; + top: 0; + opacity: 0; + transition: all 0.3s ease; +} + +.left-column img.active { + opacity: 1; +} + + +/* Right Column */ + +/* Product Description */ +.product-description { + border-bottom: 1px solid #E1E8EE; + margin-bottom: 20px; +} +.product-description span { + font-size: 12px; + color: #f33f3f; + letter-spacing: 1px; + text-transform: uppercase; + text-decoration: none; +} +.product-description h1 { + font-weight: 300; + font-size: 52px; + color: #43484D; + letter-spacing: -2px; +} +.product-description p { + font-size: 16px; + font-weight: 300; + color: #86939E; + line-height: 24px; +} + + +/* Product Price */ +.product-price { + display: flex; + align-items: center; +} + +.product-price span { + font-size: 26px; + font-weight: 300; + color: #43474D; + margin-right: 20px; +} + +.cart-btn { + display: inline-block; + background-color: #f33f3f; + border-radius: 6px; + font-size: 16px; + color: #FFFFFF; + text-decoration: none; + padding: 12px 30px; + transition: all .5s; +} +.cart-btn:hover { + background-color: #f21616; +} + +/* Responsive */ +@media (max-width: 940px) { + .produktcontainer { + flex-direction: column; + margin-top: 60px; + } + + .left-column, + .right-column { + width: 100%; + } + + .left-column img { + width: 300px; + right: 0; + top: -65px; + left: initial; + } +} + +@media (max-width: 535px) { + .left-column img { + width: 220px; + top: -85px; + } +} + + +/*-------------------------------*/ + +.clearfix { + content: ""; + display: table; + clear: both; +} + + +#cart { + width: 100%; +} + +#cart h1 { + font-weight: 300; +} + +#cart a { + color: #f33f3f; + text-decoration: none; + + -webkit-transition: color .2s linear; + -moz-transition: color .2s linear; + -ms-transition: color .2s linear; + -o-transition: color .2s linear; + transition: color .2s linear; +} + +#cart a:hover { + color: #f21616; +} + +.product.removed { + margin-left: 980px !important; + opacity: 0; +} + +.product { + border: 1px solid #eee; + margin: 20px 0; + width: 100%; + height: 195px; + position: relative; + + -webkit-transition: margin .2s linear, opacity .2s linear; + -moz-transition: margin .2s linear, opacity .2s linear; + -ms-transition: margin .2s linear, opacity .2s linear; + -o-transition: margin .2s linear, opacity .2s linear; + transition: margin .2s linear, opacity .2s linear; +} + +.product img { + width: 100%; + height: 100%; +} + +.product header, .product .content { + background-color: #fff; + border: 1px solid #ccc; + border-style: none none solid none; + float: left; +} + +.product header { + background: #000; + margin: 0 1% 20px 0; + overflow: hidden; + padding: 0; + position: relative; + width: 24%; + height: 195px; +} + +.product header:hover img { + opacity: .7; +} + +.product header:hover h3 { + bottom: 73px; +} + +.product header h3 { + background: #f33f3f; + color: #fff; + font-size: 22px; + font-weight: 300; + line-height: 49px; + margin: 0; + padding: 0 30px; + position: absolute; + bottom: -50px; + right: 0; + left: 0; + + -webkit-transition: bottom .2s linear; + -moz-transition: bottom .2s linear; + -ms-transition: bottom .2s linear; + -o-transition: bottom .2s linear; + transition: bottom .2s linear; +} + +.remove { + cursor: pointer; +} + +.product .content { + box-sizing: border-box; + -moz-box-sizing: border-box; + height: 140px; + padding: 0 20px; + width: 75%; +} + +.product h1 { + color: #53b5aa; + font-size: 25px; + font-weight: 300; + margin: 17px 0 20px 0; +} + +.product footer.content { + height: 50px; + margin: 6px 0 0 0; + padding: 0; +} + +.product footer .price { + background: #f33f3f; + color: #000; + float: right; + font-size: 15px; + font-weight: 300; + line-height: 49px; + margin: 0; + padding: 0 30px; +} + +.product footer .full-price { + background: #f33f3f; + color: #fff; + float: right; + font-size: 22px; + font-weight: 300; + line-height: 49px; + margin: 0; + padding: 0 30px; + + -webkit-transition: margin .15s linear; + -moz-transition: margin .15s linear; + -ms-transition: margin .15s linear; + -o-transition: margin .15s linear; + transition: margin .15s linear; +} + +.qt, .qt-plus, .qt-minus { + display: block; + float: left; +} + +.qt { + font-size: 19px; + line-height: 50px; + width: 70px; + text-align: center; +} + +.qt-plus, .qt-minus { + background: #f33f3f; + border: none; + font-size: 30px; + font-weight: 300; + height: 100%; + padding: 0 20px; + -webkit-transition: background .2s linear; + -moz-transition: background .2s linear; + -ms-transition: background .2s linear; + -o-transition: background .2s linear; + transition: background .2s linear; +} + +.qt-plus:hover, .qt-minus:hover { + background: #f33f3f; + color: #fff; + cursor: pointer; +} + +.qt-plus { + line-height: 50px; +} + +.qt-minus { + line-height: 47px; +} + +#site-footer { + margin: 30px 0 0 0; +} + +#site-footer { + padding: 40px; +} + +#site-footer h1 { + background: #f33f3f; + border: 1px solid #ccc; + border-style: none none solid none; + font-size: 24px; + font-weight: 300; + margin: 0 0 7px 0; + padding: 14px 40px; + text-align: center; +} + +#site-footer h2 { + font-size: 24px; + font-weight: 300; + margin: 10px 0 0 0; +} + +#site-footer h3 { + font-size: 19px; + font-weight: 300; + margin: 15px 0; +} + +.left { + float: left; +} + +.right { + float: right; +} + +.btn { + background: #f33f3f; + border: 1px solid #999; + border-style: none none solid none; + cursor: pointer; + display: block; + color: #fff; + font-size: 20px; + font-weight: 300; + padding: 16px 0; + width: 290px; + text-align: center; + + -webkit-transition: all .2s linear; + -moz-transition: all .2s linear; + -ms-transition: all .2s linear; + -o-transition: all .2s linear; + transition: all .2s linear; +} + +.btn:hover { + color: #fff; + background: #f21616; +} + +.minused { + margin: 0 50px 0 0 !important; +} + +.added { + margin: 0 -50px 0 0 !important; +} + + + + + + + + + + + +.text-font{ + font-weight: 700; + letter-spacing: .156rem; + font-size: 1.125rem; +} +.text-price{ + padding: 0 .625rem; + font-style: normal; + font-size: .75rem; + font-weight: 700; + line-height: .813rem; + letter-spacing: 1.6px; +} +.text-descriptions{ + font-style: normal; + font-size: .75rem; + font-weight: 400; + line-height: 1.125rem; + margin: .313rem 0 .938rem; + padding: 0 .625rem; +} +.button-color{ + color: #4e4e4e ; + border-color: #4e4e4e ; +} +.button-order{ + font-style: normal; + font-size: .75rem; + font-weight: 700; + background-color: hsl(90, 40%, 50%); + color: white; +} diff --git a/static/fonts/Flaticon.woff b/static/fonts/Flaticon.woff new file mode 100644 index 0000000..8b057c3 Binary files /dev/null and b/static/fonts/Flaticon.woff differ diff --git a/static/fonts/FontAwesome.otf b/static/fonts/FontAwesome.otf new file mode 100644 index 0000000..f7936cc Binary files /dev/null and b/static/fonts/FontAwesome.otf differ diff --git a/static/fonts/flexslider-icon.eot b/static/fonts/flexslider-icon.eot new file mode 100644 index 0000000..97c4196 Binary files /dev/null and b/static/fonts/flexslider-icon.eot differ diff --git a/static/fonts/flexslider-icon.svg b/static/fonts/flexslider-icon.svg new file mode 100644 index 0000000..89fd1ab --- /dev/null +++ b/static/fonts/flexslider-icon.svg @@ -0,0 +1,19 @@ + + + + +This is a custom SVG font generated by IcoMoon. + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/flexslider-icon.ttf b/static/fonts/flexslider-icon.ttf new file mode 100644 index 0000000..0543298 Binary files /dev/null and b/static/fonts/flexslider-icon.ttf differ diff --git a/static/fonts/flexslider-icon.woff b/static/fonts/flexslider-icon.woff new file mode 100644 index 0000000..10c4eeb Binary files /dev/null and b/static/fonts/flexslider-icon.woff differ diff --git a/static/fonts/fontawesome-webfont.eot b/static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..33b2bb8 Binary files /dev/null and b/static/fonts/fontawesome-webfont.eot differ diff --git a/static/fonts/fontawesome-webfont.svg b/static/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..1ee89d4 --- /dev/null +++ b/static/fonts/fontawesome-webfont.svg @@ -0,0 +1,565 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/fonts/fontawesome-webfont.ttf b/static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..ed9372f Binary files /dev/null and b/static/fonts/fontawesome-webfont.ttf differ diff --git a/static/fonts/fontawesome-webfont.woff b/static/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..8b280b9 Binary files /dev/null and b/static/fonts/fontawesome-webfont.woff differ diff --git a/static/fonts/fontawesome-webfont.woff2 b/static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..3311d58 Binary files /dev/null and b/static/fonts/fontawesome-webfont.woff2 differ diff --git a/static/fonts/slick.eot b/static/fonts/slick.eot new file mode 100644 index 0000000..2cbab9c Binary files /dev/null and b/static/fonts/slick.eot differ diff --git a/static/fonts/slick.svg b/static/fonts/slick.svg new file mode 100644 index 0000000..b36a66a --- /dev/null +++ b/static/fonts/slick.svg @@ -0,0 +1,14 @@ + + + +Generated by Fontastic.me + + + + + + + + + + diff --git a/static/fonts/slick.ttf b/static/fonts/slick.ttf new file mode 100644 index 0000000..9d03461 Binary files /dev/null and b/static/fonts/slick.ttf differ diff --git a/static/fonts/slick.woff b/static/fonts/slick.woff new file mode 100644 index 0000000..8ee9972 Binary files /dev/null and b/static/fonts/slick.woff differ diff --git a/static/img/about-heading.jpg b/static/img/about-heading.jpg new file mode 100644 index 0000000..4b4c5ee Binary files /dev/null and b/static/img/about-heading.jpg differ diff --git a/static/img/client-01.png b/static/img/client-01.png new file mode 100644 index 0000000..79a6cce Binary files /dev/null and b/static/img/client-01.png differ diff --git a/static/img/contact-heading.jpg b/static/img/contact-heading.jpg new file mode 100644 index 0000000..9d590e7 Binary files /dev/null and b/static/img/contact-heading.jpg differ diff --git a/static/img/feature-image.jpg b/static/img/feature-image.jpg new file mode 100644 index 0000000..292f5c9 Binary files /dev/null and b/static/img/feature-image.jpg differ diff --git a/static/img/more-info.jpg b/static/img/more-info.jpg new file mode 100644 index 0000000..53808c6 Binary files /dev/null and b/static/img/more-info.jpg differ diff --git a/static/img/product_01.jpg b/static/img/product_01.jpg new file mode 100644 index 0000000..9ec3210 Binary files /dev/null and b/static/img/product_01.jpg differ diff --git a/static/img/product_02.jpg b/static/img/product_02.jpg new file mode 100644 index 0000000..1c5cc9e Binary files /dev/null and b/static/img/product_02.jpg differ diff --git a/static/img/product_03.jpg b/static/img/product_03.jpg new file mode 100644 index 0000000..8150772 Binary files /dev/null and b/static/img/product_03.jpg differ diff --git a/static/img/product_04.jpg b/static/img/product_04.jpg new file mode 100644 index 0000000..ec67257 Binary files /dev/null and b/static/img/product_04.jpg differ diff --git a/static/img/product_05.jpg b/static/img/product_05.jpg new file mode 100644 index 0000000..bfdc9f8 Binary files /dev/null and b/static/img/product_05.jpg differ diff --git a/static/img/product_06.jpg b/static/img/product_06.jpg new file mode 100644 index 0000000..4cc4a76 Binary files /dev/null and b/static/img/product_06.jpg differ diff --git a/static/img/products-heading.jpg b/static/img/products-heading.jpg new file mode 100644 index 0000000..3ac4430 Binary files /dev/null and b/static/img/products-heading.jpg differ diff --git a/static/img/services-bg.jpg b/static/img/services-bg.jpg new file mode 100644 index 0000000..777b1d1 Binary files /dev/null and b/static/img/services-bg.jpg differ diff --git a/static/img/slide_01.jpg b/static/img/slide_01.jpg new file mode 100644 index 0000000..0797ceb Binary files /dev/null and b/static/img/slide_01.jpg differ diff --git a/static/img/slide_02.jpg b/static/img/slide_02.jpg new file mode 100644 index 0000000..efd102b Binary files /dev/null and b/static/img/slide_02.jpg differ diff --git a/static/img/slide_03.jpg b/static/img/slide_03.jpg new file mode 100644 index 0000000..814d477 Binary files /dev/null and b/static/img/slide_03.jpg differ diff --git a/static/img/team_01.jpg b/static/img/team_01.jpg new file mode 100644 index 0000000..1c2fea9 Binary files /dev/null and b/static/img/team_01.jpg differ diff --git a/static/img/team_02.jpg b/static/img/team_02.jpg new file mode 100644 index 0000000..3029346 Binary files /dev/null and b/static/img/team_02.jpg differ diff --git a/static/img/team_03.jpg b/static/img/team_03.jpg new file mode 100644 index 0000000..523df91 Binary files /dev/null and b/static/img/team_03.jpg differ diff --git a/static/img/team_04.jpg b/static/img/team_04.jpg new file mode 100644 index 0000000..f0f6ab5 Binary files /dev/null and b/static/img/team_04.jpg differ diff --git a/static/img/team_05.jpg b/static/img/team_05.jpg new file mode 100644 index 0000000..65a69ab Binary files /dev/null and b/static/img/team_05.jpg differ diff --git a/static/img/team_06.jpg b/static/img/team_06.jpg new file mode 100644 index 0000000..3fcee89 Binary files /dev/null and b/static/img/team_06.jpg differ diff --git a/static/js/accordions.js b/static/js/accordions.js new file mode 100644 index 0000000..688355f --- /dev/null +++ b/static/js/accordions.js @@ -0,0 +1,16582 @@ +/*! jQuery UI - v1.11.2 - 2014-10-16 +* http://jqueryui.com +* Includes: core.js, widget.js, mouse.js, position.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, draggable.js, droppable.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js, menu.js, progressbar.js, resizable.js, selectable.js, selectmenu.js, slider.js, sortable.js, spinner.js, tabs.js, tooltip.js +* Copyright 2014 jQuery Foundation and other contributors; Licensed MIT */ + +(function( factory ) { + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define([ "jquery" ], factory ); + } else { + + // Browser globals + factory( jQuery ); + } +}(function( $ ) { +/*! + * jQuery UI Core 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/category/ui-core/ + */ + + +// $.ui might exist from components with no dependencies, e.g., $.ui.position +$.ui = $.ui || {}; + +$.extend( $.ui, { + version: "1.11.2", + + keyCode: { + BACKSPACE: 8, + COMMA: 188, + DELETE: 46, + DOWN: 40, + END: 35, + ENTER: 13, + ESCAPE: 27, + HOME: 36, + LEFT: 37, + PAGE_DOWN: 34, + PAGE_UP: 33, + PERIOD: 190, + RIGHT: 39, + SPACE: 32, + TAB: 9, + UP: 38 + } +}); + +// plugins +$.fn.extend({ + scrollParent: function( includeHidden ) { + var position = this.css( "position" ), + excludeStaticParent = position === "absolute", + overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, + scrollParent = this.parents().filter( function() { + var parent = $( this ); + if ( excludeStaticParent && parent.css( "position" ) === "static" ) { + return false; + } + return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); + }).eq( 0 ); + + return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; + }, + + uniqueId: (function() { + var uuid = 0; + + return function() { + return this.each(function() { + if ( !this.id ) { + this.id = "ui-id-" + ( ++uuid ); + } + }); + }; + })(), + + removeUniqueId: function() { + return this.each(function() { + if ( /^ui-id-\d+$/.test( this.id ) ) { + $( this ).removeAttr( "id" ); + } + }); + } +}); + +// selectors +function focusable( element, isTabIndexNotNaN ) { + var map, mapName, img, + nodeName = element.nodeName.toLowerCase(); + if ( "area" === nodeName ) { + map = element.parentNode; + mapName = map.name; + if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { + return false; + } + img = $( "img[usemap='#" + mapName + "']" )[ 0 ]; + return !!img && visible( img ); + } + return ( /input|select|textarea|button|object/.test( nodeName ) ? + !element.disabled : + "a" === nodeName ? + element.href || isTabIndexNotNaN : + isTabIndexNotNaN) && + // the element and all of its ancestors must be visible + visible( element ); +} + +function visible( element ) { + return $.expr.filters.visible( element ) && + !$( element ).parents().addBack().filter(function() { + return $.css( this, "visibility" ) === "hidden"; + }).length; +} + +$.extend( $.expr[ ":" ], { + data: $.expr.createPseudo ? + $.expr.createPseudo(function( dataName ) { + return function( elem ) { + return !!$.data( elem, dataName ); + }; + }) : + // support: jQuery <1.8 + function( elem, i, match ) { + return !!$.data( elem, match[ 3 ] ); + }, + + focusable: function( element ) { + return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); + }, + + tabbable: function( element ) { + var tabIndex = $.attr( element, "tabindex" ), + isTabIndexNaN = isNaN( tabIndex ); + return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); + } +}); + +// support: jQuery <1.8 +if ( !$( "" ).outerWidth( 1 ).jquery ) { + $.each( [ "Width", "Height" ], function( i, name ) { + var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], + type = name.toLowerCase(), + orig = { + innerWidth: $.fn.innerWidth, + innerHeight: $.fn.innerHeight, + outerWidth: $.fn.outerWidth, + outerHeight: $.fn.outerHeight + }; + + function reduce( elem, size, border, margin ) { + $.each( side, function() { + size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; + if ( border ) { + size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; + } + if ( margin ) { + size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; + } + }); + return size; + } + + $.fn[ "inner" + name ] = function( size ) { + if ( size === undefined ) { + return orig[ "inner" + name ].call( this ); + } + + return this.each(function() { + $( this ).css( type, reduce( this, size ) + "px" ); + }); + }; + + $.fn[ "outer" + name] = function( size, margin ) { + if ( typeof size !== "number" ) { + return orig[ "outer" + name ].call( this, size ); + } + + return this.each(function() { + $( this).css( type, reduce( this, size, true, margin ) + "px" ); + }); + }; + }); +} + +// support: jQuery <1.8 +if ( !$.fn.addBack ) { + $.fn.addBack = function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + }; +} + +// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) +if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { + $.fn.removeData = (function( removeData ) { + return function( key ) { + if ( arguments.length ) { + return removeData.call( this, $.camelCase( key ) ); + } else { + return removeData.call( this ); + } + }; + })( $.fn.removeData ); +} + +// deprecated +$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); + +$.fn.extend({ + focus: (function( orig ) { + return function( delay, fn ) { + return typeof delay === "number" ? + this.each(function() { + var elem = this; + setTimeout(function() { + $( elem ).focus(); + if ( fn ) { + fn.call( elem ); + } + }, delay ); + }) : + orig.apply( this, arguments ); + }; + })( $.fn.focus ), + + disableSelection: (function() { + var eventType = "onselectstart" in document.createElement( "div" ) ? + "selectstart" : + "mousedown"; + + return function() { + return this.bind( eventType + ".ui-disableSelection", function( event ) { + event.preventDefault(); + }); + }; + })(), + + enableSelection: function() { + return this.unbind( ".ui-disableSelection" ); + }, + + zIndex: function( zIndex ) { + if ( zIndex !== undefined ) { + return this.css( "zIndex", zIndex ); + } + + if ( this.length ) { + var elem = $( this[ 0 ] ), position, value; + while ( elem.length && elem[ 0 ] !== document ) { + // Ignore z-index if position is set to a value where z-index is ignored by the browser + // This makes behavior of this function consistent across browsers + // WebKit always returns auto if the element is positioned + position = elem.css( "position" ); + if ( position === "absolute" || position === "relative" || position === "fixed" ) { + // IE returns 0 when zIndex is not specified + // other browsers return a string + // we ignore the case of nested elements with an explicit value of 0 + //
+ value = parseInt( elem.css( "zIndex" ), 10 ); + if ( !isNaN( value ) && value !== 0 ) { + return value; + } + } + elem = elem.parent(); + } + } + + return 0; + } +}); + +// $.ui.plugin is deprecated. Use $.widget() extensions instead. +$.ui.plugin = { + add: function( module, option, set ) { + var i, + proto = $.ui[ module ].prototype; + for ( i in set ) { + proto.plugins[ i ] = proto.plugins[ i ] || []; + proto.plugins[ i ].push( [ option, set[ i ] ] ); + } + }, + call: function( instance, name, args, allowDisconnected ) { + var i, + set = instance.plugins[ name ]; + + if ( !set ) { + return; + } + + if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { + return; + } + + for ( i = 0; i < set.length; i++ ) { + if ( instance.options[ set[ i ][ 0 ] ] ) { + set[ i ][ 1 ].apply( instance.element, args ); + } + } + } +}; + + +/*! + * jQuery UI Widget 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/jQuery.widget/ + */ + + +var widget_uuid = 0, + widget_slice = Array.prototype.slice; + +$.cleanData = (function( orig ) { + return function( elems ) { + var events, elem, i; + for ( i = 0; (elem = elems[i]) != null; i++ ) { + try { + + // Only trigger remove when necessary to save time + events = $._data( elem, "events" ); + if ( events && events.remove ) { + $( elem ).triggerHandler( "remove" ); + } + + // http://bugs.jquery.com/ticket/8235 + } catch ( e ) {} + } + orig( elems ); + }; +})( $.cleanData ); + +$.widget = function( name, base, prototype ) { + var fullName, existingConstructor, constructor, basePrototype, + // proxiedPrototype allows the provided prototype to remain unmodified + // so that it can be used as a mixin for multiple widgets (#8876) + proxiedPrototype = {}, + namespace = name.split( "." )[ 0 ]; + + name = name.split( "." )[ 1 ]; + fullName = namespace + "-" + name; + + if ( !prototype ) { + prototype = base; + base = $.Widget; + } + + // create selector for plugin + $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { + return !!$.data( elem, fullName ); + }; + + $[ namespace ] = $[ namespace ] || {}; + existingConstructor = $[ namespace ][ name ]; + constructor = $[ namespace ][ name ] = function( options, element ) { + // allow instantiation without "new" keyword + if ( !this._createWidget ) { + return new constructor( options, element ); + } + + // allow instantiation without initializing for simple inheritance + // must use "new" keyword (the code above always passes args) + if ( arguments.length ) { + this._createWidget( options, element ); + } + }; + // extend with the existing constructor to carry over any static properties + $.extend( constructor, existingConstructor, { + version: prototype.version, + // copy the object used to create the prototype in case we need to + // redefine the widget later + _proto: $.extend( {}, prototype ), + // track widgets that inherit from this widget in case this widget is + // redefined after a widget inherits from it + _childConstructors: [] + }); + + basePrototype = new base(); + // we need to make the options hash a property directly on the new instance + // otherwise we'll modify the options hash on the prototype that we're + // inheriting from + basePrototype.options = $.widget.extend( {}, basePrototype.options ); + $.each( prototype, function( prop, value ) { + if ( !$.isFunction( value ) ) { + proxiedPrototype[ prop ] = value; + return; + } + proxiedPrototype[ prop ] = (function() { + var _super = function() { + return base.prototype[ prop ].apply( this, arguments ); + }, + _superApply = function( args ) { + return base.prototype[ prop ].apply( this, args ); + }; + return function() { + var __super = this._super, + __superApply = this._superApply, + returnValue; + + this._super = _super; + this._superApply = _superApply; + + returnValue = value.apply( this, arguments ); + + this._super = __super; + this._superApply = __superApply; + + return returnValue; + }; + })(); + }); + constructor.prototype = $.widget.extend( basePrototype, { + // TODO: remove support for widgetEventPrefix + // always use the name + a colon as the prefix, e.g., draggable:start + // don't prefix for widgets that aren't DOM-based + widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name + }, proxiedPrototype, { + constructor: constructor, + namespace: namespace, + widgetName: name, + widgetFullName: fullName + }); + + // If this widget is being redefined then we need to find all widgets that + // are inheriting from it and redefine all of them so that they inherit from + // the new version of this widget. We're essentially trying to replace one + // level in the prototype chain. + if ( existingConstructor ) { + $.each( existingConstructor._childConstructors, function( i, child ) { + var childPrototype = child.prototype; + + // redefine the child widget using the same prototype that was + // originally used, but inherit from the new version of the base + $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); + }); + // remove the list of existing child constructors from the old constructor + // so the old child constructors can be garbage collected + delete existingConstructor._childConstructors; + } else { + base._childConstructors.push( constructor ); + } + + $.widget.bridge( name, constructor ); + + return constructor; +}; + +$.widget.extend = function( target ) { + var input = widget_slice.call( arguments, 1 ), + inputIndex = 0, + inputLength = input.length, + key, + value; + for ( ; inputIndex < inputLength; inputIndex++ ) { + for ( key in input[ inputIndex ] ) { + value = input[ inputIndex ][ key ]; + if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { + // Clone objects + if ( $.isPlainObject( value ) ) { + target[ key ] = $.isPlainObject( target[ key ] ) ? + $.widget.extend( {}, target[ key ], value ) : + // Don't extend strings, arrays, etc. with objects + $.widget.extend( {}, value ); + // Copy everything else by reference + } else { + target[ key ] = value; + } + } + } + } + return target; +}; + +$.widget.bridge = function( name, object ) { + var fullName = object.prototype.widgetFullName || name; + $.fn[ name ] = function( options ) { + var isMethodCall = typeof options === "string", + args = widget_slice.call( arguments, 1 ), + returnValue = this; + + // allow multiple hashes to be passed on init + options = !isMethodCall && args.length ? + $.widget.extend.apply( null, [ options ].concat(args) ) : + options; + + if ( isMethodCall ) { + this.each(function() { + var methodValue, + instance = $.data( this, fullName ); + if ( options === "instance" ) { + returnValue = instance; + return false; + } + if ( !instance ) { + return $.error( "cannot call methods on " + name + " prior to initialization; " + + "attempted to call method '" + options + "'" ); + } + if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { + return $.error( "no such method '" + options + "' for " + name + " widget instance" ); + } + methodValue = instance[ options ].apply( instance, args ); + if ( methodValue !== instance && methodValue !== undefined ) { + returnValue = methodValue && methodValue.jquery ? + returnValue.pushStack( methodValue.get() ) : + methodValue; + return false; + } + }); + } else { + this.each(function() { + var instance = $.data( this, fullName ); + if ( instance ) { + instance.option( options || {} ); + if ( instance._init ) { + instance._init(); + } + } else { + $.data( this, fullName, new object( options, this ) ); + } + }); + } + + return returnValue; + }; +}; + +$.Widget = function( /* options, element */ ) {}; +$.Widget._childConstructors = []; + +$.Widget.prototype = { + widgetName: "widget", + widgetEventPrefix: "", + defaultElement: "
", + options: { + disabled: false, + + // callbacks + create: null + }, + _createWidget: function( options, element ) { + element = $( element || this.defaultElement || this )[ 0 ]; + this.element = $( element ); + this.uuid = widget_uuid++; + this.eventNamespace = "." + this.widgetName + this.uuid; + + this.bindings = $(); + this.hoverable = $(); + this.focusable = $(); + + if ( element !== this ) { + $.data( element, this.widgetFullName, this ); + this._on( true, this.element, { + remove: function( event ) { + if ( event.target === element ) { + this.destroy(); + } + } + }); + this.document = $( element.style ? + // element within the document + element.ownerDocument : + // element is window or document + element.document || element ); + this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); + } + + this.options = $.widget.extend( {}, + this.options, + this._getCreateOptions(), + options ); + + this._create(); + this._trigger( "create", null, this._getCreateEventData() ); + this._init(); + }, + _getCreateOptions: $.noop, + _getCreateEventData: $.noop, + _create: $.noop, + _init: $.noop, + + destroy: function() { + this._destroy(); + // we can probably remove the unbind calls in 2.0 + // all event bindings should go through this._on() + this.element + .unbind( this.eventNamespace ) + .removeData( this.widgetFullName ) + // support: jquery <1.6.3 + // http://bugs.jquery.com/ticket/9413 + .removeData( $.camelCase( this.widgetFullName ) ); + this.widget() + .unbind( this.eventNamespace ) + .removeAttr( "aria-disabled" ) + .removeClass( + this.widgetFullName + "-disabled " + + "ui-state-disabled" ); + + // clean up events and states + this.bindings.unbind( this.eventNamespace ); + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + }, + _destroy: $.noop, + + widget: function() { + return this.element; + }, + + option: function( key, value ) { + var options = key, + parts, + curOption, + i; + + if ( arguments.length === 0 ) { + // don't return a reference to the internal hash + return $.widget.extend( {}, this.options ); + } + + if ( typeof key === "string" ) { + // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } + options = {}; + parts = key.split( "." ); + key = parts.shift(); + if ( parts.length ) { + curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); + for ( i = 0; i < parts.length - 1; i++ ) { + curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; + curOption = curOption[ parts[ i ] ]; + } + key = parts.pop(); + if ( arguments.length === 1 ) { + return curOption[ key ] === undefined ? null : curOption[ key ]; + } + curOption[ key ] = value; + } else { + if ( arguments.length === 1 ) { + return this.options[ key ] === undefined ? null : this.options[ key ]; + } + options[ key ] = value; + } + } + + this._setOptions( options ); + + return this; + }, + _setOptions: function( options ) { + var key; + + for ( key in options ) { + this._setOption( key, options[ key ] ); + } + + return this; + }, + _setOption: function( key, value ) { + this.options[ key ] = value; + + if ( key === "disabled" ) { + this.widget() + .toggleClass( this.widgetFullName + "-disabled", !!value ); + + // If the widget is becoming disabled, then nothing is interactive + if ( value ) { + this.hoverable.removeClass( "ui-state-hover" ); + this.focusable.removeClass( "ui-state-focus" ); + } + } + + return this; + }, + + enable: function() { + return this._setOptions({ disabled: false }); + }, + disable: function() { + return this._setOptions({ disabled: true }); + }, + + _on: function( suppressDisabledCheck, element, handlers ) { + var delegateElement, + instance = this; + + // no suppressDisabledCheck flag, shuffle arguments + if ( typeof suppressDisabledCheck !== "boolean" ) { + handlers = element; + element = suppressDisabledCheck; + suppressDisabledCheck = false; + } + + // no element argument, shuffle and use this.element + if ( !handlers ) { + handlers = element; + element = this.element; + delegateElement = this.widget(); + } else { + element = delegateElement = $( element ); + this.bindings = this.bindings.add( element ); + } + + $.each( handlers, function( event, handler ) { + function handlerProxy() { + // allow widgets to customize the disabled handling + // - disabled as an array instead of boolean + // - disabled class as method for disabling individual parts + if ( !suppressDisabledCheck && + ( instance.options.disabled === true || + $( this ).hasClass( "ui-state-disabled" ) ) ) { + return; + } + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + + // copy the guid so direct unbinding works + if ( typeof handler !== "string" ) { + handlerProxy.guid = handler.guid = + handler.guid || handlerProxy.guid || $.guid++; + } + + var match = event.match( /^([\w:-]*)\s*(.*)$/ ), + eventName = match[1] + instance.eventNamespace, + selector = match[2]; + if ( selector ) { + delegateElement.delegate( selector, eventName, handlerProxy ); + } else { + element.bind( eventName, handlerProxy ); + } + }); + }, + + _off: function( element, eventName ) { + eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + + this.eventNamespace; + element.unbind( eventName ).undelegate( eventName ); + + // Clear the stack to avoid memory leaks (#10056) + this.bindings = $( this.bindings.not( element ).get() ); + this.focusable = $( this.focusable.not( element ).get() ); + this.hoverable = $( this.hoverable.not( element ).get() ); + }, + + _delay: function( handler, delay ) { + function handlerProxy() { + return ( typeof handler === "string" ? instance[ handler ] : handler ) + .apply( instance, arguments ); + } + var instance = this; + return setTimeout( handlerProxy, delay || 0 ); + }, + + _hoverable: function( element ) { + this.hoverable = this.hoverable.add( element ); + this._on( element, { + mouseenter: function( event ) { + $( event.currentTarget ).addClass( "ui-state-hover" ); + }, + mouseleave: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-hover" ); + } + }); + }, + + _focusable: function( element ) { + this.focusable = this.focusable.add( element ); + this._on( element, { + focusin: function( event ) { + $( event.currentTarget ).addClass( "ui-state-focus" ); + }, + focusout: function( event ) { + $( event.currentTarget ).removeClass( "ui-state-focus" ); + } + }); + }, + + _trigger: function( type, event, data ) { + var prop, orig, + callback = this.options[ type ]; + + data = data || {}; + event = $.Event( event ); + event.type = ( type === this.widgetEventPrefix ? + type : + this.widgetEventPrefix + type ).toLowerCase(); + // the original event may come from any element + // so we need to reset the target on the new event + event.target = this.element[ 0 ]; + + // copy original event properties over to the new event + orig = event.originalEvent; + if ( orig ) { + for ( prop in orig ) { + if ( !( prop in event ) ) { + event[ prop ] = orig[ prop ]; + } + } + } + + this.element.trigger( event, data ); + return !( $.isFunction( callback ) && + callback.apply( this.element[0], [ event ].concat( data ) ) === false || + event.isDefaultPrevented() ); + } +}; + +$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { + $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { + if ( typeof options === "string" ) { + options = { effect: options }; + } + var hasOptions, + effectName = !options ? + method : + options === true || typeof options === "number" ? + defaultEffect : + options.effect || defaultEffect; + options = options || {}; + if ( typeof options === "number" ) { + options = { duration: options }; + } + hasOptions = !$.isEmptyObject( options ); + options.complete = callback; + if ( options.delay ) { + element.delay( options.delay ); + } + if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { + element[ method ]( options ); + } else if ( effectName !== method && element[ effectName ] ) { + element[ effectName ]( options.duration, options.easing, callback ); + } else { + element.queue(function( next ) { + $( this )[ method ](); + if ( callback ) { + callback.call( element[ 0 ] ); + } + next(); + }); + } + }; +}); + +var widget = $.widget; + + +/*! + * jQuery UI Mouse 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/mouse/ + */ + + +var mouseHandled = false; +$( document ).mouseup( function() { + mouseHandled = false; +}); + +var mouse = $.widget("ui.mouse", { + version: "1.11.2", + options: { + cancel: "input,textarea,button,select,option", + distance: 1, + delay: 0 + }, + _mouseInit: function() { + var that = this; + + this.element + .bind("mousedown." + this.widgetName, function(event) { + return that._mouseDown(event); + }) + .bind("click." + this.widgetName, function(event) { + if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { + $.removeData(event.target, that.widgetName + ".preventClickEvent"); + event.stopImmediatePropagation(); + return false; + } + }); + + this.started = false; + }, + + // TODO: make sure destroying one instance of mouse doesn't mess with + // other instances of mouse + _mouseDestroy: function() { + this.element.unbind("." + this.widgetName); + if ( this._mouseMoveDelegate ) { + this.document + .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) + .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); + } + }, + + _mouseDown: function(event) { + // don't let more than one widget handle mouseStart + if ( mouseHandled ) { + return; + } + + this._mouseMoved = false; + + // we may have missed mouseup (out of window) + (this._mouseStarted && this._mouseUp(event)); + + this._mouseDownEvent = event; + + var that = this, + btnIsLeft = (event.which === 1), + // event.target.nodeName works around a bug in IE 8 with + // disabled inputs (#7620) + elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); + if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { + return true; + } + + this.mouseDelayMet = !this.options.delay; + if (!this.mouseDelayMet) { + this._mouseDelayTimer = setTimeout(function() { + that.mouseDelayMet = true; + }, this.options.delay); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = (this._mouseStart(event) !== false); + if (!this._mouseStarted) { + event.preventDefault(); + return true; + } + } + + // Click event may never have fired (Gecko & Opera) + if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { + $.removeData(event.target, this.widgetName + ".preventClickEvent"); + } + + // these delegates are required to keep context + this._mouseMoveDelegate = function(event) { + return that._mouseMove(event); + }; + this._mouseUpDelegate = function(event) { + return that._mouseUp(event); + }; + + this.document + .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + event.preventDefault(); + + mouseHandled = true; + return true; + }, + + _mouseMove: function(event) { + // Only check for mouseups outside the document if you've moved inside the document + // at least once. This prevents the firing of mouseup in the case of IE<9, which will + // fire a mousemove event if content is placed under the cursor. See #7778 + // Support: IE <9 + if ( this._mouseMoved ) { + // IE mouseup check - mouseup happened when mouse was out of window + if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { + return this._mouseUp(event); + + // Iframe mouseup check - mouseup occurred in another document + } else if ( !event.which ) { + return this._mouseUp( event ); + } + } + + if ( event.which || event.button ) { + this._mouseMoved = true; + } + + if (this._mouseStarted) { + this._mouseDrag(event); + return event.preventDefault(); + } + + if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { + this._mouseStarted = + (this._mouseStart(this._mouseDownEvent, event) !== false); + (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); + } + + return !this._mouseStarted; + }, + + _mouseUp: function(event) { + this.document + .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) + .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); + + if (this._mouseStarted) { + this._mouseStarted = false; + + if (event.target === this._mouseDownEvent.target) { + $.data(event.target, this.widgetName + ".preventClickEvent", true); + } + + this._mouseStop(event); + } + + mouseHandled = false; + return false; + }, + + _mouseDistanceMet: function(event) { + return (Math.max( + Math.abs(this._mouseDownEvent.pageX - event.pageX), + Math.abs(this._mouseDownEvent.pageY - event.pageY) + ) >= this.options.distance + ); + }, + + _mouseDelayMet: function(/* event */) { + return this.mouseDelayMet; + }, + + // These are placeholder methods, to be overriden by extending plugin + _mouseStart: function(/* event */) {}, + _mouseDrag: function(/* event */) {}, + _mouseStop: function(/* event */) {}, + _mouseCapture: function(/* event */) { return true; } +}); + + +/*! + * jQuery UI Position 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/position/ + */ + +(function() { + +$.ui = $.ui || {}; + +var cachedScrollbarWidth, supportsOffsetFractions, + max = Math.max, + abs = Math.abs, + round = Math.round, + rhorizontal = /left|center|right/, + rvertical = /top|center|bottom/, + roffset = /[\+\-]\d+(\.[\d]+)?%?/, + rposition = /^\w+/, + rpercent = /%$/, + _position = $.fn.position; + +function getOffsets( offsets, width, height ) { + return [ + parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), + parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) + ]; +} + +function parseCss( element, property ) { + return parseInt( $.css( element, property ), 10 ) || 0; +} + +function getDimensions( elem ) { + var raw = elem[0]; + if ( raw.nodeType === 9 ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: 0, left: 0 } + }; + } + if ( $.isWindow( raw ) ) { + return { + width: elem.width(), + height: elem.height(), + offset: { top: elem.scrollTop(), left: elem.scrollLeft() } + }; + } + if ( raw.preventDefault ) { + return { + width: 0, + height: 0, + offset: { top: raw.pageY, left: raw.pageX } + }; + } + return { + width: elem.outerWidth(), + height: elem.outerHeight(), + offset: elem.offset() + }; +} + +$.position = { + scrollbarWidth: function() { + if ( cachedScrollbarWidth !== undefined ) { + return cachedScrollbarWidth; + } + var w1, w2, + div = $( "
" ), + innerDiv = div.children()[0]; + + $( "body" ).append( div ); + w1 = innerDiv.offsetWidth; + div.css( "overflow", "scroll" ); + + w2 = innerDiv.offsetWidth; + + if ( w1 === w2 ) { + w2 = div[0].clientWidth; + } + + div.remove(); + + return (cachedScrollbarWidth = w1 - w2); + }, + getScrollInfo: function( within ) { + var overflowX = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-x" ), + overflowY = within.isWindow || within.isDocument ? "" : + within.element.css( "overflow-y" ), + hasOverflowX = overflowX === "scroll" || + ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), + hasOverflowY = overflowY === "scroll" || + ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); + return { + width: hasOverflowY ? $.position.scrollbarWidth() : 0, + height: hasOverflowX ? $.position.scrollbarWidth() : 0 + }; + }, + getWithinInfo: function( element ) { + var withinElement = $( element || window ), + isWindow = $.isWindow( withinElement[0] ), + isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; + return { + element: withinElement, + isWindow: isWindow, + isDocument: isDocument, + offset: withinElement.offset() || { left: 0, top: 0 }, + scrollLeft: withinElement.scrollLeft(), + scrollTop: withinElement.scrollTop(), + + // support: jQuery 1.6.x + // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows + width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), + height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() + }; + } +}; + +$.fn.position = function( options ) { + if ( !options || !options.of ) { + return _position.apply( this, arguments ); + } + + // make a copy, we don't want to modify arguments + options = $.extend( {}, options ); + + var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, + target = $( options.of ), + within = $.position.getWithinInfo( options.within ), + scrollInfo = $.position.getScrollInfo( within ), + collision = ( options.collision || "flip" ).split( " " ), + offsets = {}; + + dimensions = getDimensions( target ); + if ( target[0].preventDefault ) { + // force left top to allow flipping + options.at = "left top"; + } + targetWidth = dimensions.width; + targetHeight = dimensions.height; + targetOffset = dimensions.offset; + // clone to reuse original targetOffset later + basePosition = $.extend( {}, targetOffset ); + + // force my and at to have valid horizontal and vertical positions + // if a value is missing or invalid, it will be converted to center + $.each( [ "my", "at" ], function() { + var pos = ( options[ this ] || "" ).split( " " ), + horizontalOffset, + verticalOffset; + + if ( pos.length === 1) { + pos = rhorizontal.test( pos[ 0 ] ) ? + pos.concat( [ "center" ] ) : + rvertical.test( pos[ 0 ] ) ? + [ "center" ].concat( pos ) : + [ "center", "center" ]; + } + pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; + pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; + + // calculate offsets + horizontalOffset = roffset.exec( pos[ 0 ] ); + verticalOffset = roffset.exec( pos[ 1 ] ); + offsets[ this ] = [ + horizontalOffset ? horizontalOffset[ 0 ] : 0, + verticalOffset ? verticalOffset[ 0 ] : 0 + ]; + + // reduce to just the positions without the offsets + options[ this ] = [ + rposition.exec( pos[ 0 ] )[ 0 ], + rposition.exec( pos[ 1 ] )[ 0 ] + ]; + }); + + // normalize collision option + if ( collision.length === 1 ) { + collision[ 1 ] = collision[ 0 ]; + } + + if ( options.at[ 0 ] === "right" ) { + basePosition.left += targetWidth; + } else if ( options.at[ 0 ] === "center" ) { + basePosition.left += targetWidth / 2; + } + + if ( options.at[ 1 ] === "bottom" ) { + basePosition.top += targetHeight; + } else if ( options.at[ 1 ] === "center" ) { + basePosition.top += targetHeight / 2; + } + + atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); + basePosition.left += atOffset[ 0 ]; + basePosition.top += atOffset[ 1 ]; + + return this.each(function() { + var collisionPosition, using, + elem = $( this ), + elemWidth = elem.outerWidth(), + elemHeight = elem.outerHeight(), + marginLeft = parseCss( this, "marginLeft" ), + marginTop = parseCss( this, "marginTop" ), + collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, + collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, + position = $.extend( {}, basePosition ), + myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); + + if ( options.my[ 0 ] === "right" ) { + position.left -= elemWidth; + } else if ( options.my[ 0 ] === "center" ) { + position.left -= elemWidth / 2; + } + + if ( options.my[ 1 ] === "bottom" ) { + position.top -= elemHeight; + } else if ( options.my[ 1 ] === "center" ) { + position.top -= elemHeight / 2; + } + + position.left += myOffset[ 0 ]; + position.top += myOffset[ 1 ]; + + // if the browser doesn't support fractions, then round for consistent results + if ( !supportsOffsetFractions ) { + position.left = round( position.left ); + position.top = round( position.top ); + } + + collisionPosition = { + marginLeft: marginLeft, + marginTop: marginTop + }; + + $.each( [ "left", "top" ], function( i, dir ) { + if ( $.ui.position[ collision[ i ] ] ) { + $.ui.position[ collision[ i ] ][ dir ]( position, { + targetWidth: targetWidth, + targetHeight: targetHeight, + elemWidth: elemWidth, + elemHeight: elemHeight, + collisionPosition: collisionPosition, + collisionWidth: collisionWidth, + collisionHeight: collisionHeight, + offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], + my: options.my, + at: options.at, + within: within, + elem: elem + }); + } + }); + + if ( options.using ) { + // adds feedback as second argument to using callback, if present + using = function( props ) { + var left = targetOffset.left - position.left, + right = left + targetWidth - elemWidth, + top = targetOffset.top - position.top, + bottom = top + targetHeight - elemHeight, + feedback = { + target: { + element: target, + left: targetOffset.left, + top: targetOffset.top, + width: targetWidth, + height: targetHeight + }, + element: { + element: elem, + left: position.left, + top: position.top, + width: elemWidth, + height: elemHeight + }, + horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", + vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" + }; + if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { + feedback.horizontal = "center"; + } + if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { + feedback.vertical = "middle"; + } + if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { + feedback.important = "horizontal"; + } else { + feedback.important = "vertical"; + } + options.using.call( this, props, feedback ); + }; + } + + elem.offset( $.extend( position, { using: using } ) ); + }); +}; + +$.ui.position = { + fit: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, + outerWidth = within.width, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = withinOffset - collisionPosLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, + newOverRight; + + // element is wider than within + if ( data.collisionWidth > outerWidth ) { + // element is initially over the left side of within + if ( overLeft > 0 && overRight <= 0 ) { + newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; + position.left += overLeft - newOverRight; + // element is initially over right side of within + } else if ( overRight > 0 && overLeft <= 0 ) { + position.left = withinOffset; + // element is initially over both left and right sides of within + } else { + if ( overLeft > overRight ) { + position.left = withinOffset + outerWidth - data.collisionWidth; + } else { + position.left = withinOffset; + } + } + // too far left -> align with left edge + } else if ( overLeft > 0 ) { + position.left += overLeft; + // too far right -> align with right edge + } else if ( overRight > 0 ) { + position.left -= overRight; + // adjust based on position and margin + } else { + position.left = max( position.left - collisionPosLeft, position.left ); + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.isWindow ? within.scrollTop : within.offset.top, + outerHeight = data.within.height, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = withinOffset - collisionPosTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, + newOverBottom; + + // element is taller than within + if ( data.collisionHeight > outerHeight ) { + // element is initially over the top of within + if ( overTop > 0 && overBottom <= 0 ) { + newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; + position.top += overTop - newOverBottom; + // element is initially over bottom of within + } else if ( overBottom > 0 && overTop <= 0 ) { + position.top = withinOffset; + // element is initially over both top and bottom of within + } else { + if ( overTop > overBottom ) { + position.top = withinOffset + outerHeight - data.collisionHeight; + } else { + position.top = withinOffset; + } + } + // too far up -> align with top + } else if ( overTop > 0 ) { + position.top += overTop; + // too far down -> align with bottom edge + } else if ( overBottom > 0 ) { + position.top -= overBottom; + // adjust based on position and margin + } else { + position.top = max( position.top - collisionPosTop, position.top ); + } + } + }, + flip: { + left: function( position, data ) { + var within = data.within, + withinOffset = within.offset.left + within.scrollLeft, + outerWidth = within.width, + offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, + collisionPosLeft = position.left - data.collisionPosition.marginLeft, + overLeft = collisionPosLeft - offsetLeft, + overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, + myOffset = data.my[ 0 ] === "left" ? + -data.elemWidth : + data.my[ 0 ] === "right" ? + data.elemWidth : + 0, + atOffset = data.at[ 0 ] === "left" ? + data.targetWidth : + data.at[ 0 ] === "right" ? + -data.targetWidth : + 0, + offset = -2 * data.offset[ 0 ], + newOverRight, + newOverLeft; + + if ( overLeft < 0 ) { + newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; + if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { + position.left += myOffset + atOffset + offset; + } + } else if ( overRight > 0 ) { + newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; + if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { + position.left += myOffset + atOffset + offset; + } + } + }, + top: function( position, data ) { + var within = data.within, + withinOffset = within.offset.top + within.scrollTop, + outerHeight = within.height, + offsetTop = within.isWindow ? within.scrollTop : within.offset.top, + collisionPosTop = position.top - data.collisionPosition.marginTop, + overTop = collisionPosTop - offsetTop, + overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, + top = data.my[ 1 ] === "top", + myOffset = top ? + -data.elemHeight : + data.my[ 1 ] === "bottom" ? + data.elemHeight : + 0, + atOffset = data.at[ 1 ] === "top" ? + data.targetHeight : + data.at[ 1 ] === "bottom" ? + -data.targetHeight : + 0, + offset = -2 * data.offset[ 1 ], + newOverTop, + newOverBottom; + if ( overTop < 0 ) { + newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; + if ( ( position.top + myOffset + atOffset + offset) > overTop && ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) ) { + position.top += myOffset + atOffset + offset; + } + } else if ( overBottom > 0 ) { + newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; + if ( ( position.top + myOffset + atOffset + offset) > overBottom && ( newOverTop > 0 || abs( newOverTop ) < overBottom ) ) { + position.top += myOffset + atOffset + offset; + } + } + } + }, + flipfit: { + left: function() { + $.ui.position.flip.left.apply( this, arguments ); + $.ui.position.fit.left.apply( this, arguments ); + }, + top: function() { + $.ui.position.flip.top.apply( this, arguments ); + $.ui.position.fit.top.apply( this, arguments ); + } + } +}; + +// fraction support test +(function() { + var testElement, testElementParent, testElementStyle, offsetLeft, i, + body = document.getElementsByTagName( "body" )[ 0 ], + div = document.createElement( "div" ); + + //Create a "fake body" for testing based on method used in jQuery.support + testElement = document.createElement( body ? "div" : "body" ); + testElementStyle = { + visibility: "hidden", + width: 0, + height: 0, + border: 0, + margin: 0, + background: "none" + }; + if ( body ) { + $.extend( testElementStyle, { + position: "absolute", + left: "-1000px", + top: "-1000px" + }); + } + for ( i in testElementStyle ) { + testElement.style[ i ] = testElementStyle[ i ]; + } + testElement.appendChild( div ); + testElementParent = body || document.documentElement; + testElementParent.insertBefore( testElement, testElementParent.firstChild ); + + div.style.cssText = "position: absolute; left: 10.7432222px;"; + + offsetLeft = $( div ).offset().left; + supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; + + testElement.innerHTML = ""; + testElementParent.removeChild( testElement ); +})(); + +})(); + +var position = $.ui.position; + + +/*! + * jQuery UI Accordion 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/accordion/ + */ + + +var accordion = $.widget( "ui.accordion", { + version: "1.11.2", + options: { + active: 0, + animate: {}, + collapsible: false, + event: "click", + header: "> li > :first-child,> :not(li):even", + heightStyle: "auto", + icons: { + activeHeader: "ui-icon-triangle-1-s", + header: "ui-icon-triangle-1-e" + }, + + // callbacks + activate: null, + beforeActivate: null + }, + + hideProps: { + borderTopWidth: "hide", + borderBottomWidth: "hide", + paddingTop: "hide", + paddingBottom: "hide", + height: "hide" + }, + + showProps: { + borderTopWidth: "show", + borderBottomWidth: "show", + paddingTop: "show", + paddingBottom: "show", + height: "show" + }, + + _create: function() { + var options = this.options; + this.prevShow = this.prevHide = $(); + this.element.addClass( "ui-accordion ui-widget ui-helper-reset" ) + // ARIA + .attr( "role", "tablist" ); + + // don't allow collapsible: false and active: false / null + if ( !options.collapsible && (options.active === false || options.active == null) ) { + options.active = 0; + } + + this._processPanels(); + // handle negative values + if ( options.active < 0 ) { + options.active += this.headers.length; + } + this._refresh(); + }, + + _getCreateEventData: function() { + return { + header: this.active, + panel: !this.active.length ? $() : this.active.next() + }; + }, + + _createIcons: function() { + var icons = this.options.icons; + if ( icons ) { + $( "" ) + .addClass( "ui-accordion-header-icon ui-icon " + icons.header ) + .prependTo( this.headers ); + this.active.children( ".ui-accordion-header-icon" ) + .removeClass( icons.header ) + .addClass( icons.activeHeader ); + this.headers.addClass( "ui-accordion-icons" ); + } + }, + + _destroyIcons: function() { + this.headers + .removeClass( "ui-accordion-icons" ) + .children( ".ui-accordion-header-icon" ) + .remove(); + }, + + _destroy: function() { + var contents; + + // clean up main element + this.element + .removeClass( "ui-accordion ui-widget ui-helper-reset" ) + .removeAttr( "role" ); + + // clean up headers + this.headers + .removeClass( "ui-accordion-header ui-accordion-header-active ui-state-default " + + "ui-corner-all ui-state-active ui-state-disabled ui-corner-top" ) + .removeAttr( "role" ) + .removeAttr( "aria-expanded" ) + .removeAttr( "aria-selected" ) + .removeAttr( "aria-controls" ) + .removeAttr( "tabIndex" ) + .removeUniqueId(); + + this._destroyIcons(); + + // clean up content panels + contents = this.headers.next() + .removeClass( "ui-helper-reset ui-widget-content ui-corner-bottom " + + "ui-accordion-content ui-accordion-content-active ui-state-disabled" ) + .css( "display", "" ) + .removeAttr( "role" ) + .removeAttr( "aria-hidden" ) + .removeAttr( "aria-labelledby" ) + .removeUniqueId(); + + if ( this.options.heightStyle !== "content" ) { + contents.css( "height", "" ); + } + }, + + _setOption: function( key, value ) { + if ( key === "active" ) { + // _activate() will handle invalid values and update this.options + this._activate( value ); + return; + } + + if ( key === "event" ) { + if ( this.options.event ) { + this._off( this.headers, this.options.event ); + } + this._setupEvents( value ); + } + + this._super( key, value ); + + // setting collapsible: false while collapsed; open first panel + if ( key === "collapsible" && !value && this.options.active === false ) { + this._activate( 0 ); + } + + if ( key === "icons" ) { + this._destroyIcons(); + if ( value ) { + this._createIcons(); + } + } + + // #5332 - opacity doesn't cascade to positioned elements in IE + // so we need to add the disabled class to the headers and panels + if ( key === "disabled" ) { + this.element + .toggleClass( "ui-state-disabled", !!value ) + .attr( "aria-disabled", value ); + this.headers.add( this.headers.next() ) + .toggleClass( "ui-state-disabled", !!value ); + } + }, + + _keydown: function( event ) { + if ( event.altKey || event.ctrlKey ) { + return; + } + + var keyCode = $.ui.keyCode, + length = this.headers.length, + currentIndex = this.headers.index( event.target ), + toFocus = false; + + switch ( event.keyCode ) { + case keyCode.RIGHT: + case keyCode.DOWN: + toFocus = this.headers[ ( currentIndex + 1 ) % length ]; + break; + case keyCode.LEFT: + case keyCode.UP: + toFocus = this.headers[ ( currentIndex - 1 + length ) % length ]; + break; + case keyCode.SPACE: + case keyCode.ENTER: + this._eventHandler( event ); + break; + case keyCode.HOME: + toFocus = this.headers[ 0 ]; + break; + case keyCode.END: + toFocus = this.headers[ length - 1 ]; + break; + } + + if ( toFocus ) { + $( event.target ).attr( "tabIndex", -1 ); + $( toFocus ).attr( "tabIndex", 0 ); + toFocus.focus(); + event.preventDefault(); + } + }, + + _panelKeyDown: function( event ) { + if ( event.keyCode === $.ui.keyCode.UP && event.ctrlKey ) { + $( event.currentTarget ).prev().focus(); + } + }, + + refresh: function() { + var options = this.options; + this._processPanels(); + + // was collapsed or no panel + if ( ( options.active === false && options.collapsible === true ) || !this.headers.length ) { + options.active = false; + this.active = $(); + // active false only when collapsible is true + } else if ( options.active === false ) { + this._activate( 0 ); + // was active, but active panel is gone + } else if ( this.active.length && !$.contains( this.element[ 0 ], this.active[ 0 ] ) ) { + // all remaining panel are disabled + if ( this.headers.length === this.headers.find(".ui-state-disabled").length ) { + options.active = false; + this.active = $(); + // activate previous panel + } else { + this._activate( Math.max( 0, options.active - 1 ) ); + } + // was active, active panel still exists + } else { + // make sure active index is correct + options.active = this.headers.index( this.active ); + } + + this._destroyIcons(); + + this._refresh(); + }, + + _processPanels: function() { + var prevHeaders = this.headers, + prevPanels = this.panels; + + this.headers = this.element.find( this.options.header ) + .addClass( "ui-accordion-header ui-state-default ui-corner-all" ); + + this.panels = this.headers.next() + .addClass( "ui-accordion-content ui-helper-reset ui-widget-content ui-corner-bottom" ) + .filter( ":not(.ui-accordion-content-active)" ) + .hide(); + + // Avoid memory leaks (#10056) + if ( prevPanels ) { + this._off( prevHeaders.not( this.headers ) ); + this._off( prevPanels.not( this.panels ) ); + } + }, + + _refresh: function() { + var maxHeight, + options = this.options, + heightStyle = options.heightStyle, + parent = this.element.parent(); + + this.active = this._findActive( options.active ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ) + .removeClass( "ui-corner-all" ); + this.active.next() + .addClass( "ui-accordion-content-active" ) + .show(); + + this.headers + .attr( "role", "tab" ) + .each(function() { + var header = $( this ), + headerId = header.uniqueId().attr( "id" ), + panel = header.next(), + panelId = panel.uniqueId().attr( "id" ); + header.attr( "aria-controls", panelId ); + panel.attr( "aria-labelledby", headerId ); + }) + .next() + .attr( "role", "tabpanel" ); + + this.headers + .not( this.active ) + .attr({ + "aria-selected": "false", + "aria-expanded": "false", + tabIndex: -1 + }) + .next() + .attr({ + "aria-hidden": "true" + }) + .hide(); + + // make sure at least one header is in the tab order + if ( !this.active.length ) { + this.headers.eq( 0 ).attr( "tabIndex", 0 ); + } else { + this.active.attr({ + "aria-selected": "true", + "aria-expanded": "true", + tabIndex: 0 + }) + .next() + .attr({ + "aria-hidden": "false" + }); + } + + this._createIcons(); + + this._setupEvents( options.event ); + + if ( heightStyle === "fill" ) { + maxHeight = parent.height(); + this.element.siblings( ":visible" ).each(function() { + var elem = $( this ), + position = elem.css( "position" ); + + if ( position === "absolute" || position === "fixed" ) { + return; + } + maxHeight -= elem.outerHeight( true ); + }); + + this.headers.each(function() { + maxHeight -= $( this ).outerHeight( true ); + }); + + this.headers.next() + .each(function() { + $( this ).height( Math.max( 0, maxHeight - + $( this ).innerHeight() + $( this ).height() ) ); + }) + .css( "overflow", "auto" ); + } else if ( heightStyle === "auto" ) { + maxHeight = 0; + this.headers.next() + .each(function() { + maxHeight = Math.max( maxHeight, $( this ).css( "height", "" ).height() ); + }) + .height( maxHeight ); + } + }, + + _activate: function( index ) { + var active = this._findActive( index )[ 0 ]; + + // trying to activate the already active panel + if ( active === this.active[ 0 ] ) { + return; + } + + // trying to collapse, simulate a click on the currently active header + active = active || this.active[ 0 ]; + + this._eventHandler({ + target: active, + currentTarget: active, + preventDefault: $.noop + }); + }, + + _findActive: function( selector ) { + return typeof selector === "number" ? this.headers.eq( selector ) : $(); + }, + + _setupEvents: function( event ) { + var events = { + keydown: "_keydown" + }; + if ( event ) { + $.each( event.split( " " ), function( index, eventName ) { + events[ eventName ] = "_eventHandler"; + }); + } + + this._off( this.headers.add( this.headers.next() ) ); + this._on( this.headers, events ); + this._on( this.headers.next(), { keydown: "_panelKeyDown" }); + this._hoverable( this.headers ); + this._focusable( this.headers ); + }, + + _eventHandler: function( event ) { + var options = this.options, + active = this.active, + clicked = $( event.currentTarget ), + clickedIsActive = clicked[ 0 ] === active[ 0 ], + collapsing = clickedIsActive && options.collapsible, + toShow = collapsing ? $() : clicked.next(), + toHide = active.next(), + eventData = { + oldHeader: active, + oldPanel: toHide, + newHeader: collapsing ? $() : clicked, + newPanel: toShow + }; + + event.preventDefault(); + + if ( + // click on active header, but not collapsible + ( clickedIsActive && !options.collapsible ) || + // allow canceling activation + ( this._trigger( "beforeActivate", event, eventData ) === false ) ) { + return; + } + + options.active = collapsing ? false : this.headers.index( clicked ); + + // when the call to ._toggle() comes after the class changes + // it causes a very odd bug in IE 8 (see #6720) + this.active = clickedIsActive ? $() : clicked; + this._toggle( eventData ); + + // switch classes + // corner classes on the previously active header stay after the animation + active.removeClass( "ui-accordion-header-active ui-state-active" ); + if ( options.icons ) { + active.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.activeHeader ) + .addClass( options.icons.header ); + } + + if ( !clickedIsActive ) { + clicked + .removeClass( "ui-corner-all" ) + .addClass( "ui-accordion-header-active ui-state-active ui-corner-top" ); + if ( options.icons ) { + clicked.children( ".ui-accordion-header-icon" ) + .removeClass( options.icons.header ) + .addClass( options.icons.activeHeader ); + } + + clicked + .next() + .addClass( "ui-accordion-content-active" ); + } + }, + + _toggle: function( data ) { + var toShow = data.newPanel, + toHide = this.prevShow.length ? this.prevShow : data.oldPanel; + + // handle activating a panel during the animation for another activation + this.prevShow.add( this.prevHide ).stop( true, true ); + this.prevShow = toShow; + this.prevHide = toHide; + + if ( this.options.animate ) { + this._animate( toShow, toHide, data ); + } else { + toHide.hide(); + toShow.show(); + this._toggleComplete( data ); + } + + toHide.attr({ + "aria-hidden": "true" + }); + toHide.prev().attr( "aria-selected", "false" ); + // if we're switching panels, remove the old header from the tab order + // if we're opening from collapsed state, remove the previous header from the tab order + // if we're collapsing, then keep the collapsing header in the tab order + if ( toShow.length && toHide.length ) { + toHide.prev().attr({ + "tabIndex": -1, + "aria-expanded": "false" + }); + } else if ( toShow.length ) { + this.headers.filter(function() { + return $( this ).attr( "tabIndex" ) === 0; + }) + .attr( "tabIndex", -1 ); + } + + toShow + .attr( "aria-hidden", "false" ) + .prev() + .attr({ + "aria-selected": "true", + tabIndex: 0, + "aria-expanded": "true" + }); + }, + + _animate: function( toShow, toHide, data ) { + var total, easing, duration, + that = this, + adjust = 0, + down = toShow.length && + ( !toHide.length || ( toShow.index() < toHide.index() ) ), + animate = this.options.animate || {}, + options = down && animate.down || animate, + complete = function() { + that._toggleComplete( data ); + }; + + if ( typeof options === "number" ) { + duration = options; + } + if ( typeof options === "string" ) { + easing = options; + } + // fall back from options to animation in case of partial down settings + easing = easing || options.easing || animate.easing; + duration = duration || options.duration || animate.duration; + + if ( !toHide.length ) { + return toShow.animate( this.showProps, duration, easing, complete ); + } + if ( !toShow.length ) { + return toHide.animate( this.hideProps, duration, easing, complete ); + } + + total = toShow.show().outerHeight(); + toHide.animate( this.hideProps, { + duration: duration, + easing: easing, + step: function( now, fx ) { + fx.now = Math.round( now ); + } + }); + toShow + .hide() + .animate( this.showProps, { + duration: duration, + easing: easing, + complete: complete, + step: function( now, fx ) { + fx.now = Math.round( now ); + if ( fx.prop !== "height" ) { + adjust += fx.now; + } else if ( that.options.heightStyle !== "content" ) { + fx.now = Math.round( total - toHide.outerHeight() - adjust ); + adjust = 0; + } + } + }); + }, + + _toggleComplete: function( data ) { + var toHide = data.oldPanel; + + toHide + .removeClass( "ui-accordion-content-active" ) + .prev() + .removeClass( "ui-corner-top" ) + .addClass( "ui-corner-all" ); + + // Work around for rendering bug in IE (#5421) + if ( toHide.length ) { + toHide.parent()[ 0 ].className = toHide.parent()[ 0 ].className; + } + this._trigger( "activate", null, data ); + } +}); + + +/*! + * jQuery UI Menu 1.11.2 + * http://jqueryui.com + * + * Copyright 2014 jQuery Foundation and other contributors + * Released under the MIT license. + * http://jquery.org/license + * + * http://api.jqueryui.com/menu/ + */ + + +var menu = $.widget( "ui.menu", { + version: "1.11.2", + defaultElement: "