diff --git a/Praktikum1_Kai/webteams/content/webteams.css b/Praktikum1_Kai/webteams/content/webteams.css index 577a9e3..9fac126 100644 --- a/Praktikum1_Kai/webteams/content/webteams.css +++ b/Praktikum1_Kai/webteams/content/webteams.css @@ -1,72 +1 @@ -body { - font-family: "Open Sans", sans-serif; - font-size: 12pt; - padding: 0; - margin: 0; -} - -td { - border: 1px solid black; -} - -th { - height: 50px; - border: 1px solid black; -} - -li { -} - -ul { - padding-left: 30px; - list-style-type: square; - margin-bottom: 50px; -} - -label { - padding-left: 15px; -} - -input { - width: 200px; - border: none; - border-bottom: 2px solid black; - font-size: 12pt; -} - -input.button { - background-color: #eeeeee; - color: black; - padding: 5px 10px; - text-align: center; - text-decoration: none; - display: inline-block; - border: none; -} - -input.button:hover, input.button:active { - background-color: #e7e7e7; -} - -idWTForm { -} - - - -a:link, a:visited { - background-color: #eeeeee; - color: black; - padding: 5px 10px; - text-align: center; - text-decoration: none; - display: inline-block; -} - - -a:hover, a:active { - background-color: #e7e7e7; -} - -a.clDelete { -} - +body{font-family:"Open Sans",sans-serif;font-size:12pt;padding:0;margin:0;}td{border:1px solid black;}th{height:50px;border:1px solid black;}li{}ul{padding-left:30px;list-style-type:square;margin-bottom:50px;}label{padding-left:15px;}input{width:200px;border:none;border-bottom:2px solid black;font-size:12pt;}input.button{background-color:#eeeeee;color:black;padding:5px 10px;text-align:center;text-decoration:none;display:inline-block;border:none;}input.button:hover,input.button:active{background-color:#e7e7e7;}idWTForm{}a:link,a:visited{background-color:#eeeeee;color:black;padding:5px 10px;text-align:center;text-decoration:none;display:inline-block;}a:hover,a:active{background-color:#e7e7e7;}a.clDelete{} \ No newline at end of file diff --git a/Praktikum2/AufgabePrak2A.pdf b/Praktikum2/AufgabePrak2A.pdf new file mode 100644 index 0000000..a875c5b Binary files /dev/null and b/Praktikum2/AufgabePrak2A.pdf differ diff --git a/Praktikum2/ppm1/app/__init__.py b/Praktikum2/ppm1/app/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/Praktikum2/ppm1/app/__pycache__/__init__.cpython-35.pyc b/Praktikum2/ppm1/app/__pycache__/__init__.cpython-35.pyc new file mode 100644 index 0000000..245d099 Binary files /dev/null and b/Praktikum2/ppm1/app/__pycache__/__init__.cpython-35.pyc differ diff --git a/Praktikum2/ppm1/app/__pycache__/application.cpython-35.pyc b/Praktikum2/ppm1/app/__pycache__/application.cpython-35.pyc new file mode 100644 index 0000000..ae068d7 Binary files /dev/null and b/Praktikum2/ppm1/app/__pycache__/application.cpython-35.pyc differ diff --git a/Praktikum2/ppm1/app/__pycache__/database.cpython-35.pyc b/Praktikum2/ppm1/app/__pycache__/database.cpython-35.pyc new file mode 100644 index 0000000..64a1314 Binary files /dev/null and b/Praktikum2/ppm1/app/__pycache__/database.cpython-35.pyc differ diff --git a/Praktikum2/ppm1/app/__pycache__/view.cpython-35.pyc b/Praktikum2/ppm1/app/__pycache__/view.cpython-35.pyc new file mode 100644 index 0000000..4e41b53 Binary files /dev/null and b/Praktikum2/ppm1/app/__pycache__/view.cpython-35.pyc differ diff --git a/Praktikum2/ppm1/app/application.py b/Praktikum2/ppm1/app/application.py new file mode 100644 index 0000000..528176a --- /dev/null +++ b/Praktikum2/ppm1/app/application.py @@ -0,0 +1,284 @@ +import cherrypy +from .database import Database_cl +from .view import View_cl +import collections +orderedDict = collections.OrderedDict() +from collections import OrderedDict + +#---------------------------------------------------------- +class Application_cl(object): +#---------------------------------------------------------- + +#------------------------------------------------------- +# Request Processing +#------------------------------------------------------- + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + # spezielle Initialisierung können hier eingetragen werden + self.db = Database_cl() + self.view = View_cl() + @cherrypy.expose + + #------------------------------------------------------- + def index(self): + #------------------------------------------------------- + print("Index\n") + return self.GenerateIndex() + @cherrypy.expose + + #------------------------------------------------------- + def category(self, cat=None): + #------------------------------------------------------- + print("Category: ", cat, "\n") + if(cat==None): + return self.GenerateIndex() + else: + return self.GenerateList(cat) + @cherrypy.expose + + #------------------------------------------------------- + def choice(self): + #------------------------------------------------------- + print("Choice \n") + return self.GenerateListChoice() + @cherrypy.expose + + #------------------------------------------------------- + def eval(self, cat): + #------------------------------------------------------- + print("Eval \n") + self.db.CheckDates() + return self.GenerateListEval(cat) + @cherrypy.expose + + #------------------------------------------------------- + def detail(self, cat=None, id=None): + #------------------------------------------------------- + if(cat!=None): + if(id!=None): + print("Cat=", cat, " id=", id) + return self.GenerateDetail(cat, id) + else: + print("ID=None Cat=", cat) + return self.GenerateDetail(cat) + else: + return self.GenerateIndex() + @cherrypy.expose + + #------------------------------------------------------- + def detailchoice(self, id): + #------------------------------------------------------- + print("id=", id) + return self.GenerateDetailChoice(id) + + @cherrypy.expose + + #------------------------------------------------------- + def save(self, cat=None, **data): + #------------------------------------------------------- + print("Save: ", cat) + dataTmp = data + return self.GenerateSave(dataTmp, cat) + @cherrypy.expose + + #------------------------------------------------------- + def saveChoice(self, **data): + #------------------------------------------------------- + print("Save: Choice") + dataTmp = data + return self.GenerateSaveChoice(dataTmp) + @cherrypy.expose + + #------------------------------------------------------- + def delete(self, cat=None, id=None): + #------------------------------------------------------- + print("Delete",cat,id) + return self.GenerateDelete(cat, id) + @cherrypy.expose + + #------------------------------------------------------- + def default(self, *arguments, **kwargs): + #------------------------------------------------------- + msg_s = "unbekannte Anforderung: " + \ + str(arguments) + \ + ''+ \ + str(kwargs) + raise cherrypy.HTTPError(404, msg_s) + default.exposed= True + +#------------------------------------------------------- +# Functions +#------------------------------------------------------- + + #------------------------------------------------------- + def GenerateIndex(self): + #------------------------------------------------------- + return self.view.CreateIndex() + + #------------------------------------------------------- + def GenerateList(self, category): + #------------------------------------------------------- + self.db.ReadAll() + data = {} + data['content'] = {} + data['headings'] = {} + data['category'] = category + data['content'] = self.db.data[category] + if(len(data['content']) != 0): + print(len(data['content'])) + contentFirst = list(data['content'].keys())[0] + data['headings'] = list(data['content'][contentFirst].keys()) + print(data) + return self.view.CreateList(data) + + #------------------------------------------------------- + def GenerateListChoice(self): + #------------------------------------------------------- + self.db.ReadAll() + data = {} + data['content'] = {} + offerings = self.db.data['Angebote'] + for key, value in offerings.items(): + for key2, value2 in value.items(): + if(key2 == 'Status'): + if(value2 == 'Angebot'): + data['content'][key] = value + + print(data) + return self.view.CreateListChoice(data) + + #------------------------------------------------------- + def GenerateDetail(self, category, id=None): + #------------------------------------------------------- + self.db.ReadAll() + data = {} + data['category'] = category + print("Detail",category,id) + if(id != None): + data['id'] = id + data['content'] = self.db.ReadEntry(category, id) + else: + data['id'] = None + data['content'] = self.db.GetDefault(category) + print(data['content']) + if(category == 'Angebote'): + print("Angebote") + data['Firmen'] = self.db.data['Firmen'] + print(data, "\n") + return self.view.CreateDetail(data) + + #------------------------------------------------------- + def GenerateDetailChoice(self, id): + #------------------------------------------------------- + self.db.ReadAll() + data = {} + data['id'] = id + data = self.db.data['Angebote'][id] + data['Studenten'] = self.db.data['Studenten'] + data['Lehrender'] = self.db.data['Lehrender'] + print(data, "\n") + return self.view.CreateDetailChoice(data) + + #------------------------------------------------------- + def GenerateListEval(self, cat): + #------------------------------------------------------- + self.db.ReadAll() + data = {} + Studenten = self.db.data['Studenten'] + Lehrender = self.db.data['Lehrender'] + Firmen = self.db.data['Firmen'] + Angebote = self.db.data['Angebote'] + + data['category'] = cat + if(cat == 'Firmen'): + for keyFirma, valueFirma in sorted(Firmen.items()): + data[valueFirma['Name']] = {} + data[valueFirma['Name']]['Name'] = valueFirma['Name'] + data[valueFirma['Name']]['Angebote'] = {} + data[valueFirma['Name']]['Angebote']['Angebot'] = {} + data[valueFirma['Name']]['Angebote']['aktuell'] = {} + data[valueFirma['Name']]['Angebote']['abgeschlossen'] = {} + for keyAngebote, valueAngebote in Angebote.items(): + if(valueAngebote['Firma'] == valueFirma['Name']): + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']] = {} + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Name'] = valueAngebote['Name'] + if(valueAngebote['Student'] != ''): + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = Studenten[valueAngebote['Student']]['Name'] + else: + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = '' + if(valueAngebote['Lehrender'] != ''): + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = Lehrender[valueAngebote['Lehrender']]['Name'] + else: + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = '' + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumVon'] = valueAngebote['ZeitraumVon'] + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumBis'] = valueAngebote['ZeitraumBis'] + print(data) + return self.view.CreateListEval(data) + elif(cat == 'Studenten'): + for keyStudent, valueStudent in Studenten.items(): + data[valueStudent['Name']] = {} + data[valueStudent['Name']]['Angebote'] = {} + data[valueStudent['Name']]['Angebote']['Angebot'] = {} + data[valueStudent['Name']]['Angebote']['aktuell'] = {} + data[valueStudent['Name']]['Angebote']['abgeschlossen'] = {} + for keyAngebot, valueAngebot in Angebote.items(): + if(valueAngebot['Student'] == valueStudent['id']): + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {} + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Lehrender'] = Lehrender[valueAngebot['Lehrender']]['Name'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis'] + elif(cat == 'Lehrender'): + for keyLehrende, valueLehrende in Lehrender.items(): + data[valueLehrende['Name']] = {} + data[valueLehrende['Name']]['Angebote'] = {} + data[valueLehrende['Name']]['Angebote']['Angebot'] = {} + data[valueLehrende['Name']]['Angebote']['aktuell'] = {} + data[valueLehrende['Name']]['Angebote']['abgeschlossen'] = {} + for keyAngebot, valueAngebot in Angebote.items(): + if(valueAngebot['Lehrender'] == valueLehrende['id']): + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {} + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Student'] = Studenten[valueAngebot['Student']]['Name'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis'] + + return self.view.CreateListEval(data) + + + #------------------------------------------------------- + def GenerateSave(self, dataTmp, category): + #------------------------------------------------------- + if(category == None): + return self.view.CreateIndex() + else: + self.db.Save(dataTmp, category) + return self.GenerateList(category) + + #------------------------------------------------------- + def GenerateSaveChoice(self, dataTmp): + #------------------------------------------------------- + if(dataTmp['Student'] != ''): + angebote = self.db.CheckOfferings(dataTmp['Student']) + print(angebote) + if(angebote == 0): + print("Save") + self.db.Save(dataTmp, 'Angebote') + return self.GenerateListChoice() + + #------------------------------------------------------- + def GenerateDelete(self, category, id): + #------------------------------------------------------- + if(category == None or id == None): + return self.view.CreateIndex() + else: + self.db.Delete(category, id) + return self.GenerateList(category) + +#EOF \ No newline at end of file diff --git a/Praktikum2/ppm1/app/database.py b/Praktikum2/ppm1/app/database.py new file mode 100644 index 0000000..41e1ca2 --- /dev/null +++ b/Praktikum2/ppm1/app/database.py @@ -0,0 +1,189 @@ +# coding: utf-8 + +import os +import os.path +import codecs +import json +from datetime import datetime, timedelta + +#---------------------------------------------------------- +class Database_cl(object): +#---------------------------------------------------------- + # da es hier nur darum geht, die Daten dauerhaft zu speichern, + # wird ein sehr einfacher Ansatz verwendet: + # - es können Daten zu genau 15 Teams gespeichert werden + # - je Team werden 2 Teilnehmer mit Namen, Vornamen und Matrikelnummer + # berücksichtigt + # - die Daten werden als eine JSON-Datei abgelegt + + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + self.data = {} + self.data['Studenten'] = {} + self.data['Lehrender'] = {} + self.data['Firmen'] = {} + self.data['Angebote'] = {} + self.ReadAll() + + + #------------------------------------------------------- + def Read(self, category): + #------------------------------------------------------- + path = 'data/' + category + if not(os.path.exists(path)): + os.makedirs(path) + categoryDir = os.listdir(path) + for fileName in categoryDir: + if fileName.endswith('.json') and fileName != 'last.json': + file = codecs.open(os.path.join('data', category, fileName), 'rU', 'utf-8') + fileContent = file.read() + id = fileName[:-5] + self.data[category][id] = json.loads(fileContent) + + #------------------------------------------------------- + def ReadAll(self): + #------------------------------------------------------- + self.Read('Studenten') + self.Read('Lehrender') + self.Read('Firmen') + self.Read('Angebote') + + #------------------------------------------------------- + def ReadEntry(self, category = None, id = None): + #------------------------------------------------------- + print("ReadEntry: ", category, id) + self.Read(category) + data = None + if id == None: + data = self.data + else: + if id in self.data[category]: + data = self.data[category][id] + + print(data, "\n") + return data + + #------------------------------------------------------- + def Save(self, data, category): + #------------------------------------------------------- + status_b = False + id = data['id'] + print("ID: ", id, "\n") + if(id != "None"): + if id in self.data[category]: + file = codecs.open(os.path.join('data', category, id+'.json'), 'w', 'utf-8') + file.write(json.dumps(data, indent=3, ensure_ascii=True)) + file.close() + self.Read(category) + status_b = True + else: + data['id'] = self.IdNext(category) + file = codecs.open(os.path.join('data', category, data['id']+'.json'), 'w', 'utf-8') + file.write(json.dumps(data, indent=3, ensure_ascii=True)) + file.close() + self.Read(category) + status_b = True + + return status_b + + #------------------------------------------------------- + def Delete(self, category, id): + #------------------------------------------------------- + status_b = False + if(category == 'Studenten'): + for angebote in self.data['Angebote']: + if(self.data['Angebote'][angebote]['Student'] == id): + try: + os.remove(os.path.join('data', 'Angebote', angebote+'.json')) + except OSError: + pass + elif(category == 'Lehrender'): + for angebote in self.data['Angebote']: + if(self.data['Angebote'][angebote]['Lehrender'] == id): + try: + os.remove(os.path.join('data', 'Angebote', angebote+'.json')) + except OSError: + pass + elif(category == 'Firmen'): + for firmen in self.data['Firmen']: + if(firmen == id): + fn = self.data['Firmen'][firmen]['Name'] + for angebote in self.data['Angebote']: + if(self.data['Angebote'][angebote]['Firma'] == fn): + try: + os.remove(os.path.join('data', 'Angebote', angebote+'.json')) + except OSError: + pass + + if id in self.data[category]: + os.remove(os.path.join('data', category, id+'.json')) + del self.data[category][id] + + return status_b + + #------------------------------------------------------- + def CheckOfferings(self, id): + #------------------------------------------------------- + print("Offerings: ", id) + for offerings in self.data['Angebote']: + if(self.data['Angebote'][offerings]['Student'] != id): + return 0 + else: + return 1 + + #------------------------------------------------------- + def CheckDates(self): + #------------------------------------------------------- + now = datetime.now() + for offerings in self.data['Angebote']: + if(self.data['Angebote'][offerings]['ZeitraumBis'] != ''): + zeitraumBis = datetime.strptime(self.data['Angebote'][offerings]['ZeitraumBis'], "%d.%m.%Y") + if(zeitraumBis <= now): + self.data['Angebote'][offerings]['Status'] = 'abgeschlossen' + data = {} + data['Status'] = 'abgeschlossen' + data['id'] = offerings + data['Name'] = self.data['Angebote'][offerings]['Name'] + data['Firma'] = self.data['Angebote'][offerings]['Firma'] + data['Beschreibung'] = self.data['Angebote'][offerings]['Beschreibung'] + data['Voraussetzungen'] = self.data['Angebote'][offerings]['Voraussetzungen'] + data['Firmenbetreuer'] = self.data['Angebote'][offerings]['Firmenbetreuer'] + data['Lehrender'] = self.data['Angebote'][offerings]['Lehrender'] + data['ZeitraumVon'] = self.data['Angebote'][offerings]['ZeitraumVon'] + data['ZeitraumBis'] = self.data['Angebote'][offerings]['ZeitraumBis'] + data['Student'] = self.data['Angebote'][offerings]['Student'] + self.Save(data, 'Angebote') + + #------------------------------------------------------- + def GetDefault(self, category): + #------------------------------------------------------- + if(category == 'Studenten'): + return {'Name':'', 'Vorname':'', 'Matrikelnummer':''} + elif(category == 'Lehrender'): + return {'Titel':'', 'Name':'', 'Vorname':'', 'Lehrgebiet':''} + elif(category == 'Firmen'): + return {'Name':'', 'Branche':'', 'Schwerpunkt':'', 'Sitz':'', 'Anzahl Mitarbeiter':''} + elif(category == 'Angebote'): + return {'Name':'', 'Firma':'', 'Beschreibung':'', 'Voraussetzungen':'', 'Firmenbetreuer':'', 'Status':'Angebot', 'Lehrender':'', 'ZeitraumVon':'', 'ZeitraumBis':'', 'Student':''} + + #------------------------------------------------------- + def IdNext(self, category): + #------------------------------------------------------- + path = 'data/' + category + '/last.json' + if(os.path.isfile(path)): + file = open(os.path.join('data', category, 'last.json'), 'r+') + last = file.read() + last = str(int(last)+1) + file.seek(0) + file.write(last) + file.close() + else: + file = open(os.path.join('data', category, 'last.json'), 'w+') + last = str(int(0)) + file.write(last) + file.close() + return last + +# EOF \ No newline at end of file diff --git a/Praktikum2/ppm1/app/view.py b/Praktikum2/ppm1/app/view.py new file mode 100644 index 0000000..a481e64 --- /dev/null +++ b/Praktikum2/ppm1/app/view.py @@ -0,0 +1,52 @@ +import os.path +from mako.template import Template +from mako.lookup import TemplateLookup + +#---------------------------------------------------------- +class View_cl(object): +#---------------------------------------------------------- + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + self.path = 'templates' + self.lookup = TemplateLookup(directories=['/']) + + #------------------------------------------------------- + def Create(self, template, data): + #------------------------------------------------------- + print("CreateView\n") + template = Template(filename=os.path.join(self.path, template), output_encoding='utf-8', lookup=self.lookup) + return template.render(data = data) + + #------------------------------------------------------- + def CreateIndex(self): + #------------------------------------------------------- + print("CreateIndex\n") + data = None + return self.Create('index.tpl', data) + + #------------------------------------------------------- + def CreateList(self, data): + #------------------------------------------------------- + return self.Create('list.tpl', data) + + #------------------------------------------------------- + def CreateListChoice(self, data): + #------------------------------------------------------- + return self.Create('listChoice.tpl', data) + + #------------------------------------------------------- + def CreateListEval(self, data): + #------------------------------------------------------- + return self.Create('listEval.tpl', data) + + #------------------------------------------------------- + def CreateDetail(self, data): + #------------------------------------------------------- + return self.Create('detail.tpl', data) + + #------------------------------------------------------- + def CreateDetailChoice(self, data): + #------------------------------------------------------- + return self.Create('detailChoice.tpl', data) \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Angebote/23.json b/Praktikum2/ppm1/data/Angebote/23.json new file mode 100644 index 0000000..b28de59 --- /dev/null +++ b/Praktikum2/ppm1/data/Angebote/23.json @@ -0,0 +1,13 @@ +{ + "Name": "Angebot IBM 1", + "ZeitraumBis": "01.01.2018", + "id": "23", + "Firmenbetreuer": "Sepp Meine", + "Firma": "IBM", + "Voraussetzungen": "Keine", + "Lehrender": "7", + "Status": "aktuell", + "Beschreibung": "Praxisphasenplatz bei IBM", + "ZeitraumVon": "01.01.2017", + "Student": "9" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Angebote/26.json b/Praktikum2/ppm1/data/Angebote/26.json new file mode 100644 index 0000000..f2fd625 --- /dev/null +++ b/Praktikum2/ppm1/data/Angebote/26.json @@ -0,0 +1,13 @@ +{ + "id": "26", + "ZeitraumVon": "02.02.2019", + "Firma": "Apple", + "Student": "10", + "Beschreibung": "Beschreibung", + "Name": "Name", + "Lehrender": "5", + "Firmenbetreuer": "Firmenbetreuer3", + "Voraussetzungen": "Kein", + "Status": "aktuell", + "ZeitraumBis": "02.02.2020" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Angebote/27.json b/Praktikum2/ppm1/data/Angebote/27.json new file mode 100644 index 0000000..c1e9b49 --- /dev/null +++ b/Praktikum2/ppm1/data/Angebote/27.json @@ -0,0 +1,13 @@ +{ + "id": "27", + "Voraussetzungen": "Keine", + "Lehrender": "5", + "Status": "abgeschlossen", + "Firmenbetreuer": "Horst", + "Beschreibung": "Praxisphase Apple", + "ZeitraumVon": "02.02.2002", + "Student": "11", + "Name": "Angebot Apple 2", + "Firma": "Apple", + "ZeitraumBis": "02.02.2003" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Angebote/30.json b/Praktikum2/ppm1/data/Angebote/30.json new file mode 100644 index 0000000..31c0e32 --- /dev/null +++ b/Praktikum2/ppm1/data/Angebote/30.json @@ -0,0 +1,13 @@ +{ + "ZeitraumBis": "", + "Firmenbetreuer": "firmenbetreuer", + "id": "30", + "ZeitraumVon": "", + "Name": "name", + "Beschreibung": "beschreibung", + "Student": "", + "Lehrender": "", + "Status": "Angebot", + "Voraussetzungen": "voraussetzungen", + "Firma": "IBM" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Angebote/last.json b/Praktikum2/ppm1/data/Angebote/last.json new file mode 100644 index 0000000..a5c750f --- /dev/null +++ b/Praktikum2/ppm1/data/Angebote/last.json @@ -0,0 +1 @@ +27 \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Firmen/4.json b/Praktikum2/ppm1/data/Firmen/4.json new file mode 100644 index 0000000..98b84ab --- /dev/null +++ b/Praktikum2/ppm1/data/Firmen/4.json @@ -0,0 +1,8 @@ +{ + "id": "4", + "Branche": "IT", + "Sitz": "Cupertino", + "Schwerpunkt": "Informatik", + "Anzahl Mitarbeiter": "110000", + "Name": "Apple" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Firmen/5.json b/Praktikum2/ppm1/data/Firmen/5.json new file mode 100644 index 0000000..28aecae --- /dev/null +++ b/Praktikum2/ppm1/data/Firmen/5.json @@ -0,0 +1,8 @@ +{ + "id": "5", + "Branche": "IT", + "Sitz": "Redmond", + "Schwerpunkt": "Informatik", + "Anzahl Mitarbeiter": "114000", + "Name": "Microsoft" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Firmen/6.json b/Praktikum2/ppm1/data/Firmen/6.json new file mode 100644 index 0000000..cd2cba7 --- /dev/null +++ b/Praktikum2/ppm1/data/Firmen/6.json @@ -0,0 +1,8 @@ +{ + "id": "6", + "Branche": "IT", + "Sitz": "Armonk", + "Schwerpunkt": "Elektrotechnik", + "Anzahl Mitarbeiter": "377000", + "Name": "IBM" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Firmen/last.json b/Praktikum2/ppm1/data/Firmen/last.json new file mode 100644 index 0000000..62f9457 --- /dev/null +++ b/Praktikum2/ppm1/data/Firmen/last.json @@ -0,0 +1 @@ +6 \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Lehrender/5.json b/Praktikum2/ppm1/data/Lehrender/5.json new file mode 100644 index 0000000..cee342e --- /dev/null +++ b/Praktikum2/ppm1/data/Lehrender/5.json @@ -0,0 +1,7 @@ +{ + "Titel": "Prof", + "id": "5", + "Lehrgebiet": "Informatik", + "Name": "Heiner", + "Vorname": "Theodor" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Lehrender/6.json b/Praktikum2/ppm1/data/Lehrender/6.json new file mode 100644 index 0000000..bb4eb50 --- /dev/null +++ b/Praktikum2/ppm1/data/Lehrender/6.json @@ -0,0 +1,7 @@ +{ + "Titel": "Prof Dr", + "id": "6", + "Lehrgebiet": "Elektrotechnik", + "Name": "Anton", + "Vorname": "Emanuel" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Lehrender/7.json b/Praktikum2/ppm1/data/Lehrender/7.json new file mode 100644 index 0000000..2f4b91f --- /dev/null +++ b/Praktikum2/ppm1/data/Lehrender/7.json @@ -0,0 +1,7 @@ +{ + "Titel": "Prof", + "id": "7", + "Lehrgebiet": "Informatik", + "Name": "Adalbert", + "Vorname": "Bastian" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Lehrender/8.json b/Praktikum2/ppm1/data/Lehrender/8.json new file mode 100644 index 0000000..62b79b3 --- /dev/null +++ b/Praktikum2/ppm1/data/Lehrender/8.json @@ -0,0 +1,7 @@ +{ + "Titel": "Dr", + "id": "8", + "Lehrgebiet": "Elektrotechnik", + "Name": "Leberecht", + "Vorname": "Egon" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Lehrender/last.json b/Praktikum2/ppm1/data/Lehrender/last.json new file mode 100644 index 0000000..ca7bf83 --- /dev/null +++ b/Praktikum2/ppm1/data/Lehrender/last.json @@ -0,0 +1 @@ +13 \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Studenten/10.json b/Praktikum2/ppm1/data/Studenten/10.json new file mode 100644 index 0000000..31ac8db --- /dev/null +++ b/Praktikum2/ppm1/data/Studenten/10.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Timo", + "Name": "Ben", + "Matrikelnummer": "3", + "id": "10" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Studenten/11.json b/Praktikum2/ppm1/data/Studenten/11.json new file mode 100644 index 0000000..2ccc813 --- /dev/null +++ b/Praktikum2/ppm1/data/Studenten/11.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Korbinian", + "Name": "Moritz", + "Matrikelnummer": "6", + "id": "11" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Studenten/12.json b/Praktikum2/ppm1/data/Studenten/12.json new file mode 100644 index 0000000..406f91d --- /dev/null +++ b/Praktikum2/ppm1/data/Studenten/12.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Alfons", + "Name": "Meine", + "Matrikelnummer": "4", + "id": "12" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Studenten/13.json b/Praktikum2/ppm1/data/Studenten/13.json new file mode 100644 index 0000000..e463503 --- /dev/null +++ b/Praktikum2/ppm1/data/Studenten/13.json @@ -0,0 +1,6 @@ +{ + "id": "13", + "Name": "Edmund", + "Vorname": "Adalbert", + "Matrikelnummer": "1" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Studenten/9.json b/Praktikum2/ppm1/data/Studenten/9.json new file mode 100644 index 0000000..a4bd70d --- /dev/null +++ b/Praktikum2/ppm1/data/Studenten/9.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Gregor", + "Name": "Klemens", + "Matrikelnummer": "2", + "id": "9" +} \ No newline at end of file diff --git a/Praktikum2/ppm1/data/Studenten/last.json b/Praktikum2/ppm1/data/Studenten/last.json new file mode 100644 index 0000000..da2d398 --- /dev/null +++ b/Praktikum2/ppm1/data/Studenten/last.json @@ -0,0 +1 @@ +14 \ No newline at end of file diff --git a/Praktikum2/ppm1/doc/documentation.html b/Praktikum2/ppm1/doc/documentation.html new file mode 100644 index 0000000..7387d6d --- /dev/null +++ b/Praktikum2/ppm1/doc/documentation.html @@ -0,0 +1,127 @@ + + + + + + + + + + + +

Web-Praktikum Gruppe A

+

Kai Wansart und Felix Hoster

+

16.11.2016

+

Beschreibung der Lösung

+

Aufgabe der Anwendung:

+ +

Übersicht der fachlichen Funktion:

+ +

Beschreibung des Servers

+

Zweck

+ +

Aufbau (Bestandteile der Komponente)

+ +

Zusammenwirken mit anderen Komponenten

+

API (Programmierschnittstellen), die die Leistung der Komponente anbieten

+ + + diff --git a/Praktikum2/ppm1/doc/documentation.md b/Praktikum2/ppm1/doc/documentation.md new file mode 100644 index 0000000..27141f1 --- /dev/null +++ b/Praktikum2/ppm1/doc/documentation.md @@ -0,0 +1,36 @@ +# Web-Praktikum Gruppe K +## Kai Wansart und Felix Hoster +### 16.11.2016 + +## Beschreibung der Lösung +### Aufgabe der Anwendung: +Die Praktikumsaufgabe war, eine Ünterstützung der Betreuung von Praxisphasen mit einer Web-Anwendung zu erstellen. Praxisphasen werden +von externen Partnern (Firmen) angeboten, Studenten können diese Angebote nutzen, wenn sie einen Lehrenden als Betreuer +finden + + #### Übersicht der fachlichen Funktion + - Datenpflege Studenten: Eine Liste mit allen erstellten Studenten (Name, Vorname, Matrikelnummer) + - Datenpflege Lehrende: Eine Übersicht mit allen Lehrenden (Name, Titel, Lehrgebiet) + - Datenpflege Firmenverzeichniss: Eine Liste mit einer kleinen Übersicht über einzelne Firmen (Schwerpunkt, Sitz, Name, Branche, Mitarbeiteranzahl) + - Datenpflege Praxisphase: Erhält man eine kurze Übersicht über Angebote für die Studenten (Firmenbetreuer, Beschreibung, Name, Voraussetzung, Firma) + - Auswahl Praxisphasen: Dort können die Studenten mit einem Professor sich eine Praxisphase aussuchen + - Auswertung Firma: Hier werden die Firmen bewertet, die ein Angebot für die Praxisphase bewertet + - Auswertung Praxisphasen nach Studenten: Hier sieht man die Bewertung der Studenten über die einzelnen Angebote + - Auswertung Praxisphase nach Betreuern: Hier sieht man die Bewertung der Praxisphasen - Betreuer + + +## Beschreibung des Servers +#### Zweck + +#### Aufbau (Bestandteile der Komponente) + +#### Zusammenwirken mit anderen Komponenten + +#### API (Programmierschnittstellen), die die Leistung der Komponente anbieten + +## Datenablage +Die Daten werden mittels der Kategorie abgespeichert, die als Variable behandelt wird. Mit dieser Variable wird die Datei immer wieder neu gespeichert, wenn etwas gelöscht bzw. geändert wird. Das Format der Datei ist eine JSON-Datei, die im Ordner 'Data' und der darauffolgenden Kategorie abgespeichert wird. + +## Konfiguration + +## Durchführung und Ergebnis der geforderten Prüfungen \ No newline at end of file diff --git a/Praktikum2/ppm1/server.py b/Praktikum2/ppm1/server.py new file mode 100644 index 0000000..4e64056 --- /dev/null +++ b/Praktikum2/ppm1/server.py @@ -0,0 +1,45 @@ +#coding: utf-8 + +import os +import cherrypy +from app import application + +#-------------------------------------- +def main(): +#-------------------------------------- + + # Get current directory + try: + current_dir = os.path.dirname(os.path.abspath(__file__)) + except: + current_dir = os.path.dirname(os.path.abspath(sys.executable)) + + # disable autoreload and timeout_monitor + cherrypy.engine.autoreload.unsubscribe() + cherrypy.engine.timeout_monitor.unsubscribe() + + # Static content config + static_config = { + '/': { + 'tools.staticdir.root': current_dir, + 'tools.staticdir.on': True, + 'tools.staticdir.dir': './static' + } + } + + # Mount static content handler + root_o = cherrypy.tree.mount(application.Application_cl(), '/', static_config) + + # suppress traceback-info + cherrypy.config.update({'request.show_tracebacks': False}) + + # Start server + cherrypy.engine.start() + cherrypy.engine.block() + +#-------------------------------------- +if __name__ == '__main__': +#-------------------------------------- + main() + +# EOF \ No newline at end of file diff --git a/Praktikum2/ppm1/static/functions.js b/Praktikum2/ppm1/static/functions.js new file mode 100644 index 0000000..20acdea --- /dev/null +++ b/Praktikum2/ppm1/static/functions.js @@ -0,0 +1,46 @@ +var table = document.getElementById('idList'); +var selected = table.getElementsByClassName('selected'); +var selectedId = 'None'; +table.onclick = highlight; + +function select(category, mode) { + var id = selectedId; + if (id == 'None') + { + alert("Kein Eintrag ausgewaehlt!"); + } + else + { + if(mode == 0) { + window.location.href = '/detail/?cat=' + category + '&id=' + id; + } + if(mode == 1) { + var result = confirm("Sind Sie sicher, dass der Eintrag gelöscht werden soll?"); + if(result) { + window.location.href = '/delete/?cat=' + category + '&id=' + id; + return true; + } + else { + return false; + } + } + if(mode == 2) { + var result = confirm("Sind Sie sicher, dass das Angebot angenommen werden soll?"); + if(result) { + window.location.href = '/detailchoice/?id=' + id; + return true; + } + else { + return false; + } + } + } +} + + +function highlight(e) { + if (selected[0]) selected[0].className = ''; + e.target.parentNode.className = 'selected'; + var tr = e.target.parentNode; + selectedId = tr.getAttribute('id'); +} \ No newline at end of file diff --git a/Praktikum2/ppm1/static/functionsAngebote.js b/Praktikum2/ppm1/static/functionsAngebote.js new file mode 100644 index 0000000..967dc07 --- /dev/null +++ b/Praktikum2/ppm1/static/functionsAngebote.js @@ -0,0 +1,33 @@ +window.onload = function () { + document.getElementById("idList").onclick = function (event_opl) { + if (event_opl.target.tagName.toLowerCase() == 'td') { + id = event_opl.target.parentNode.id; + if (id != "") { + document.getElementById(id).className = ""; + } + + + console.log(id); + document.getElementById(id).className = "selected"; + } + } + + document.getElementById("New").onclick = function (event_opl) { + window.location.href = "/detail/?cat=Angebote" ; + } + + + document.getElementById("Modify").onclick = function (event_opl) { + if (id != "") + window.location.href = "/detail/?cat=Angebote&id=" + id; + } + + document.getElementById("Delete").onclick = function (event_opl) { + if (id != "") + if (confirm("Soll der Eintrag wirklich geloescht werden?")) { + window.location.href = "/delete/?cat=Angebote&id=" + id; + } + + } + +} \ No newline at end of file diff --git a/Praktikum2/ppm1/static/functionsChoice.js b/Praktikum2/ppm1/static/functionsChoice.js new file mode 100644 index 0000000..ee7b3fa --- /dev/null +++ b/Praktikum2/ppm1/static/functionsChoice.js @@ -0,0 +1,19 @@ +window.onload = function () { + document.getElementById("idList").onclick = function (event_opl) { + if (event_opl.target.tagName.toLowerCase() == 'td') { + id = event_opl.target.parentNode.id; + if (id != "") { + document.getElementById(id).className = ""; + } + + + console.log(id); + document.getElementById(id).className = "selected"; + } + } + + document.getElementById("Annehmen").onclick = function (event_opl) { + if (id != "") + window.location.href = "/detailchoice/?id=" + id; + } +} \ No newline at end of file diff --git a/Praktikum2/ppm1/static/functionsFirmen.js b/Praktikum2/ppm1/static/functionsFirmen.js new file mode 100644 index 0000000..c52c68f --- /dev/null +++ b/Praktikum2/ppm1/static/functionsFirmen.js @@ -0,0 +1,33 @@ +window.onload = function () { + document.getElementById("idList").onclick = function (event_opl) { + if (event_opl.target.tagName.toLowerCase() == 'td') { + id = event_opl.target.parentNode.id; + if (id != "") { + document.getElementById(id).className = ""; + } + + + console.log(id); + document.getElementById(id).className = "selected"; + } + } + + document.getElementById("New").onclick = function (event_opl) { + window.location.href = "/detail/?cat=Firmen" ; + } + + + document.getElementById("Modify").onclick = function (event_opl) { + if (id != "") + window.location.href = "/detail/?cat=Firmen&id=" + id; + } + + document.getElementById("Delete").onclick = function (event_opl) { + if (id != "") + if (confirm("Soll der Eintrag wirklich geloescht werden?")) { + window.location.href = "/delete/?cat=Firmen&id=" + id; + } + + } + +} \ No newline at end of file diff --git a/Praktikum2/ppm1/static/functionsLehrender.js b/Praktikum2/ppm1/static/functionsLehrender.js new file mode 100644 index 0000000..de63671 --- /dev/null +++ b/Praktikum2/ppm1/static/functionsLehrender.js @@ -0,0 +1,33 @@ +window.onload = function () { + document.getElementById("idList").onclick = function (event_opl) { + if (event_opl.target.tagName.toLowerCase() == 'td') { + id = event_opl.target.parentNode.id; + if (id != "") { + document.getElementById(id).className = ""; + } + + + console.log(id); + document.getElementById(id).className = "selected"; + } + } + + document.getElementById("New").onclick = function (event_opl) { + window.location.href = "/detail/?cat=Lehrender" ; + } + + + document.getElementById("Modify").onclick = function (event_opl) { + if (id != "") + window.location.href = "/detail/?cat=Lehrender&id=" + id; + } + + document.getElementById("Delete").onclick = function (event_opl) { + if (id != "") + if (confirm("Soll der Eintrag wirklich geloescht werden?")) { + window.location.href = "/delete/?cat=Lehrender&id=" + id; + } + + } + +} \ No newline at end of file diff --git a/Praktikum2/ppm1/static/functionsStudenten.js b/Praktikum2/ppm1/static/functionsStudenten.js new file mode 100644 index 0000000..2136ca2 --- /dev/null +++ b/Praktikum2/ppm1/static/functionsStudenten.js @@ -0,0 +1,33 @@ +window.onload = function () { + document.getElementById("idList").onclick = function (event_opl) { + if (event_opl.target.tagName.toLowerCase() == 'td') { + id = event_opl.target.parentNode.id; + if (id != "") { + document.getElementById(id).className = ""; + } + + + console.log(id); + document.getElementById(id).className = "selected"; + } + } + + document.getElementById("New").onclick = function (event_opl) { + window.location.href = "/detail/?cat=Studenten" ; + } + + + document.getElementById("Modify").onclick = function (event_opl) { + if (id != "") + window.location.href = "/detail/?cat=Studenten&id=" + id; + } + + document.getElementById("Delete").onclick = function (event_opl) { + if (id != "") + if (confirm("Soll der Eintrag wirklich geloescht werden?")) { + window.location.href = "/delete/?cat=Studenten&id=" + id; + } + + } + +} \ No newline at end of file diff --git a/Praktikum2/ppm1/static/img/logo.png b/Praktikum2/ppm1/static/img/logo.png new file mode 100644 index 0000000..40801c4 Binary files /dev/null and b/Praktikum2/ppm1/static/img/logo.png differ diff --git a/Praktikum2/ppm1/static/style.css b/Praktikum2/ppm1/static/style.css new file mode 100644 index 0000000..9dcd8c3 --- /dev/null +++ b/Praktikum2/ppm1/static/style.css @@ -0,0 +1 @@ +body{font-family:"Open Sans",sans-serif;font-size:12pt;padding:0;margin:0;}.clSiteHeader{position:absolute;top:0;left:0;right:0;height:100px;line-height:100px;margin:0;padding:5px;font-size:40pt;text-align:center;text-shadow:black 3px 2px;font-family:"Open Sans",sans-serif;background-color:#084791;border:none;border-radius:60px;}.clSiteHeader a{text-decoration:none;color:white;}.clSiteHeader:hover{background-color:#0D71E4;cursor:pointer;}.clSiteHeader a:visited,a:active{color:white;text-decoration:none;}.clContent{position:absolute;top:150px;left:0;right:0;bottom:0;margin:0;padding:5px;background-repeat:no-repeat;background-position:bottom left;}.clContentHeader{position:absolute;top:20px;left:0;right:0;height:30px;line-height:30px;margin:0;padding:5px;font-size:18pt;text-align:center;}.clContentArea{position:absolute;top:80px;left:0;right:0;bottom:0px;margin:10px 0;margin-left:10px;padding:5px;background-attachment:#819FF7;}.clButtonArea{position:absolute;left:0;right:0;bottom:0;height:80px;line-height:80px;margin:0;padding:5px;text-align:center;background-color:#FFFFFF;}.clButtonArea a,input[type="submit"]{margin:0 5px;padding:3px 6px;font-size:14pt;text-decoration:none;border:2px solid;color:white;background-color:#084791;}.clButtonArea a:hover{color:white;background-color:#0D71E4;cursor:pointer;}.clButtonArea a:visited,a:active{color:white;}.clNavButton{display:inline-block;text-align:center;background-color:#084791;border:1px solid black;color:white;padding:15px 32px;text-decoration:none;font-size:16px;cursor:pointer;float:left;clear:left;width:20%;margin-left:38%;margin-right:30%;}.clNavButton:hover{background-color:#0D71E4;}#idList{table-layout:fixed;width:auto;border:2px solid;border-collapse:collapse;margin:auto;}#idList th{text-align:center;padding-left:5px;background-color:white;padding:3px;border:2px solid;}#idList td{padding:3px;border:2px solid;cursor:pointer;}#idForm .clContentArea{width:500px;margin:auto;}.selected{background-color:#0D71E4;color:white;}.clFormRow{position:relative;height:30px;margin-bottom:10px;}.clFormRow label{position:absolute;top:0;left:0;width:240px;text-align:center;}.clFormRow input{position:absolute;top:0;left:250px;width:250px;}.clFormRow select{position:absolute;top:0;left:250px;width:250px;}h3{text-align:center;} \ No newline at end of file diff --git a/Praktikum2/ppm1/templates/detail.tpl b/Praktikum2/ppm1/templates/detail.tpl new file mode 100644 index 0000000..1fa65ec --- /dev/null +++ b/Praktikum2/ppm1/templates/detail.tpl @@ -0,0 +1,75 @@ + + + + + Praxisphasenmanager (PPM) + + + + + +

+ Praxisphasenmanager (PPM) +

+ +
+

+ ${data['category']}: Ihre Daten +

+
+ + + % if data['category'] != 'Angebote': + % for field in data['content']: + % if field!='id' and field!='Status': +
+ + + % else: + "" id="${field}" name="${field}" /> + % endif +
+ % endif + % endfor + % else: + + + + + + % for field in data['content']: + % if field!='id' and field!='Status' and field!='ZeitraumVon' and field!='ZeitraumBis' and field!='Lehrender' and field!='Student': +
+ + % if field!='Firma': + + % else: + "" id="${field}" name="${field}" /> + % endif + % else: + + % endif +
+ % endif + % endfor + % endif + + +
+
+ + \ No newline at end of file diff --git a/Praktikum2/ppm1/templates/detailChoice.tpl b/Praktikum2/ppm1/templates/detailChoice.tpl new file mode 100644 index 0000000..1451eae --- /dev/null +++ b/Praktikum2/ppm1/templates/detailChoice.tpl @@ -0,0 +1,66 @@ + + + + + Praxisphasenmanager (PPM) + + + + + +

+ Praxisphasenmanager (PPM) +

+ +
+

+ Praxisphasenangebots Auswahl +

+
+ + + + + + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + \ No newline at end of file diff --git a/Praktikum2/ppm1/templates/index.tpl b/Praktikum2/ppm1/templates/index.tpl new file mode 100644 index 0000000..e7094e5 --- /dev/null +++ b/Praktikum2/ppm1/templates/index.tpl @@ -0,0 +1,36 @@ + + + + + Praxisphasenmanager (PPM) + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

Module

+
+ Datenpflege: Studenten + Datenpflege: Lehrender + Datenpflege: Firmenverzeichnis + Datenpflege: Praxisphasen + + Auswahl: Praxisphasen + + Auswertung: Studenten + Auswertung: Lehrenden + Auswertung: Firmen + +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm1/templates/list.tpl b/Praktikum2/ppm1/templates/list.tpl new file mode 100644 index 0000000..7cc3bce --- /dev/null +++ b/Praktikum2/ppm1/templates/list.tpl @@ -0,0 +1,76 @@ + + + + + Praxisphasenmanager (PPM) + + + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

+ Übersicht: ${data['category']} +

+
+ + + + % if data['content']!= None: + % for heading in data['headings']: + % if heading!='id' and heading!='Status' and heading!='ZeitraumVon' and heading!='ZeitraumBis' and heading!='Student' and heading!='Lehrender': + + % endif + % endfor + % else: + + % endif + + % if data['content']!= None: + + % for entries in data['content']: + + % if data['category'] == 'Angebote': + % if data['content'][entries]['Status'] == 'Angebot': + % for entry in data['content'][entries]: + % if entry!='id' and entry!='Status' and entry!='ZeitraumVon' and entry!='ZeitraumBis' and entry!='Student' and entry!='Lehrender': + + % endif + % endfor + % endif + % else: + % for entry in data['content'][entries]: + % if entry!='id': + + % endif + % endfor + % endif + + % endfor + + % endif + +
${heading}Bisher kein Inhalt
${data['content'][entries][entry]}${data['content'][entries][entry]}
+
+ +
+ Startseite + + Neu + Bearbeiten + Loeschen + +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm1/templates/listChoice.tpl b/Praktikum2/ppm1/templates/listChoice.tpl new file mode 100644 index 0000000..5241c5c --- /dev/null +++ b/Praktikum2/ppm1/templates/listChoice.tpl @@ -0,0 +1,56 @@ + + + + + Praxisphasenmanager (PPM) + + + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

+ Übersicht Praxisphasen Auswahl +

+
+ + + + + + + + + + % if data['content']!= None: + % for entries in data['content']: + + + + + + + + % endfor + + % endif + +
NameFirmaBeschreibungVoraussetzungenFirmenbetreuer
${data['content'][entries]['Name']}${data['content'][entries]['Firma']}${data['content'][entries]['Beschreibung']}${data['content'][entries]['Voraussetzungen']}${data['content'][entries]['Firmenbetreuer']}
+
+ +
+ Startseite + Annehmen +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm1/templates/listEval.tpl b/Praktikum2/ppm1/templates/listEval.tpl new file mode 100644 index 0000000..0bab960 --- /dev/null +++ b/Praktikum2/ppm1/templates/listEval.tpl @@ -0,0 +1,146 @@ + + + + + Praxisphasenmanager (PPM) + + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

+ Übersicht: ${data['category']} +

+
+ % if data['category'] == 'Firmen': + % for firmen in data: + % if firmen != 'category': +

${firmen}

+ + + + + + + + + % for aktuell in data[firmen]['Angebote']['aktuell']: + + + + + + + + % endfor + % for abgeschlossen in data[firmen]['Angebote']['abgeschlossen']: + + + + + + + + % endfor +
StatusStudentLehrenderZeitraum: VonZeitraum: Bis
Aktuell${data[firmen]['Angebote']['aktuell'][aktuell]['Student']}${data[firmen]['Angebote']['aktuell'][aktuell]['Lehrender']}${data[firmen]['Angebote']['aktuell'][aktuell]['ZeitraumVon']}${data[firmen]['Angebote']['aktuell'][aktuell]['ZeitraumBis']}
Abgeschlossen${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['Student']}${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['Lehrender']}${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['ZeitraumVon']}${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['ZeitraumBis']}
+ % endif + % endfor + % endif + + % if data['category'] == 'Studenten': + % for studenten in data: + % if studenten != 'category': +

${studenten}

+ + + + + + + + + + % for angebote in data[studenten]['Angebote']['aktuell']: + + + + + + + + + % endfor + % for angebote in data[studenten]['Angebote']['abgeschlossen']: + + + + + + + + + % endfor + + +
LehrenderFirmaPraxisphaseStatusZeitraum: VonZeitraum: Bis
${data[studenten]['Angebote']['aktuell'][angebote]['Lehrender']}${data[studenten]['Angebote']['aktuell'][angebote]['Firma']}${data[studenten]['Angebote']['aktuell'][angebote]['Praxisphase']}${data[studenten]['Angebote']['aktuell'][angebote]['Status']}${data[studenten]['Angebote']['aktuell'][angebote]['ZeitraumVon']}${data[studenten]['Angebote']['aktuell'][angebote]['ZeitraumBis']}
${data[studenten]['Angebote']['abgeschlossen'][angebote]['Lehrender']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['Firma']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['Praxisphase']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['Status']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['ZeitraumVon']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['ZeitraumBis']}
+ % endif + % endfor + % endif + + % if data['category'] == 'Lehrender': + % for Lehrender in data: + % if Lehrender != 'category': +

${Lehrender}

+ + + + + + + + + + % if data[Lehrender] != NULL: + % for angebote in data[Lehrender]['Angebote']['aktuell']: + + + + + + + + + % endfor + % for angebote in data[Lehrender]['Angebote']['abgeschlossen']: + + + + + + + + + % endfor + % endif +
StudentFirmaPraxisphaseStatusZeitraum: VonZeitraum: Bis
${data[Lehrender]['Angebote']['aktuell'][angebote]['Student']}${data[Lehrender]['Angebote']['aktuell'][angebote]['Firma']}${data[Lehrender]['Angebote']['aktuell'][angebote]['Praxisphase']}${data[Lehrender]['Angebote']['aktuell'][angebote]['Status']}${data[Lehrender]['Angebote']['aktuell'][angebote]['ZeitraumVon']}${data[Lehrender]['Angebote']['aktuell'][angebote]['ZeitraumBis']}
${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Student']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Firma']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Praxisphase']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Status']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['ZeitraumVon']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['ZeitraumBis']}
+ % endif + % endfor + % endif +
+ +
+ Startseite +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm2/.vs/ppm2/v14/.suo b/Praktikum2/ppm2/.vs/ppm2/v14/.suo new file mode 100644 index 0000000..9a68bf7 Binary files /dev/null and b/Praktikum2/ppm2/.vs/ppm2/v14/.suo differ diff --git a/Praktikum2/ppm2/app/__pycache__/application.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/application.cpython-35.pyc new file mode 100644 index 0000000..c772c2e Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/application.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/category.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/category.cpython-35.pyc new file mode 100644 index 0000000..478bda0 Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/category.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/choice.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/choice.cpython-35.pyc new file mode 100644 index 0000000..dfc209f Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/choice.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/database.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/database.cpython-35.pyc new file mode 100644 index 0000000..a86d93c Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/database.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/eval.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/eval.cpython-35.pyc new file mode 100644 index 0000000..dcb3165 Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/eval.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/template.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/template.cpython-35.pyc new file mode 100644 index 0000000..ffbb276 Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/template.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/templates.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/templates.cpython-35.pyc new file mode 100644 index 0000000..f275311 Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/templates.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/__pycache__/view.cpython-35.pyc b/Praktikum2/ppm2/app/__pycache__/view.cpython-35.pyc new file mode 100644 index 0000000..b94bd66 Binary files /dev/null and b/Praktikum2/ppm2/app/__pycache__/view.cpython-35.pyc differ diff --git a/Praktikum2/ppm2/app/application.py.old b/Praktikum2/ppm2/app/application.py.old new file mode 100644 index 0000000..e22162c --- /dev/null +++ b/Praktikum2/ppm2/app/application.py.old @@ -0,0 +1,332 @@ +import json +import cherrypy +from app import database +from app import view + +#---------------------------------------------------------- +class Application_cl(object): +#---------------------------------------------------------- + exposed = True + + #---------------------------------------------------------- + def __init__(self): + #---------------------------------------------------------- + self.db_o = database.Database_cl() + self.view_o = view.View_cl() + + #---------------------------------------------------------- + def GET(self, cat=None, id=None): + #---------------------------------------------------------- + + return json.dumps(retVal) + + #---------------------------------------------------------- + def PUT(self, **data): + #---------------------------------------------------------- + + return json.dumps(retVal) + + #---------------------------------------------------------- + def POST(self, cat, id, **data_opl): + #---------------------------------------------------------- + + return json.dumps(retVal) + + #---------------------------------------------------------- + def DELETE(self, cat, id): + #---------------------------------------------------------- + + return json.dumps(retVal) + + #---------------------------------------------------------- + def default(self, *arguments, **kwargs): + #---------------------------------------------------------- + msg_s = "unbekannte Anforderung: " + \ + str(arguments) + \ + ' ' + \ + str(kwargs) + raise cherrypy.HTTPError(404, msg_s) + +# /* import cherrypy +# from .database import Database_cl +# from .view import View_cl +# import collections +# orderedDict = collections.OrderedDict() +# from collections import OrderedDict + +# #---------------------------------------------------------- +# class Application_cl(object): +# #---------------------------------------------------------- + +# #------------------------------------------------------- +# # Request Processing +# #------------------------------------------------------- + +# #------------------------------------------------------- +# def __init__(self): +# #------------------------------------------------------- +# # spezielle Initialisierung können hier eingetragen werden +# self.db = Database_cl() +# self.view = View_cl() +# @cherrypy.expose + +# #------------------------------------------------------- +# def index(self): +# #------------------------------------------------------- +# print("Index\n") +# return self.GenerateIndex() +# @cherrypy.expose + +# #------------------------------------------------------- +# def category(self, cat=None): +# #------------------------------------------------------- +# print("Category: ", cat, "\n") +# if(cat==None): +# return self.GenerateIndex() +# else: +# return self.GenerateList(cat) +# @cherrypy.expose + +# #------------------------------------------------------- +# def choice(self): +# #------------------------------------------------------- +# print("Choice \n") +# return self.GenerateListChoice() +# @cherrypy.expose + +# #------------------------------------------------------- +# def eval(self, cat): +# #------------------------------------------------------- +# print("Eval \n") +# self.db.CheckDates() +# return self.GenerateListEval(cat) +# @cherrypy.expose + +# #------------------------------------------------------- +# def detail(self, cat=None, id=None): +# #------------------------------------------------------- +# if(cat!=None): +# if(id!=None): +# print("Cat=", cat, " id=", id) +# return self.GenerateDetail(cat, id) +# else: +# print("ID=None Cat=", cat) +# return self.GenerateDetail(cat) +# else: +# return self.GenerateIndex() +# @cherrypy.expose + +# #------------------------------------------------------- +# def detailchoice(self, id): +# #------------------------------------------------------- +# print("id=", id) +# return self.GenerateDetailChoice(id) + +# @cherrypy.expose + +# #------------------------------------------------------- +# def save(self, cat=None, **data): +# #------------------------------------------------------- +# print("Save: ", cat) +# dataTmp = data +# return self.GenerateSave(dataTmp, cat) +# @cherrypy.expose + +# #------------------------------------------------------- +# def saveChoice(self, **data): +# #------------------------------------------------------- +# print("Save: Choice") +# dataTmp = data +# return self.GenerateSaveChoice(dataTmp) +# @cherrypy.expose + +# #------------------------------------------------------- +# def delete(self, cat=None, id=None): +# #------------------------------------------------------- +# print("Delete",cat,id) +# return self.GenerateDelete(cat, id) +# @cherrypy.expose + +# #------------------------------------------------------- +# def default(self, *arguments, **kwargs): +# #------------------------------------------------------- +# msg_s = "unbekannte Anforderung: " + \ +# str(arguments) + \ +# ''+ \ +# str(kwargs) +# raise cherrypy.HTTPError(404, msg_s) +# default.exposed= True + +# #------------------------------------------------------- +# # Functions +# #------------------------------------------------------- + +# #------------------------------------------------------- +# def GenerateIndex(self): +# #------------------------------------------------------- +# return self.view.CreateIndex() + +# #------------------------------------------------------- +# def GenerateList(self, category): +# #------------------------------------------------------- +# self.db.ReadAll() +# data = {} +# data['content'] = {} +# data['headings'] = {} +# data['category'] = category +# data['content'] = self.db.data[category] +# if(len(data['content']) != 0): +# print(len(data['content'])) +# contentFirst = list(data['content'].keys())[0] +# data['headings'] = list(data['content'][contentFirst].keys()) +# print(data) +# return self.view.CreateList(data) + +# #------------------------------------------------------- +# def GenerateListChoice(self): +# #------------------------------------------------------- +# self.db.ReadAll() +# data = {} +# data['content'] = {} +# offerings = self.db.data['Angebote'] +# for key, value in offerings.items(): +# for key2, value2 in value.items(): +# if(key2 == 'Status'): +# if(value2 == 'Angebot'): +# data['content'][key] = value + +# print(data) +# return self.view.CreateListChoice(data) + +# #------------------------------------------------------- +# def GenerateDetail(self, category, id=None): +# #------------------------------------------------------- +# self.db.ReadAll() +# data = {} +# data['category'] = category +# print("Detail",category,id) +# if(id != None): +# data['id'] = id +# data['content'] = self.db.ReadEntry(category, id) +# else: +# data['id'] = None +# data['content'] = self.db.GetDefault(category) +# print(data['content']) +# if(category == 'Angebote'): +# print("Angebote") +# data['Firmen'] = self.db.data['Firmen'] +# print(data, "\n") +# return self.view.CreateDetail(data) + +# #------------------------------------------------------- +# def GenerateDetailChoice(self, id): +# #------------------------------------------------------- +# self.db.ReadAll() +# data = {} +# data['id'] = id +# data = self.db.data['Angebote'][id] +# data['Studenten'] = self.db.data['Studenten'] +# data['Lehrender'] = self.db.data['Lehrender'] +# print(data, "\n") +# return self.view.CreateDetailChoice(data) + +# #------------------------------------------------------- +# def GenerateListEval(self, cat): +# #------------------------------------------------------- +# self.db.ReadAll() +# data = {} +# Studenten = self.db.data['Studenten'] +# Lehrender = self.db.data['Lehrender'] +# Firmen = self.db.data['Firmen'] +# Angebote = self.db.data['Angebote'] + +# data['category'] = cat +# if(cat == 'Firmen'): +# for keyFirma, valueFirma in sorted(Firmen.items()): +# data[valueFirma['Name']] = {} +# data[valueFirma['Name']]['Name'] = valueFirma['Name'] +# data[valueFirma['Name']]['Angebote'] = {} +# data[valueFirma['Name']]['Angebote']['Angebot'] = {} +# data[valueFirma['Name']]['Angebote']['aktuell'] = {} +# data[valueFirma['Name']]['Angebote']['abgeschlossen'] = {} +# for keyAngebote, valueAngebote in Angebote.items(): +# if(valueAngebote['Firma'] == valueFirma['Name']): +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']] = {} +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Name'] = valueAngebote['Name'] +# if(valueAngebote['Student'] != ''): +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = Studenten[valueAngebote['Student']]['Name'] +# else: +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = '' +# if(valueAngebote['Lehrender'] != ''): +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = Lehrender[valueAngebote['Lehrender']]['Name'] +# else: +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = '' +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumVon'] = valueAngebote['ZeitraumVon'] +# data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumBis'] = valueAngebote['ZeitraumBis'] +# print(data) +# return self.view.CreateListEval(data) +# elif(cat == 'Studenten'): +# for keyStudent, valueStudent in Studenten.items(): +# data[valueStudent['Name']] = {} +# data[valueStudent['Name']]['Angebote'] = {} +# data[valueStudent['Name']]['Angebote']['Angebot'] = {} +# data[valueStudent['Name']]['Angebote']['aktuell'] = {} +# data[valueStudent['Name']]['Angebote']['abgeschlossen'] = {} +# for keyAngebot, valueAngebot in Angebote.items(): +# if(valueAngebot['Student'] == valueStudent['id']): +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {} +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Lehrender'] = Lehrender[valueAngebot['Lehrender']]['Name'] +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status'] +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name'] +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma'] +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon'] +# data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis'] +# elif(cat == 'Lehrender'): +# for keyLehrende, valueLehrende in Lehrender.items(): +# data[valueLehrende['Name']] = {} +# data[valueLehrende['Name']]['Angebote'] = {} +# data[valueLehrende['Name']]['Angebote']['Angebot'] = {} +# data[valueLehrende['Name']]['Angebote']['aktuell'] = {} +# data[valueLehrende['Name']]['Angebote']['abgeschlossen'] = {} +# for keyAngebot, valueAngebot in Angebote.items(): +# if(valueAngebot['Lehrender'] == valueLehrende['id']): +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {} +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Student'] = Studenten[valueAngebot['Student']]['Name'] +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status'] +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name'] +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma'] +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon'] +# data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis'] + +# return self.view.CreateListEval(data) + + +# #------------------------------------------------------- +# def GenerateSave(self, dataTmp, category): +# #------------------------------------------------------- +# if(category == None): +# return self.view.CreateIndex() +# else: +# self.db.Save(dataTmp, category) +# return self.GenerateList(category) + +# #------------------------------------------------------- +# def GenerateSaveChoice(self, dataTmp): +# #------------------------------------------------------- +# if(dataTmp['Student'] != ''): +# angebote = self.db.CheckOfferings(dataTmp['Student']) +# print(angebote) +# if(angebote == 0): +# print("Save") +# self.db.Save(dataTmp, 'Angebote') +# return self.GenerateListChoice() + +# #------------------------------------------------------- +# def GenerateDelete(self, category, id): +# #------------------------------------------------------- +# if(category == None or id == None): +# return self.view.CreateIndex() +# else: +# self.db.Delete(category, id) +# return self.GenerateList(category) +# #EOF \ No newline at end of file diff --git a/Praktikum2/ppm2/app/category.py b/Praktikum2/ppm2/app/category.py new file mode 100644 index 0000000..649364c --- /dev/null +++ b/Praktikum2/ppm2/app/category.py @@ -0,0 +1,33 @@ +# coding: utf-8 + +import json +import cherrypy +from app import database + +#------------------------------------------------------- +class Category(object): +#------------------------------------------------------- + + exposed = True # gilt für alle Methoden + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + self.db = database.Database() + + #------------------------------------------------------- + def GET(self, cat=None): + #------------------------------------------------------- + data = {} + if(cat != None): + self.db.ReadAll() + data['content'] = {} + data['headings'] = {} + data['category'] = cat + data['content'] = self.db.data[cat] + if(len(data['content']) != 0): + print(len(data['content'])) + contentFirst = list(data['content'].keys())[0] + data['headings'] = list(data['content'][contentFirst].keys()) + print(data) + return json.dumps(data) diff --git a/Praktikum2/ppm2/app/choice.py b/Praktikum2/ppm2/app/choice.py new file mode 100644 index 0000000..cbe5e65 --- /dev/null +++ b/Praktikum2/ppm2/app/choice.py @@ -0,0 +1,31 @@ +# coding: utf-8 + +import json +import cherrypy +from app import database + +#------------------------------------------------------- +class Choice(object): +#------------------------------------------------------- + + exposed = True # gilt für alle Methoden + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + self.db = database.Database() + + #------------------------------------------------------- + def GET(self): + #------------------------------------------------------- + self.db.ReadAll() + data = {} + data['content'] = {} + offerings = self.db.data['Angebote'] + for key, value in offerings.items(): + for key2, value2 in value.items(): + if(key2 == 'Status'): + if(value2 == 'Angebot'): + data['content'][key] = value + print(data) + return json.dumps(data) diff --git a/Praktikum2/ppm2/app/database.py b/Praktikum2/ppm2/app/database.py new file mode 100644 index 0000000..36c072a --- /dev/null +++ b/Praktikum2/ppm2/app/database.py @@ -0,0 +1,189 @@ +# coding: utf-8 + +import os +import os.path +import codecs +import json +from datetime import datetime, timedelta + +#---------------------------------------------------------- +class Database(object): +#---------------------------------------------------------- + # da es hier nur darum geht, die Daten dauerhaft zu speichern, + # wird ein sehr einfacher Ansatz verwendet: + # - es können Daten zu genau 15 Teams gespeichert werden + # - je Team werden 2 Teilnehmer mit Namen, Vornamen und Matrikelnummer + # berücksichtigt + # - die Daten werden als eine JSON-Datei abgelegt + + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + self.data = {} + self.data['Studenten'] = {} + self.data['Lehrender'] = {} + self.data['Firmen'] = {} + self.data['Angebote'] = {} + self.ReadAll() + + + #------------------------------------------------------- + def Read(self, category): + #------------------------------------------------------- + path = 'data/' + category + if not(os.path.exists(path)): + os.makedirs(path) + categoryDir = os.listdir(path) + for fileName in categoryDir: + if fileName.endswith('.json') and fileName != 'last.json': + file = codecs.open(os.path.join('data', category, fileName), 'rU', 'utf-8') + fileContent = file.read() + id = fileName[:-5] + self.data[category][id] = json.loads(fileContent) + + #------------------------------------------------------- + def ReadAll(self): + #------------------------------------------------------- + self.Read('Studenten') + self.Read('Lehrender') + self.Read('Firmen') + self.Read('Angebote') + + #------------------------------------------------------- + def ReadEntry(self, category = None, id = None): + #------------------------------------------------------- + print("ReadEntry: ", category, id) + self.Read(category) + data = None + if id == None: + data = self.data + else: + if id in self.data[category]: + data = self.data[category][id] + + print(data, "\n") + return data + + #------------------------------------------------------- + def Save(self, data, category): + #------------------------------------------------------- + status_b = False + id = data['id'] + print("ID: ", id, "\n") + if(id != "None"): + if id in self.data[category]: + file = codecs.open(os.path.join('data', category, id+'.json'), 'w', 'utf-8') + file.write(json.dumps(data, indent=3, ensure_ascii=True)) + file.close() + self.Read(category) + status_b = True + else: + data['id'] = self.IdNext(category) + file = codecs.open(os.path.join('data', category, data['id']+'.json'), 'w', 'utf-8') + file.write(json.dumps(data, indent=3, ensure_ascii=True)) + file.close() + self.Read(category) + status_b = True + + return status_b + + #------------------------------------------------------- + def Delete(self, category, id): + #------------------------------------------------------- + status_b = False + if(category == 'Studenten'): + for angebote in self.data['Angebote']: + if(self.data['Angebote'][angebote]['Student'] == id): + try: + os.remove(os.path.join('data', 'Angebote', angebote+'.json')) + except OSError: + pass + elif(category == 'Lehrender'): + for angebote in self.data['Angebote']: + if(self.data['Angebote'][angebote]['Lehrender'] == id): + try: + os.remove(os.path.join('data', 'Angebote', angebote+'.json')) + except OSError: + pass + elif(category == 'Firmen'): + for firmen in self.data['Firmen']: + if(firmen == id): + fn = self.data['Firmen'][firmen]['Name'] + for angebote in self.data['Angebote']: + if(self.data['Angebote'][angebote]['Firma'] == fn): + try: + os.remove(os.path.join('data', 'Angebote', angebote+'.json')) + except OSError: + pass + + if id in self.data[category]: + os.remove(os.path.join('data', category, id+'.json')) + del self.data[category][id] + + return status_b + + #------------------------------------------------------- + def CheckOfferings(self, id): + #------------------------------------------------------- + print("Offerings: ", id) + for offerings in self.data['Angebote']: + if(self.data['Angebote'][offerings]['Student'] != id): + return 0 + else: + return 1 + + #------------------------------------------------------- + def CheckDates(self): + #------------------------------------------------------- + now = datetime.now() + for offerings in self.data['Angebote']: + if(self.data['Angebote'][offerings]['ZeitraumBis'] != ''): + zeitraumBis = datetime.strptime(self.data['Angebote'][offerings]['ZeitraumBis'], "%d.%m.%Y") + if(zeitraumBis <= now): + self.data['Angebote'][offerings]['Status'] = 'abgeschlossen' + data = {} + data['Status'] = 'abgeschlossen' + data['id'] = offerings + data['Name'] = self.data['Angebote'][offerings]['Name'] + data['Firma'] = self.data['Angebote'][offerings]['Firma'] + data['Beschreibung'] = self.data['Angebote'][offerings]['Beschreibung'] + data['Voraussetzungen'] = self.data['Angebote'][offerings]['Voraussetzungen'] + data['Firmenbetreuer'] = self.data['Angebote'][offerings]['Firmenbetreuer'] + data['Lehrender'] = self.data['Angebote'][offerings]['Lehrender'] + data['ZeitraumVon'] = self.data['Angebote'][offerings]['ZeitraumVon'] + data['ZeitraumBis'] = self.data['Angebote'][offerings]['ZeitraumBis'] + data['Student'] = self.data['Angebote'][offerings]['Student'] + self.Save(data, 'Angebote') + + #------------------------------------------------------- + def GetDefault(self, category): + #------------------------------------------------------- + if(category == 'Studenten'): + return {'Name':'', 'Vorname':'', 'Matrikelnummer':''} + elif(category == 'Lehrender'): + return {'Titel':'', 'Name':'', 'Vorname':'', 'Lehrgebiet':''} + elif(category == 'Firmen'): + return {'Name':'', 'Branche':'', 'Schwerpunkt':'', 'Sitz':'', 'Anzahl Mitarbeiter':''} + elif(category == 'Angebote'): + return {'Name':'', 'Firma':'', 'Beschreibung':'', 'Voraussetzungen':'', 'Firmenbetreuer':'', 'Status':'Angebot', 'Lehrender':'', 'ZeitraumVon':'', 'ZeitraumBis':'', 'Student':''} + + #------------------------------------------------------- + def IdNext(self, category): + #------------------------------------------------------- + path = 'data/' + category + '/last.json' + if(os.path.isfile(path)): + file = open(os.path.join('data', category, 'last.json'), 'r+') + last = file.read() + last = str(int(last)+1) + file.seek(0) + file.write(last) + file.close() + else: + file = open(os.path.join('data', category, 'last.json'), 'w+') + last = str(int(0)) + file.write(last) + file.close() + return last + +# EOF \ No newline at end of file diff --git a/Praktikum2/ppm2/app/eval.py b/Praktikum2/ppm2/app/eval.py new file mode 100644 index 0000000..b27f6d3 --- /dev/null +++ b/Praktikum2/ppm2/app/eval.py @@ -0,0 +1,87 @@ +# coding: utf-8 + +import json +import cherrypy +from app import database + +#------------------------------------------------------- +class Eval(object): +#------------------------------------------------------- + + exposed = True # gilt für alle Methoden + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + self.db = database.Database() + + #------------------------------------------------------- + def GET(self, cat=None): + #------------------------------------------------------- + self.db.CheckDates() + self.db.ReadAll() + data = {} + Studenten = self.db.data['Studenten'] + Lehrender = self.db.data['Lehrender'] + Firmen = self.db.data['Firmen'] + Angebote = self.db.data['Angebote'] + + data['category'] = cat + if(cat == 'Firmen'): + for keyFirma, valueFirma in sorted(Firmen.items()): + data[valueFirma['Name']] = {} + data[valueFirma['Name']]['Name'] = valueFirma['Name'] + data[valueFirma['Name']]['Angebote'] = {} + data[valueFirma['Name']]['Angebote']['Angebot'] = {} + data[valueFirma['Name']]['Angebote']['aktuell'] = {} + data[valueFirma['Name']]['Angebote']['abgeschlossen'] = {} + for keyAngebote, valueAngebote in Angebote.items(): + if(valueAngebote['Firma'] == valueFirma['Name']): + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']] = {} + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Name'] = valueAngebote['Name'] + if(valueAngebote['Student'] != ''): + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = Studenten[valueAngebote['Student']]['Name'] + else: + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Student'] = '' + if(valueAngebote['Lehrender'] != ''): + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = Lehrender[valueAngebote['Lehrender']]['Name'] + else: + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['Lehrender'] = '' + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumVon'] = valueAngebote['ZeitraumVon'] + data[valueFirma['Name']]['Angebote'][valueAngebote['Status']][valueAngebote['Name']]['ZeitraumBis'] = valueAngebote['ZeitraumBis'] + print(data) + return self.view.CreateListEval(data) + elif(cat == 'Studenten'): + for keyStudent, valueStudent in Studenten.items(): + data[valueStudent['Name']] = {} + data[valueStudent['Name']]['Angebote'] = {} + data[valueStudent['Name']]['Angebote']['Angebot'] = {} + data[valueStudent['Name']]['Angebote']['aktuell'] = {} + data[valueStudent['Name']]['Angebote']['abgeschlossen'] = {} + for keyAngebot, valueAngebot in Angebote.items(): + if(valueAngebot['Student'] == valueStudent['id']): + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {} + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Lehrender'] = Lehrender[valueAngebot['Lehrender']]['Name'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon'] + data[valueStudent['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis'] + elif(cat == 'Lehrender'): + for keyLehrende, valueLehrende in Lehrender.items(): + data[valueLehrende['Name']] = {} + data[valueLehrende['Name']]['Angebote'] = {} + data[valueLehrende['Name']]['Angebote']['Angebot'] = {} + data[valueLehrende['Name']]['Angebote']['aktuell'] = {} + data[valueLehrende['Name']]['Angebote']['abgeschlossen'] = {} + for keyAngebot, valueAngebot in Angebote.items(): + if(valueAngebot['Lehrender'] == valueLehrende['id']): + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot] = {} + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Student'] = Studenten[valueAngebot['Student']]['Name'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Status'] = valueAngebot['Status'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Praxisphase'] = valueAngebot['Name'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['Firma'] = valueAngebot['Firma'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumVon'] = valueAngebot['ZeitraumVon'] + data[valueLehrende['Name']]['Angebote'][valueAngebot['Status']][keyAngebot]['ZeitraumBis'] = valueAngebot['ZeitraumBis'] + print(data) + return json.dumps(data) diff --git a/Praktikum2/ppm2/app/templates.py b/Praktikum2/ppm2/app/templates.py new file mode 100644 index 0000000..adb2340 --- /dev/null +++ b/Praktikum2/ppm2/app/templates.py @@ -0,0 +1,37 @@ +# coding: utf-8 + +import json +import os +import codecs +import cherrypy + +#---------------------------------------------------------- +class Templates(object): +#---------------------------------------------------------- + + exposed = True # gilt für alle Methoden + + #------------------------------------------------------- + def __init__(self): + #------------------------------------------------------- + pass + + #------------------------------------------------------- + def GET(self): + #------------------------------------------------------- + retVal = { + 'templates': {} + } + + files = os.listdir('templates') + for fileName in files: + if fileName != '.DS_Store': + file = codecs.open(os.path.join('templates', fileName), 'rU', 'utf-8', errors='ignore') + content = file.read() + file.close() + retVal["templates"][fileName] = content + print(retVal) + + return json.dumps(retVal) + +# EOF \ No newline at end of file diff --git a/Praktikum2/ppm2/app/view.py.old b/Praktikum2/ppm2/app/view.py.old new file mode 100644 index 0000000..636a61f --- /dev/null +++ b/Praktikum2/ppm2/app/view.py.old @@ -0,0 +1,52 @@ +# import os.path +# from mako.template import Template +# from mako.lookup import TemplateLookup + +# #---------------------------------------------------------- +# class View_cl(object): +# #---------------------------------------------------------- + +# #------------------------------------------------------- +# def __init__(self): +# #------------------------------------------------------- +# self.path = 'templates' +# self.lookup = TemplateLookup(directories=['/']) + +# #------------------------------------------------------- +# def Create(self, template, data): +# #------------------------------------------------------- +# print("CreateView\n") +# template = Template(filename=os.path.join(self.path, template), output_encoding='utf-8', lookup=self.lookup) +# return template.render(data = data) + +# #------------------------------------------------------- +# def CreateIndex(self): +# #------------------------------------------------------- +# print("CreateIndex\n") +# data = None +# return self.Create('index.tpl', data) + +# #------------------------------------------------------- +# def CreateList(self, data): +# #------------------------------------------------------- +# return self.Create('list.tpl', data) + +# #------------------------------------------------------- +# def CreateListChoice(self, data): +# #------------------------------------------------------- +# return self.Create('listChoice.tpl', data) + +# #------------------------------------------------------- +# def CreateListEval(self, data): +# #------------------------------------------------------- +# return self.Create('listEval.tpl', data) + +# #------------------------------------------------------- +# def CreateDetail(self, data): +# #------------------------------------------------------- +# return self.Create('detail.tpl', data) + +# #------------------------------------------------------- +# def CreateDetailChoice(self, data): +# #------------------------------------------------------- +# return self.Create('detailChoice.tpl', data) \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Angebote/23.json b/Praktikum2/ppm2/data/Angebote/23.json new file mode 100644 index 0000000..b28de59 --- /dev/null +++ b/Praktikum2/ppm2/data/Angebote/23.json @@ -0,0 +1,13 @@ +{ + "Name": "Angebot IBM 1", + "ZeitraumBis": "01.01.2018", + "id": "23", + "Firmenbetreuer": "Sepp Meine", + "Firma": "IBM", + "Voraussetzungen": "Keine", + "Lehrender": "7", + "Status": "aktuell", + "Beschreibung": "Praxisphasenplatz bei IBM", + "ZeitraumVon": "01.01.2017", + "Student": "9" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Angebote/26.json b/Praktikum2/ppm2/data/Angebote/26.json new file mode 100644 index 0000000..f2fd625 --- /dev/null +++ b/Praktikum2/ppm2/data/Angebote/26.json @@ -0,0 +1,13 @@ +{ + "id": "26", + "ZeitraumVon": "02.02.2019", + "Firma": "Apple", + "Student": "10", + "Beschreibung": "Beschreibung", + "Name": "Name", + "Lehrender": "5", + "Firmenbetreuer": "Firmenbetreuer3", + "Voraussetzungen": "Kein", + "Status": "aktuell", + "ZeitraumBis": "02.02.2020" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Angebote/27.json b/Praktikum2/ppm2/data/Angebote/27.json new file mode 100644 index 0000000..966a816 --- /dev/null +++ b/Praktikum2/ppm2/data/Angebote/27.json @@ -0,0 +1,13 @@ +{ + "Lehrender": "5", + "Status": "abgeschlossen", + "Firmenbetreuer": "Horst", + "Firma": "Apple", + "Name": "Angebot Apple 2", + "Beschreibung": "Praxisphase Apple", + "Student": "11", + "Voraussetzungen": "Keine", + "ZeitraumBis": "02.02.2003", + "id": "27", + "ZeitraumVon": "02.02.2002" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Angebote/30.json b/Praktikum2/ppm2/data/Angebote/30.json new file mode 100644 index 0000000..31c0e32 --- /dev/null +++ b/Praktikum2/ppm2/data/Angebote/30.json @@ -0,0 +1,13 @@ +{ + "ZeitraumBis": "", + "Firmenbetreuer": "firmenbetreuer", + "id": "30", + "ZeitraumVon": "", + "Name": "name", + "Beschreibung": "beschreibung", + "Student": "", + "Lehrender": "", + "Status": "Angebot", + "Voraussetzungen": "voraussetzungen", + "Firma": "IBM" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Angebote/last.json b/Praktikum2/ppm2/data/Angebote/last.json new file mode 100644 index 0000000..a5c750f --- /dev/null +++ b/Praktikum2/ppm2/data/Angebote/last.json @@ -0,0 +1 @@ +27 \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Firmen/4.json b/Praktikum2/ppm2/data/Firmen/4.json new file mode 100644 index 0000000..98b84ab --- /dev/null +++ b/Praktikum2/ppm2/data/Firmen/4.json @@ -0,0 +1,8 @@ +{ + "id": "4", + "Branche": "IT", + "Sitz": "Cupertino", + "Schwerpunkt": "Informatik", + "Anzahl Mitarbeiter": "110000", + "Name": "Apple" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Firmen/5.json b/Praktikum2/ppm2/data/Firmen/5.json new file mode 100644 index 0000000..28aecae --- /dev/null +++ b/Praktikum2/ppm2/data/Firmen/5.json @@ -0,0 +1,8 @@ +{ + "id": "5", + "Branche": "IT", + "Sitz": "Redmond", + "Schwerpunkt": "Informatik", + "Anzahl Mitarbeiter": "114000", + "Name": "Microsoft" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Firmen/6.json b/Praktikum2/ppm2/data/Firmen/6.json new file mode 100644 index 0000000..cd2cba7 --- /dev/null +++ b/Praktikum2/ppm2/data/Firmen/6.json @@ -0,0 +1,8 @@ +{ + "id": "6", + "Branche": "IT", + "Sitz": "Armonk", + "Schwerpunkt": "Elektrotechnik", + "Anzahl Mitarbeiter": "377000", + "Name": "IBM" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Firmen/last.json b/Praktikum2/ppm2/data/Firmen/last.json new file mode 100644 index 0000000..62f9457 --- /dev/null +++ b/Praktikum2/ppm2/data/Firmen/last.json @@ -0,0 +1 @@ +6 \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Lehrender/5.json b/Praktikum2/ppm2/data/Lehrender/5.json new file mode 100644 index 0000000..cee342e --- /dev/null +++ b/Praktikum2/ppm2/data/Lehrender/5.json @@ -0,0 +1,7 @@ +{ + "Titel": "Prof", + "id": "5", + "Lehrgebiet": "Informatik", + "Name": "Heiner", + "Vorname": "Theodor" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Lehrender/6.json b/Praktikum2/ppm2/data/Lehrender/6.json new file mode 100644 index 0000000..bb4eb50 --- /dev/null +++ b/Praktikum2/ppm2/data/Lehrender/6.json @@ -0,0 +1,7 @@ +{ + "Titel": "Prof Dr", + "id": "6", + "Lehrgebiet": "Elektrotechnik", + "Name": "Anton", + "Vorname": "Emanuel" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Lehrender/7.json b/Praktikum2/ppm2/data/Lehrender/7.json new file mode 100644 index 0000000..2f4b91f --- /dev/null +++ b/Praktikum2/ppm2/data/Lehrender/7.json @@ -0,0 +1,7 @@ +{ + "Titel": "Prof", + "id": "7", + "Lehrgebiet": "Informatik", + "Name": "Adalbert", + "Vorname": "Bastian" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Lehrender/8.json b/Praktikum2/ppm2/data/Lehrender/8.json new file mode 100644 index 0000000..62b79b3 --- /dev/null +++ b/Praktikum2/ppm2/data/Lehrender/8.json @@ -0,0 +1,7 @@ +{ + "Titel": "Dr", + "id": "8", + "Lehrgebiet": "Elektrotechnik", + "Name": "Leberecht", + "Vorname": "Egon" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Lehrender/last.json b/Praktikum2/ppm2/data/Lehrender/last.json new file mode 100644 index 0000000..ca7bf83 --- /dev/null +++ b/Praktikum2/ppm2/data/Lehrender/last.json @@ -0,0 +1 @@ +13 \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Studenten/10.json b/Praktikum2/ppm2/data/Studenten/10.json new file mode 100644 index 0000000..31ac8db --- /dev/null +++ b/Praktikum2/ppm2/data/Studenten/10.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Timo", + "Name": "Ben", + "Matrikelnummer": "3", + "id": "10" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Studenten/11.json b/Praktikum2/ppm2/data/Studenten/11.json new file mode 100644 index 0000000..2ccc813 --- /dev/null +++ b/Praktikum2/ppm2/data/Studenten/11.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Korbinian", + "Name": "Moritz", + "Matrikelnummer": "6", + "id": "11" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Studenten/12.json b/Praktikum2/ppm2/data/Studenten/12.json new file mode 100644 index 0000000..406f91d --- /dev/null +++ b/Praktikum2/ppm2/data/Studenten/12.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Alfons", + "Name": "Meine", + "Matrikelnummer": "4", + "id": "12" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Studenten/13.json b/Praktikum2/ppm2/data/Studenten/13.json new file mode 100644 index 0000000..e463503 --- /dev/null +++ b/Praktikum2/ppm2/data/Studenten/13.json @@ -0,0 +1,6 @@ +{ + "id": "13", + "Name": "Edmund", + "Vorname": "Adalbert", + "Matrikelnummer": "1" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Studenten/9.json b/Praktikum2/ppm2/data/Studenten/9.json new file mode 100644 index 0000000..a4bd70d --- /dev/null +++ b/Praktikum2/ppm2/data/Studenten/9.json @@ -0,0 +1,6 @@ +{ + "Vorname": "Gregor", + "Name": "Klemens", + "Matrikelnummer": "2", + "id": "9" +} \ No newline at end of file diff --git a/Praktikum2/ppm2/data/Studenten/last.json b/Praktikum2/ppm2/data/Studenten/last.json new file mode 100644 index 0000000..da2d398 --- /dev/null +++ b/Praktikum2/ppm2/data/Studenten/last.json @@ -0,0 +1 @@ +14 \ No newline at end of file diff --git a/Praktikum2/ppm2/ppm2.pyproj b/Praktikum2/ppm2/ppm2.pyproj new file mode 100644 index 0000000..fdb09eb --- /dev/null +++ b/Praktikum2/ppm2/ppm2.pyproj @@ -0,0 +1,50 @@ + + + + Debug + 2.0 + {1747f32f-45d5-4d27-868d-c3fe710f4d86} + + server.py + + . + . + {888888a0-9f3d-457c-b088-3a5042f75d52} + Standard Python launcher + + + + + + + 10.0 + $(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Python Tools\Microsoft.PythonTools.targets + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Praktikum2/ppm2/ppm2.sln b/Praktikum2/ppm2/ppm2.sln new file mode 100644 index 0000000..9e6727a --- /dev/null +++ b/Praktikum2/ppm2/ppm2.sln @@ -0,0 +1,20 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 14 +VisualStudioVersion = 14.0.25420.1 +MinimumVisualStudioVersion = 10.0.40219.1 +Project("{888888A0-9F3D-457C-B088-3A5042F75D52}") = "ppm2", "ppm2.pyproj", "{1747F32F-45D5-4D27-868D-C3FE710F4D86}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {1747F32F-45D5-4D27-868D-C3FE710F4D86}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1747F32F-45D5-4D27-868D-C3FE710F4D86}.Release|Any CPU.ActiveCfg = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/Praktikum2/ppm2/server.conf b/Praktikum2/ppm2/server.conf new file mode 100644 index 0000000..3b608c4 --- /dev/null +++ b/Praktikum2/ppm2/server.conf @@ -0,0 +1,19 @@ +[global] +tools.log_headers.on: True +tools.sessions.on: False +tools.encode.on: True +tools.encode.encoding:"utf-8" + +server.socket_port: 8080 +server.socket_timeout:60 + +server.thread_pool: 10 +server.environment: "production" +log.screen: True + +[/] +tools.staticdir.root: cherrypy.Application.currentDir_s +tools.staticdir.on = True +tools.staticdir.dir = '.' +tools.staticdir.index = 'static/html/index.html' + diff --git a/Praktikum2/ppm2/server.py b/Praktikum2/ppm2/server.py new file mode 100644 index 0000000..bda808b --- /dev/null +++ b/Praktikum2/ppm2/server.py @@ -0,0 +1,54 @@ +# coding:utf-8 + +import os.path +import cherrypy + +from app import templates, category, choice, eval + +#---------------------------------------------------------- +def main(): +#---------------------------------------------------------- + + # aktuelles Verzeichnis ermitteln, damit es in der Konfigurationsdatei als + # Bezugspunkt verwendet werden kann + try: # aktuelles Verzeichnis als absoluter Pfad + currentDir_s = os.path.dirname(os.path.abspath(__file__)) + except: + currentDir_s = os.path.dirname(os.path.abspath(sys.executable)) + cherrypy.Application.currentDir_s = currentDir_s + + configFileName_s = 'server.conf' # im aktuellen Verzeichnis + if os.path.exists(configFileName_s) == False: + # Datei gibt es nicht + configFileName_s = None + + # autoreload und timeout_Monitor hier abschalten + # für cherrypy-Versionen >= "3.1.0" ! + cherrypy.engine.autoreload.unsubscribe() + cherrypy.engine.timeout_monitor.unsubscribe() + + # Standardverhalten, Berücksichtigung der Konfigurationsangaben im configFile + cherrypy.tree.mount( + None, '/', configFileName_s + ) + + cherrypy.tree.mount( + category.Category(), '/category', {'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}} + ) + cherrypy.tree.mount( + choice.Choice(), '/choice', {'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}} + ) + cherrypy.tree.mount( + eval.Eval(), '/eval', {'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}} + ) + cherrypy.tree.mount( + templates.Templates(), '/templates', {'/': {'request.dispatch': cherrypy.dispatch.MethodDispatcher()}} + ) + + cherrypy.engine.start() + cherrypy.engine.block() + +#---------------------------------------------------------- +if __name__ == '__main__': +#---------------------------------------------------------- + main() \ No newline at end of file diff --git a/Praktikum2/ppm2/static/css/style.css b/Praktikum2/ppm2/static/css/style.css new file mode 100644 index 0000000..cbbf0f7 --- /dev/null +++ b/Praktikum2/ppm2/static/css/style.css @@ -0,0 +1 @@ +body{font-family:"Open Sans",sans-serif;font-size:12pt;padding:0;margin:0;}.clSiteHeader{position:absolute;top:0;left:0;right:0;height:100px;line-height:100px;margin:0;padding:5px;font-size:40pt;text-align:center;text-shadow:black 3px 2px;font-family:"Open Sans",sans-serif;background-color:#084791;border:none;border-radius:60px;}.clSiteHeader a{text-decoration:none;color:white;}.clSiteHeader:hover{background-color:#0D71E4;cursor:pointer;}.clSiteHeader a:visited,a:active{color:white;text-decoration:none;}.clContent{position:absolute;top:150px;left:0;right:0;bottom:0;margin:0;padding:5px;background-repeat:no-repeat;background-position:bottom left;}.clContentHeader{position:absolute;top:20px;left:0;right:0;height:30px;line-height:30px;margin:0;padding:5px;font-size:18pt;text-align:center;}.clContentArea{position:absolute;top:80px;left:0;right:0;bottom:0px;margin:10px 0;margin-left:10px;padding:5px;background-attachment:#819FF7;}.clButtonArea{position:absolute;left:0;right:0;bottom:0;height:80px;line-height:80px;margin:0;padding:5px;text-align:center;background-color:#FFFFFF;}.clButtonArea a,input[type="submit"]{margin:0 5px;padding:3px 6px;font-size:14pt;text-decoration:none;border:2px solid;color:white;background-color:#084791;}.clButtonArea a:hover{color:white;background-color:#0D71E4;cursor:pointer;}.clButtonArea a:visited,a:active{color:white;}.clNavButton{display:inline-block;text-align:center;background-color:#084791;border:1px solid black;color:white;padding:15px 32px;text-decoration:none;font-size:16px;cursor:pointer;float:left;clear:left;width:20%;margin-left:38%;margin-right:30%;}.clNavButton:hover{background-color:#0D71E4;}#idList{table-layout:fixed;width:auto;border:2px solid;border-collapse:collapse;margin:auto;}#idList th{text-align:center;padding-left:5px;background-color:white;padding:3px;border:2px solid;}#idList td{padding:3px;border:2px solid;cursor:pointer;}#idForm .clContentArea{width:500px;margin:auto;}.selected{background-color:#0D71E4;color:white;}.clFormRow{position:relative;height:30px;margin-bottom:10px;}.clFormRow label{position:absolute;top:0;left:0;width:240px;text-align:center;}.clFormRow input{position:absolute;top:0;left:250px;width:250px;}.clFormRow select{position:absolute;top:0;left:250px;width:250px;}.clMenu{list-style-type:none;padding-left:0;margin-left:0;}h3{text-align:center;} \ No newline at end of file diff --git a/Praktikum2/ppm2/static/html/detail.html b/Praktikum2/ppm2/static/html/detail.html new file mode 100644 index 0000000..1fa65ec --- /dev/null +++ b/Praktikum2/ppm2/static/html/detail.html @@ -0,0 +1,75 @@ + + + + + Praxisphasenmanager (PPM) + + + + + +

+ Praxisphasenmanager (PPM) +

+ +
+

+ ${data['category']}: Ihre Daten +

+
+ + + % if data['category'] != 'Angebote': + % for field in data['content']: + % if field!='id' and field!='Status': +
+ + + % else: + "" id="${field}" name="${field}" /> + % endif +
+ % endif + % endfor + % else: + + + + + + % for field in data['content']: + % if field!='id' and field!='Status' and field!='ZeitraumVon' and field!='ZeitraumBis' and field!='Lehrender' and field!='Student': +
+ + % if field!='Firma': + + % else: + "" id="${field}" name="${field}" /> + % endif + % else: + + % endif +
+ % endif + % endfor + % endif + + +
+
+ + \ No newline at end of file diff --git a/Praktikum2/ppm2/static/html/detailChoice.html b/Praktikum2/ppm2/static/html/detailChoice.html new file mode 100644 index 0000000..1451eae --- /dev/null +++ b/Praktikum2/ppm2/static/html/detailChoice.html @@ -0,0 +1,66 @@ + + + + + Praxisphasenmanager (PPM) + + + + + +

+ Praxisphasenmanager (PPM) +

+ +
+

+ Praxisphasenangebots Auswahl +

+
+ + + + + + + + +
+ + +
+ +
+ + +
+ +
+ + +
+ +
+ + +
+ + +
+
+ + \ No newline at end of file diff --git a/Praktikum2/ppm2/static/html/index.html b/Praktikum2/ppm2/static/html/index.html new file mode 100644 index 0000000..6e2abee --- /dev/null +++ b/Praktikum2/ppm2/static/html/index.html @@ -0,0 +1,37 @@ + + + + + Praxisphasenmanager (PPM) + + + + + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

Module

+
+ +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm2/static/html/listChoice.html b/Praktikum2/ppm2/static/html/listChoice.html new file mode 100644 index 0000000..5241c5c --- /dev/null +++ b/Praktikum2/ppm2/static/html/listChoice.html @@ -0,0 +1,56 @@ + + + + + Praxisphasenmanager (PPM) + + + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

+ Übersicht Praxisphasen Auswahl +

+
+ + + + + + + + + + % if data['content']!= None: + % for entries in data['content']: + + + + + + + + % endfor + + % endif + +
NameFirmaBeschreibungVoraussetzungenFirmenbetreuer
${data['content'][entries]['Name']}${data['content'][entries]['Firma']}${data['content'][entries]['Beschreibung']}${data['content'][entries]['Voraussetzungen']}${data['content'][entries]['Firmenbetreuer']}
+
+ +
+ Startseite + Annehmen +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm2/static/html/listEval.html b/Praktikum2/ppm2/static/html/listEval.html new file mode 100644 index 0000000..0bab960 --- /dev/null +++ b/Praktikum2/ppm2/static/html/listEval.html @@ -0,0 +1,146 @@ + + + + + Praxisphasenmanager (PPM) + + + + + + +

+ Praxisphasenmanager (PPM) +

+
+

+ Übersicht: ${data['category']} +

+
+ % if data['category'] == 'Firmen': + % for firmen in data: + % if firmen != 'category': +

${firmen}

+ + + + + + + + + % for aktuell in data[firmen]['Angebote']['aktuell']: + + + + + + + + % endfor + % for abgeschlossen in data[firmen]['Angebote']['abgeschlossen']: + + + + + + + + % endfor +
StatusStudentLehrenderZeitraum: VonZeitraum: Bis
Aktuell${data[firmen]['Angebote']['aktuell'][aktuell]['Student']}${data[firmen]['Angebote']['aktuell'][aktuell]['Lehrender']}${data[firmen]['Angebote']['aktuell'][aktuell]['ZeitraumVon']}${data[firmen]['Angebote']['aktuell'][aktuell]['ZeitraumBis']}
Abgeschlossen${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['Student']}${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['Lehrender']}${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['ZeitraumVon']}${data[firmen]['Angebote']['abgeschlossen'][abgeschlossen]['ZeitraumBis']}
+ % endif + % endfor + % endif + + % if data['category'] == 'Studenten': + % for studenten in data: + % if studenten != 'category': +

${studenten}

+ + + + + + + + + + % for angebote in data[studenten]['Angebote']['aktuell']: + + + + + + + + + % endfor + % for angebote in data[studenten]['Angebote']['abgeschlossen']: + + + + + + + + + % endfor + + +
LehrenderFirmaPraxisphaseStatusZeitraum: VonZeitraum: Bis
${data[studenten]['Angebote']['aktuell'][angebote]['Lehrender']}${data[studenten]['Angebote']['aktuell'][angebote]['Firma']}${data[studenten]['Angebote']['aktuell'][angebote]['Praxisphase']}${data[studenten]['Angebote']['aktuell'][angebote]['Status']}${data[studenten]['Angebote']['aktuell'][angebote]['ZeitraumVon']}${data[studenten]['Angebote']['aktuell'][angebote]['ZeitraumBis']}
${data[studenten]['Angebote']['abgeschlossen'][angebote]['Lehrender']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['Firma']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['Praxisphase']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['Status']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['ZeitraumVon']}${data[studenten]['Angebote']['abgeschlossen'][angebote]['ZeitraumBis']}
+ % endif + % endfor + % endif + + % if data['category'] == 'Lehrender': + % for Lehrender in data: + % if Lehrender != 'category': +

${Lehrender}

+ + + + + + + + + + % if data[Lehrender] != NULL: + % for angebote in data[Lehrender]['Angebote']['aktuell']: + + + + + + + + + % endfor + % for angebote in data[Lehrender]['Angebote']['abgeschlossen']: + + + + + + + + + % endfor + % endif +
StudentFirmaPraxisphaseStatusZeitraum: VonZeitraum: Bis
${data[Lehrender]['Angebote']['aktuell'][angebote]['Student']}${data[Lehrender]['Angebote']['aktuell'][angebote]['Firma']}${data[Lehrender]['Angebote']['aktuell'][angebote]['Praxisphase']}${data[Lehrender]['Angebote']['aktuell'][angebote]['Status']}${data[Lehrender]['Angebote']['aktuell'][angebote]['ZeitraumVon']}${data[Lehrender]['Angebote']['aktuell'][angebote]['ZeitraumBis']}
${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Student']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Firma']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Praxisphase']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['Status']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['ZeitraumVon']}${data[Lehrender]['Angebote']['abgeschlossen'][angebote]['ZeitraumBis']}
+ % endif + % endfor + % endif +
+ +
+ Startseite +
+
+ + + \ No newline at end of file diff --git a/Praktikum2/ppm2/static/js/jquery-3.1.1.min.js b/Praktikum2/ppm2/static/js/jquery-3.1.1.min.js new file mode 100644 index 0000000..4c5be4c --- /dev/null +++ b/Praktikum2/ppm2/static/js/jquery-3.1.1.min.js @@ -0,0 +1,4 @@ +/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R), +a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)), +void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("