commit 062b2dfae8fe69428c8c6823ac80d903b1f4fb1e Author: aschwarz Date: Tue Mar 14 14:47:50 2023 +0100 first commit diff --git a/2022-01-12_index.php b/2022-01-12_index.php new file mode 100644 index 0000000..bec9e85 --- /dev/null +++ b/2022-01-12_index.php @@ -0,0 +1,646 @@ + now() + ORDER BY date_format(datum, '%Y%m%d') ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + + $query_anzgesp = $db->query("SELECT count(distinct lfd_haushalt) Anz + FROM gd_buchung + WHERE tid = $row1[tid] + "); + $row_anzgesp = $query_anzgesp->fetch_array(); + +#04.07.2021 | 1 | 0 +#11.07.2021 | 1 | 2 +#18.07.2021 | 1 | 3 +#25.07.2021 | 1 | 4 + + // Überprüfung, ob die Anmeldefrist überschritten ist + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum + $heute_format = date("YmdHis", $heute); // ISO-8601 Format wie in der Datenbank: Formatierung für Vergleiche erforderlich + + + $a = strtotime ($heute_format); //Umrechnung des Fristgrenztages in eine Zahl + $b = strtotime ($row1['Anmeldestopp']); // Umrechnung des Enddatums in eine Zahl + +#echo "$row1[datum] | $a | $b
"; + if(($row_anzgesp['Anz'] >= $gesperrt) or ($row1['loginstop'] != '0000-00-00 00:00:00') or ($b<=$a)){ + $hinweis_gepserrt =1; + }else{ + $hinweis_gepserrt =0; + } + if(!isset($zaehler) or $zaehler == 1){ + $zaehler = 0; + }else{ + $zaehler = 1; + } + $row1['hinweis_gepserrt'] = $hinweis_gepserrt; + $row1['zaehler'] = $zaehler; + $table_data1[] = $row1; + + } + $smarty->assign('table_data1', $table_data1); + + # + for($i=0;$iassign('checked_'.$_SESSION["termin"][$i], "1"); + } + #Session wird zurückgesetzt, da Sie nach dem Auslesen wieder durch POST gesetzt wird + unset($_SESSION["termin"]); + #echo "
";
+  #print_r($table_data1);
+  #echo "
"; + + ## Fehlerhandling + $error1 = $_GET['error1']; + + if($error1 == 1){ + $smarty->assign('termin_error', 1); + + if($error1 == 1){ + $smarty->assign('termin_error_text', 'Sie müssen einen Termin auswählen für den nächsten Schritt'); + } + } +} + +if ($action == 'hausstand') { + + if(isset($_POST["termin"])){ + $termin = $_POST["termin"]; + $_SESSION["termin"] = $termin; + }else{ + if(isset($_SESSION["termin"])){ + $termin = $_SESSION["termin"]; + }else{ + $error1=1; + $error=true; + } + } + + if(isset($error)){ + echo ""; + exit; + } + + + + + + $smarty->assign('hausstand_value_nachname1', $_SESSION["nachname1"]); + $smarty->assign('hausstand_value_vorname1', $_SESSION["vorname1"]); + $smarty->assign('hausstand_value_nachname2', $_SESSION["nachname2"]); + $smarty->assign('hausstand_value_vorname2', $_SESSION["vorname2"]); + $smarty->assign('hausstand_value_nachname3', $_SESSION["nachname3"]); + $smarty->assign('hausstand_value_vorname3', $_SESSION["vorname3"]); + $smarty->assign('hausstand_value_nachname4', $_SESSION["nachname4"]); + $smarty->assign('hausstand_value_vorname4', $_SESSION["vorname4"]); + $smarty->assign('hausstand_value_nachname5', $_SESSION["nachname5"]); + $smarty->assign('hausstand_value_mail', $_SESSION["mail"]); + $smarty->assign('hausstand_value_vorname5', $_SESSION["vorname5"]); + + ## Fehlerhandling + $error1 = $_GET['error1']; + + if($error1 == 1){ + $smarty->assign('hausstand_error', 1); + + if($error1 == 1){ + $smarty->assign('hausstand_error_text', 'Sie müssen zumindest eine Person erfassen.'); + } + } +} + + +if ($action == 'overview') { + if(isset($_POST['nachname1'])){ + $nachname1 = trim($_POST['nachname1']); + }else{ + $nachname1 = $_SESSION["nachname1"]; + } + + if(isset($_POST['vorname1'])){ + $vorname1 = trim($_POST['vorname1']); + }else{ + $vorname1 = $_SESSION["vorname1"]; + } + + if(isset($_POST['nachname2'])){ + $nachname2 = trim($_POST['nachname2']); + }else{ + $nachname2 = $_SESSION["nachname2"]; + } + + if(isset($_POST['vorname2'])){ + $vorname2 = trim($_POST['vorname2']); + }else{ + $vorname2 = $_SESSION["vorname2"]; + } + + if(isset($_POST['nachname3'])){ + $nachname3 = trim($_POST['nachname3']); + }else{ + $nachname3 = $_SESSION["nachname3"]; + } + + if(isset($_POST['vorname3'])){ + $vorname3 = trim($_POST['vorname3']); + }else{ + $vorname3 = $_SESSION["vorname3"]; + } + + if(isset($_POST['nachname4'])){ + $nachname4 = trim($_POST['nachname4']); + }else{ + $nachname4 = $_SESSION["nachname4"]; + } + + if(isset($_POST['vorname4'])){ + $vorname4 = trim($_POST['vorname4']); + }else{ + $vorname4 = $_SESSION["vorname4"]; + } + + if(isset($_POST['nachname5'])){ + $nachname5 = trim($_POST['nachname5']); + }else{ + $nachname5 = $_SESSION["nachname5"]; + } + + if(isset($_POST['mail'])){ + $mail = trim($_POST['mail']); + }else{ + $mail = $_SESSION["mail"]; + } + + if(isset($_POST['vorname5'])){ + $vorname5 = trim($_POST['vorname5']); + }else{ + $vorname5 = $_SESSION["vorname5"]; + } + + $_SESSION["nachname1"] = $nachname1; + $_SESSION["vorname1"] = $vorname1; + $_SESSION["nachname2"] = $nachname2; + $_SESSION["vorname2"] = $vorname2; + $_SESSION["nachname3"] = $nachname3; + $_SESSION["vorname3"] = $vorname3; + $_SESSION["nachname4"] = $nachname4; + $_SESSION["vorname4"] = $vorname4; + $_SESSION["nachname5"] = $nachname5; + $_SESSION["vorname5"] = $vorname5; + $_SESSION["mail"] = $mail; + + if ($nachname1 == '' AND $nachname2 == '' AND $nachname3 == '' AND $nachname4 == '' AND $nachname5 == '') { + $error1=1; + $error=true; + } + + if(isset($error)){ + echo ""; + exit; + } + for($i=0;$iquery("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM gd_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + $row1['beginn'] = $row_termin['beginn']; + $row1['hinweis'] = $row_termin['hinweis']; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + + $smarty->assign('overview_value_beginn', $row_termin["beginn"]); + $smarty->assign('overview_value_hinweis', $row_termin["hinweis"]); + $smarty->assign('overview_value_nachname1', $_SESSION["nachname1"]); + $smarty->assign('overview_value_vorname1', $_SESSION["vorname1"]); + $smarty->assign('overview_value_nachname2', $_SESSION["nachname2"]); + $smarty->assign('overview_value_vorname2', $_SESSION["vorname2"]); + $smarty->assign('overview_value_nachname3', $_SESSION["nachname3"]); + $smarty->assign('overview_value_vorname3', $_SESSION["vorname3"]); + $smarty->assign('overview_value_nachname4', $_SESSION["nachname4"]); + $smarty->assign('overview_value_vorname4', $_SESSION["vorname4"]); + $smarty->assign('overview_value_nachname5', $_SESSION["nachname5"]); + $smarty->assign('overview_value_vorname5', $_SESSION["vorname5"]); + $smarty->assign('overview_value_mail', $_SESSION["mail"]); +} + +if ($action == 'save') { + + $nachname1 = $_SESSION["nachname1"]; + $vorname1 = $_SESSION["vorname1"]; + $nachname2 = $_SESSION["nachname2"]; + $vorname2 = $_SESSION["vorname2"]; + $nachname3 = $_SESSION["nachname3"]; + $vorname3 = $_SESSION["vorname3"]; + $nachname4 = $_SESSION["nachname4"]; + $vorname4 = $_SESSION["vorname4"]; + $nachname5 = $_SESSION["nachname5"]; + $vorname5 = $_SESSION["vorname5"]; + $mail = $_SESSION["mail"]; + +for($i=0;$i +# $lfd_haushalt +#
+# "; + $datum=date("Y-m-d H:i:s"); + + if($nachname1 != ''){ + if($return = doppelanmelder($termin, $vorname1, $nachname1)){ + $crypt1 = "$return"; + }else{ + $sitzplatz1 = get_sitzplatz($nachname1, $vorname1); + $split1 = explode("|", $sitzplatz1); + $reihe1 = $split1[0]; + $platz1 = $split1[1]; + $sql1 = $db->query("insert into gd_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname1', '$vorname1', '$reihe1', '$platz1', '$mail', '$lfd_haushalt', '$datum')"); + $bid1 = $db->insert_id; + $crypt1 = rawurlencode(cryption("$bid1|$nachname1|$termin", 'e')); + } + } + if($nachname2 != ''){ + if($return = doppelanmelder($termin, $vorname2, $nachname2)){ + $crypt2 = "$return"; + }else{ + $sitzplatz2 = get_sitzplatz($nachname2, $vorname2); + $split2 = explode("|", $sitzplatz2); + $reihe2 = $split2[0]; + $platz2 = $split2[1]; + $sql1 = $db->query("insert into gd_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname2', '$vorname2', '$reihe2', '$platz2', '$mail', '$lfd_haushalt', '$datum')"); + $bid2 = $db->insert_id; + $crypt2 = rawurlencode(cryption("$bid2|$nachname2|$termin", 'e')); + } + } + if($nachname3 != ''){ + if($return = doppelanmelder($termin, $vorname3, $nachname3)){ + $crypt3 = "$return"; + }else{ + $sitzplatz3 = get_sitzplatz($nachname3, $vorname3); + $split3 = explode("|", $sitzplatz3); + $reihe3 = $split3[0]; + $platz3 = $split3[1]; + $sql1 = $db->query("insert into gd_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname3', '$vorname3', '$reihe3', '$platz3', '$mail', '$lfd_haushalt', '$datum')"); + $bid3 = $db->insert_id; + $crypt3 = rawurlencode(cryption("$bid3|$nachname3|$termin", 'e')); + } + } + if($nachname4 != ''){ + if($return = doppelanmelder($termin, $vorname4, $nachname4)){ + $crypt4 = "$return"; + }else{ + $sitzplatz4 = get_sitzplatz($nachname4, $vorname4); + $split4 = explode("|", $sitzplatz4); + $reihe4 = $split4[0]; + $platz4 = $split4[1]; + $sql1 = $db->query("insert into gd_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname4', '$vorname4', '$reihe4', '$platz4', '$mail', '$lfd_haushalt', '$datum')"); + $bid4 = $db->insert_id; + $crypt4 = rawurlencode(cryption("$bid4|$nachname4|$termin", 'e')); + } + } + if($nachname5 != ''){ + if($return = doppelanmelder($termin, $vorname5, $nachname5)){ + $crypt5 = "$return"; + }else{ + $sitzplatz5 = get_sitzplatz($nachname5, $vorname5); + $split5 = explode("|", $sitzplatz5); + $reihe5 = $split5[0]; + $platz5 = $split5[1]; + $sql1 = $db->query("insert into gd_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname5', '$vorname5', '$reihe5', '$platz5', '$mail', '$lfd_haushalt', '$datum')"); + $bid5 = $db->insert_id; + $crypt5 = rawurlencode(cryption("$bid5|$nachname5|$termin", 'e')); + } + } + #Anzahl der gemeldeten Haushalte überschritten? + kritische_haushalte($termin); + + + + + if(isset($_SESSION["mail"]) AND $mail !=''){ + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis, fellbach_gd + FROM gd_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + $empfaenger = "$mail"; + $betreff = "Registrierung zum Gottesdienst am $row_termin[beginn] Uhr"; + $text = " + + + Registrierung zum Gottesdienst + + + + Guten Tag!

+ Sie haben sich zum Gottesdienst in der neuapostolischen Kirche Weinstadt-Beutelsbach registriert.
+ Nachfolgend finden Sie die hinterlegten Daten: +
+
+ + + + + + + + + + + "; + if($nachname1 != ''){ + $text .=" + + + + + "; + $nname[] = "$nachname1"; + $vname[] = "$vorname1"; + } + if($nachname2 != ''){ + $text .=" + + + + + "; + $nname[] = "$nachname2"; + $vname[] = "$vorname2"; + } + if($nachname3 != ''){ + $text .=" + + + + + "; + $nname[] = "$nachname3"; + $vname[] = "$vorname3"; + } + if($nachname4 != ''){ + $text .=" + + + + + "; + $nname[] = "$nachname4"; + $vname[] = "$vorname4"; + } + if($nachname5 != ''){ + $text .=" + + + + + "; + $nname[] = "$nachname5"; + $vname[] = "$vorname5"; + } + $text .=" + +
+ + Datum: + + + + $row_termin[beginn]";if($row_termin['hinweis'] != ''){ $text .=" ($row_termin[hinweis])";} + $text.=" + +
+   + +   + +   +
+ + Person 1: + + + + $nachname1, $vorname1 + + + Abmeldung +
+ + Person 2: + + + + $nachname2, $vorname2 + + + Abmeldung +
+ + Person 3: + + + + $nachname3, $vorname3 + + + Abmeldung +
+ + Person 4: + + + + $nachname4, $vorname4 + + + Abmeldung +
+ + Person 5: + + + + $nachname5, $vorname5 + + + Abmeldung +
+
+ Link zur Registrierung: Registrierung zum Gottesdienst +

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + $text = stripslashes($text); + + if($row_termin['fellbach_gd'] == 'N'){ + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: Gottesdienstregistrierung \n"; + #$headers .= "Bcc: \n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + }else{ + + + require_once("./mpdf/vendor/autoload.php"); + $mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4', + 'orientation' => 'P', + 'margin_top' => 10, + 'margin_bottom' => 20, + 'margin_left' => 10, + 'margin_right' => 16, + 'default_font' => 'arial', + + ]); + $buffer = ''; + $buffer.=" + "; + $cnt=0; + for($i=0;$i
+ $qr_id +

$vname[$i] $nname[$i]


+ Dieser QR-Code dient lediglich zur Einlasskontrolle in die KircheFellbach und enthält keine persönlichen Daten.

+ Neuapostolische Kirche Fellbach
+ Kastanienweg 5
+ 70734 Fellbach + "; + }else{ + $buffer.=" +
"; + } + if($cnt == 3){ + #$buffer.=""; + $cnt = 0; + } + + $cnt++; + } + $buffer.=" + +
+ Kein QR Code vorhanden! +
+

$vname[$i] $nname[$i]

+
+
"; + $mpdf->WriteHTML($buffer); + $mpdf->Output("./admin/pdfs/QR_Codes_Fellbach_$nachname1.pdf", F); + + + $pdfLocation = "./admin/pdfs/QR_Codes_Fellbach_$nachname1.pdf"; // file location + $pdfName = "QR_Codes_Fellbach_$nachname1.pdf"; // pdf file name recipient will get + $filetype = "application/pdf"; // type + + // create headers and mime boundry + $eol = PHP_EOL; + $semi_rand = md5(time()); + $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; + $headers = "From: Gottesdienstregistrierung $eol" . + "MIME-Version: 1.0$eol" . + "Content-Type: multipart/mixed;$eol" . + " boundary=\"$mime_boundary\""; + + // add html message body + $message = "--$mime_boundary$eol" . + "Content-Type: text/html; charset=\"utf-8\"$eol" . + "Content-Transfer-Encoding: 7bit$eol$eol" . + $text . $eol; + + // fetch pdf + $file = fopen($pdfLocation, 'rb'); + $data = fread($file, filesize($pdfLocation)); + fclose($file); + $pdf = chunk_split(base64_encode($data)); + + // attach pdf to email + $message .= "--$mime_boundary$eol" . + "Content-Type: $filetype;$eol" . + " name=\"$pdfName\"$eol" . + "Content-Disposition: attachment;$eol" . + " filename=\"$pdfName\"$eol" . + "Content-Transfer-Encoding: base64$eol$eol" . + $pdf . $eol . + "--$mime_boundary--"; + + // Send the email + $return = @mail($empfaenger, $betreff, $message, $headers); + unlink($pdfLocation); + + } + } +} + + + session_destroy(); +} + + +$smarty->assign('action', "$action"); +$smarty->display("$template/$templatename"); +?> diff --git a/abmeldung.php b/abmeldung.php new file mode 100644 index 0000000..bd2a4e9 --- /dev/null +++ b/abmeldung.php @@ -0,0 +1,175 @@ +query("SELECT count(*) Anz + FROM jumi_buchung + WHERE bid = $bid + AND tid = $termin"); + $row = $result->fetch_array(); + + if($row['Anz'] == 0 or $row['Anz'] >1){ + $smarty->assign('abmelde_error', 1); + }else{ + $smarty->assign('abmelde_error', 0); + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + $smarty->assign('abmelde_termin', $row_termin['beginn']); + $_SESSION["sabmelde_termin"] = $row_termin['beginn']; + $_SESSION["sabmelde_tid"] = $termin; + + $result_name = $db->query("SELECT nachname, vorname + FROM jumi_buchung + WHERE bid = $bid"); + $row_name = $result_name->fetch_array(); + $smarty->assign('abmelde_vorname', $row_name['vorname']); + $smarty->assign('abmelde_nachname', $row_name['nachname']); + $_SESSION["sabmelde_vorname"] = $row_name['vorname']; + $_SESSION["sabmelde_nachname"] = $row_name['nachname']; + } +} + +if ($action == 'del') { + $bid = $_SESSION["sabmelde_bid"]; + $antwort = $_GET['antwort']; + $termin = $_SESSION["sabmelde_termin"]; + $vorname = $_SESSION["sabmelde_vorname"]; + $nachname = $_SESSION["sabmelde_nachname"]; + $tid = $_SESSION["sabmelde_tid"]; + + if($antwort == 'Y'){ + $result_mail = $db->query("SELECT mail + FROM jumi_buchung + WHERE bid = $bid"); + $row_mail = $result_mail->fetch_array(); + + + $sql1 = $db->query("DELETE FROM jumi_buchung WHERE bid = $bid"); + $ausgabe = "Sie haben $vorname $nachname vom Gottesdienst am $termin Uhr abgemeldet"; + + $anmeldestopp = get_parameter(3); + + $result_stop = $db->query("SELECT 1 offen + FROM jumi_termine + WHERE tid = $tid + AND (DATE_SUB(datum, INTERVAL $anmeldestopp HOUR) > now() + OR loginstop != '0000-00-00 00:00:00')"); + $row_stop = $result_stop->fetch_array(); + + if($row_stop['offen'] != '1'){ + # Anmeldungen sind bereits gesperrt, dann Mail senden + + $empfaenger = get_parameter(5); // addresses to email pdf to + $betreff = "Abmeldung zum Gottesdienst am ".$termin; // email subject + $text = " + + Abmeldung zum Gottesdienst + + + + Guten Tag!

+ Folgende Abmeldungen zum Gottesdienstes haben sich ergeben: +

+ Datum: $termin
+ Person: $nachname, $vorname +
+

+ Ggf. wird dadurch ein Sitzplatz verfügbar!
+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + + // create headers and mime boundry + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: NAK Beutelsbach \n"; + #$headers .= "Bcc: \n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + } + + if($row_mail['mail'] != ''){ + + $empfaenger = $row_mail['mail']; // addresses to email pdf to + $betreff = "Abmeldung zum Gottesdienst am ".$termin; // email subject + $text = " + + Abmeldung zum Gottesdienst + + + + Guten Tag!

+ Sie haben sich zum Gottesdienst in der neuapostolischen Kirche Weinstadt-Beutelsbach abgemeldet.
+

+ Datum: $termin
+ Person: $nachname, $vorname +
+

+ Link zur Registrierung: Registrierung zum Gottesdienst +

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + + // create headers and mime boundry + + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: NAK Beutelsbach \n"; + #$headers .= "Bcc: \n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + + } + + + + + + }else{ + $ausgabe = "Sie haben $vorname $nachname vom Gottesdienst am $termin Uhr NICHT abgemeldet"; + } + $smarty->assign('abmelde_ausgabe', $ausgabe); + session_destroy(); +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/$templatename"); +?> diff --git a/abmeldung.php_20210111 b/abmeldung.php_20210111 new file mode 100644 index 0000000..1cda9a4 --- /dev/null +++ b/abmeldung.php_20210111 @@ -0,0 +1,142 @@ +query("SELECT count(*) Anz + FROM gd_buchung + WHERE bid = $bid + AND tid = $termin"); + $row = $result->fetch_array(); + + if($row['Anz'] == 0 or $row['Anz'] >1){ + $smarty->assign('abmelde_error', 1); + }else{ + $smarty->assign('abmelde_error', 0); + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM gd_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + $smarty->assign('abmelde_termin', $row_termin['beginn']); + $_SESSION["sabmelde_termin"] = $row_termin['beginn']; + $_SESSION["sabmelde_tid"] = $termin; + + $result_name = $db->query("SELECT nachname, vorname + FROM gd_buchung + WHERE bid = $bid"); + $row_name = $result_name->fetch_array(); + $smarty->assign('abmelde_vorname', $row_name['vorname']); + $smarty->assign('abmelde_nachname', $row_name['nachname']); + $_SESSION["sabmelde_vorname"] = $row_name['vorname']; + $_SESSION["sabmelde_nachname"] = $row_name['nachname']; + } +} + +if ($action == 'del') { + $bid = $_SESSION["sabmelde_bid"]; + $antwort = $_GET['antwort']; + $termin = $_SESSION["sabmelde_termin"]; + $vorname = $_SESSION["sabmelde_vorname"]; + $nachname = $_SESSION["sabmelde_nachname"]; + $tid = $_SESSION["sabmelde_tid"]; + + if($antwort == 'Y'){ + $sql1 = $db->query("DELETE FROM gd_buchung WHERE bid = $bid"); + $ausgabe = "Sie haben $vorname $nachname vom Gottesdienst am $termin Uhr abgemeldet"; + + $anmeldestopp = get_parameter(3); + + $result_stop = $db->query("SELECT 1 offen + FROM gd_termine + WHERE tid = $tid + AND (DATE_SUB(datum, INTERVAL $anmeldestopp HOUR) > now() + OR loginstop != '0000-00-00 00:00:00')"); + $row_stop = $result_stop->fetch_array(); + + if($row_stop['offen'] != '1'){ + # Anmeldungen sind bereits gesperrt, dann Mail senden + + $to = get_parameter(5); // addresses to email pdf to + $from = "NAK Beutelsbach "; // address message is sent from + $subject = "Abmeldung zum Gottesdienst am ".$termin; // email subject + $body = " + + Abmeldung zum Gottesdienst + + + + Guten Tag!

+ Folgende Abmeldungen zum Gottesdienstes haben sich ergeben: +

+ Datum: $termin
+ Person: $nachname, $vorname +
+

+ Ggf. wird dadurch ein Sitzplatz verfügbar! + Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + $pdfLocation = "./pdfs/".$row_get_termin['datum_output']."_Gottesdienstteilnehmer.pdf"; // file location + $pdfName = $row_get_termin['datum_output']."_Gottesdienstteilnehmer.pdf"; // pdf file name recipient will get + $filetype = "application/pdf"; // type + + // create headers and mime boundry + $eol = PHP_EOL; + $semi_rand = md5(time()); + $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; + $headers = "From: $from$eol" . + "MIME-Version: 1.0$eol" . + "Content-Type: multipart/mixed;$eol" . + " boundary=\"$mime_boundary\""; + + // add html message body + $message = "--$mime_boundary$eol" . + "Content-Type: text/html; charset=\"iso-8859-1\"$eol" . + "Content-Transfer-Encoding: 7bit$eol$eol" . + $body . $eol; + + // Send the email + mail($to, $subject, $message, $headers); + } + + + + + }else{ + $ausgabe = "Sie haben $vorname $nachname vom Gottesdienst am $termin Uhr NICHT abgemeldet"; + } + $smarty->assign('abmelde_ausgabe', $ausgabe); + session_destroy(); +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/$templatename"); +?> diff --git a/admin/2022-01-12_unzugeordnet.php b/admin/2022-01-12_unzugeordnet.php new file mode 100644 index 0000000..a0dda3e --- /dev/null +++ b/admin/2022-01-12_unzugeordnet.php @@ -0,0 +1,77 @@ +query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + $value2 = ''; + $mehrfachbelegung = trim(get_parameter(6)); + if($mehrfachbelegung == 0){ + $query2 = "SELECT reihe, platz + FROM gd_verfplaetze + WHERE concat(reihe,platz) not in (select concat(reihe,platz) from gd_buchung where tid=$termin and lfd_haushalt!=$row1[lfd_haushalt]) + AND reihe not in ('Sonntagschule', 'Vorsonntagschule') + order by reihe, platz + "; + }else{ + $query2 = "SELECT reihe, platz + FROM gd_verfplaetze + WHERE reihe not in ('Sonntagschule', 'Vorsonntagschule') + order by reihe, platz + "; + } + $result2 = $db->query( $query2) + or die ("Cannot execute query2"); + + $ln2 = 0; + while ($row2 = $result2->fetch_array()){ + $inner1[$ln2]['reihe'] = $row2['reihe']; + $inner1[$ln2]['platz'] = $row2['platz']; + $value2 = $inner1; + $ln2++; + } + + + $query_name = $db->query("SELECT bid, vorname, nachname + FROM gd_buchung + WHERE reihe = '' + AND lfd_haushalt= $row1[lfd_haushalt] + AND tid = $termin + ORDER BY bid + LIMIT 1"); + $row_name = $query_name->fetch_array(); + + $row1['inner'] = $value2; + $row1['tid'] = $termin; + $row1['vorname'] = $row_name['vorname']; + $row1['nachname'] = $row_name['nachname']; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/administration_frame.php b/admin/administration_frame.php new file mode 100644 index 0000000..d5b323a --- /dev/null +++ b/admin/administration_frame.php @@ -0,0 +1,9 @@ +display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/fill_qr.php b/admin/fill_qr.php new file mode 100644 index 0000000..edd650e --- /dev/null +++ b/admin/fill_qr.php @@ -0,0 +1,26 @@ +query($query3) or die("Cannot execute query3"); + + while ($row3 = $result3->fetch_array()) { + $result1 = $db->query("SELECT mail + FROM jumi_buchung + WHERE nachname='$row3[nachname]' + AND vorname='$row3[vorname]' + AND mail != '' + ORDER BY bid DESC + LIMIT 1"); + $row1 = $result1->fetch_array(); + $update = $db->query("UPDATE jumi_qr_fellbach + SET mail ='$row1[mail]' + WHERE id = $row3[id] + "); + } +?> diff --git a/admin/gd_verwaltung.php b/admin/gd_verwaltung.php new file mode 100644 index 0000000..2dee45c --- /dev/null +++ b/admin/gd_verwaltung.php @@ -0,0 +1,565 @@ +query("SELECT COUNT(*) Anz + FROM jumi_buchung + WHERE tid=$termin"); + $row1 = $result1->fetch_array(); + $smarty->assign('verwaltung_anzges', $row1['Anz']); + + $result2 = $db->query("SELECT COUNT(distinct lfd_haushalt) Anz + FROM jumi_buchung + WHERE tid=$termin"); + $row2 = $result2->fetch_array(); + $smarty->assign('verwaltung_lfd_haushalte', $row2['Anz']); + $smarty->assign('verwaltung_kritischemarke', get_parameter(2)); + + # Gesperrt? + $result3 = $db->query("SELECT loginstop, date_format(loginstop, '%d.%m.%Y - %H:%i') dateform + FROM jumi_termine + WHERE tid=$termin"); + $row3 = $result3->fetch_array(); + if($row3['loginstop'] != '0000-00-00 00:00:00'){ + $sperrung = "1"; + $smarty->assign('verwaltung_sperrdat', $row3['dateform']); + }else{ + $sperrung = "0"; + } + $smarty->assign('verwaltung_sperrung', $sperrung); + + + + $query3 = "SELECT bid, nachname, vorname + FROM jumi_buchung + WHERE tid = $termin + ORDER BY nachname, vorname"; + + $result3 = $db->query($query3) or die("Cannot execute query3"); + + while ($row3 = $result3->fetch_array()) { + $table_data1[] = $row3; + } + $smarty->assign('table_data1', $table_data1); + + ## Fehlerhandling + $error1 = $_GET['error1']; + + $smarty->assign('verwaltung_value_nachname1', $_SESSION["nachname1"]); + $smarty->assign('verwaltung_value_vorname1', $_SESSION["vorname1"]); + $smarty->assign('verwaltung_value_nachname2', $_SESSION["nachname2"]); + $smarty->assign('verwaltung_value_vorname2', $_SESSION["vorname2"]); + $smarty->assign('verwaltung_value_nachname3', $_SESSION["nachname3"]); + $smarty->assign('verwaltung_value_vorname3', $_SESSION["vorname3"]); + $smarty->assign('verwaltung_value_nachname4', $_SESSION["nachname4"]); + $smarty->assign('verwaltung_value_vorname4', $_SESSION["vorname4"]); + $smarty->assign('verwaltung_value_nachname5', $_SESSION["nachname5"]); + $smarty->assign('verwaltung_value_mail', $_SESSION["mail"]); + $smarty->assign('verwaltung_value_vorname5', $_SESSION["vorname5"]); + + if($error1 == 1){ + $smarty->assign('verwaltung_error', 1); + $smarty->assign('verwaltung_error_text', 'Sie müssen zumindest eine Person erfassen.'); + } +} + +if ($action == 'del') { + + $bid = $_POST['del']; + $termin = $_SESSION["termin"]; + $_SESSION["sabmelde_bid"] = $bid; + + $result = $db->query("SELECT count(*) Anz + FROM jumi_buchung + WHERE bid = $bid + AND tid = $termin"); + $row = $result->fetch_array(); + + if($row['Anz'] == 0 or $row['Anz'] >1){ + $smarty->assign('abmelde_error', 1); + }else{ + $smarty->assign('abmelde_error', 0); + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + $smarty->assign('abmelde_termin', $row_termin['beginn']); + $_SESSION["sabmelde_termin"] = $row_termin['beginn']; + + $result_name = $db->query("SELECT nachname, vorname + FROM jumi_buchung + WHERE bid = $bid"); + $row_name = $result_name->fetch_array(); + $smarty->assign('abmelde_vorname', $row_name['vorname']); + $smarty->assign('abmelde_nachname', $row_name['nachname']); + $_SESSION["sabmelde_vorname"] = $row_name['vorname']; + $_SESSION["sabmelde_nachname"] = $row_name['nachname']; + } +} + +if ($action == 'del2') { + $bid = $_SESSION["sabmelde_bid"]; + $antwort = $_GET['antwort']; + $termin = $_SESSION["sabmelde_termin"]; + $tid = $_SESSION["termin"]; + $vorname = $_SESSION["sabmelde_vorname"]; + $nachname = $_SESSION["sabmelde_nachname"]; + + # Platz herausfinden, für automatischen reload + $result_name = $db->query("SELECT concat(reihe,platz) iframe + FROM jumi_buchung + WHERE bid = $bid + AND vorname = '$vorname' + AND nachname = '$nachname'"); + $row_name = $result_name->fetch_array(); + + if($row_name['iframe'] == ''){ + $iframe = "unzugeordnet"; + }else{ + $iframe = $row_name['iframe']; + } + $smarty->assign('iframe', "$iframe"); + + if($antwort == 'Y'){ + $sql1 = $db->query("DELETE FROM jumi_buchung WHERE bid = $bid"); + $ausgabe = "Sie haben $vorname $nachname vom Gottesdienst am $termin Uhr abgemeldet"; + }else{ + $ausgabe = "Sie haben $vorname $nachname vom Gottesdienst am $termin Uhr NICHT abgemeldet"; + } + + echo ""; + + $smarty->assign('abmelde_ausgabe', $ausgabe); + +} + + +if ($action == 'save') { + + if(isset($_POST['nachname1'])){ + $nachname1 = trim($_POST['nachname1']); + }else{ + $nachname1 = $_SESSION["nachname1"]; + } + + if(isset($_POST['vorname1'])){ + $vorname1 = trim($_POST['vorname1']); + }else{ + $vorname1 = $_SESSION["vorname1"]; + } + + if(isset($_POST['nachname2'])){ + $nachname2 = trim($_POST['nachname2']); + }else{ + $nachname2 = $_SESSION["nachname2"]; + } + + if(isset($_POST['vorname2'])){ + $vorname2 = trim($_POST['vorname2']); + }else{ + $vorname2 = $_SESSION["vorname2"]; + } + + if(isset($_POST['nachname3'])){ + $nachname3 = trim($_POST['nachname3']); + }else{ + $nachname3 = $_SESSION["nachname3"]; + } + + if(isset($_POST['vorname3'])){ + $vorname3 = trim($_POST['vorname3']); + }else{ + $vorname3 = $_SESSION["vorname3"]; + } + + if(isset($_POST['nachname4'])){ + $nachname4 = trim($_POST['nachname4']); + }else{ + $nachname4 = $_SESSION["nachname4"]; + } + + if(isset($_POST['vorname4'])){ + $vorname4 = trim($_POST['vorname4']); + }else{ + $vorname4 = $_SESSION["vorname4"]; + } + + if(isset($_POST['nachname5'])){ + $nachname5 = trim($_POST['nachname5']); + }else{ + $nachname5 = $_SESSION["nachname5"]; + } + + if(isset($_POST['vorname5'])){ + $vorname5 = trim($_POST['vorname5']); + }else{ + $vorname5 = $_SESSION["vorname5"]; + } + + if(isset($_POST['mail'])){ + $mail = trim($_POST['mail']); + }else{ + $mail = $_SESSION["mail"]; + } + $_SESSION["nachname1"] = $nachname1; + $_SESSION["vorname1"] = $vorname1; + $_SESSION["nachname2"] = $nachname2; + $_SESSION["vorname2"] = $vorname2; + $_SESSION["nachname3"] = $nachname3; + $_SESSION["vorname3"] = $vorname3; + $_SESSION["nachname4"] = $nachname4; + $_SESSION["vorname4"] = $vorname4; + $_SESSION["nachname5"] = $nachname5; + $_SESSION["vorname5"] = $vorname5; + $_SESSION["mail"] = $mail; + $termin = $_SESSION["termin"]; + + if ($nachname1 == '' AND $nachname2 == '' AND $nachname3 == '' AND $nachname4 == '' AND $nachname5 == '') { + $error1=1; + $error=true; + } + + if(isset($error)){ + echo ""; + exit; + } + +if(isset($termin)){ + $lfd_haushalt = get_lfd_haushalt($termin); + $datum=date("Y-m-d H:i:s"); + + if($nachname1 != ''){ + $sitzplatz1 = get_sitzplatz($nachname1, $vorname1); + $split1 = explode("|", $sitzplatz1); + $reihe1 = $split1[0]; + $platz1 = $split1[1]; + $sql1 = $db->query("insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname1', '$vorname1', '$reihe1', '$platz1', '$mail', '$lfd_haushalt', '$datum')"); + $bid1 = $db->insert_id; + $crypt1 = cryption("$bid1|$nachname1|$termin", 'e'); + if($reihe1!=''){ + $smarty->assign('iframe1', "$reihe1$platz1"); + }else{ + $smarty->assign('iframe1', "unzugeordnet"); + } + + } + if($nachname2 != ''){ + $sitzplatz2 = get_sitzplatz($nachname2, $vorname2); + $split2 = explode("|", $sitzplatz2); + $reihe2 = $split2[0]; + $platz2 = $split2[1]; + $sql1 = $db->query("insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname2', '$vorname2', '$reihe2', '$platz2', '$mail', '$lfd_haushalt', '$datum')"); + $bid2 = $db->insert_id; + $crypt2 = cryption("$bid2|$nachname2|$termin", 'e'); + if($reihe2!=''){ + $smarty->assign('iframe2', "$reihe2$platz2"); + }else{ + $smarty->assign('iframe2', "unzugeordnet"); + } + } + if($nachname3 != ''){ + $sitzplatz3 = get_sitzplatz($nachname3, $vorname3); + $split3 = explode("|", $sitzplatz3); + $reihe3 = $split3[0]; + $platz3 = $split3[1]; + $sql1 = $db->query("insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname3', '$vorname3', '$reihe3', '$platz3', '$mail', '$lfd_haushalt', '$datum')"); + $bid3 = $db->insert_id; + $crypt3 = cryption("$bid3|$nachname3|$termin", 'e'); + if($reihe3!=''){ + $smarty->assign('iframe3', "$reihe3$platz3"); + }else{ + $smarty->assign('iframe3', "unzugeordnet"); + } + } + if($nachname4 != ''){ + $sitzplatz4 = get_sitzplatz($nachname4, $vorname4); + $split4 = explode("|", $sitzplatz4); + $reihe4 = $split4[0]; + $platz4 = $split4[1]; + $sql1 = $db->query("insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname4', '$vorname4', '$reihe4', '$platz4', '$mail', '$lfd_haushalt', '$datum')"); + $bid4 = $db->insert_id; + $crypt4 = cryption("$bid4|$nachname4|$termin", 'e'); + if($reihe4!=''){ + $smarty->assign('iframe4', "$reihe4$platz4"); + }else{ + $smarty->assign('iframe4', "unzugeordnet"); + } + } + if($nachname5 != ''){ + $sitzplatz5 = get_sitzplatz($nachname5, $vorname5); + $split5 = explode("|", $sitzplatz5); + $reihe5 = $split5[0]; + $platz5 = $split5[1]; + $sql1 = $db->query("insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname5', '$vorname5', '$reihe5', '$platz5', '$mail', '$lfd_haushalt', '$datum')"); + $bid5 = $db->insert_id; + $crypt5 = cryption("$bid5|$nachname5|$termin", 'e'); + if($reihe5!=''){ + $smarty->assign('iframe5', "$reihe5$platz5"); + }else{ + $smarty->assign('iframe5', "unzugeordnet"); + } + } +#Anzahl der gemeldeten Haushalte überschritten? +kritische_haushalte($termin); + +} + + +if(isset($_SESSION["mail"]) AND $mail !=''){ + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + $empfaenger = "$mail"; + $betreff = "Registrierung zum Gottesdienst am $row_termin[beginn] Uhr"; + $text = " + + + Registrierung zum Gottesdienst + + + + Guten Tag!

+ Sie haben sich zum Gottesdienst in der neuapostolischen Kirche Weinstadt-Beutelsbach registriert.
+ Nachfolgend finden Sie die hinterlegten Daten: +
+
+ + + + + + + + + + + "; + if($nachname1 != ''){ + $text .=" + + + + + "; + } + if($nachname2 != ''){ + $text .=" + + + + + "; + } + if($nachname3 != ''){ + $text .=" + + + + + "; + } + if($nachname4 != ''){ + $text .=" + + + + + "; + } + if($nachname5 != ''){ + $text .=" + + + + + "; + } + $text .=" + +
+ + Datum: + + + + $row_termin[beginn]";if($row_termin['hinweis'] != ''){ $text .=" ($row_termin[hinweis])";} + $text.=" + +
+   + +   + +   +
+ + Person 1: + + + + $nachname1, $vorname1 + + + Abmeldung +
+ + Person 2: + + + + $nachname2, $vorname2 + + + Abmeldung +
+ + Person 3: + + + + $nachname3, $vorname3 + + + Abmeldung +
+ + Person 4: + + + + $nachname4, $vorname4 + + + Abmeldung +
+ + Person 5: + + + + $nachname5, $vorname5 + + + Abmeldung +
+
+ Link zur Registrierung: Registrierung zum Gottesdienst +

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + + + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: Gottesdienstregistrierung \n"; + #$headers .= "Bcc: \n"; + + $return = @mail($empfaenger, $betreff, $text, $headers); +} + + + echo ""; + +} + + +if ($action == 'sperrung') { + # 0 --> öffnen + # 1 --> sperren + $aktion = $_GET['aktion']; + $termin = $_SESSION["termin"]; + $datum = date("Y-m-d H:i:s"); + + if($aktion == 0){ + $update = $db->query("UPDATE jumi_termine + SET loginstop ='0000-00-00 00:00:00' + WHERE tid = $termin + "); + } + if($aktion == 1){ + $update = $db->query("UPDATE jumi_termine + SET loginstop ='$datum' + WHERE tid = $termin + "); + } + + echo ""; +} +if ($action == 'resetstandard') { + $termin = $_SESSION["termin"]; + # Alle löschen zum Termin, die einen Standardplatz haben laut Liste + $update = $db->query("UPDATE jumi_buchung + SET reihe='$reihe' + ,platz='$platz' + WHERE tid=$termin + "); + + $query3 = "SELECT bid, nachname, vorname + FROM jumi_buchung + WHERE tid = $termin + ORDER BY nachname, vorname"; + + $result3 = $db->query($query3) or die("Cannot execute query3"); + + while ($row3 = $result3->fetch_array()) { + $reihe = ""; + $platz = ""; + $vorname = $row3['vorname']; + $nachname = $row3['nachname']; + $sitzplatz = get_sitzplatz($nachname, $vorname); + $split = explode("|", $sitzplatz); + $reihe = $split[0]; + $platz = $split[1]; + if ($reihe != ''){ + $update = $db->query("UPDATE jumi_buchung + SET reihe='$reihe' + ,platz='$platz' + WHERE bid = $row3[bid] + AND tid=$termin + "); + } + } + # Refresh der Ansicht + echo ""; +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/hauptframe.php b/admin/hauptframe.php new file mode 100644 index 0000000..d5b323a --- /dev/null +++ b/admin/hauptframe.php @@ -0,0 +1,9 @@ +display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/index.php b/admin/index.php new file mode 100644 index 0000000..12aaa65 --- /dev/null +++ b/admin/index.php @@ -0,0 +1,86 @@ +assign('index_error', 1); + + if($errorno == 1){ + $smarty->assign('index_error_text', "Es müssen alle Felder ausgefüllt werden"); + } + + if($errorno == 2){ + $smarty->assign('index_error_text', "Der Benutzername ist im System nicht vorhanden"); + } + + if($errorno == 3){ + $smarty->assign('index_error_text', "Der Benutzername oder das Passwort ist nicht korrekt."); + } + + # Daten aufbereiten bei Fehler + if(isset($_SESSION["global_username"])){ + $smarty->assign('index_user', $_SESSION["global_username"]); + } + } + + +} + +if($action == 'anmeld'){ + $username=strtoupper($_POST["user"]); //remove case sensitivity on the username + $password=$_POST["password"]; + + if($_POST["user"] != ""){ + $_SESSION["global_username"]=$username; + } + + if($username == "" OR $password == ""){ + echo ""; + }else{ + + + $db = dbconnect(); + $result = $db->query("SELECT bpmuid, uid, passwort FROM jumi_admin WHERE UPPER(uid)='$username'"); + $row = $result->fetch_array(); + + + if ($username != strtoupper($row['uid'])) { + echo ""; + } + // Passwort falsch + elseif (md5($password) != $row['passwort']){ //verschlüsseltes Passwort überprüfen + # Cookies werden bereits gesetzt, falls sich jemand ein passwort zusenden lässt. + $_SESSION["global_uid"] = $row['bpmuid']; + $_SESSION["global_username"] = $row['uid']; + echo ""; + }else{ + $db = dbconnect(); + $datum=date("Y-m-d H:i:s"); + $ip=getenv("REMOTE_ADDR"); + $agent=getenv("HTTP_USER_AGENT"); + $user_admin = $row['bpmuid']; + $_SESSION["global_uid"] = $user_admin; + $_SESSION["global_username"] = $row['uid']; + $result_1 = $db->query("INSERT INTO jumi_adminlog (Datum, IP, user_agent, bpmuid) VALUES ('$datum', '$ip', '$agent', '$user_admin')"); + $smarty->assign('index_login', "1"); + } + } + +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/indexframe.php b/admin/indexframe.php new file mode 100644 index 0000000..ced4e83 --- /dev/null +++ b/admin/indexframe.php @@ -0,0 +1,8 @@ +display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/liste_qr_name.php b/admin/liste_qr_name.php new file mode 100644 index 0000000..4ca52df --- /dev/null +++ b/admin/liste_qr_name.php @@ -0,0 +1,252 @@ +query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT id, vorname, nachname, qr + FROM jumi_qr_fellbach + ORDER BY nachname ASC, vorname ASC + "; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + $filename = $PNG_TEMP_DIR.$row1['qr'].'.png'; + QRcode::png($row1['qr'], $filename, H, 10, 2); + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'ausgabe') { +require_once("../mpdf/vendor/autoload.php"); +$name = $_POST["name"]; + + #echo "Mailsend: ".$_POST['mailsend']; + #exit; + // Output a PDF file directly to the browser + if($_POST['mailsend'] != '1'){ + $smarty->assign('mailwindow', '0'); + $mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4', + 'orientation' => 'P', + 'margin_top' => 10, + 'margin_bottom' => 20, + 'margin_left' => 10, + 'margin_right' => 16, + 'default_font' => 'arial', + + ]); + + + $buffer = ''; + $buffer.=" + "; + $cnt=0; + for($i=0;$iquery("SELECT id, nachname, vorname, qr, mail + FROM jumi_qr_fellbach + WHERE id = $name[$i]"); + $row_qr = $result_qr->fetch_array(); + $buffer.=" + "; + if($cnt == 3){ + #$buffer.=""; + $cnt = 0; + } + + $cnt++; + } + $buffer.=" + +
+ QR-Code zur Erfassung der Gottesdienstteilnehmer in der Neuapostolischen Kirche Fellbach
+
+
+ $row_qr[qr] +

$row_qr[vorname] $row_qr[nachname]


+ Dieser QR-Code dient lediglich zur Einlasskontrolle in die KircheFellbach und enthält keine persönlichen Daten.

+ Neuapostolische Kirche Fellbach
+ Kastanienweg 5
+ 70734 Fellbach +
+
"; + $mpdf->WriteHTML($buffer); + $mpdf->Output('QR_Codes_Fellbach.pdf', D); + }else{ + $smarty->assign('mailwindow', '1'); + + + for($i=0;$i 'utf-8', + 'format' => 'A6', + 'orientation' => 'P', + 'margin_top' => 10, + 'margin_bottom' => 20, + 'margin_left' => 10, + 'margin_right' => 16, + 'default_font' => 'arial', + + ]); + + $result_qr = $db->query("SELECT id, nachname, vorname, qr, mail + FROM jumi_qr_fellbach + WHERE id = $name[$i]"); + $row_qr = $result_qr->fetch_array(); + if($row_qr['mail'] != ''){ + $buffer = ''; + $buffer.=" + "; + $buffer.=" + "; + + $buffer.=" + +
+ QR-Code zur Erfassung der Gottesdienstteilnehmer in der Neuapostolischen Kirche Fellbach
+
+
+ $row_qr[qr] +

$row_qr[vorname] $row_qr[nachname]


+ Dieser QR-Code dient lediglich zur Einlasskontrolle in die KircheFellbach und enthält keine persönlichen Daten.

+ Neuapostolische Kirche Fellbach
+ Kastanienweg 5
+ 70734 Fellbach +
+
"; + $mpdf->WriteHTML($buffer); + $mpdf->Output("./pdfs/QR-Code_Fellbach_$row_qr[nachname]_$row_qr[vorname].pdf", F); + + /* leere Mail ausgeben */ + $to = $row_qr['mail']; // addresses to email pdf to + $from = "NAK Beutelsbach "; // address message is sent from + $subject = "CR Code Fellbach: $row_qr[nachname], $row_qr[vorname] Nr. $row_qr[qr]"; // email subject + $body = " + + QR Code Fellbach + + + + Guten Tag!

+ im Anhang finden Sie Ihren QR Code für den Einlass in die Gemeinde Fellbach. +
+
+

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + $pdfLocation = "./pdfs/QR-Code_Fellbach_$row_qr[nachname]_$row_qr[vorname].pdf"; // file location + $pdfName = "QR-Code_Fellbach_$row_qr[nachname]_$row_qr[vorname].pdf"; // pdf file name recipient will get + $filetype = "application/pdf"; // type + + // create headers and mime boundry + $eol = PHP_EOL; + $semi_rand = md5(time()); + $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; + $headers = "From: $from$eol" . + "MIME-Version: 1.0$eol" . + "Content-Type: multipart/mixed;$eol" . + " boundary=\"$mime_boundary\""; + + // add html message body + $message = "--$mime_boundary$eol" . + "Content-Type: text/html; charset=\"utf-8\"$eol" . + "Content-Transfer-Encoding: 7bit$eol$eol" . + $body . $eol; + + // fetch pdf + $file = fopen($pdfLocation, 'rb'); + $data = fread($file, filesize($pdfLocation)); + fclose($file); + $pdf = chunk_split(base64_encode($data)); + + // attach pdf to email + $message .= "--$mime_boundary$eol" . + "Content-Type: $filetype;$eol" . + " name=\"$pdfName\"$eol" . + "Content-Disposition: attachment;$eol" . + " filename=\"$pdfName\"$eol" . + "Content-Transfer-Encoding: base64$eol$eol" . + $pdf . $eol . + "--$mime_boundary--"; + + // Send the email + if(mail($to, $subject, $message, $headers)) { + $smarty->assign('message', 'Die Mails wurden versendet!'); + }else { + $smarty->assign('message', 'Die Mails wurde nicht alle versendet!'); + $name_kein_mailversand .= "$row_qr[vorname] $row_qr[nachname]
"; + } + }else{ + # Keine Mailadresse hinterlegt + $name_keine_mailadresse .= "$row_qr[vorname] $row_qr[nachname]
"; + } + unlink($pdfLocation); + } + + $smarty->assign('kein_mailversand', "$name_kein_mailversand"); + $smarty->assign('keine_Mailadresse', "$name_keine_mailadresse"); + } # Ende Häkchen Mailversand + + + +#echo "

";
+#echo $buffer;
+#echo "
";
+#exit;
+}
+
+$smarty->assign('action', "$action");
+$smarty->display("$template/admin/$templatename");
+
+?>
diff --git a/admin/liste_tn.php b/admin/liste_tn.php
new file mode 100644
index 0000000..654cb3d
--- /dev/null
+++ b/admin/liste_tn.php
@@ -0,0 +1,1549 @@
+query("SET lc_time_names = 'de_DE';");
+  
+  $query1 = "SELECT a.tid, date_format(datum, '%a, %d.%m.%Y - %H:%i Uhr')datum_form
+               FROM jumi_termine a
+              WHERE a.datum > ADDDATE(now(), -7)
+              GROUP BY a.tid, datum_form
+              ORDER BY datum ASC";
+  
+  $result1 = $db->query($query1) or die("Cannot execute query1");
+  
+  
+  while ($row1 = $result1->fetch_array()) {
+   $termin = $row1['tid'];
+   $result2 = $db->query("SELECT COUNT(*) Anz 
+                            FROM jumi_buchung 
+                           WHERE tid=$termin");
+   $row2 = $result2->fetch_array();
+   
+   $result3 = $db->query("SELECT COUNT(distinct lfd_haushalt) Anz 
+                            FROM jumi_buchung 
+                           WHERE tid=$termin");
+   $row3 = $result3->fetch_array();
+
+    $row1['anz_ges']         = $row2['Anz'];
+    $row1['anz_fam']         = $row3['Anz'];
+    $table_data1[]           = $row1;
+  }
+  $smarty->assign('table_data1', $table_data1);
+}
+
+if ($action == 'ausgabe') {
+  $termin = $_POST["termin"];
+  $german = $db->query("SET lc_time_names = 'de_DE';");
+  $query_termin = $db->query("SELECT date_format(datum, '%a, %d.%m.%Y - %H:%i Uhr')datum_form, hinweis,date_format(datum, '%Y-%m-%d')datum_output
+                                FROM jumi_termine
+                               WHERE tid = $termin");
+  $row_get_termin = $query_termin->fetch_array();
+  
+
+ $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'A1' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC";
+ $result1x = $db->query($query1x) or die('Cannot execute query1');
+ while ($row_tn_koord = $result1x->fetch_array()) {
+   $A1A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'A1' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $A1B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'A1' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $A1C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'A1' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $A1D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'A1' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $A1E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'A1' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $A1F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K1' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K1A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K1' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K1B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K1' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K1C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K1' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K1D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K1' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K1E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K1' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K1F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K2' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K2A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K2' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K2B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K2' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K2C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K2' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K2D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K2' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K2E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K2' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K2F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K3' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K3A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K3' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K3B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K3' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K3C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K3' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K3D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K3' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K3E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K3' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K3F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K4' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K4A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K4' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K4B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K4' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K4C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K4' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K4D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K4' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K4E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K4' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K4F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K5' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K5A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K5' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K5B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K5' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K5C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K5' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K5D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K5' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K5E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K5' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K5F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K6' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K6A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K6' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K6B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K6' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K6C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K6' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K6D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K6' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K6E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K6' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K6F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K7' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K7A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K7' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K7B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K7' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K7C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K7' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K7D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K7' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K7E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K7' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K7F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K8' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K8A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K8' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K8B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K8' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K8C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K8' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K8D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K8' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K8E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K8' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K8F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K9' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K9A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K9' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K9B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K9' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K9C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K9' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K9D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K9' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K9E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K9' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K9F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K10' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K10A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K10' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K10B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K10' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K10C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K10' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K10D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K10' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K10E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'K10' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $K10F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'D1' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $D1E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'M1' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $M1A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'M1' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $M1B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'M1' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $M1C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'F1' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $F1A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'F2' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $F2B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'F3' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $F3C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E1' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E1A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E1' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E1B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E1' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E1C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E1' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E1D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E1' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E1E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E1' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E1F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E2' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E2A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E2' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E2B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E2' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E2C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E2' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E2D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E2' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E2E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E2' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E2F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E3' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E3A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E3' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E3B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E3' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E3C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E3' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E3D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E3' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E3E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E3' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E3F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E4' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E4A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E4' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E4B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E4' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E4C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E4' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E4D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E4' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E4E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E4' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E4F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E5' AND platz = 'A' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E5A .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E5' AND platz = 'B' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E5B .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E5' AND platz = 'C' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E5C .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E5' AND platz = 'D' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E5D .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E5' AND platz = 'E' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E5E .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'E5' AND platz = 'F' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $E5F .= "$row_tn_koord[nachname], $row_tn_koord[vorname]
"; + } + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'Sonntagschule' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $sonntagschule .= "$row_tn_koord[nachname], $row_tn_koord[vorname]; "; + } + $sonntagschule = substr($sonntagschule,0, -2); + + $query1x = "SELECT bid, vorname, nachname FROM jumi_buchung WHERE reihe = 'Vorsonntagschule' AND tid = $termin ORDER BY nachname, vorname ASC"; + $result1x = $db->query($query1x) or die('Cannot execute query1'); + while ($row_tn_koord = $result1x->fetch_array()) { + $vorsonntagschule .= "$row_tn_koord[nachname], $row_tn_koord[vorname]; "; + } + $vorsonntagschule = substr($vorsonntagschule,0, -2); + + + + +$buffer = ''; +$buffer .= ""; + +$buffer.="

$row_get_termin[datum_form]

+ + + + + + + + +"; + $query1 = "SELECT vorname, nachname, reihe, platz, lfd_haushalt + FROM jumi_buchung + WHERE tid = $termin + AND reihe != '' + ORDER BY nachname, lfd_haushalt, vorname + "; + + $result1 = $db->query($query1) or die("Cannot execute query1a"); + + $smarty->assign('termine_aktdat', date("d.m.Y H:i", time() ) ) ; + $lfdnr = 1; + while ($row1 = $result1->fetch_array()) { + if($row1['platz'] == ''){ + $platz = "$row1[reihe]"; + }else{ + $platz = "$row1[reihe] / $row1[platz]"; + } + + if($row1['lfd_haushalt'] != $haushalt_last){ + if($tdclass == "td1"){ + $tdclass = "td2"; + }else{ + $tdclass = "td1"; + } + } + + $buffer.=" + + + + + + "; + $lfdnr++; + $haushalt_last = $row1['lfd_haushalt']; + } + +$buffer.=" +
+ Nr. + + Name + + Sitzplatz + + Anwesend +
+ $lfdnr + + $row1[nachname], $row1[vorname] + + $platz + +
+
"; + +require_once("../mpdf/vendor/autoload.php"); +$mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4', + 'orientation' => 'P', + 'margin_top' => 10, + 'margin_bottom' => 20, + 'margin_left' => 10, + 'margin_right' => 16, + 'default_font' => 'arial', + +]); + + + + $buffer.=" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
ABCDEF
A1
+ +
Klavier + $A1A +
+ + $A1B + + + $A1C + + + $A1D + + + $A1E + + + $A1F +
K1 + + $K1A + + + $K1B + + + $K1C + + + $K1D + + + $K1E + + + $K1F + K1
K2 + + $K2A + + + $K2B + + + $K2C + + + $K2D + + + $K2E + + + $K2F + K2
K3 + + $K3A + + + $K3B + + + $K3C + + + $K3D + + + $K3E + + + $K3F + K3
K4 + + $K4A + + + $K4B + + + $K4C + + + $K4D + + + $K4E + + + $K4F + K4
K5 + + $K5A + + + $K5B + + + $K5C + + + $K5D + + + $K5E + + + $K5F + K5
K6 + + $K6A + + + $K6B + + + $K6C + + + $K6D + + + $K6E + + + $K6F + K6
K7 + + $K7A + + + $K7B + + + $K7C + + + $K7D + + + $K7E + + + $K7F + K7
K8 + + $K8A + + + $K8B + + + $K8C + + + $K8D + + + $K8E + + + $K8F + K8
K9 + + $K9A + + + $K9B + + + $K9C + + + $K9D + + + $K9E + + + $K9F + K9
+ + $K10D + + + $K10E + + + $K10F + K10
K10 + + $K10A + + + $K10B + + + $K10C +
D1 + + $D1E + D1
M1 + + $M1A + + + $M1B + + + $M1C +
F1 + + $F1A + + + $F1B + + + $F1C +
E1 + + $E1A + + + $E1B + + + $E1C + + + $E1D + + + $E1E + + + $E1F + E1
E2 + + $E2A + + + $E2B + + + $E2C + + + $E2D + + + $E2E + + + $E2F + E2
E3 + + $E3A + + + $E3B + + + $E3C + + + $E3D + + + $E3E + + + $E3F + E3
E4 + + $E4A + + + $E4B + + + $E4C + + + $E4D + + + $E4E + + + $E4F + E4
E5 + + $E5A + + + $E5B + + + $E5C +
+ + $E5D + + + $E5E + + + $E5F + E5
ABCDEF
+
+ + + + +
+ Sonntagschule
+ $sonntagschule +
+ Vorsonntagschule
+ $vorsonntagschule +
+
+ Legende: + + + + +
+ A1 = Altarraum
+ K1-10 = Kirchenschiffreihen
+ D1 = Diakon
+
+ M1 = Mutter/Kind
+ F1 = Foyer
+ E1-5 Empore
+
+
"; +$mpdf->setFooter("Gottesdienstteilnehmer|{PAGENO} /{nb}|$row_get_termin[datum_form]"); + +#echo "
";
+#echo $buffer;
+#echo "
";
+#exit;
+$mpdf->WriteHTML($buffer);
+
+#echo "Mailsend: ".$_POST['mailsend'];
+#exit;
+// Output a PDF file directly to the browser
+  if($_POST['mailsend'] != '1'){
+    $smarty->assign('mailwindow', '0');
+    $mpdf->Output($row_get_termin['datum_output'].'_Gottesdienstteilnehmer.pdf', D);
+  }else{
+    $smarty->assign('mailwindow', '1');
+    $mpdf->Output('./pdfs/'.$row_get_termin['datum_output'].'_Gottesdienstteilnehmer.pdf', F); 
+    $to          = get_parameter(5); // addresses to email pdf to
+    $from        = "NAK Beutelsbach "; // address message is sent from
+    $subject     = "Liste der Gottesdienstteilnehmer am ".$row_get_termin['datum_form']; // email subject
+    $body = "
+             
+             Liste der Gottesdienstteilnehmer
+             
+             
+             
+             Guten Tag!

+ im Anhang finden Sie die Teilnehmerliste des Gottesdienstes am: $row_get_termin[datum_form] +
+
+

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + $pdfLocation = "./pdfs/".$row_get_termin['datum_output']."_Gottesdienstteilnehmer.pdf"; // file location + $pdfName = $row_get_termin['datum_output']."_Gottesdienstteilnehmer.pdf"; // pdf file name recipient will get + $filetype = "application/pdf"; // type + + // create headers and mime boundry + $eol = PHP_EOL; + $semi_rand = md5(time()); + $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; + $headers = "From: $from$eol" . + "MIME-Version: 1.0$eol" . + "Content-Type: multipart/mixed;$eol" . + " boundary=\"$mime_boundary\""; + + // add html message body + $message = "--$mime_boundary$eol" . + "Content-Type: text/html; charset=\"iso-8859-1\"$eol" . + "Content-Transfer-Encoding: 7bit$eol$eol" . + $body . $eol; + + // fetch pdf + $file = fopen($pdfLocation, 'rb'); + $data = fread($file, filesize($pdfLocation)); + fclose($file); + $pdf = chunk_split(base64_encode($data)); + + // attach pdf to email + $message .= "--$mime_boundary$eol" . + "Content-Type: $filetype;$eol" . + " name=\"$pdfName\"$eol" . + "Content-Disposition: attachment;$eol" . + " filename=\"$pdfName\"$eol" . + "Content-Transfer-Encoding: base64$eol$eol" . + $pdf . $eol . + "--$mime_boundary--"; + + // Send the email + if(mail($to, $subject, $message, $headers)) { + $smarty->assign('message', 'Die Mail wurde versendet!'); + } + else { + $smarty->assign('message', 'Die Mail wurde nicht versendet!'); + } + unlink($pdfLocation); + } +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/logout.php b/admin/logout.php new file mode 100644 index 0000000..c148555 --- /dev/null +++ b/admin/logout.php @@ -0,0 +1,12 @@ +display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/menu_administration.php b/admin/menu_administration.php new file mode 100644 index 0000000..68d5e91 --- /dev/null +++ b/admin/menu_administration.php @@ -0,0 +1,16 @@ +assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/menu_qr.php b/admin/menu_qr.php new file mode 100644 index 0000000..68d5e91 --- /dev/null +++ b/admin/menu_qr.php @@ -0,0 +1,16 @@ +assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/menu_survey.php b/admin/menu_survey.php new file mode 100644 index 0000000..69926f5 --- /dev/null +++ b/admin/menu_survey.php @@ -0,0 +1,16 @@ +assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/menu_verwaltung.php b/admin/menu_verwaltung.php new file mode 100644 index 0000000..68d5e91 --- /dev/null +++ b/admin/menu_verwaltung.php @@ -0,0 +1,16 @@ +assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/menu_youtube.php b/admin/menu_youtube.php new file mode 100644 index 0000000..68d5e91 --- /dev/null +++ b/admin/menu_youtube.php @@ -0,0 +1,16 @@ +assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/old/Import_CSV_Hogrefe.xlsx b/admin/old/Import_CSV_Hogrefe.xlsx new file mode 100644 index 0000000..3d5a1fe Binary files /dev/null and b/admin/old/Import_CSV_Hogrefe.xlsx differ diff --git a/admin/old/bewerber_daten.php b/admin/old/bewerber_daten.php new file mode 100644 index 0000000..58c5e24 --- /dev/null +++ b/admin/old/bewerber_daten.php @@ -0,0 +1,1221 @@ +query("SET lc_time_names = 'de_DE';"); + +# Dropdown befüllen übernimmt ajax:fetch.php +# $query1 = "SELECT ka_id, vorname, nachname +# FROM bpm_kandidat +# ORDER BY nachname, vorname"; +# +# $result1 = $db->query($query1) or die("Cannot execute query1a"); +# +# +# while ($row1 = $result1->fetch_array()) { +# $table_data1[] = $row1; +# } +# $smarty->assign('table_data1', $table_data1); + + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + $smarty->assign('bewerber_error', 1); + if ($errorno == 1) { + $smarty->assign('bewerber_error_text', "Es muss ein Bewerber ausgewählt werden."); + } + + } +} + +if ($action == 'ausgabe') { + if (isset($_POST['user'])) { + $username = mb_strtoupper($_POST["user"]); //remove case sensitivity on the username + } elseif(isset($_GET['user'])) { + $username = mb_strtoupper($_GET["user"]); + } else { + $username = $_SESSION["username"]; + } + + $_SESSION["username"] = $username; + + + if ($username == "") { + echo ""; + exit; + } + + # Fehler beim Upload anzeigen + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + $smarty->assign('index_error', 1); + + if ($errorno == 1) { + $smarty->assign('index_error_text', "Es dürfen nur PDF Dateien hochgeladen werden."); + } + if ($errorno == 2) { + # Tabelle bpm_parameter + $size_mb = trim(get_parameter(12)); + $smarty->assign('index_error_text', "Die Datei ist zu groß. Die Dateigröße darf max. $size_mb MB betragen."); + } + if ($errorno == 3) { + $smarty->assign('index_error_text', "Die Datei mit diesem Namen wurde bereits hochgeladen."); + } + if ($errorno == 4) { + # Tabelle bpm_parameter + $anz_dok = trim(get_parameter(13)); + $smarty->assign('index_error_text', "Es dürfen maximal $anz_dok Dateien hochgeladen werden."); + } + } + + $result = $db->query("SELECT a.ka_id, anrede, vorname, nachname, str, plz, ort, date_format(tm_datum, '%d.%m.%Y - %H:%i Uhr') tm_datum_form, date_format(gebdat, '%d.%m.%Y') gebdat_form, a.id, c.tan, hochschule, date_format(login_dat, '%d.%m.%Y - %H:%i Uhr') login_dat_form, login_dat, a.mail, a.tel + FROM bpm_kandidat a, bpm_term_kand b, bpm_tanpool c, bpm_termine d + WHERE a.ka_id = b.ka_id + AND b.tp_id = c.tp_id + AND b.tm_id = d.tm_id + AND a.ka_id = '$username' + ORDER BY tk_id DESC + LIMIT 1"); + $row = $result->fetch_array(); + + #Aktuelle Tan ermitteln + + $result_tan = $db->query("SELECT tan + FROM bpm_tanpool a, bpm_term_kand b + WHERE a.tp_id = b.tp_id + AND b.ka_id = '$username' + order by b.tk_id DESC + LIMIT 1"); + $row_tan = $result_tan->fetch_array(); + $tan = $row_tan['tan']; + $_SESSION["tan"] = $tan; + + if ($row['anrede'] == 'M') { + $anrede = 'Herr'; + } else { + $anrede = 'Frau'; + } + if($row['login_dat'] == '0000-00-00 00:00:00'){ + $tm_datum_form = "-"; + }else{ + $tm_datum_form = $row['login_dat_form']; + } + + $smarty->assign('status_anrede', $anrede); + $smarty->assign('status_vorname', $row['vorname']); + $smarty->assign('status_nachname', $row['nachname']); + $smarty->assign('status_gebdat', $row['gebdat_form']); + $smarty->assign('status_str', $row['str']); + $smarty->assign('status_plz', $row['plz']); + $smarty->assign('status_ort', $row['ort']); + $smarty->assign('status_mail', $row['mail']); + $smarty->assign('status_tel', $row['tel']); + $smarty->assign('status_tm_datum_form', $row['tm_datum_form']); + $smarty->assign('status_login_dat_form', $tm_datum_form); + $smarty->assign('status_hochschule', $row['hochschule']); + $smarty->assign('status_login_id', $row['id']); + $smarty->assign('status_login_tan', $tan); + + $result_ct = $db->query("SELECT count(*) Anz + FROM bpm_ergebnisse + WHERE ka_id =$row[ka_id] + AND tan='$tan'"); + $row_ct = $result_ct->fetch_array(); + + if ($row_ct['Anz'] == 0) { + $smarty->assign('status_erg_vorhanden', 0); + $smarty->assign('status_erg_bestanden', '3'); + } else { + $smarty->assign('status_erg_vorhanden', 1); + $result_erg = $db->query("SELECT satzerg, gemeinsamkeiten, rechenaufgaben, zahlenreihen, rechenzeichen, matrizen, merkf, summe, bestanden, date_format(einsicht_dat, '%d.%m.%Y, %H:%i Uhr') einsicht_dat_form, einsicht_dat + FROM bpm_ergebnisse + WHERE ka_id =$row[ka_id] + AND tan='$tan'"); + $row_erg = $result_erg->fetch_array(); + if ($row_erg['einsicht_dat'] == '0000-00-00 00:00:00') { + $einsicht_dat = "bisher keine Einsicht"; + } else { + $einsicht_dat = $row_erg['einsicht_dat_form']; + } + $smarty->assign('status_erg_satzerg', $row_erg['satzerg']); + $smarty->assign('status_erg_gemeinsamkeiten', $row_erg['gemeinsamkeiten']); + $smarty->assign('status_erg_rechenaufgaben', $row_erg['rechenaufgaben']); + $smarty->assign('status_erg_zahlenreihen', $row_erg['zahlenreihen']); + $smarty->assign('status_erg_rechenzeichen', $row_erg['rechenzeichen']); + $smarty->assign('status_erg_matrizen', $row_erg['matrizen']); + $smarty->assign('status_erg_merkf', $row_erg['merkf']); + $smarty->assign('status_erg_summe', $row_erg['summe']); + $smarty->assign('status_erg_einsicht_dat', $einsicht_dat); + + if ($row_erg['bestanden'] == 0) { + $smarty->assign('status_erg_bestanden', 0); + $smarty->assign('status_erg_bestanden_text', "nicht bestanden"); + } + if ($row_erg['bestanden'] == 1) { + $smarty->assign('status_erg_bestanden', 1); + $smarty->assign('status_erg_bestanden_text', "bestanden"); + } + + } + + # Ältere Testergebnisse vorhanden? + $query4 = "SELECT tan + FROM bpm_ergebnisse + WHERE ka_id =$row[ka_id] + AND tan!='$tan'"; + $result4 = $db->query($query4) or die("Cannot execute query4"); + + while ($row4 = $result4->fetch_array()) { + + $result_erg = $db->query("SELECT satzerg, gemeinsamkeiten, rechenaufgaben, zahlenreihen, rechenzeichen, matrizen, merkf, summe, bestanden, date_format(einsicht_dat, '%d.%m.%Y, %H:%i Uhr') einsicht_dat_form, einsicht_dat + FROM bpm_ergebnisse + WHERE ka_id =$row[ka_id] + AND tan='$row4[tan]'"); + $row_erg = $result_erg->fetch_array(); + + $result_testdat = $db->query("SELECT date_format(tm_datum, '%d.%m.%Y - %H:%i') datum_form + , CASE tm_standort + WHEN 'L' THEN 'Ludwigsburg' + WHEN 'K' THEN 'Kehl' + ELSE '' END as tm_standort + FROM bpm_term_kand a, bpm_tanpool b, bpm_termine c + WHERE a.tp_id = b.tp_id + AND a.tm_id =c.tm_id + AND tan = '$row4[tan]'"); + $row_testdat = $result_testdat->fetch_array(); + + if ($row_erg['einsicht_dat'] == '0000-00-00 00:00:00') { + $einsicht_dat = "bisher keine Einsicht"; + } else { + $einsicht_dat = $row_erg['einsicht_dat_form']; + } + + if ($row_erg['bestanden'] == 0) { + $status_erg_bestanden = "0"; + $status_erg_bestanden_text = "nicht bestanden"; + } + if ($row_erg['bestanden'] == 1) { + $status_erg_bestanden = "1"; + $status_erg_bestanden_text = "bestanden"; + } + $row4['status_erg_testdat'] = $row_testdat['datum_form']; + $row4['status_erg_standort'] = $row_testdat['tm_standort']; + $row4['status_erg_satzerg'] = $row_erg['satzerg']; + $row4['status_erg_gemeinsamkeiten'] = $row_erg['gemeinsamkeiten']; + $row4['status_erg_rechenaufgaben'] = $row_erg['rechenaufgaben']; + $row4['status_erg_zahlenreihen'] = $row_erg['zahlenreihen']; + $row4['status_erg_rechenzeichen'] = $row_erg['rechenzeichen']; + $row4['status_erg_matrizen'] = $row_erg['matrizen']; + $row4['status_erg_merkf'] = $row_erg['merkf']; + $row4['status_erg_summe'] = $row_erg['summe']; + $row4['status_erg_bestanden'] = $status_erg_bestanden; + $row4['status_erg_bestanden_text'] = $status_erg_bestanden_text; + $row4['status_erg_einsicht_dat'] = $einsicht_dat; + $table_data4[] = $row4; + } + $smarty->assign('table_data4', $table_data4); + + + + $query1 = "SELECT up_id, ka_id, file, beschreibung, date_format(upload_dat, '%d.%m.%Y, %H:%i Uhr') upload_dat + FROM bpm_upload + WHERE ka_id = $row[ka_id] + AND upload_dat != '0000-00-00 00:00:00'"; + $result1 = $db->query($query1) or die("Cannot execute query1b"); + + $username = $_SESSION["username"]; + $result_id = $db->query("SELECT id + FROM bpm_kandidat + WHERE ka_id = '$username'"); + $row_id = $result_id->fetch_array(); + $id = $row_id['id']; + + while ($row1 = $result1->fetch_array()) { + if (file_exists($row1['file'])) { + $exists = 1; + } else { + $exists = 0; + } + $basename = basename($row1['file']); + $basename_link = basename($row1['file']); + $rep = $id."_"; + $row1['exists'] = $exists; + $row1['basename'] = str_replace($rep, '', $basename); + $row1['basename_link'] = urldecode($row1['file']); + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + + # Gespeicherte Werte Noten + $result_note = $db->query("SELECT erfdat_hzb, erfdat_schnitt, hzb, hzb_punkte, zeugnisschnitt, zeugnisschnitt_punkte + FROM bpm_note + WHERE ka_id ='$username' + ORDER BY no_id desc + LIMIT 1"); + $row_note = $result_note->fetch_array(); + $row_cnt = $result_note->num_rows; + + if($row_note['erfdat_hzb'] != '0000-00-00 00:00:00' AND $row_cnt > 0){ + # HZB erfasst + $smarty->assign('notenart', "HZB"); + if($row_note['hzb_punkte'] != '0.00'){ + $smarty->assign('skala_value', "Punkte"); + $smarty->assign('note', "$row_note[hzb_punkte]"); + # Bei hzb gibts keine Punkte + #$smarty->assign('note_schnitt', "$row_note[hzb]"); + }else{ + $smarty->assign('skala_value', "Noten"); + $smarty->assign('note', "$row_note[hzb]"); + } + }elseif($row_note['erfdat_schnitt'] != '0000-00-00 00:00:00' AND $row_cnt > 0){ + # Durchscnittsnote erfasst + $smarty->assign('notenart', "Durchschnitt"); + if($row_note['zeugnisschnitt_punkte'] != '0.00'){ + $smarty->assign('skala_value', "Punkte"); + $smarty->assign('note', "$row_note[zeugnisschnitt_punkte]"); + $smarty->assign('note_schnitt', "$row_note[zeugnisschnitt]"); + }else{ + $smarty->assign('skala_value', "Noten"); + $smarty->assign('note', "$row_note[zeugnisschnitt]"); + } + }else{ + # Keine Auswahl + $smarty->assign('notenart', "Keine"); + $smarty->assign('skala_value', "Noten"); + $smarty->assign('note', ""); + } + + # Gespeicherte Werte Praxisstellen + $query2 = "SELECT a.ka_id, a.wu_id, b.bez, b.str, b.plz, b.ort, b.mail, a.status, date_format(sendedat, '%d.%m.%Y, %H:%i Uhr') sendedat, b.dst_id + FROM bpm_dst_wunsch a, bpm_dienststellen b + WHERE a.dst_id = b.dst_id + AND a.ka_id = $row[ka_id]"; + + $result2 = $db->query($query2) or die("Cannot execute query2"); + + while ($row2 = $result2->fetch_array()) { + if ($row2['status'] == 'V') { + $status = "Versendet
$row2[sendedat]"; + } + if ($row2['status'] == 'F') { + $status = "Fehler"; + } + if ($row2['status'] == 'O') { + $status = "Vorgemerkt"; + } + $row2['status'] = $status; + $table_data2[] = $row2; + } + $smarty->assign('table_data2', $table_data2); + + # Gespeicherte Werte: Sonstige Mails + $query3 = "SELECT sm_id, sender, sendermail, empfaenger, mail_betreff, mail_text, status, date_format(sendedat, '%d.%m.%y, %H:%i Uhr') sendedat_form + FROM bpm_sonstige_mail + WHERE ka_id = $row[ka_id] + ORDER BY sendedat desc"; + + $result3 = $db->query($query3) or die("Cannot execute query2"); + + while ($row3 = $result3->fetch_array()) { + if ($row3['status'] == 'V') { + $status = "Versendet
$row3[sendedat]"; + } + if ($row3['status'] == 'F') { + $status = "Fehler"; + } + $row3['status'] = $status; + $table_data3[] = $row3; + } + $smarty->assign('table_data3', $table_data3); + +} + +if ($action == 'mail') { + $wu_id = $_GET['wu_id']; + $result_erg = $db->query("SELECT mail_text + FROM bpm_dst_wunsch + WHERE wu_id =$wu_id"); + $row_erg = $result_erg->fetch_array(); + $smarty->assign('mail_text', $row_erg['mail_text']); + +} + +if ($action == 'mail_sonst') { + $sm_id = $_GET['sm_id']; + $result_erg = $db->query("SELECT mail_text, mail_betreff + FROM bpm_sonstige_mail + WHERE sm_id =$sm_id"); + $row_erg = $result_erg->fetch_array(); + $smarty->assign('mail_text', $row_erg['mail_text']); + $smarty->assign('mail_betreff', $row_erg['mail_betreff']); + +} + + +if ($action == 'mailsenden') { + $wu_id = $_GET['wu_id']; + + $result_erg = $db->query("SELECT mail_text, mail_betreff, b.mail, b.bez + FROM bpm_dst_wunsch a, bpm_dienststellen b + WHERE a.dst_id = b.dst_id + AND wu_id =$wu_id"); + $row_erg = $result_erg->fetch_array(); + $smarty->assign('mail_text', $row_erg['mail_text']); + $smarty->assign('mail_betreff', $row_erg['mail_betreff']); + $smarty->assign('mail_mail', $row_erg['mail']); + $smarty->assign('mail_bez', $row_erg['bez']); + $smarty->assign('mail_wuid', $wu_id); +} + +if ($action == 'mailsenden_sonst') { + $sm_id = $_GET['sm_id']; + + $result_erg = $db->query("SELECT sender, sendermail, empfaenger, mail_betreff, mail_text + FROM bpm_sonstige_mail + WHERE sm_id =$sm_id"); + $row_erg = $result_erg->fetch_array(); + $smarty->assign('mail_sender', $row_erg['sender']); + $smarty->assign('mail_sendermail', $row_erg['sendermail']); + $smarty->assign('mail_text', $row_erg['mail_text']); + $smarty->assign('mail_betreff', $row_erg['mail_betreff']); + $smarty->assign('mail_mail', $row_erg['empfaenger']); + $smarty->assign('mail_smid', $sm_id); +} + +if ($action == 'mailsenden2') { + $wu_id = $_POST['wuid']; + + $result_erg = $db->query("SELECT a.ka_id, mail_text, mail_betreff, b.mail, b.bez + FROM bpm_dst_wunsch a, bpm_dienststellen b + WHERE a.dst_id = b.dst_id + AND wu_id =$wu_id"); + $row_erg = $result_erg->fetch_array(); + + $result_kand = $db->query("SELECT hochschule + FROM bpm_kandidat + WHERE ka_id =$row_erg[ka_id]"); + $row_kand = $result_kand->fetch_array(); + + $hochschule = "$row_kand[hochschule]"; + if ($hochschule == 'Ludwigsburg') { + $anschrift = 'Reuteallee 36
71634 Ludwigsburg'; + $sender = "Hochschule Ludwigsburg"; + $sendermail = get_parameter(8); + } elseif ($hochschule == 'Kehl') { + $anschrift = 'Kinzigallee 1
77694 Kehl'; + $sender = "Hochschule Kehl"; + $sendermail = get_parameter(7); + } + $empfaenger = $row_erg['mail']; + $betreff = $_POST['betreff']; + $text = $_POST['text']; + + #echo " + #From: $sender - $sendermail
+ #$empfaenger
+ #$betreff
+ #$text
+ #$hochschule
"; + #exit; + + #Beim CKEDITOR die

Tags mit Zeilenabstand 0 in der Mail + $style =" + + + "; + $text = $style.$text; + + ## Mailversand: + $headers = "From: $sender <$sendermail>\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $text_db = addslashes($text); + $betreff_db = addslashes($betreff); + if ($return) { + $sql1 = $db->query("UPDATE bpm_dst_wunsch + SET mail_text = '$text_db' + , mail_betreff = '$betreff_db' + , status = 'V' + , sendedat = '$datum_db' + WHERE wu_id = $wu_id + "); + $smarty->assign('mail_senderg', "Die Mail wurde verschickt!"); + } else { + $sql1 = $db->query("UPDATE bpm_dst_wunsch + SET mail_text = '$text_db' + , mail_betreff = '$betreff_db' + , status = 'F' + WHERE wu_id = $wu_id + "); + $smarty->assign('mail_senderg', "Die Mail konnte nicht verschickt werden!
Prüfen Sie die Mailadresse der Praxisstelle."); + } +} + + +if ($action == 'mailsenden2_sonst') { + $sm_id = $_POST['smid']; + $sender = $_POST['mail_sender']; + $sendermail = $_POST['mail_sendermail']; + $empfaenger = $_POST['mail_mail']; + $betreff = $_POST['betreff']; + $text = $_POST['text']; + + #Beim CKEDITOR die

Tags mit Zeilenabstand 0 in der Mail + $style =" + + + "; + $text = $style.$text; + + #echo " + #From: $sender - $sendermail
+ #$empfaenger
+ #$betreff
+ #$text
"; + #exit; + + ## Mailversand: + $headers = "From: $sender <$sendermail>\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $text_db = addslashes($text); + $betreff_db = addslashes($betreff); + if ($return) { + $sql1 = $db->query("UPDATE bpm_sonstige_mail + SET mail_text = '$text_db' + , mail_betreff = '$betreff_db' + , empfaenger = '$empfaenger' + , status = 'V' + , sendedat = '$datum_db' + WHERE sm_id = $sm_id + "); + $smarty->assign('mail_senderg', "Die Mail wurde verschickt!"); + } else { + $sql1 = $db->query("UPDATE bpm_sonstige_mail + SET mail_text = '$text_db' + , mail_betreff = '$betreff_db' + , empfaenger = '$empfaenger' + , status = 'F' + WHERE sm_id = $sm_id + "); + $smarty->assign('mail_senderg', "Die Mail konnte nicht verschickt werden!
Prüfen Sie die Mailadresse das Kandidaten."); + } +} + + + + +if ($action == 'chhs') { + + $hochschule = $_POST['hs']; + $username = $_SESSION["username"]; + + $sql1 = $db->query("UPDATE bpm_kandidat + SET hochschule = '$hochschule' + WHERE ka_id = $username + "); + echo ""; +} + +if ($action == 'upload') { + $username = $_SESSION["username"]; + $result_id = $db->query("SELECT id + FROM bpm_kandidat + WHERE ka_id = '$username'"); + $row_id = $result_id->fetch_array(); + $id = $row_id['id']; + + // http://www.tutorials.de/tutorials65420.html + #echo '

', print_r($_POST, true), '
'; + + $tempname = $_FILES['file']['tmp_name']; + $name = $_FILES['file']['name']; + + $type = $_FILES['file']['type']; + $size = $_FILES['file']['size']; + $einheit = "Byte"; // Für die Efolgsmeldung. + + $limitedext = array( + ".pdf" + ); //Erlaubte Dateieindung beim Upload + $extlimit = "yes"; //Do you want to limit the extensions of files uploaded + $ext = strrchr($name, '.'); + + + if (($extlimit == "yes") && (!in_array($ext, $limitedext))) { + echo ""; + exit; + } + # Tabelle bpm_parameter + $size_mb = trim(get_parameter(12)); + $size_bt = $size_mb * 1024 * 1024; + + if ($size > $size_bt) { + echo ""; + exit; + } + + $name = str_replace(array( + "ä", + "ö", + "ü", + "ß", + "Ä", + "Ü", + "Ü", + " " + ), array( + "ae", + "oe", + "ue", + "ss", + "Ae", + "Oe", + "Ue", + "_" + ), $name); + $ka_id = $_SESSION["ka_id"]; + $neu = $id . "_" . $name; + + $result_exists = $db->query("SELECT count(*) Anz + FROM bpm_upload + WHERE file = '$verz$neu' + AND ka_id = '$ka_id'"); + $row_exists = $result_exists->fetch_array(); + + $result_anz = $db->query("SELECT count(*) Anz + FROM bpm_upload + WHERE ka_id = '$ka_id'"); + $row_anz = $result_anz->fetch_array(); + + if ($row_exists['Anz'] > 0) { + echo ""; + exit; + } + + # Tabelle bpm_parameter + $anz_dok = trim(get_parameter(13)); + + if ($row_anz['Anz'] >= $anz_dok) { + echo ""; + exit; + } + + # Datei hochladen + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + move_uploaded_file("$tempname", "$verz$neu"); // Unterverzeichnisse wie folgt: copy("$tempname", "pdf/$neu"); + $sql1 = $db->query("insert into bpm_upload (ka_id, file, upload_dat) VALUES('$username', '$verz$neu', '$datum_db')"); + echo ""; + +} +if ($action == 'descr') { + // http://www.tutorials.de/tutorials65420.html + #echo '
', print_r($_POST, true), '
'; + $username = $_SESSION["username"]; + $query1 = "SELECT up_id + FROM bpm_upload + WHERE ka_id = $username + AND upload_dat != '0000-00-00 00:00:00'"; + + $result1 = $db->query($query1) or die("Cannot execute query1c"); + while ($row1 = $result1->fetch_array()) { + $id = "desc_".$row1['up_id']; + $beschreibung = $_POST[$id]; + + $sql1 = $db->query("UPDATE bpm_upload + SET beschreibung = '$beschreibung' + WHERE up_id = $row1[up_id] + "); + + } + echo ""; + +} +if ($action == 'deldok') { + $up_id = $_GET['up_id']; + + $username = $_SESSION["username"]; + $result_id = $db->query("SELECT id + FROM bpm_kandidat + WHERE ka_id = '$username'"); + $row_id = $result_id->fetch_array(); + $id = $row_id['id']; + + $result_file = $db->query("SELECT file + FROM bpm_upload + WHERE up_id = '$up_id'"); + $row_file = $result_file->fetch_array(); + + $basename = basename($row_file['file']); + $rep = $id."_"; + $dokument = str_replace($rep, '', $basename); + + $smarty->assign('deldok_dokument', $dokument); + $smarty->assign('deldok_up_id', $up_id); +} +if ($action == 'deldok2') { + $up_id = $_GET['up_id']; + $username = $_SESSION["username"]; + + function deleteFiles($datei) + { + if (@unlink($datei)) { + $error = TRUE; + } else { + $error = FALSE; + } + return $error; + } + + $result_del = $db->query("SELECT file + FROM bpm_upload + WHERE ka_id = $username + AND up_id= $up_id + LIMIT 1; + "); + $row_del = $result_del->fetch_array(); + + $del = deleteFiles($row_del['file']); // Dateien werden im Uploadverzeichnis gelöscht, falls noch welche darin wären +# if rausgenommen, wenn kein Dokument vorhanden ist, nur DB Eintrag, dann kann dieser nicht gelöscht werden +# if ($del) { + $sql1 = $db->query("DELETE FROM bpm_upload + WHERE ka_id = $username + AND up_id= $up_id"); +# } + +echo ""; +} +if ($action == 'stelle') { + $username = $_SESSION["username"]; + $query1 = "SELECT a.dst_id, bez, plz, ort + FROM bpm_dienststellen a + WHERE a.dst_id NOT IN (SELECT dst_id + FROM bpm_dst_wunsch + WHERE ka_id = '$username' + ) + AND (gueltig_von <= date_format(now(), '%Y-%m-%d') OR gueltig_von = '0000-00-00') + AND (gueltig_bis >= date_format(now(), '%Y-%m-%d') OR gueltig_bis = '0000-00-00') + ORDER BY bez ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1d"); + + while ($row1 = $result1->fetch_array()) { + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + + + # Gespeicherte Werte + $query2 = "SELECT a.wu_id, b.bez, b.str, b.plz, b.ort, b.mail + FROM bpm_dst_wunsch a, bpm_dienststellen b + WHERE a.dst_id = b.dst_id + AND a.ka_id = $username"; + + $result2 = $db->query($query2) or die("Cannot execute query2b"); + + while ($row2 = $result2->fetch_array()) { + $table_data2[] = $row2; + } + $smarty->assign('table_data2', $table_data2); + + # Tabelle bpm_parameter + $anz_stellen = trim(get_parameter(14)); + $smarty->assign('index_stelle_anz', $anz_stellen); + + # Fehler bei Praxisstellenwahl anzeigen + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + $smarty->assign('index_error', 1); + + if ($errorno == 1) { + $smarty->assign('index_error_text', "Es dürfen maximal $anz_stellen Stellen gewählt werden."); + } + if ($errorno == 2) { + $smarty->assign('index_error_text', "Sie müssen zuerst eine Stelle aud der Dropdownliste markieren."); + } + if ($errorno == 3) { + $smarty->assign('index_error_text', "Es muss zunächst eine zuständige Hochschule definiert werden."); + } + } +} + +if ($action == 'save_praxis') { + $username = $_SESSION["username"]; + $dst_id = $_POST["stelle"]; + +/* + // http://www.tutorials.de/tutorials65420.html + $result_anz = $db->query("SELECT count(*) Anz + FROM bpm_dst_wunsch + WHERE ka_id = '$ka_id'"); + $row_anz = $result_anz->fetch_array(); + + # Tabelle bpm_parameter + $anz_stellen = trim(get_parameter(14)); + + if ($row_anz['Anz'] >= $anz_stellen) { + echo ""; + exit; + } +*/ + if ($dst_id == '') { + echo ""; + exit; + } + + + $result_hs = $db->query("SELECT anrede, hochschule, id + FROM bpm_kandidat + WHERE ka_id = $username + LIMIT 1; + "); + $row_hs = $result_hs->fetch_array(); + $hochschule = $row_hs['hochschule']; + + if($hochschule == 'Ludwigsburg'){ + $anschrift = 'Reuteallee 36
71634 Ludwigsburg'; + $sender = "Hochschule Ludwigsburg"; + $sendermail = get_parameter(8); + }elseif($hochschule == 'Kehl'){ + $anschrift = 'Kinzigallee 1
77694 Kehl'; + $sender = "Hochschule Kehl"; + $sendermail = get_parameter(7); + }else{ + echo ""; + exit; + } + + $link_arzt = 'https://www.gesundheitsamt-bw.de/'; + $link = 'https://www.hs-ludwigsburg.de/kurs/bpm/praxisstelle/index.php'; + $link_register = 'https://www.hs-ludwigsburg.de/kurs/bpm/praxisstelle/register.php'; + + $result_dst = $db->query("SELECT mail, init_tan + FROM bpm_dienststellen + WHERE dst_id = $dst_id + LIMIT 1; + "); + $row_dst = $result_dst->fetch_array(); + + if ($row_dst['init_tan'] == ''){ + $tan = tangen(); + $sql0 = $db->query("UPDATE bpm_dienststellen + SET init_tan = '$tan' + WHERE dst_id = '$dst_id' + "); + }else{ + $tan = ""; + } + + $empfaenger = "$row_dst[mail]"; + $betreff = "Bewerbung zur praktischen Ausbildung BPM"; + + ######################################################### + ## dieselbe Mail ist auch in /upload/index.php + ######################################################### + if($row_hs['anrede'] != 'W'){ + # männliche Version + $text = "Guten Tag,
+
+ ein Bewerber hat Sie als Wunschausbildungsstelle für das Einführungspraktikum im Studiengang Public Management ausgewählt.
"; + + + if($tan == ""){ + $text .=" + Sie erhalten einen Link für die Einsicht der Bewerbungsunterlagen: +
+
+ $link"; + } + + if($tan != ""){ + $text .=" +
+
+ Bitte registrieren Sie Ihre Praxisstelle zunächst mit folgenden Logindaten:
+ Registrierung: $link_register
+ Benutzername: $empfaenger
+ Einmalpasswort: $tan + "; + } + + $text .= " +
+
+ Die Ausbildungsstellen führen das Auswahlverfahren nach § 7 Absätze 3 und 4 APrOVw gD durch. Sollten Sie sich für den Bewerber und selbiger für Ihre Ausbildungsstelle entscheiden, teilt die Ausbildungsstelle der zuständigen Hochschule schnellstmöglich, jedoch bis spätestens 22. Juli des Jahres des Ausbildungsbeginns schriftlich Ihre Entscheidung mit. +
+ Der Bewerber ist von Ihnen darauf hinzuweisen, sich um folgende personalrechtlichen Unterlagen zu bemühen und an Sie zu übersenden: +
    +
  • Ärztliches Zeugnis zum Nachweis der gesundheitlichen Eignung (es ist ein Attest von einer Ärztin oder eines Arztes, die vom Landesgesundheitsamt dafür bestimmt wurden notwendig. Eine Liste aller Ärzte finden Sie + unter: $link_arzt -> Service -> Gesundheitliche Eignung bei Verbeamtung -> Hinweise für Beamtenbewerber. Die dafür anfallenden Kosten hat die Bewerberin oder der Bewerber selbst zu tragen. Dieses Zeugnis darf zu Ausbildungsbeginn nicht älter als 6 Monate sein), +
  • +
  • Erklärung über den Ausschluss eines aktuellen oder früheren Behandlungsverhältnisses (dies finden Sie unter $link_arzt -> Service -> Gesundheitliche Eignung bei Verbeamtung -> Hinweise für Beamtenbewerber -> „Erklärung Ausschluss Behandlungsverhältnis“), +
  • +
  • Führungszeugnis zur Vorlage bei einer Behörde nach § 30 Abs. 5 BZRG (dieses Zeugnis darf keine Einträge enthalten und zu Ausbildungsbeginn nicht älter als 3 Monate sein).
  • +
+
+ Diese Unterlagen sind von Ihnen als Einstellungsvoraussetzungen zum 1. September des Einstellungsjahres zu prüfen. Nach Ausbildungsbeginn müssen diese Unterlagen an die Hochschule übersendet werden, diese sind die Grundlage für die spätere Ernennung in ein Beamtenverhältnis. +

+ Bitte teilen Sie dem Bewerber mit, dass er nur dann einen Ausbildungsplatz bei Ihnen erhalten kann, wenn er eine endgültige Zulassung für einen Studienplatz durch die Hochschule erhält. Endgültige Zulassungen zum Studium können erst nach Abschluss der Bewerbungsphase und nach der Rückmeldefrist der Ausbildungsstellen (22. Juli des Jahres des Ausbildungsbeginns) erfolgen. Erst dann kann die finale Bewerberrangliste gebildet werden, die die Grundlage der Studienplatzvergabe darstellt. Das Nachrückverfahren kann in Einzelfällen wie bisher auch bis unmittelbar vor Praktikumsbeginn andauern. +
+
+ Freundliche Grüße +

+ Ihre Hochschule $hochschule +
+ $anschrift +
+

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail.
+
+ Vielen Dank! + + "; + }else{ + # weibliche Version + $text = "Guten Tag,
+
+ eine Bewerberin hat Sie als Wunschausbildungsstelle für das Einführungspraktikum im Studiengang Public Management ausgewählt.
"; + + if($tan == ""){ + $text .=" + Sie erhalten einen Link für die Einsicht der Bewerbungsunterlagen: +
+
+ $link"; + } + + if($tan != ""){ + $text .=" +
+
+ Bitte registrieren Sie Ihre Praxisstelle zunächst mit folgenden Logindaten:
+ Registrierung: $link_register
+ Benutzername: $empfaenger
+ Einmalpasswort: $tan + "; + } + + $text .= " +
+
+ Die Ausbildungsstellen führen das Auswahlverfahren nach § 7 Absätze 3 und 4 APrOVw gD durch. Sollten Sie sich für die Bewerberin und selbige für Ihre Ausbildungsstelle entscheiden, teilt die Ausbildungsstelle der zuständigen Hochschule schnellstmöglich, jedoch bis spätestens 22. Juli des Jahres des Ausbildungsbeginns schriftlich Ihre Entscheidung mit. +
+ Die Bewerberin ist von Ihnen darauf hinzuweisen, sich um folgende personalrechtlichen Unterlagen zu bemühen und an Sie zu übersenden: +

    +
  • Ärztliches Zeugnis zum Nachweis der gesundheitlichen Eignung (es ist ein Attest von einer Ärztin oder eines Arztes, die vom Landesgesundheitsamt dafür bestimmt wurden notwendig. Eine Liste aller Ärzte finden Sie + unter: $link_arzt -> Service -> Gesundheitliche Eignung bei Verbeamtung -> Hinweise für Beamtenbewerber. Die dafür anfallenden Kosten hat die Bewerberin oder der Bewerber selbst zu tragen. Dieses Zeugnis darf zu Ausbildungsbeginn nicht älter als 6 Monate sein), +
  • +
  • Erklärung über den Ausschluss eines aktuellen oder früheren Behandlungsverhältnisses (dies finden Sie unter $link_arzt -> Service -> Gesundheitliche Eignung bei Verbeamtung -> Hinweise für Beamtenbewerber -> „Erklärung Ausschluss Behandlungsverhältnis“), +
  • +
  • Führungszeugnis zur Vorlage bei einer Behörde nach § 30 Abs. 5 BZRG (dieses Zeugnis darf keine Einträge enthalten und zu Ausbildungsbeginn nicht älter als 3 Monate sein).
  • +
+
+ Diese Unterlagen sind von Ihnen als Einstellungsvoraussetzungen zum 1. September des Einstellungsjahres zu prüfen. Nach Ausbildungsbeginn müssen diese Unterlagen an die Hochschule übersendet werden, diese sind die Grundlage für die spätere Ernennung in ein Beamtenverhältnis. +

+ Bitte teilen Sie der Bewerberin mit, dass sie nur dann einen Ausbildungsplatz bei Ihnen erhalten kann, wenn sie eine endgültige Zulassung für einen Studienplatz durch die Hochschule erhält. Endgültige Zulassungen zum Studium können erst nach Abschluss der Bewerbungsphase und nach der Rückmeldefrist der Ausbildungsstellen (22. Juli des Jahres des Ausbildungsbeginns) erfolgen. Erst dann kann die finale Bewerberrangliste gebildet werden, die die Grundlage der Studienplatzvergabe darstellt. Das Nachrückverfahren kann in Einzelfällen wie bisher auch bis unmittelbar vor Praktikumsbeginn andauern. +
+
+ Freundliche Grüße +

+ Ihre Hochschule $hochschule +
+ $anschrift +
+

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail.
+
+ Vielen Dank! + + "; + } + +#echo " +#From: $sender - $sendermail
+#$empfaenger
+#$betreff
+#$text
"; +#exit; + ## Mailversand: + $headers = "From: $sender <$sendermail>\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $text_db = addslashes($text); + + + if($return){ + $sql1 = $db->query("insert into bpm_dst_wunsch (dst_id, ka_id, datum, mail_text, mail_betreff, status, sendedat) + VALUES('$dst_id', '$username', '$datum_db', '$text_db', '$betreff', 'V', '$datum_db')"); + + }else{ + $sql1 = $db->query("insert into bpm_dst_wunsch (dst_id, ka_id, datum, mail_text, mail_betreff, status) + VALUES('$dst_id', '$username', '$datum_db', '$text_db', '$betreff', 'F')"); + } + echo ""; + +} + +if ($action == 'testback') { + $username = $_SESSION["username"]; + $tan = $_SESSION["tan"]; + + $sql1 = $db->query("UPDATE bpm_tanpool a + SET login_dat = '0000-00-00 00:00:00' + ,aktiv = 'A' + WHERE tp_id = (SELECT b.tp_id + FROM bpm_term_kand b + WHERE b.ka_id = '$username' + ORDER BY b.tk_id DESC + LIMIT 1 + ) + AND tan = '$tan' + "); + + echo ""; +} + +if ($action == 'skala') { + # Die Seite wird neu geladen und damit vom Element Spinner die Ranges gesetzt + #$skala = $_POST['notenskala']; + #$_SESSION["skala"] = $skala; + echo ""; +} + +if ($action == 'stammdaten_edit') { + $username = $_SESSION["username"]; + + + + $result = $db->query("SELECT ka_id, anrede, vorname, nachname, str, plz, ort, date_format(gebdat, '%d.%m.%Y') gebdat_form, mail, tel + FROM bpm_kandidat + WHERE ka_id = '$username' + LIMIT 1"); + $row = $result->fetch_array(); + + $smarty->assign('persdat_value_anrede', $row['anrede']); + $smarty->assign('persdat_value_vorname', $row['vorname']); + $smarty->assign('persdat_value_nachname', $row['nachname']); + $smarty->assign('persdat_value_gebdat', $row['gebdat_form']); + $smarty->assign('persdat_value_str', $row['str']); + $smarty->assign('persdat_value_plz', $row['plz']); + $smarty->assign('persdat_value_ort', $row['ort']); + $smarty->assign('persdat_value_mail', $row['mail']); + $smarty->assign('persdat_value_tel', $row['tel']); + + ## Fehlerhandling + $error1 = $_GET['error1']; + $error2 = $_GET['error2']; + $error3 = $_GET['error3']; + $error4 = $_GET['error4']; + $error5 = $_GET['error5']; + $error6 = $_GET['error6']; + $error7 = $_GET['error7']; + $error8 = $_GET['error8']; + $error9 = $_GET['error9']; + $error10 = $_GET['error10']; + $error11 = $_GET['error11']; + $error12 = $_GET['error12']; + $error13 = $_GET['error13']; + $error14 = $_GET['error14']; + + if ($error1 == 1){$smarty->assign('erf_hig_anrede', 1);}else{$smarty->assign('erf_hig_anrede', 0);} + if ($error2 == 1){$smarty->assign('erf_hig_vorname', 1);}else{$smarty->assign('erf_hig_vorname', 0);} + if ($error3 == 1){$smarty->assign('erf_hig_nachname', 1);}else{$smarty->assign('erf_hig_nachname', 0);} + if ($error4 == 1){$smarty->assign('erf_hig_gebdat', 1);}else{$smarty->assign('erf_hig_gebdat', 0);} + if ($error5 == 1){$smarty->assign('erf_hig_str', 1);}else{$smarty->assign('erf_hig_str', 0);} + if ($error6 == 1){$smarty->assign('erf_hig_plz', 1);}else{$smarty->assign('erf_hig_plz', 0);} + if ($error7 == 1){$smarty->assign('erf_hig_ort', 1);}else{$smarty->assign('erf_hig_ort', 0);} + if ($error8 == 1){$smarty->assign('erf_hig_mail', 1);}else{$smarty->assign('erf_hig_mail', 0);} + if ($error14 == 1){$smarty->assign('erf_hig_tel', 1);}else{$smarty->assign('erf_hig_tel', 0);} + + #Telefon kein Pflichtfeld derzeit + if($error1 == 1 or $error2 == 1 or $error3 == 1 or $error4 == 1 or $error5 == 1 or $error6 == 1 or $error7 == 1 or $error8 == 1 or $error9 == 1 or $error10 == 1){ + $smarty->assign('persdat_error', 1); + + if($error9 == 1){ + $smarty->assign('persdat_error_text', 'Bitte prüfen Sie das Geburtsdatum.'); + } + if($error10 == 1){ + $smarty->assign('persdat_error_text', 'Die E-Mailadresse enthält Fehler.'); + } +# if($error11 == 1){ +# $smarty->assign('persdat_error_text', 'Sie haben sich bereits registriert. Setzen Sie sich ggf. mit der Hochschule in Verbindung.'); +# } +# if($error12 == 1){ +# $smarty->assign('persdat_error_text', 'Sie haben Sie den Test bereits 1x wiederholt.'); +# } +# if($error13 == 1){ +# $smarty->assign('persdat_error_text', 'Bitte prüfen Sie die Kombination aus ID/TAN.'); +# } + + if($error20 == 1){ + $smarty->assign('persdat_error_text', 'Die damalige ID darf nicht leer sein.'); + } + if($error21 == 1){ + $smarty->assign('persdat_error_text', 'Die damalige TAN darf nicht leer sein.'); + } + if($error1 == 1 or $error2 == 1 or $error3 == 1 or $error4 == 1 or $error5 == 1 or $error6 == 1 or $error7 == 1 or $error8 == 1 or $error14 == 1){ + $smarty->assign('persdat_error_text', 'Bitte füllen Sie die Pflichtfelder aus.'); + } + } +} + +if ($action == 'stammdaten2_edit') { + $username = $_SESSION["username"]; + + if(isset($_POST['anrede'])){ + $anrede = trim($_POST['anrede']); + } + + if(isset($_POST['vorname'])){ + $vorname = addslashes(trim($_POST['vorname'])); + } + + if(isset($_POST['nachname'])){ + $nachname = addslashes(trim($_POST['nachname'])); + } + + if(isset($_POST['gebdat'])){ + $gebdat = addslashes(trim($_POST['gebdat'])); + } + + if(isset($_POST['str'])){ + $str = addslashes(trim($_POST['str'])); + } + + if(isset($_POST['plz'])){ + $plz = addslashes(trim($_POST['plz'])); + } + + if(isset($_POST['ort'])){ + $ort = addslashes(trim($_POST['ort'])); + } + + if(isset($_POST['alter18'])){ + $alter18 = addslashes(trim($_POST['alter18'])); + } + + if(isset($_POST['mail'])){ + $mail = addslashes(trim($_POST['mail'])); + } + + if(isset($_POST['tel'])){ + $tel = addslashes(trim($_POST['tel'])); + } + + if ($anrede == '') { + $error1=1; + $error=true; + } + if ($vorname == ''){ + $error2=1; + $error=true; + } + if ($nachname == ''){ + $error3=1; + $error=true; + } + if ($gebdat == ''){ + $error4=1; + $error=true; + } + if ($str == ''){ + $error5=1; + $error=true; + } + if ($plz == ''){ + $error6=1; + $error=true; + } + if ($ort == ''){ + $error7=1; + $error=true; + } + if ($mail == ''){ + $error8=1; + $error=true; + } + +#Telefon kein Pflichtfeld derzeit +# if ($tel == ''){ +# $error14=1; +# $error=true; +# } + + # Datumsformat von DD.MM.YYYY nach YYYY-MM-DD + $gebdat_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $gebdat); + + function validateDate($date, $format = 'Y-m-d'){ + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; + } + + if(!validateDate($gebdat_form)){ + $error9=1; + $error=true; + } + + if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) { + $error10=1; + $error=true; + } + + if(isset($error)){ + echo ""; + exit; + } + $sql1 = $db->query( "UPDATE bpm_kandidat + SET anrede = '$anrede' + ,vorname = '$vorname' + ,nachname = '$nachname' + ,gebdat = '$gebdat_form' + ,str = '$str' + ,plz = '$plz' + ,ort = '$ort' + ,mail = '$mail' + ,tel = '$tel' + WHERE ka_id = '$username' + " ); + +} +// ende Action +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/datencheck.php b/admin/old/datencheck.php new file mode 100644 index 0000000..eac2812 --- /dev/null +++ b/admin/old/datencheck.php @@ -0,0 +1,161 @@ +query("SELECT count(distinct ka_id) Anz + FROM bpm_term_kand a, bpm_tanpool b + WHERE a.tp_id = b.tp_id + AND b.login_dat != '0000-00-00 00:00:00'"); + $row_anzget = $result_anzget->fetch_array(); + $smarty->assign('datenchk_anzget', $row_anzget['Anz']); + + #Anzahl der Kandidaten mit ausstehendem Test + $result_aussttest = $db->query("SELECT count(*) Anz + FROM bpm_tanpool b + WHERE verw_dat != '0000-00-00 00:00:00' + AND b.login_dat = '0000-00-00 00:00:00'"); + $row_aussttest = $result_aussttest->fetch_array(); + $smarty->assign('datenchk_aussttest', $row_aussttest['Anz']); + + #Anzahl aller Anmeldung + $result_alleranm = $db->query("SELECT count(distinct ka_id) Anz + FROM bpm_term_kand a, bpm_tanpool b + WHERE a.tp_id = b.tp_id + AND b.verw_dat != '0000-00-00 00:00:00'"); + $row_alleranm = $result_alleranm->fetch_array(); + $smarty->assign('datenchk_alleranm', $row_alleranm['Anz']); + + #Anzahl Durchfaller - komplizierter. Wenn er nach dem ersten Mal durchgefallen doch bestanden hat, gilt er nicht als Durchfaller + $query = "SELECT ka_id, max(tp_id) tp_id + FROM bpm_term_kand + GROUP BY ka_id + "; + + $result = $db->query($query) or die("Cannot execute query1"); + $zaehler = 0; + while ($row = $result->fetch_array()) { + $result_tan = $db->query("SELECT tan + FROM bpm_tanpool + WHERE tp_id = $row[tp_id]"); + $row_tan = $result_tan->fetch_array(); + + $result_bestanden = $db->query("SELECT bestanden + FROM bpm_ergebnisse + WHERE ka_id = $row[ka_id] + AND tan = '$row_tan[tan]'"); + $row_bestanden = $result_bestanden->fetch_array(); + if($row_bestanden['bestanden'] == 0 and $row_bestanden['bestanden'] != ''){ + $zaehler++; + } + } + $smarty->assign('datenchk_anzdurchfaller', $zaehler); + + # Gespeicherte Werte + $query1 = "SELECT a.ka_id, vorname, nachname, date_format(tm_datum, '%d.%m.%Y um %H:%i Uhr') tm_datum, CASE tm_standort + WHEN 'L' THEN 'Ludwigsburg' + WHEN 'K' THEN 'Kehl' + ELSE '' END as tm_standort + , behinderung, verkuerzung + FROM bpm_kandidat a, bpm_term_kand b, bpm_termine c, bpm_ergebnisse d, bpm_tanpool e + WHERE a.ka_id = b.ka_id + AND b.tm_id = c.tm_id + AND a.ka_id = d.ka_id + AND b.tp_id = e.tp_id + AND a.ka_id IN (SELECT distinct ka_id FROM bpm_ergebnisse) + AND a.ka_id IN (SELECT distinct ka_id FROM bpm_upload WHERE upload_dat != '0000-00-00 00:00:00') + AND d.bestanden = '1' + AND e.tan=d.tan + ORDER BY tm_datum DESC, nachname ASC, vorname ASC + "; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + $row_cnt = $result1->num_rows; + $smarty->assign('dokverw_anzdb', $row_cnt); + + while ($row1 = $result1->fetch_array()) { + + $result_test = $db->query("SELECT summe + FROM bpm_ergebnisse + WHERE ka_id = '$row1[ka_id]' + AND bestanden = '1'"); + $row_test = $result_test->fetch_array(); + + $result_anzhzb = $db->query("SELECT count(*) Anz + FROM bpm_upload + WHERE beschreibung = 'HZB' + AND ka_id = '$row1[ka_id]'"); + $row_anzhzb = $result_anzhzb->fetch_array(); + if($row_anzhzb['Anz'] > 0){ + $image_hzb = "ok.gif"; + }else{ + $image_hzb = "cross.jpg"; + } + + $result_anzzeug = $db->query("SELECT count(*) Anz + FROM bpm_upload + WHERE beschreibung like 'Zeugnis%' + AND ka_id = '$row1[ka_id]'"); + $row_anzzeug = $result_anzzeug->fetch_array(); + if($row_anzzeug['Anz'] >= 2){ + $image_zeug = "ok.gif"; + }else{ + $image_zeug = "cross.jpg"; + } + + $result_anzleben = $db->query("SELECT count(*) Anz + FROM bpm_upload + WHERE beschreibung = 'Lebenslauf' + AND ka_id = '$row1[ka_id]'"); + $row_anzleben = $result_anzleben->fetch_array(); + if($row_anzleben['Anz'] >= 1){ + $image_leben = "ok.gif"; + }else{ + $image_leben = "cross.jpg"; + } + + $result_notehzb = $db->query("SELECT hzb, zeugnisschnitt + FROM bpm_note + WHERE ka_id = '$row1[ka_id]'"); + $row_notehzb = $result_notehzb->fetch_array(); + if($row_notehzb['hzb'] == "0.00" or $row_notehzb['hzb'] == ""){ + $image_notehzb = "cross.jpg"; + }else{ + $image_notehzb = "ok.gif"; + } + + if($row_notehzb['zeugnisschnitt'] == "0.00" or $row_notehzb['zeugnisschnitt'] == ""){ + $image_noteschnitt = "cross.jpg"; + }else{ + $image_noteschnitt = "ok.gif"; + } + + $row1['image_noteschnitt'] = $image_noteschnitt; + $row1['image_notehzb'] = $image_notehzb; + $row1['image_leben'] = $image_leben; + $row1['image_zeug'] = $image_zeug; + $row1['anz_zeug'] = $row_anzzeug['Anz']; + $row1['image_hzb'] = $image_hzb; + $row1['testergebnis'] = $row_test['summe']; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/dokverw.php b/admin/old/dokverw.php new file mode 100644 index 0000000..2029482 --- /dev/null +++ b/admin/old/dokverw.php @@ -0,0 +1,110 @@ +query($query1) or die("Cannot execute query1"); + $row_cnt = $result1->num_rows; + $smarty->assign('dokverw_anzdb', $row_cnt); + + while ($row1 = $result1->fetch_array()) { + $result_kand = $db->query("SELECT vorname, nachname + FROM bpm_kandidat + WHERE ka_id = '$row1[ka_id]'"); + $row_kand = $result_kand->fetch_array(); + if (file_exists($row1['file'])) { + $exists = 1; + } else { + $exists = 0; + } + + $row1['vorname'] = $row_kand['vorname']; + $row1['nachname'] = $row_kand['nachname']; + $row1['exists'] = $exists; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + + + $dir = $_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF'])."/$verz"; + + $folder = dir($dir); + while ($dateiname = $folder->read()) { + if (filetype($dir.$dateiname) != "dir") { + $ext = strrchr($dateiname, '.'); + if($ext == '.pdf'){ + $result_checkdoc = $db->query("SELECT count(*) Anz + FROM bpm_upload + WHERE file ='$verz$dateiname' + LIMIT 1"); + $row_checkdoc = $result_checkdoc->fetch_array(); + if($row_checkdoc['Anz'] == 0){ + $exists2 = 0; + $vorname = ""; + $nachname = ""; + }else{ + $result_checkdoc2 = $db->query("SELECT ka_id + FROM bpm_upload + WHERE file ='$verz$dateiname' + LIMIT 1"); + $row_checkdoc2 = $result_checkdoc2->fetch_array(); + + $result_kand = $db->query("SELECT vorname, nachname + FROM bpm_kandidat + WHERE ka_id = '$row_checkdoc2[ka_id]'"); + $row_kand = $result_kand->fetch_array(); + $vorname = $row_kand['vorname']; + $nachname = $row_kand['nachname']; + $exists2 = 1; + } + $row2['vorname'] = $vorname; + $row2['nachname'] = $nachname; + $row2['file'] = $dateiname; + $row2['exists'] = $exists2; + $row2['dateiname'] = $dateiname; + $table_data2[] = $row2; + } + } + } + $smarty->assign('table_data2', $table_data2); + $cntserver = count($table_data2); + $smarty->assign('dokverw_anzserver', $cntserver); +} +if ($action == 'delserver') { + $file = $verz.$_GET['file']; + @unlink($file); + echo ""; +} +if ($action == 'deldb') { + $up_id = $_GET['up_id']; + $sql1 = $db->query("DELETE FROM bpm_upload + WHERE up_id = $up_id + "); + echo ""; +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/downpdf.php b/admin/old/downpdf.php new file mode 100644 index 0000000..460eadd --- /dev/null +++ b/admin/old/downpdf.php @@ -0,0 +1,29 @@ +window.top.location.href = \"index.php\";"; +exit; +} +$file = str_replace('%2F', '/', urlencode($_GET["file"])); + + +if (file_exists($file)) { +header("Content-Type: application/octet-stream"); +header("Content-Disposition: attachment; filename=" . urlencode(basename($file))); +header("Content-Type: application/download"); +header("Content-Description: File Transfer"); +header("Content-Length: " . filesize($file)); + +flush(); // This doesn't really matter. + +$fp = fopen($file, "r"); +while (!feof($fp)) { + echo fread($fp, 65536); + flush(); // This is essential for large downloads +} + +fclose($fp); +}else{ +echo "Datei nicht gefunden"; +} +?> \ No newline at end of file diff --git a/admin/old/ergebnisse.php b/admin/old/ergebnisse.php new file mode 100644 index 0000000..a92024e --- /dev/null +++ b/admin/old/ergebnisse.php @@ -0,0 +1,123 @@ +query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT a.tm_id, date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine a, bpm_term_kand b, bpm_ergebnisse c + WHERE a.tm_id=b.tm_id + AND b.ka_id = c.ka_id + AND a.tm_datum > ADDDATE(now(), -365) + AND a.tm_datum < now() + GROUP BY a.tm_id, tm_datum_form, tm_standort + ORDER BY tm_datum desc"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + + if ($row1['tm_standort'] == 'L') { + $standort = 'Ludwigsburg'; + } + if ($row1['tm_standort'] == 'K') { + $standort = 'Kehl'; + } + + $row1['tm_standort'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'ausgabe') { + if (isset($_POST["testtermin"])) { + $testtermin = $_POST["testtermin"]; + } else { + $testtermin = $_SESSION["testtermin"]; + } + + $_SESSION["testtermin"] = $testtermin; + + $result = $db->query("SELECT date_format(tm_datum, '%d.%m.%Y') tm_datum, tm_standort + FROM bpm_termine + WHERE tm_id = $testtermin"); + $row = $result->fetch_array(); + + if ($row['tm_standort'] == 'L') { + $standort = 'Ludwigsburg'; + } + if ($row['tm_standort'] == 'K') { + $standort = 'Kehl'; + } + + $smarty->assign('erg_datum', $row['tm_datum']); + $smarty->assign('erg_standort', $standort); + + $query1 = "SELECT vorname, nachname, a.ka_id, a.tan, satzerg, gemeinsamkeiten, rechenaufgaben, zahlenreihen, rechenzeichen, matrizen, merkf, summe, bestanden, a.eg_id + FROM bpm_ergebnisse a, bpm_kandidat b, bpm_term_kand c, bpm_termine d, bpm_tanpool e + WHERE a.ka_id = b.ka_id + AND b.ka_id = c.ka_id + AND c.tm_id = d.tm_id + AND c.tp_id = e.tp_id + AND e.tan = a.tan + AND d.tm_id = $testtermin + ORDER BY nachname ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + $row1['tm_standort'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + + +if ($action == 'del') { +$ka_id = $_GET['ka_id']; +$eg_id = $_GET['eg_id']; + + $result = $db->query("SELECT vorname, nachname + FROM bpm_kandidat + WHERE ka_id = $ka_id"); + $row = $result->fetch_array(); + $smarty->assign('del_name', "$row[vorname] $row[nachname]"); + $smarty->assign('del_eg_id', $eg_id); + +} + +if ($action == 'del2') { + $eg_id = $_GET['eg_id']; + + $sql1 = $db->query("UPDATE bpm_ergebnisse + SET summe = 0 + ,bestanden='0' + WHERE eg_id= $eg_id"); + +echo ""; +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/old/fetch.php b/admin/old/fetch.php new file mode 100644 index 0000000..1fe4d26 --- /dev/null +++ b/admin/old/fetch.php @@ -0,0 +1,70 @@ + 0) +{ + while($row = mysqli_fetch_array($result)) + { + if(mysqli_num_rows($result) == 1){ + $output .= " + + "; + + }else{ + $output .= " + + "; + + } + } + echo $output; +} +else +{ + echo 'Data Not Found'; +} +?> diff --git a/admin/old/kand_del.php b/admin/old/kand_del.php new file mode 100644 index 0000000..52fb1a2 --- /dev/null +++ b/admin/old/kand_del.php @@ -0,0 +1,111 @@ +query("SET lc_time_names = 'de_DE';"); + +# Dropdown befüllen übernimmt ajax:fetch.php +# $query1 = "SELECT a.ka_id, vorname, nachname, date_format(gebdat, '%d.%m.%Y') geb_format +# FROM bpm_kandidat a, bpm_term_kand b, bpm_tanpool c +# WHERE a.ka_id =b.ka_id +# AND b.tp_id =c.tp_id +# AND c.login_dat = '0000-00-00 00:00:00' +# ORDER BY nachname ASC, vorname ASC"; +# +# $result1 = $db->query($query1) or die("Cannot execute query1"); +# +# +# while ($row1 = $result1->fetch_array()) { +# $table_data1[] = $row1; +# } +# $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'nachfrage') { + $ka_id = $_POST['user']; + + $result_id = $db->query("SELECT vorname, nachname + FROM bpm_kandidat + WHERE ka_id = '$ka_id'"); + $row_id = $result_id->fetch_array(); + + $smarty->assign('kand_name', "$row_id[vorname] $row_id[nachname]"); + $smarty->assign('kand_ka_id', $ka_id); + +} + +if ($action == 'delkand') { + $ka_id = $_GET['ka_id']; + + + $result_del = $db->query("SELECT count(*) Anz + FROM bpm_kandidat a, bpm_term_kand b, bpm_tanpool c + WHERE a.ka_id =b.ka_id + AND b.tp_id =c.tp_id + AND c.login_dat = '0000-00-00 00:00:00' + AND a.ka_id = $ka_id + "); + $row_del = $result_del->fetch_array(); + + # Kandidat war inzwischen nicht beim Test angemeldet + if ($row_del['Anz'] == 1) { + + #Aktuelle Tan ermitteln + $result_tan = $db->query("SELECT a.tp_id, tan + FROM bpm_tanpool a, bpm_term_kand b + WHERE a.tp_id = b.tp_id + AND b.ka_id = '$ka_id' + ORDER BY b.tk_id DESC + LIMIT 1"); + $row_tan = $result_tan->fetch_array(); + $tan = $row_tan['tan']; + $tp_id = $row_tan['tp_id']; + + + $sql1 = $db->query("DELETE FROM bpm_term_kand + WHERE tp_id = $tp_id + AND ka_id= $ka_id"); + + $sql1 = $db->query("DELETE FROM bpm_sonstige_mail + WHERE ka_id= $ka_id"); + + # TAN wieder freigeben + $sql2 = $db->query("UPDATE bpm_tanpool + SET verw_dat = '0000-00-00 00:00:00' + ,login_dat = '0000-00-00 00:00:00' + WHERE tp_id= $tp_id + AND tan = '$tan'"); + + # Prüfen, ob es noch eine alte Bewerbung zum Test gibt, den er nicht bestanden hatte. Dann sollen die Stammdaten erhalten bleiben + $result_del2 = $db->query("SELECT count(*) Anz + FROM bpm_term_kand + WHERE ka_id ='$ka_id' + "); + $row_del2 = $result_del2->fetch_array(); + + if($row_del2['Anz'] == 0){ + $sql3 = $db->query("DELETE FROM bpm_kandidat + WHERE ka_id= $ka_id"); + } + } + +echo ""; +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/liste_tn.php b/admin/old/liste_tn.php new file mode 100644 index 0000000..3e53669 --- /dev/null +++ b/admin/old/liste_tn.php @@ -0,0 +1,256 @@ +query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT a.tm_id, date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine a, bpm_term_kand b + WHERE a.tm_id=b.tm_id + AND a.tm_datum > ADDDATE(now(), -7) + GROUP BY a.tm_id, tm_datum_form, tm_standort + ORDER BY tm_datum ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + + if($row1['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg'; + } + if($row1['tm_standort'] == 'K'){ + $standort = 'Kehl'; + } + + $row1['tm_standort'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'ausgabe') { + $testtermin = $_POST["testtermin"]; + $german = $db->query("SET lc_time_names = 'de_DE';"); + $query_termin = $db->query("SELECT date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine + WHERE tm_id = $testtermin"); + $row_get_termin = $query_termin->fetch_array(); + + if($row_get_termin['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg'; + } + if($row_get_termin['tm_standort'] == 'K'){ + $standort = 'Kehl'; + } + + +$buffer = ''; +$buffer .= ""; + +$buffer.="

$row_get_termin[tm_datum_form], $standort

+ + + + + + + + + + + +"; + $query1 = "SELECT anrede, vorname, nachname, str, plz, ort, alter18, id, date_format(gebdat,'%d.%m.%Y') gebdat_form, tan, tinyurl, mail + FROM bpm_term_kand a, bpm_tanpool b, bpm_kandidat c + WHERE a.tp_id= b.tp_id + AND a.ka_id = c.ka_id + AND a.tm_id = $testtermin + ORDER BY nachname, vorname + "; + + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + $smarty->assign('termine_aktdat', date("d.m.Y H:i", time() ) ) ; + while ($row1 = $result1->fetch_array()) { + if($row1['alter18'] == 0){ + $minderj = 'ja'; + } + if($row1['alter18'] == 1){ + $minderj = 'nein'; + } +$buffer.=" + + + + + + + + +"; + } + +$buffer.=" +
+ Name + + Geburtstag + + Minderjährig + + ID + + Mail + + TAN + + Link +
+ $row1[nachname], $row1[vorname] ($row1[anrede])
+ $row1[str]
+ $row1[plz] $row1[ort] +
+ $row1[gebdat_form] + + $minderj + + $row1[id] + + $row1[mail] + + $row1[tan] + + $row1[tinyurl] +
+"; + +require_once("../mpdf/vendor/autoload.php"); +$mpdf = new \Mpdf\Mpdf([ + 'mode' => 'utf-8', + 'format' => 'A4', + 'orientation' => 'P', + 'margin_top' => 10, + 'margin_bottom' => 10, + 'margin_left' => 10, + 'margin_right' => 16, + 'default_font' => 'arial' +]); + + + + $query2 = "SELECT anrede, vorname, nachname, str, plz, ort, alter18, id, date_format(gebdat,'%d.%m.%Y') gebdat_form, tan, tinyurl, mail, hochschule + FROM bpm_term_kand a, bpm_tanpool b, bpm_kandidat c + WHERE a.tp_id= b.tp_id + AND a.ka_id = c.ka_id + AND a.tm_id = $testtermin + ORDER BY nachname, vorname + "; + + + $result2 = $db->query($query2) or die("Cannot execute query2"); + + $smarty->assign('termine_aktdat', date("d.m.Y H:i", time() ) ) ; + while ($row2 = $result2->fetch_array()) { + + if($row2['alter18'] == 0){ + $minderj = 'ja'; + } + if($row2['alter18'] == 1){ + $minderj = 'nein'; + } + + if($row2['hochschule'] == 'Ludwigsburg'){ + $link = "https://www.hs-ludwigsburg.de/studium/public-management-ba/bewerben.html"; + } + if($row2['hochschule'] == 'Kehl'){ + $link = "http://www.hs-kehl.de/studium-lehre/bachelor-studiengaenge/public-management-ba/bewerbung/"; + } + if($row2['hochschule'] == 'NA'){ + $link = "http://www.hs-kehl.de/studium-lehre/bachelor-studiengaenge/public-management-ba/bewerbung/ bzw.
https://www.hs-ludwigsburg.de/studium/public-management-ba/bewerben.html"; + } + $buffer.=" + + +

Anmeldedaten für $row2[vorname] $row2[nachname] ($row2[gebdat_form])

+

+ Bitte bewahren Sie die nachfolgenden Anmeldedaten für das gesamte Bewerbungsverfahren auf. +
+
+ + + + + + + + + + + +
+ Persönliche ID + + Passwort/TAN +
+ $row2[id] + + $row2[tan] +
+
+
+ Weiterführende Links: + + + + + +
+ Weitere Informationen: + + $link +
+
"; + } +#$mpdf->setFooter("Teilnehmerliste|$row_get_termin[tm_datum_form], $standort|{PAGENO} / {nb}"); +$mpdf->setFooter("Testteilnehmer||$row_get_termin[tm_datum_form], $standort"); + + + +$mpdf->WriteHTML($buffer); + +// Output a PDF file directly to the browser +$mpdf->Output(); + + +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/logout.php b/admin/old/logout.php new file mode 100644 index 0000000..c148555 --- /dev/null +++ b/admin/old/logout.php @@ -0,0 +1,12 @@ +display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/old/mail_test.php b/admin/old/mail_test.php new file mode 100644 index 0000000..2a6339a --- /dev/null +++ b/admin/old/mail_test.php @@ -0,0 +1,151 @@ +query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT a.tm_id, date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine a, bpm_term_kand b + WHERE a.tm_id=b.tm_id + AND a.tm_datum > ADDDATE(now(), -7) + GROUP BY a.tm_id, tm_datum_form, tm_standort + ORDER BY tm_datum ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + + if($row1['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg'; + } + if($row1['tm_standort'] == 'K'){ + $standort = 'Kehl'; + } + + $row1['tm_standort'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'mailsenden_test') { + $testtermin = $_POST["testtermin"]; + $_SESSION["testtermin"] = $testtermin; + + $german = $db->query("SET lc_time_names = 'de_DE';"); + $query_termin = $db->query("SELECT date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine + WHERE tm_id = $testtermin"); + $row_get_termin = $query_termin->fetch_array(); + + if($row_get_termin['tm_standort'] == 'L'){ + $sender = 'Hochschule Ludwigsburg'; + $sendermail = trim(get_parameter(8)); + } + if($row_get_termin['tm_standort'] == 'K'){ + $sender = 'Hochschule Kehl'; + $sendermail = trim(get_parameter(7)); + } + $smarty->assign('mail_sender', $sender); + $smarty->assign('mail_sendermail', $sendermail); + + $query1 = "SELECT vorname, nachname, mail + FROM bpm_kandidat + WHERE ka_id IN (SELECT ka_id FROM bpm_term_kand WHERE tm_id = $testtermin)"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + $mail = ""; + while ($row1 = $result1->fetch_array()) { + $mail .= $row1['mail'].", "; + } + $mail = substr($mail,0,-2); + $smarty->assign('empfaenger', $mail); +} + +if ($action == 'mailsenden2_test') { + $testtermin = $_SESSION["testtermin"]; + + $german = $db->query("SET lc_time_names = 'de_DE';"); + $query_termin = $db->query("SELECT date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine + WHERE tm_id = $testtermin"); + $row_get_termin = $query_termin->fetch_array(); + + if($row_get_termin['tm_standort'] == 'L'){ + $sender = 'Hochschule Ludwigsburg'; + $sendermail = trim(get_parameter(8)); + } + if($row_get_termin['tm_standort'] == 'K'){ + $sender = 'Hochschule Kehl'; + $sendermail = trim(get_parameter(7)); + } + + $empfaenger_alle = $_POST['mail_mail']; + $betreff = $_POST['betreff']; + $text = $_POST['text']; + + $empf_array = explode(",", $empfaenger_alle); +# echo " +#
+#  From: $sender - $sendermail
+# $empfaenger
+# $betreff
+# $text
"; +# #print_r($empf_array); +# echo "
"; +# exit; + + $style =""; + $text = $style.$text; + + for($i=0;$iquery("SELECT ka_id + FROM bpm_kandidat + WHERE mail = '$empfaenger'"); + $row_kaid = $query_kaid->fetch_array(); + + + ## Mailversand: + $headers = "From: $sender <$sendermail>\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $text_db = addslashes($text); + $betreff_db = addslashes($betreff); + if ($return) { + $sql1 = $db->query("INSERT INTO bpm_sonstige_mail (sender, sendermail, ka_id, empfaenger, mail_betreff, mail_text, status, sendedat) + VALUES ('$sender', '$sendermail', '$row_kaid[ka_id]', '$empfaenger', '$betreff', '$text_db', 'V', '$datum_db') + "); + $smarty->assign('mail_senderg', "Die Mail wurde verschickt!"); + } else { + $sql1 = $db->query("INSERT INTO bpm_sonstige_mail (sender, sendermail, ka_id, empfaenger, mail_betreff, mail_text, status, sendedat) + VALUES ('$sender', '$sendermail', '$row_kaid[ka_id]', '$empfaenger', '$betreff', '$text_db', 'F', '$datum_db') + "); + $smarty->assign('mail_senderg', "Die Mail konnte nicht verschickt werden!
Prüfen Sie die Mailadresse das Kandidaten."); + } + } +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/parameter.php b/admin/old/parameter.php new file mode 100644 index 0000000..4f02dec --- /dev/null +++ b/admin/old/parameter.php @@ -0,0 +1,84 @@ +query($query1) or die("Cannot execute query1"); + + $result_ct = $db->query("SELECT count(*) Anz FROM bpm_tanpool where verw_dat = '0000-00-00 00:00:00'"); + $row_ct = $result_ct->fetch_array(); + $smarty->assign('parameter_anzahltan', "$row_ct[Anz]"); + + while ($row1 = $result1->fetch_array()) { + # Passwort fr die Praxisstellen wird verschlsselt gespeichert + + if(!isset($zaehler) or $zaehler == 1){ + $zaehler = 0; + }else{ + $zaehler = 1; + } + $row1['zaehler'] = $zaehler; + $table_data1[] = $row1; + } + + $smarty->assign('table_data1', $table_data1); +} + +if($action == 'save'){ + + + $query2 = "SELECT pid + FROM bpm_parameter + ORDER BY pid ASC"; + $result2 = $db->query( $query2) + or die ("Cannot execute query2"); + + while ($row2 = $result2->fetch_array()){ + $pid = $row2['pid']; + $pid_value = $_POST[$pid]; + + + $sql1 = $db->query( "UPDATE bpm_parameter + SET wert = '$pid_value' + WHERE pid = $pid + " ); + + } + + if(!$sql1){ + $error = TRUE; + $error_reason .= "Fehler beim Update [bpm_parameter]
"; + }else{ + $error = FALSE; + $smarty->assign('parameter_inserterr', "2"); + echo ""; + } + + if($error){ + $smarty->assign('parameter_inserterr', "1"); + $smarty->assign('parameter_reason', "$error_reason"); // Kein Mailversand + } // Ende IF : Insert hat geklappt + +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/praxisstellen_edit.php b/admin/old/praxisstellen_edit.php new file mode 100644 index 0000000..873f620 --- /dev/null +++ b/admin/old/praxisstellen_edit.php @@ -0,0 +1,346 @@ +query("SELECT vorname, nachname + FROM bpm_kandidat + WHERE ka_id = $user"); + $row_name = $result_name->fetch_array(); + $_SESSION["prxedit_user"] = $user; + $_SESSION["prxedit_username"] = "$row_name[vorname] $row_name[nachname]"; + # Falls aus bewerber_daten.php kommend, bietet man einen zurückbutton an + $smarty->assign('prxedit_value_user', $_SESSION["prxedit_user"]); + $smarty->assign('prxedit_value_username', $_SESSION["prxedit_username"]); + } + + $result_all = $db->query("SELECT count(*) Anz + FROM bpm_dienststellen + "); + $row_all = $result_all->fetch_array(); + $smarty->assign('prxedit_value_anzall', $row_all['Anz']); + + + $result_unreg = $db->query("SELECT count(*) Anz + FROM bpm_dienststellen + WHERE register_dat = '0000-00-00 00:00:00'"); + $row_unreg = $result_unreg->fetch_array(); + $smarty->assign('prxedit_value_anzunreg', $row_unreg['Anz']); + + $result_reg = $db->query("SELECT count(*) Anz + FROM bpm_dienststellen + WHERE register_dat != '0000-00-00 00:00:00'"); + $row_reg = $result_reg->fetch_array(); + $smarty->assign('prxedit_value_anzreg', $row_reg['Anz']); + + + + # -- Fehlermeldungen -- # + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + + $smarty->assign('prxedit_error', 1); + + $smarty->assign('prxedit_value_art', $_SESSION["prxedit_value_art"]); + $smarty->assign('prxedit_value_name', $_SESSION["prxedit_value_name"]); + $smarty->assign('prxedit_value_str', $_SESSION["prxedit_value_str"]); + $smarty->assign('prxedit_value_plz', $_SESSION["prxedit_value_plz"]); + $smarty->assign('prxedit_value_ort', $_SESSION["prxedit_value_ort"]); + $smarty->assign('prxedit_value_mail', $_SESSION["prxedit_value_mail"]); + $smarty->assign('prxedit_value_gueltigvon', $_SESSION["prxedit_value_gueltigvon"]); + $smarty->assign('prxedit_value_gueltigbis', $_SESSION["prxedit_value_gueltigbis"]); + + + + if ($errorno == 3) { + # ungültiges Datum + $smarty->assign('prxedit_error_text', "Das eingegebene Gültig von Datum ist nicht korrekt. Bitte korrigieren Sie das Datum!"); + } + if ($errorno == 4) { + # ungültiges Datum + $smarty->assign('prxedit_error_text', "Das eingegebene Gültig bis Datum ist nicht korrekt. Bitte korrigieren Sie das Datum!"); + } + } + + # --- Wenn Werte editiert werden ------------ + if ($_SESSION["prxedit_status"] == 'edit') { + + $result_edit = $db->query("SELECT dst_id, bezeichnung, name, str, plz, ort, mail, date_format(gueltig_von, '%d.%m.%Y') gueltig_von_form, date_format(gueltig_bis, '%d.%m.%Y') gueltig_bis_form + FROM bpm_dienststellen + WHERE dst_id = $id"); + $row_edit = $result_edit->fetch_array(); + if($row_edit['gueltig_von_form'] == '00.00.0000'){ + $gueltig_von_form = ""; + }else{ + $gueltig_von_form = $row_edit['gueltig_von_form']; + } + if($row_edit['gueltig_bis_form'] == '00.00.0000'){ + $gueltig_bis_form = ""; + }else{ + $gueltig_bis_form = $row_edit['gueltig_bis_form']; + } + $smarty->assign('prxedit_value_art', "$row_edit[bezeichnung]"); + $smarty->assign('prxedit_value_name', "$row_edit[name]"); + $smarty->assign('prxedit_value_str', "$row_edit[str]"); + $smarty->assign('prxedit_value_plz', "$row_edit[plz]"); + $smarty->assign('prxedit_value_ort', "$row_edit[ort]"); + $smarty->assign('prxedit_value_mail', "$row_edit[mail]"); + $smarty->assign('prxedit_value_gueltigvon', "$gueltig_von_form"); + $smarty->assign('prxedit_value_gueltigbis', "$gueltig_bis_form"); + + } + # --- Wenn Werte editiert werden Ende ------- + + if ($_GET['editende'] == 1) { + # Editieren ist beendet, als ein update auf einen Datensatz. Dann ist der status wieder Neu, damit wird wieder ein Insert durchgeführt + $_SESSION["prxedit_status"] = 'neu'; + } + + + +} + + +if ($action == 'save') { + +$art = $_POST['art']; +$name = $_POST['name']; +$str = $_POST['str']; +$plz = $_POST['plz']; +$ort = $_POST['ort']; +$mail = $_POST['mail']; +$gueltigvon = $_POST['gueltigvon']; +$gueltigbis = $_POST['gueltigbis']; +$regmail = $_POST['regmail']; + +$_SESSION["prxedit_value_art"] = $art; +$_SESSION["prxedit_value_name"] = $name; +$_SESSION["prxedit_value_str"] = $str; +$_SESSION["prxedit_value_plz"] = $plz; +$_SESSION["prxedit_value_ort"] = $ort; +$_SESSION["prxedit_value_mail"] = $mail; + +$gueltigvon_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $gueltigvon); +$gueltigbis_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $gueltigbis); + + +function validateDate($date, $format = 'Y-m-d') +{ + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; +} + +if(!validateDate($gueltigvon_form) AND $gueltigvon_form != ''){ + echo ""; + exit; +} + +if(!validateDate($gueltigbis_form) AND $gueltigbis_form != ''){ + echo ""; + exit; +} + +if($gueltigvon_form == ''){ + $gueltigvon_form ='0000-00-00'; +} + +if($gueltigbis_form == ''){ + $gueltigbis_form ='0000-00-00'; +} + + $bez = $art." ".$name; + + #$datum = date("Y-m-d H:i:s"); + + if ($_SESSION["prxedit_status"] == 'neu') { + $tan = tangen(); + $sql1 = $db->query("INSERT INTO bpm_dienststellen ( bezeichnung + , name + , bez + , str + , plz + , ort + , mail + , init_tan + , gueltig_von + , gueltig_bis + ) + VALUES + ( '$art' + , '$name' + , '$bez' + , '$str' + , '$plz' + , '$ort' + , '$mail' + , '$tan' + , '$gueltigvon_form' + , '$gueltigbis_form' + ) + "); + } + + if ($_SESSION["prxedit_status"] == 'edit') { + $id = $_SESSION["prxedit_id"]; + $ka_id = $_SESSION["prxedit_user"]; + if($regmail == 'j'){ + $tan = tangen(); + $result = $db->query("UPDATE bpm_dienststellen + SET bezeichnung = '$art' + , name = '$name' + , bez = '$bez' + , str = '$str' + , plz = '$plz' + , ort = '$ort' + , mail = '$mail' + , init_tan = '$tan' + , gueltig_von = '$gueltigvon_form' + , gueltig_bis = '$gueltigbis_form' + , regmail_betreff = '' + , regmail_text = '' + , regmail_status = 'O' + , regmail_sendedat = '0000-00-00 00:00:00' + , pwd = '' + , register_dat = '0000-00-00 00:00:00' + WHERE dst_id = $id + "); + }else{ + $result = $db->query("UPDATE bpm_dienststellen + SET bezeichnung = '$art' + , name = '$name' + , bez = '$bez' + , str = '$str' + , plz = '$plz' + , ort = '$ort' + , mail = '$mail' + , gueltig_von = '$gueltigvon_form' + , gueltig_bis = '$gueltigbis_form' + WHERE dst_id = $id + "); + } + unset($_SESSION['prxedit_id']); + } + # Dann bekommts beim refresh den status neu, also es wird beim Abschicken ein Insert gemacht + $editende = 1; + echo ""; + + +} +if ($action == 'del') { + $id = $_GET['id']; + + $del1 = $db->query("DELETE FROM bpm_termine WHERE id = $id"); + + echo ""; +} + + +if ($action == 'mailsenden') { + + $dst_id = $_GET['dst_id']; + $result_erg = $db->query("SELECT regmail_betreff, regmail_text, mail + FROM bpm_dienststellen + WHERE dst_id =$dst_id"); + $row_erg = $result_erg->fetch_array(); + + $sender = "Hochschule Ludwigsburg"; + $sendermail = get_parameter(8); + + $smarty->assign('mail_sender', $sender); + $smarty->assign('mail_sendermail', $sendermail); + + + $smarty->assign('mail_text', $row_erg['regmail_text']); + $smarty->assign('mail_betreff', $row_erg['regmail_betreff']); + $smarty->assign('mail_mail', $row_erg['mail']); + $smarty->assign('mail_dstid', $dst_id); +} + +if ($action == 'mailsenden2') { + $dst_id = $_POST['dst_id']; + $sender = $_POST['mail_sender']; + $sendermail = $_POST['mail_sendermail']; + $empfaenger = $_POST['mail_mail']; + $betreff = $_POST['betreff']; + $text = $_POST['text']; + + #Beim CKEDITOR die

Tags mit Zeilenabstand 0 in der Mail + $style =" + + + "; + $text = $style.$text; + + #echo " + #From: $sender - $sendermail
+ #$empfaenger
+ #$betreff
+ #$text
"; + #exit; + + ## Mailversand: + $headers = "From: $sender <$sendermail>\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $text_db = addslashes($text); + $betreff_db = addslashes($betreff); + if ($return) { + $sql1 = $db->query("UPDATE bpm_dienststellen + SET regmail_text = '$text_db' + , regmail_betreff = '$betreff' + , regmail_status = 'V' + , regmail_sendedat = '$datum_db' + WHERE dst_id = $dst_id + "); + $smarty->assign('mail_senderg', "Die Mail wurde verschickt!"); + } else { + $sql1 = $db->query("UPDATE bpm_dienststellen + SET regmail_text = '$text_db' + , regmail_betreff = '$betreff_db' + , status = 'F' + WHERE dst_id = $dst_id + "); + $smarty->assign('mail_senderg', "Die Mail konnte nicht verschickt werden!
Prüfen Sie die Mailadresse der Praxissstelle."); + } +} + + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/praxisstellen_news.php b/admin/old/praxisstellen_news.php new file mode 100644 index 0000000..3a0611d --- /dev/null +++ b/admin/old/praxisstellen_news.php @@ -0,0 +1,151 @@ +assign('news_error', 1); + + $smarty->assign('news_value_headline', $_SESSION["news_value_headline"]); + $smarty->assign('news_value_text', $_SESSION["news_value_text"]); + + if ($errorno == 1) { + # ungültiges Datum + $smarty->assign('news_error_text', "Bitte füllen Sie alle Felder aus!"); + } + } + + # --- Wenn Werte editiert werden ------------ + if ($_SESSION["news_status"] == 'edit') { + $result_edit = $db->query("SELECT pn_id, pn_headline, pn_text + FROM bpm_prxnews + WHERE pn_id = $pn_id"); + $row_edit = $result_edit->fetch_array(); + $smarty->assign('news_value_headline', "$row_edit[pn_headline]"); + $smarty->assign('news_value_text', "$row_edit[pn_text]"); + + } + # --- Wenn Werte editiert werden Ende ------- + + if ($_GET['editende'] == 1) { + # Editieren ist beendet, als ein update auf einen Datensatz. Dann ist der status wieder Neu, damit wird wieder ein Insert durchgeführt + $_SESSION["news_status"] = 'neu'; + } + + + # Gespeicherte Werte + $query1 = "SELECT pn_id, pn_headline, pn_text, date_format(pn_date, '%d.%m.%Y - %H:%i Uhr') pn_date_form + FROM bpm_prxnews + ORDER BY pn_date DESC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + while ($row1 = $result1->fetch_array()) { + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + + +if ($action == 'save') { + +$headline = $_POST['headline']; +$text = $_POST['text']; + +$_SESSION["news_value_headline"] = $headline; +$_SESSION["news_value_text"] = $text; + + +if($text == "" or $headline == ""){ + echo ""; + exit; +} + + + $datum = date("Y-m-d H:i:s"); + $headline_db = addslashes($headline); + $text_db = addslashes($text); + + if ($_SESSION["news_status"] == 'neu') { + + $sql1 = $db->query("INSERT INTO bpm_prxnews ( pn_headline + , pn_text + , pn_date + ) + VALUES + ( '$headline_db' + , '$text_db' + , '$datum' + ) + "); + } + + if ($_SESSION["news_status"] == 'edit') { + $pn_id = $_SESSION["news_pn_id"]; + + $result = $db->query("UPDATE bpm_prxnews + SET pn_headline = '$headline_db' + , pn_text = '$text_db' + WHERE pn_id = $pn_id + "); + + unset($_SESSION['news_pn_id']); + + } + # Dann bekommts beim refresh den status neu, also es wird beim Abschicken ein Insert gemacht + $editende = 1; + echo ""; + + +} + +if ($action == 'show') { + $pn_id = $_GET['pn_id']; + $result_show = $db->query("SELECT pn_headline, pn_text + FROM bpm_prxnews + WHERE pn_id = $pn_id + "); + $row_show = $result_show->fetch_array(); + $smarty->assign('prx_show_headline', $row_show['pn_headline']); + $smarty->assign('prx_show_text', $row_show['pn_text']); +} + +if ($action == 'del') { + $pn_id = $_GET['pn_id']; + + $del1 = $db->query("DELETE FROM bpm_prxnews WHERE pn_id = $pn_id"); + + echo ""; +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/prx_search.php b/admin/old/prx_search.php new file mode 100644 index 0000000..d077ec3 --- /dev/null +++ b/admin/old/prx_search.php @@ -0,0 +1,163 @@ +query("SELECT dst_id, bezeichnung, name, str, plz, ort, mail, date_format(gueltig_von, '%d.%m.%Y') gueltig_von_form, date_format(gueltig_bis, '%d.%m.%Y') gueltig_bis_form + , gueltig_von, gueltig_bis, register_dat, init_tan, regmail_status, date_format(regmail_sendedat, '%d.%m.%Y - %H:%i') regmail_sendedat_form + FROM bpm_dienststellen + WHERE register_dat != '0000-00-00 00:00:00' + ORDER BY name ASC"); + }elseif($_GET['search'] == 'unreg'){ + $result1 = $db->query("SELECT dst_id, bezeichnung, name, str, plz, ort, mail, date_format(gueltig_von, '%d.%m.%Y') gueltig_von_form, date_format(gueltig_bis, '%d.%m.%Y') gueltig_bis_form + , gueltig_von, gueltig_bis, register_dat, init_tan, regmail_status, date_format(regmail_sendedat, '%d.%m.%Y - %H:%i') regmail_sendedat_form + FROM bpm_dienststellen + WHERE register_dat = '0000-00-00 00:00:00' + ORDER BY name ASC"); + }else{ + + $result1 = $db->query("SELECT dst_id, bezeichnung, name, str, plz, ort, mail, date_format(gueltig_von, '%d.%m.%Y') gueltig_von_form, date_format(gueltig_bis, '%d.%m.%Y') gueltig_bis_form + , gueltig_von, gueltig_bis, register_dat, init_tan, regmail_status, date_format(regmail_sendedat, '%d.%m.%Y - %H:%i') regmail_sendedat_form + FROM bpm_dienststellen + WHERE upper(name) LIKE '%" . strtoupper($_GET['search']) . "%' + OR plz LIKE '%" . $_GET['search'] . "%' + OR bezeichnung LIKE '%" . $_GET['search'] . "%' + ORDER BY name ASC"); + } +echo " + + + + + + + + + + + + + + + + +"; + + while($row = $result1->fetch_array()) + { + if($row['gueltig_von'] != '0000-00-00'){ + $gueltig_von = $row['gueltig_von_form']; + }else{ + $gueltig_von = ''; + } + + if($row['gueltig_bis'] != '0000-00-00'){ + $gueltig_bis = $row['gueltig_bis_form']; + }else{ + $gueltig_bis = ''; + } + + if($row['register_dat'] == '0000-00-00 00:00:00'){ + $tan = $row['init_tan']; + $id_url = cryption($row['dst_id'], 'e'); + $link_register = "Registrierungslink"; + $status = ""; + + }else{ + $tan = ""; + $link_register = ""; + } + if ($row['regmail_status'] == 'V') { + $status = "Versendet
$row[regmail_sendedat_form]"; + } + if ($row['regmail_status'] == 'F') { + $status = "Fehler"; + } + + + + $lnnr++; + echo ''; + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + + echo ''; + echo ''; + } +echo "
+ # + + Behördenart + + Name + + Straße + + PLZ + + Ort + + Mailadresse + + Registrierungstan + + Registrierungslink + + Registrierungsmail + + Gültig von + + Gültig bis + + Edit +
'; + echo $lnnr; + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $row['bezeichnung']); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $row['name']); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $row['str']); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $row['plz']); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $row['ort']); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $row['mail']); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $tan); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $link_register); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $status); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $gueltig_von); + echo ''; + echo preg_replace('/(' . $_GET['search'] . ')/Usi', '\\1', $gueltig_bis); + echo ''; + echo ''; + echo '
"; +?> diff --git a/admin/old/rangliste2.php b/admin/old/rangliste2.php new file mode 100644 index 0000000..886d439 --- /dev/null +++ b/admin/old/rangliste2.php @@ -0,0 +1,72 @@ +query($query1) or die("Cannot execute query1"); + $row_cnt = $result1->num_rows; + $smarty->assign('dokverw_anzdb', $row_cnt); + + $rangliste = 0; + $lfd_nr2 = 0; + $lfd_nr3 = 0; + $summevorher = 0; + + while ($row1 = $result1->fetch_array()) { + + $lfd_nr2++; + + $summe = $row1['summe']; + if($summe == $summevorher){ + $rangliste = $lfd_nr3; + }else{ + $rangliste = $lfd_nr2; + $lfd_nr3 = $lfd_nr2; + } + $summevorher = $row1['summe']; + + + $row1['rangliste'] = $rangliste; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/rangliste2_excel.php b/admin/old/rangliste2_excel.php new file mode 100644 index 0000000..de3999c --- /dev/null +++ b/admin/old/rangliste2_excel.php @@ -0,0 +1,104 @@ +getActiveSheet()->getPageSetup()->setFitToWidth(1); +#$spreadsheet->getActiveSheet()->getPageSetup()->setFitToHeight(0); + +$activeSheet = $spreadsheet->getActiveSheet(); + +$activeSheet->getStyle('A1:G1')->applyFromArray( + array( + 'font' => array( + 'bold' => true + ) + ) + ); + + +$activeSheet->setCellValue('A1', 'Ranglistenplatz'); +$activeSheet->setCellValue('B1', 'Vorname'); +$activeSheet->setCellValue('C1', 'Nachname'); +$activeSheet->setCellValue('D1', 'Mail'); +$activeSheet->setCellValue('E1', 'ID'); +$activeSheet->setCellValue('F1', 'Testdatum'); +$activeSheet->setCellValue('G1', 'Ergebnis'); +$activeSheet->freezePane('H2'); + +$query = $db->query("SELECT a.ka_id, vorname, nachname, date_format(tm_datum, '%d.%m.%Y um %H:%i Uhr') tm_datum, CASE tm_standort + WHEN 'L' THEN 'Ludwigsburg' + WHEN 'K' THEN 'Kehl' + ELSE '' END as tm_standort + , summe + , id + , mail + FROM bpm_kandidat a, bpm_term_kand b, bpm_termine c, bpm_ergebnisse d, bpm_tanpool e + WHERE a.ka_id = b.ka_id + AND b.tm_id = c.tm_id + AND a.ka_id = d.ka_id + AND b.tp_id = e.tp_id + AND a.ka_id IN (SELECT distinct ka_id FROM bpm_ergebnisse) + AND a.ka_id IN (SELECT distinct ka_id FROM bpm_upload WHERE upload_dat != '0000-00-00 00:00:00') + AND d.bestanden = '1' + AND e.tan=d.tan + ORDER BY summe DESC, nachname ASC, vorname ASC + "); + +if($query->num_rows > 0) { + $i = 2; + $rangliste = 0; + $lfd_nr2 = 0; + $lfd_nr3 = 0; + $summevorher = 0; + + while($row = $query->fetch_assoc()) { + + $lfd_nr2++; + + $summe = $row['summe']; + if($summe == $summevorher){ + $rangliste = $lfd_nr3; + }else{ + $rangliste = $lfd_nr2; + $lfd_nr3 = $lfd_nr2; + } + $summevorher = $row['summe']; + + $activeSheet->setCellValue('A'.$i , $rangliste); + $activeSheet->setCellValue('B'.$i , $row['nachname']); + $activeSheet->setCellValue('C'.$i , $row['vorname']); + $activeSheet->setCellValue('D'.$i , $row['mail']); + $activeSheet->setCellValue('E'.$i , $row['id']); + $activeSheet->setCellValue('F'.$i , "$row[tm_datum] ($row[tm_standort])"); + $activeSheet->setCellValue('G'.$i , $row['summe']); + $i++; + } + +} +$spreadsheet->getActiveSheet()->setTitle("Rangliste 2"); +$spreadsheet->getActiveSheet()->setSelectedCell('A1'); +$spreadsheet->getActiveSheet()->getColumnDimension('A')->setAutoSize(true); +$spreadsheet->getActiveSheet()->getColumnDimension('B')->setAutoSize(true); +$spreadsheet->getActiveSheet()->getColumnDimension('C')->setAutoSize(true); +$spreadsheet->getActiveSheet()->getColumnDimension('D')->setAutoSize(true); +$spreadsheet->getActiveSheet()->getColumnDimension('E')->setAutoSize(true); +$spreadsheet->getActiveSheet()->getColumnDimension('F')->setAutoSize(true); +$spreadsheet->getActiveSheet()->getColumnDimension('G')->setAutoSize(true); + +$writer = new Xlsx($spreadsheet); +$filename = 'Rangliste2.xlsx'; + +header('Content-type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); +header('Content-Disposition: attachment;filename='. $filename); +header('Cache-Control: max-age=0'); +$writer->save('php://output'); + +?> \ No newline at end of file diff --git a/admin/old/save_note.php b/admin/old/save_note.php new file mode 100644 index 0000000..37e1eb1 --- /dev/null +++ b/admin/old/save_note.php @@ -0,0 +1,88 @@ +query("SELECT count(*) Anz + FROM bpm_note + WHERE ka_id = $ka_id"); + $row_anz = $query_anz->fetch_array(); + if($row_anz['Anz'] == 0){ + #Insert + $sql1 = $db->query("INSERT INTO bpm_note (ka_id, hzb, hzb_punkte, zeugnisschnitt, zeugnisschnitt_punkte, erfdat_hzb, erfdat_schnitt) VALUES('$ka_id', '$hzbnote', '$hzbpunkte', '$durchschnittnote', '$durchschnittpunkte', '$erfdat_hzb', '$erfdat_schnitt')"); + }else{ + #Update + $sql1 = $db->query("UPDATE bpm_note + SET hzb = '$hzbnote' + ,hzb_punkte = '$hzbpunkte' + ,zeugnisschnitt = '$durchschnittnote' + ,zeugnisschnitt_punkte = '$durchschnittpunkte' + ,erfdat_hzb = '$erfdat_hzb' + ,erfdat_schnitt = '$erfdat_schnitt' + WHERE ka_id = '$ka_id'"); + } + + + + exit; + +?> + diff --git a/admin/old/tanimport.php b/admin/old/tanimport.php new file mode 100644 index 0000000..990b298 --- /dev/null +++ b/admin/old/tanimport.php @@ -0,0 +1,274 @@ + Semikolon +// oder $trennzeichen_excel = ","; --> Komma +############################################################# + + + + +$_SESSION["ck_verz"] = $verz; + + +if ($action == '') { + # Den Testtermin wählt man, damit jede Hochschule seine eigenen Daten importieren kann. Wenn eine Hochschule am selben TAg einen Test hat vermeidet man dass ein halbfertiger Test importiert wird + if (isset($_POST["testtermin"])) { + $testtermin = $_POST["testtermin"]; + } else { + $testtermin = $_SESSION["testtermin"]; + } + + $_SESSION["testtermin"] = $testtermin; + + + # Uploadverzeichnis aufräumen. Temporäre Dateien, die älter als 2 Wochen sind, werden gelöscht + $dir = $_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF'])."/$verz"; + $folder = dir($dir); + while ($dateiname = $folder->read()) { + if (filetype($dir.$dateiname) != "dir") { + if (strtotime("-2 weeks") > + @filemtime($dir.$dateiname)) { + if (@unlink($dir.$dateiname) != false){ + # echo $dateiname.' wurde gelöscht
'; + }else{ + # echo $dateiname.' konnte nichtgelöscht werden
'; + } + } + } + } + + $result_ct = $db->query("SELECT count(*) Anz FROM bpm_tanpool where verw_dat = '0000-00-00 00:00:00'"); + $row_ct = $result_ct->fetch_array(); + $smarty->assign('tanimp_anzahltan', "$row_ct[Anz]"); + + # Fehler beim Upload anzeigen + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + $smarty->assign('index_error', 1); + + if ($errorno == 1) { + $smarty->assign('index_error_text', "Es dürfen nur CSV Dateien hochgeladen werden."); + } + if ($errorno == 2) { + # Tabelle bpm_parameter + $size_mb = trim(get_parameter(12)); + $smarty->assign('index_error_text', "Die Datei ist zu groß. Die Dateigröße darf max. $size_mb MB betragen."); + } + if ($errorno == 3) { + $smarty->assign('index_error_text', "Vorgang wurde abgebrochen. Die Datei wurde vom Server gelöscht"); + } + if ($errorno == 4) { + $smarty->assign('index_error_text', "Vorgang wurde abgebrochen. Die Datei wurde nicht vom Server gelöscht"); + } + } +} + +if ($action == 'csvimp') { + + $testtermin = $_SESSION["testtermin"]; + + // http://www.tutorials.de/tutorials65420.html + #echo '

', print_r($_POST, true), '
'; + + $tempname = $_FILES['file']['tmp_name']; + $name = $_FILES['file']['name']; + + $type = $_FILES['file']['type']; + $size = $_FILES['file']['size']; + $einheit = "Byte"; // Für die Efolgsmeldung. + + $limitedext = array( + ".csv" + ); //Erlaubte Dateieindung beim Upload + + $extlimit = "yes"; //Do you want to limit the extensions of files uploaded + $ext = strrchr($name, '.'); + + if (($extlimit == "yes") && (!in_array($ext, $limitedext))) { + echo ""; + exit; + } + + + # Tabelle bpm_parameter + $size_mb = trim(get_parameter(12)); + $size_bt = $size_mb * 1024 * 1024; + + if ($size > $size_bt) { + echo ""; + exit; + } + + + $name = str_replace(array( + "ä", + "ö", + "ü", + "ß", + "Ä", + "Ö", + "Ü", + " " + ), array( + "ae", + "oe", + "ue", + "ss", + "Ae", + "Oe", + "Ue", + "_" + ), $name); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $heuteformat = date("H-i-s_Y-m-d", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $neu = $heuteformat . "_" . $name; + $_SESSION["ck_neu"] = $neu; + move_uploaded_file("$tempname", "$verz$neu"); // Unterverzeichnisse wie folgt: copy("$tempname", "pdf/$neu"); + + $handle = fopen("$verz$neu", "r"); // Datei zum Lesen öffnen + + + # Hier vor der Schleife erste Zeile holen und ignorieren. Enthält Überschrift + # fgetcsv($handle, 0, $trennzeichen_excel); + + while (($data = fgetcsv($handle, 0, $trennzeichen_excel)) !== FALSE) { // Daten werden aus der Datei in ein Array $data gelesen + if(!isset($zaehler) or $zaehler == 1){ + $zaehler = 0; + }else{ + $zaehler = 1; + } + + $tan = $data[3]; + $tinyurl = $data[4]; + + $row1['zaehler'] = $zaehler; + $row1['tan'] = $tan; + $row1['tinyurl'] = $tinyurl; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + fclose($handle); + +} + +if ($action == 'csvimp2') { + $neu = $_SESSION["ck_neu"]; //CSV-Dateinamen um Datei löschen zu können + $verz = $_SESSION["ck_verz"]; //Uploadverzeichnis aus Cookie holen + $testtermin = $_SESSION["testtermin"]; + + + if ($_POST['import'] == "0") // DS sollen nicht importiert werden + { + $dateiname = "$verz$neu"; + if (@unlink($dateiname)) // Funktion löscht Dateien und gibt true / false zurück + { + # Abbruch, datei gelöscht + echo ""; + exit; + } else { + # Abbruch, datei nicht gelöscht + echo ""; + exit; + } // End if + + } elseif ($_POST['import'] == "1") // DS sollen importiert werden + { + $handle = fopen("$verz$neu", "r"); // Datei zum Lesen öffnen + + + while (($data = fgetcsv($handle, 0, $trennzeichen_excel)) !== FALSE) { // Daten werden aus der Datei in ein Array $data gelesen + + $dummy_vorname = $data[0]; + $dummy_name = $data[1]; + $tan = $data[3]; + $tinyurl = $data[4]; + + $result_ct = $db->query("SELECT count(*) Anz + FROM bpm_tanpool + WHERE tan = '$tan'"); + $row_ct = $result_ct->fetch_array(); + + if ($row_ct['Anz'] == 0) { + # keine TANs vorhanden, insert + + $sql1 = $db->query("insert into bpm_tanpool (dummy_name + , dummy_vorname + , tan + , tinyurl + , aktiv) + VALUES ( '$dummy_name' + , '$dummy_vorname' + , '$tan' + , '$tinyurl' + , 'A' + )"); + if (!$sql1) { + $hinweis['hinweis'] = "TAN: " . $tan . " Fehler: TAN nicht gespeichert
"; + $smarty->assign('index_error', 1); + } + } else { + # Ergebnisse gibt es schon, kein insert + $hinweis['hinweis'] = "TAN: " . $tan . " schon vorhanden
"; + $smarty->assign('index_error', 1); + } + + $table_data2[] = $hinweis; + } + $smarty->assign('table_data2', $table_data2); + + + fclose($handle); + + } else { // Es wurde kein Radiobutton gewählt! Technisch aber ausgeschlossen + + echo "sie müssen eine Auswahl treffen"; + + } + + function deleteFiles($verz) + { + $handle = opendir($verz); + while ($file = readdir($handle)) { + if ($file != "." && $file != "..") { + + $datei = $verz . $file; + + if (@unlink($datei)) { + $error = TRUE; + } else { + $error = FALSE; + } + } + } + closedir($handle); + return $error; + } + + deleteFiles($verz); // Dateien werden im Uploadverzeichnis gelöscht, falls noch welche darin wären + +} // ende Action + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/old/termine.php_bcc b/admin/old/termine.php_bcc new file mode 100644 index 0000000..3747953 --- /dev/null +++ b/admin/old/termine.php_bcc @@ -0,0 +1,352 @@ +assign('termine_error', 1); + + $smarty->assign('termine_value_datum', $_SESSION["termine_value_tm_datum"]); + $smarty->assign('termine_value_zeit', $_SESSION["termine_value_tm_zeit"]); + $smarty->assign('termine_value_tm_standort', $_SESSION["termine_value_tm_standort"]); + $smarty->assign('termine_value_tm_plaetze', $_SESSION["termine_value_tm_plaetze"]); + $smarty->assign('termine_value_tm_raum', $_SESSION["termine_value_tm_raum"]); + $smarty->assign('termine_value_tm_referenznr', $_SESSION["termine_value_tm_referenznr"]); + + if ($errorno == 3) { + # ungültiges Datum + $smarty->assign('termine_error_text', "Das eingegebene Datum ist nicht korrekt. Bitte korrigieren Sie das Datum!"); + } + } + + # --- Wenn Werte editiert werden ------------ + if ($_SESSION["termine_status"] == 'edit') { + $result_edit = $db->query("SELECT tm_id, date_format(tm_datum, '%d.%m.%Y') datum, date_format(tm_datum, '%H:%i') zeit, tm_standort, tm_plaetze, tm_raum, tm_referenznr + FROM dvm_termine + WHERE tm_id = $tm_id"); + $row_edit = $result_edit->fetch_array(); + $smarty->assign('termine_value_datum', "$row_edit[datum]"); + $smarty->assign('termine_value_zeit', "$row_edit[zeit]"); + $smarty->assign('termine_value_tm_standort', "$row_edit[tm_standort]"); + $smarty->assign('termine_value_tm_plaetze', "$row_edit[tm_plaetze]"); + $smarty->assign('termine_value_tm_raum', "$row_edit[tm_raum]"); + $smarty->assign('termine_value_tm_referenznr', "$row_edit[tm_referenznr]"); + + } + # --- Wenn Werte editiert werden Ende ------- + + if ($_GET['editende'] == 1) { + # Editieren ist beendet, als ein update auf einen Datensatz. Dann ist der status wieder Neu, damit wird wieder ein Insert durchgeführt + $_SESSION["termine_status"] = 'neu'; + } + + + # Gespeicherte Werte + $query1 = "SELECT tm_id, date_format(tm_datum, '%d.%m.%Y') datum, date_format(tm_datum, '%H:%i') zeit, tm_standort, tm_plaetze, tm_raum, tm_referenznr + FROM dvm_termine + WHERE tm_datum > now() + ORDER BY tm_datum ASC, zeit ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + while ($row1 = $result1->fetch_array()) { + if($row1['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg'; + } + if($row1['tm_standort'] == 'K'){ + $standort = 'Kehl'; + } + $restplatz = get_restplatz($row1['tm_id']); + if($restplatz != $row1['tm_plaetze']){ + $disable = 0; + }else{ + $disable = 1; + } + $row1['restplatz'] = $restplatz; + $row1['tm_disable'] = $disable; + $row1['standort_form'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + + +if ($action == 'save') { + +$tm_datum = $_POST['tm_datum']; +$tm_zeit = $_POST['tm_zeit']; +$tm_plaetze = $_POST['tm_plaetze']; +$tm_standort = $_POST['tm_standort']; +$tm_raum = $_POST['tm_raum']; +$tm_referenznr = trim($_POST['tm_referenznr']); + + +$_SESSION["termine_value_tm_datum"] = $tm_datum; +$_SESSION["termine_value_tm_zeit"] = $tm_zeit; +$_SESSION["termine_value_tm_plaetze"] = $tm_plaetze; +$_SESSION["termine_value_tm_standort"] = $tm_standort; +$_SESSION["termine_value_tm_raum"] = $tm_raum; +$_SESSION["termine_value_tm_referenznr"] = $tm_referenznr; + +$tm_datum_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $tm_datum); +$testdatum = $tm_datum_form." ".$tm_zeit.":00"; +$_SESSION["termine_value_tm_testdatum"] = $testdatum; +function validateDate($date, $format = 'Y-m-d') +{ + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; +} + +if(!validateDate($tm_datum_form)){ + echo ""; + exit; +} + + + #$datum = date("Y-m-d H:i:s"); + if ($_SESSION["termine_status"] == 'neu') { + $sql1 = $db->query("INSERT INTO dvm_termine ( tm_datum + , tm_standort + , tm_plaetze + , tm_raum + , tm_referenznr + ) + VALUES + ( '$testdatum' + , '$tm_standort' + , '$tm_plaetze' + , '$tm_raum' + , '$tm_referenznr' + ) + "); + } + + if ($_SESSION["termine_status"] == 'edit') { + $tm_id = $_SESSION["termine_tm_id"]; + + # Prüfen, ob zu diesem Termin bereits Kandidaten gebucht sind. Wenn ja, dann Weiterleitung zum Mailanschreiben und dann Termin ändern + $result_vorh = $db->query("SELECT count(*) Anz + FROM dvm_term_kand + WHERE tm_id ='$tm_id' + "); + $row_vorh = $result_vorh->fetch_array(); + + # Prüfen, ob der Kandidat angeschrieben werden muss. Nur bei einer Änderung der Anzahl muss der Kandidat nicht extra informiert werden + $result_vorh1 = $db->query("SELECT count(*) Anz + FROM dvm_termine + WHERE tm_id ='$tm_id' + AND (tm_datum != '$testdatum' + OR tm_standort != '$tm_standort' + OR tm_raum != '$tm_raum' + OR tm_referenznr != '$tm_referenznr' + ) + "); + $row_vorh1 = $result_vorh1->fetch_array(); + if($row_vorh['Anz'] != 0 AND $row_vorh1['Anz'] != 0){ + echo ""; + exit; + }else{ + $result = $db->query("UPDATE dvm_termine + SET tm_datum = '$testdatum' + , tm_standort = '$tm_standort' + , tm_plaetze = '$tm_plaetze' + , tm_raum = '$tm_raum' + , tm_referenznr = '$tm_referenznr' + WHERE tm_id = $tm_id + "); + + unset($_SESSION['termine_tm_id']); + } + + } + # Dann bekommts beim refresh den status neu, also es wird beim Abschicken ein Insert gemacht + $editende = 1; + echo ""; + + +} +if ($action == 'del') { + $tm_id = $_GET['tm_id']; + + $del1 = $db->query("DELETE FROM dvm_termine WHERE tm_id = $tm_id"); + + echo ""; +} + +if ($action == 'mailterminupdate') { + $tm_id = $_SESSION["termine_tm_id"]; + + # Gespeicherte Werte + $query1 = "SELECT mail + FROM dvm_kandidat + WHERE ka_id IN (SELECT ka_id + FROM dvm_term_kand + WHERE tm_id = $tm_id) + ORDER BY nachname ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + while ($row1 = $result1->fetch_array()) { + $mail .= "$row1[mail], "; + } + $mail_lubu = get_parameter(8); + $mail_kehl = get_parameter(7); + + $mail_an = "$mail_kehl, $mail_lubu"; + $mail_bcc = substr(trim($mail),0,-1); + $smarty->assign('mtupd_mailadressen_an', "$mail_an"); + $smarty->assign('mtupd_mailadressen_bcc', "$mail_bcc"); + +} + +if ($action == 'mailsenden2') { + + $tm_id = $_SESSION["termine_tm_id"]; + $tm_plaetze = $_SESSION["termine_value_tm_plaetze"]; + $tm_standort = $_SESSION["termine_value_tm_standort"]; + $tm_raum = $_SESSION["termine_value_tm_raum"]; + $tm_referenznr = $_SESSION["termine_value_tm_referenznr"]; + $testdatum = $_SESSION["termine_value_tm_testdatum"]; + $empfaenger_an = $_POST['empfaenger_an']; + $empfaenger_bcc = $_POST['empfaenger_bcc']; + $betreff = $_POST['betreff']; + $text = $_POST['text']; + $absender = $_POST['absender']; + + if($absender == 'Kehl'){ + $sendermail = get_parameter(7); + $sender = 'Hochschule Kehl'; + } + + if($absender == 'Ludwigsburg'){ + $sendermail = get_parameter(8); + $sender = 'Hochschule Ludwigsburg'; + } + + # Update + $result = $db->query("UPDATE dvm_termine + SET tm_datum = '$testdatum' + , tm_standort = '$tm_standort' + , tm_plaetze = '$tm_plaetze' + , tm_raum = '$tm_raum' + , tm_referenznr = '$tm_referenznr' + WHERE tm_id = $tm_id + "); + + $query_termin = $db->query("SELECT date_format(tm_datum, '%d.%m.%Y um %H:%i Uhr') tm_datum, tm_standort, tm_raum, tm_plaetze, tm_referenznr FROM dvm_termine WHERE tm_id='$tm_id'"); + $row_termin = $query_termin->fetch_array(); + if($row_termin['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg - Reuteallee 36, 71634 Ludwigsburg'; + } + + if($row_termin['tm_standort'] == 'K'){ + $standort = 'Kehl - Kinzigallee 1, 77694 Kehl'; + } + $text = $text." +
+
+ Neue Daten:
+ + + + + + + + + + + + + + +
+ + Testtag: + + + + $row_termin[tm_datum] + +
+ + Hochschule: + + + + $standort + +
+ + Gebäude / Raum: + + + + $row_termin[tm_raum] + +
+ "; + + #echo " + #From: $sender - $sendermail
+ #$empfaenger
+ #$betreff
+ #$text
+ #$hochschule
"; + #exit; + + + + ## Mailversand: + $headers = "From: $sender <$sendermail>\r\n"; + $headers .= "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $headers .= "Bcc: $empfaenger_bcc\n"; + + $return = @mail($empfaenger_an, $betreff, $text, $headers); + + if ($return) { + $smarty->assign('mail_senderg', "Die Mail wurde verschickt!"); + } else { + $smarty->assign('mail_senderg', "Die Mail konnte nicht verschickt werden!
Prüfen Sie die Mailadressen."); + } + + + + + unset($_SESSION['termine_tm_id']); + $editende = 1; + echo ""; +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/termine_kandidat.php b/admin/old/termine_kandidat.php new file mode 100644 index 0000000..d276a66 --- /dev/null +++ b/admin/old/termine_kandidat.php @@ -0,0 +1,343 @@ +query("SET lc_time_names = 'de_DE';"); +# Dropdown befüllen übernimmt ajax:fetch.php +# $query1 = "SELECT ka_id, vorname, nachname +# FROM bpm_kandidat +# ORDER BY nachname, vorname"; +# +# $result1 = $db->query($query1) or die("Cannot execute query1a"); +# +# +# while ($row1 = $result1->fetch_array()) { +# $table_data1[] = $row1; +# } +# $smarty->assign('table_data1', $table_data1); + + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + $smarty->assign('bewerber_error', 1); + if ($errorno == 1) { + $smarty->assign('bewerber_error_text', "Es muss ein Bewerber ausgewählt werden."); + } + + } +} + +if ($action == 'ausgabe') { + if (isset($_POST['user'])) { + $username = mb_strtoupper($_POST["user"]); //remove case sensitivity on the username + } else { + $username = $_SESSION["username"]; + } + + $_SESSION["username"] = $username; + + if(isset($_GET['error'])){ + + $errorno = $_GET['error']; + $smarty->assign('termine_error', 1); + + if($errorno == 1){ + $smarty->assign('termine_error_text', "Es muss ein Termin gewählt werden"); + } + } + + if ($username == "") { + echo ""; + exit; + } + # Kandidat + $result_kandidat = $db->query("SELECT anrede, vorname, nachname + FROM bpm_kandidat + WHERE ka_id = '$username' + "); + $row_kandidat = $result_kandidat->fetch_array(); + if($row_kandidat['anrede'] == 'W'){ + $anrede = 'Frau'; + } + if($row_kandidat['anrede'] == 'M'){ + $anrede = 'Herrn'; + } + $smarty->assign('term_kand_anrede', $anrede); + $smarty->assign('term_kand_vorname', $row_kandidat['vorname']); + $smarty->assign('term_kand_nachname', $row_kandidat['nachname']); + + # Wo ist der Kandidat bisher eingebucht + $result_bisher = $db->query("SELECT tm_id, date_format(tm_datum, '%d.%m.%Y') datum, date_format(tm_datum, '%H:%i') zeit, tm_standort, tm_plaetze, tm_raum, tm_referenznr + FROM bpm_termine + WHERE tm_id = (SELECT tm_id + FROM bpm_term_kand + WHERE ka_id = '$username' + ORDER BY tk_id desc + LIMIT 1) + "); + $row_bisher = $result_bisher->fetch_array(); + if($row_bisher['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg'; + } + if($row_bisher['tm_standort'] == 'K'){ + $standort = 'Kehl'; + } + $smarty->assign('term_kand_datum', $row_bisher['datum']); + $smarty->assign('term_kand_zeit', $row_bisher['zeit']); + $smarty->assign('term_kand_tm_id', $row_bisher['tm_id']); + $smarty->assign('term_kand_standort', $standort); + + # Gespeicherte Termine + $query1 = "SELECT tm_id, date_format(tm_datum, '%d.%m.%Y') datum, date_format(tm_datum, '%H:%i') zeit, tm_standort, tm_plaetze, tm_raum, tm_referenznr + FROM bpm_termine + WHERE tm_datum > NOW() + ORDER BY tm_datum ASC, zeit ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + while ($row1 = $result1->fetch_array()) { + if($row1['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg'; + } + if($row1['tm_standort'] == 'K'){ + $standort = 'Kehl'; + } + $restplatz = get_restplatz($row1['tm_id']); + if($restplatz != $row1['tm_plaetze']){ + $disable = 0; + }else{ + $disable = 1; + } + $row1['restplatz'] = $restplatz; + $row1['tm_disable'] = $disable; + $row1['standort_form'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + +if ($action == 'mail') { + $tm_id = $_POST['tm_id']; + + $username = $_SESSION["username"]; + + if($tm_id == ""){ + echo ""; + exit; + } + $_SESSION["termine_tm_id"] = $tm_id; + + # Gespeicherte Werte + $query1 = "SELECT mail + FROM bpm_kandidat + WHERE ka_id = '$username' + LIMIT 1"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + while ($row1 = $result1->fetch_array()) { + $mail .= "$row1[mail]"; + } + + $smarty->assign('mtupd_mailadressen_an', "$mail"); +} + + + +if ($action == 'mailsenden2') { + + $tm_id = $_SESSION["termine_tm_id"]; + $username = $_SESSION["username"]; + $empfaenger = $_POST['empfaenger_an']; + $betreff = $_POST['betreff']; + $text = $_POST['text']; + $absender = $_POST['absender']; + + if($absender == 'Kehl'){ + $sendermail = get_parameter(7); + $sender = 'Hochschule Kehl'; + } + + if($absender == 'Ludwigsburg'){ + $sendermail = get_parameter(8); + $sender = 'Hochschule Ludwigsburg'; + } + + # Update + $result_curid = $db->query("SELECT tp_id + FROM bpm_term_kand + WHERE ka_id = $username + ORDER BY tp_id desc + LIMIT 1 + "); + $row_curid = $result_curid->fetch_array(); + $akt_tpid = $row_curid['tp_id']; + + $result = $db->query("UPDATE bpm_term_kand + SET tm_id = '$tm_id' + WHERE tp_id = $akt_tpid + "); + + $query_termin = $db->query("SELECT date_format(tm_datum, '%d.%m.%Y um %H:%i Uhr') tm_datum, tm_standort, tm_raum, tm_plaetze, tm_referenznr + FROM bpm_termine + WHERE tm_id='$tm_id'"); + + $row_termin = $query_termin->fetch_array(); + if($row_termin['tm_standort'] == 'L'){ + $standort = 'Ludwigsburg - Reuteallee 36, 71634 Ludwigsburg'; + $sendermail = get_parameter(8); + } + + if($row_termin['tm_standort'] == 'K'){ + $standort = 'Kehl - Kinzigallee 1, 77694 Kehl'; + $sendermail = get_parameter(7); + } + $text = $text." +
+
+ Neue Daten: +
+ + + + + + + + + + + + + +
+ + Testtag: + + + + $row_termin[tm_datum] + +
+ + Hochschule: + + + + $standort + +
+ + Gebäude / Raum: + + + + $row_termin[tm_raum] + +
+
+ "; + + $query1 = "SELECT mail, ka_id + FROM bpm_kandidat + WHERE ka_id = $username + ORDER BY nachname ASC"; + $result1 = $db->query($query1) or die("Cannot execute query1a $tm_id"); + $lnnr = 0; + while ($row1 = $result1->fetch_array()) { + $mail[$lnnr]['mail'] = "$row1[mail]"; + $mail[$lnnr]['ka_id'] = "$row1[ka_id]"; + $lnnr++; + } + $lfdnr = $lfdnr++; + # Mail auch an die zuständige HS + $mail[$lnnr][mail]= $sendermail; + $mail[$lnnr][ka_id]= ""; + + #echo "
";
+  #print_r($mail);
+  #echo "

"; + #exit; + #echo " + #From: $sender - $sendermail
+ #$empfaenger
+ #$betreff
+ #echo "$text
"; + #echo "
"; + #$hochschule
"; + #exit; + + #Beim CKEDITOR die

Tags mit Zeilenabstand 0 in der Mail + $style =" + + + "; + $text = $style.$text; + + for($i=0;$iquery("INSERT INTO bpm_sonstige_mail (sender, sendermail, ka_id, empfaenger, mail_betreff, mail_text, status, sendedat) + VALUES ('$sender', '$sendermail', '".$mail[$i][ka_id]."', '".$mail[$i][mail]."', '$betreff', '$text_db', 'V', '$datum_db') + "); + $smarty->assign('mail_senderg', "Die Mail wurde verschickt!"); + }else{ + $sql1 = $db->query("INSERT INTO bpm_sonstige_mail (sender, sendermail, ka_id, empfaenger, mail_betreff, mail_text, status, sendedat) + VALUES ('$sender', '$sendermail', '".$mail[$i][ka_id]."', '".$mail[$i][mail]."', '$betreff', '$text_db', 'F', '$datum_db') + "); + + $err = 1; + $mail_err .= $mail[$i][mail]."
"; + + } + } + } + + unset($_SESSION['termine_tm_id']); + $editende = 1; + + + if($err == 1){ + $smarty->assign('mail_senderg', "Die Mails konnten nicht verschickt werden!
Prüfen Sie die folgenden Mailadressen:

$mail_err"); + }else{ + $smarty->assign('mail_senderg', "Die Mails wurden verschickt!"); + echo ""; + } +} +// ende Action +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/old/test_csv.php b/admin/old/test_csv.php new file mode 100644 index 0000000..6b2de0e --- /dev/null +++ b/admin/old/test_csv.php @@ -0,0 +1,889 @@ + Semikolon + // oder $trennzeichen_excel = ","; --> Komma +############################################################# + + + + +$_SESSION["ck_verz"]=$verz; + +$limitedext = array(".csv"); //Erlaubte Dateieindung beim Upload + +if ($action == '') { + +$heute = mktime(0, 0, 0, date("m"), date("d"), date("Y")); // heutiges Datum +$heute_format = date("Y-m-d", $heute); // ISO-8601 Format wie in der Datenbank: Formatierung für Vergleiche erforderlich + +function deleteFiles($verz){ + $handle = opendir($verz); + while ($file = readdir ($handle)) { + if($file != "." && $file != "..") { + + $datei = $verz.$file; + + if(@unlink($datei)){ + $error = TRUE; + } + else + { + $error = FALSE; + } + } + } + closedir($handle); + return $error; +} + +deleteFiles($verz); // Dateien werden im Uploadverzeichnis gelöscht, falls noch welche darin wären + + +echo " + + + + +CSV Upload + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ CSV Upload
+ Import eines Studienjahrgangs +
+
+ +
+ + + + + + + + + +
+ Datei wählen:
Erlaubte Dateiendungen: *.csv +
+

+

+
+ +

+ +

+
+
+
+ + + + + +
+
+
+ +"; + +} + +if ($action == 'csvimp') { + + +// http://www.tutorials.de/tutorials65420.html +$tempname = $_FILES['file']['tmp_name']; +$name = $_FILES['file']['name']; + +$type = $_FILES['file']['type']; +$size = $_FILES['file']['size']; +$einheit = "Byte"; // Für die Efolgsmeldung. + +$extlimit = "yes"; //Do you want to limit the extensions of files uploaded +$ext = strrchr($name,'.'); +if (($extlimit == "yes") && (!in_array($ext,$limitedext))) { + +$err[] = " + + + + +Falscher Dateityp + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ Falscher Dateityp +
+
+ +
+

Es dürfen nur csv-Dateien hochgeladen werden! +

+

+ +

+
+
+ + + + + +
+
+
+ +"; +} + +if($size > "9900000") { +$err[] = " + + + + +Datei zu groß + + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ +
+ Datei zu groß +
+
+ +
+

Die Datei welche Sie hochladen wollen, ist zu gross!
Maximale Dateigroesse beträgt 9.900 KB! +

+

+ +

+
+
+ + + + + +
+
+
+ +"; +} +$name = str_replace (array("ä", "ö", "ü", "ß", "Ä", "Ö", "Ü"," "), array("ae", "oe", "ue", "ss", "Ae", "Oe", "Ue", "_"), $name); +$heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php +$heuteformat = date("H-i-s_Y-m-d", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll +$datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll +$neu = $heuteformat."_".$name; +$_SESSION["ck_neu"]=$neu; + +If(empty($err)) { + move_uploaded_file("$tempname", "$verz$neu"); // Unterverzeichnisse wie folgt: copy("$tempname", "pdf/$neu"); + + $row = 1; // Anzahl der Arrays + $handle = fopen ("$verz$neu","r"); // Datei zum Lesen öffnen + + echo " + + + + + Datensätze prüfen + + + + + '; + } + + // Format the HTML + for(i=0; i 11){ + nextMonth = 0; + nextYear++; + } + + prevImgHTML = '<<'; + prevLinkHTML = '' + prevImgHTML + ''; + nextImgHTML = '<<'; + nextLinkHTML = '' + nextImgHTML + ''; + + /** + * Build month combo + */ + if (this.useMonthCombo) { + monthComboOptions = ''; + for (i=0; i<12; i++) { + selected = (i == thisMonth.getMonth() ? 'selected="selected"' : ''); + monthComboOptions += ''; + } + monthCombo = ''; + } else { + monthCombo = monthnames[thisMonth.getMonth()]; + } + + /** + * Build year combo + */ + if (this.useYearCombo) { + yearComboOptions = ''; + for (i = thisMonth.getFullYear() - this.yearComboRange; i <= (thisMonth.getFullYear() + this.yearComboRange); i++) { + selected = (i == thisMonth.getFullYear() ? 'selected="selected"' : ''); + yearComboOptions += ''; + } + yearCombo = ''; + } else { + yearCombo = thisMonth.getFullYear(); + } + + html = '
+
+ + + + + + + + + + + + + + + + +
+ +
+ Datensätze prüfen
+
+
+ + + + + + + + + + + + + + + + + + + "; + + + while ( ($data = fgetcsv ($handle, 0, $trennzeichen_excel)) !== FALSE ) // Daten werden aus der Datei in ein Array $data gelesen + { + $num = count ($data); // Felder im Array $data werden gezählt + //print "

$num fields in line $row:
\n"; + print "\n"; + $row++; // Anzahl der Arrays wird + // inkrementiert + + $passwd = str_replace(".", "", $data[13]); + + print "

"; + // for ($c=0; $c < $num; $c++) { // FOR-Schleife: Oder Anzahl der zu importierenden Felder ($num) + print "\n"; // uid + print "\n"; // Nacname + print "\n"; // Vorname + print "\n"; // Matrikelnr + print "\n"; // KFZ + print "\n"; // HS + print "\n"; // PLZ + print "\n"; // ORT + print "\n"; // Straße + print "\n"; // STG + print "\n"; // StgText + print "\n"; // AG + print "\n"; // Jahrgang + #print "\n"; // Passwort in Kleinbuchstaben + print "\n"; // Passwort + print "\n"; // Mail + // } + print ""; + $ln_inserts[]++; //zählt die Anzahl der importierenden DS + } + echo " +
+ uid + + Nachname + + Vorname + + Matrikelnr. + + KFZ + + HS + + PLZ + + Ort + + Straße + + Stg + + StgText + + AG + + Jahr + + Passwort + + Mail +
".strtolower($data[0]) . "".$data[1] . "".$data[2] . "".$data[3] . "".$data[4] . "".$data[5] . "".$data[6] . "".$data[7] . "".$data[8] . "".$data[9] . "".$data[10] . "".strtoupper($data[11]) . "".$data[12] . "".strtolower($data[12]) . "".$passwd . "".$data[14] . "
+
+ +
+ + + + + +
+
"; + $zahl=count($ln_inserts); + + echo" + + + + + +
+
+ + + + + + + + + + + + + + + + +
+ + +
+ Sollen die $zahl Datensätze importiert werden?
+ +
+ +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
+ Auswahl + + Markieren +
Datensätze nicht importieren + +
Datensätze importieren + +
+   + +   +
+   + + +
+
+ +
+ + + + + +
+
+
+ + + "; +}else { + + foreach($err as $error) + echo "$error"; + exit; +} //Ende if error +fclose ($handle); + +} + +if ($action == 'csvimp2') { +$neu=$_SESSION["ck_neu"]; //CSV-Dateinamen um Datei löschen zu können +$verz=$_SESSION["ck_verz"]; //Uploadverzeichnis aus Cookie holen + + +if ($_POST['import'] == "0") // DS sollen nicht importiert werden +{ + $dateiname="$verz$neu"; + if (@unlink($dateiname)) // Funktion löscht Dateien und gibt true / false zurück + { + echo" + + + + + + Import beendet + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ Importvorgang abgebrochen
+
+
+
+

Datemsätze wurden nicht importiert!
Die CSV-Datei wurde vom Server gelöscht! +

+

+
+

+

+

+

+

+


+

+
+
+ + +
+
+
+ + "; + + }else{ + + echo" + + + + + Datei nicht gelöscht + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ Importvorgang abgebrochen
+
+
+
+

Datemsätze wurden nicht importiert!
Die CSV-Datei ($neu) konnte nicht vom Server gelöscht werden! +

+

+
+

+

+

+

+

+


+

+
+
+ + +
+
+
+ + "; + } // End if + +} elseif($_POST['import'] == "1") // DS sollen importiert werden +{ + $row = 1; // Anzahl der Arrays + $handle = fopen ("$verz$neu","r"); // Datei zum Lesen öffnen + while ( ($data = fgetcsv ($handle, 1000, $trennzeichen_excel)) !== FALSE ) // Daten werden aus der Datei in ein Array $data gelesen + { + $num = count ($data); // Felder im Array $data werden gezählt + //print "

$num fields in line $row:
\n"; + print "\n"; + $row++; // Anzahl der Arrays wird + // inkrementiert + #$pwd = strtolower($data[13]); + $pwd = str_replace(".", "", $data[13]); + $passwd = md5($pwd); + $uid = strtolower($data[0]); + + $geb = preg_split('/\./', $data[13]); + $tag = $geb[0]; + $mon = $geb[1]; + $jahr = $geb[2]; + $gebtag = "$jahr-$mon-$tag"; + //$passwd = mysql_escape_string($passwd); + + + // ACHTUNG: AN DIESER ZEILE NICHTS ÄNDERN, da die erste Zeile des Strings rausgefiltert wird bei der Ausgabe der nichtimportierten DS + $insert[] .= "INSERT INTO stud (uid, nachname, vorname, mtknr, pokfz, hs, poplz, poOrt, poStrasse, stg, stgText, AG, Jahrgang, Pwd, mail, geburtstag) VALUES ( lower('$data[0]') + ,'$data[1]' + ,'$data[2]' + ,'$data[3]' + ,'$data[4]' + ,'$data[5]' + ,'$data[6]' + ,'$data[7]' + ,'$data[8]' + ,'$data[9]' + ,'$data[10]' + ,upper('$data[11]') + ,'$data[12]' + ,'$passwd' + ,'$data[14]' + ,'$gebtag' + ) + "; + } + + + for ($i=0;$i + + + + Import beendet + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ Importvorgang erfolgreich
+
+
+
+

Der Importvorgang wurde erfolgreich beendet!
Die CSV-Datei wurde vom Server gelöscht! +

"; + $num1 = count ($y); // Anzahl der nicht importierten UIDs + if ($y != "") + { + echo"Es wurden $num1 Datensätze nicht importiert
+ Wahrscheinlich ist die UID bereits in der Datenbank vorhanden,
+ oder eines der Felder ist zu lang: +

"; + } + // Ausgabe der nicht importierten DS + for ($i=0;$i"; + } + echo" +

+
+

+

+

+

+

+


+

+
+
+ + +
+
+
+ + "; + + }else{ + + echo" + + + + + Datei nicht gelöscht + + + + + + +
+
+ + + + + + + + + + + + + + + + + +
+ +
+ Importvorgang erfolgreich
+
+
+
+

Der Importvorgang wurde erfolgreich beendet!
Die CSV-Datei ($neu) konnte nicht vom Server gelöscht werden! +

"; + $num1 = count ($y); // Anzahl der nicht importierten UIDs + if ($y != "") + { + echo"Es wurden $num1 Datensätze nicht importiert
+ Wahrscheinlich ist die UID bereits in der Datenbank vorhanden,
+ oder eines der Felder ist zu lang: +

"; + } + // Ausgabe der nicht importierten DS + for ($i=0;$i"; + } + echo" +

+
+

+

+

+

+

+


+

+
+
+ + +
+
+
+ + "; + } // End if + +}else { // Es wurde kein Radiobutton gewählt! Technisch aber ausgeschlossen + + echo "sie müssen eine Auswahl treffen"; + +} + +function deleteFiles($verz){ + $handle = opendir($verz); + while ($file = readdir ($handle)) { + if($file != "." && $file != "..") { + + $datei = $verz.$file; + + if(@unlink($datei)){ + $error = TRUE; + } + else + { + $error = FALSE; + } + } + } + closedir($handle); + return $error; +} + +deleteFiles($verz); // Dateien werden im Uploadverzeichnis gelöscht, falls noch welche darin wären + +} // ende Action + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/old/upload.php b/admin/old/upload.php new file mode 100644 index 0000000..213871e --- /dev/null +++ b/admin/old/upload.php @@ -0,0 +1,402 @@ + Semikolon +// oder $trennzeichen_excel = ","; --> Komma +############################################################# + + + + +$_SESSION["ck_verz"] = $verz; + + +if ($action == '') { + + $german = $db->query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT a.tm_id, date_format(tm_datum, '%a, %d.%m.%Y - %H:%i Uhr')tm_datum_form, tm_standort + FROM bpm_termine a, bpm_term_kand b + WHERE a.tm_id=b.tm_id + AND a.tm_datum > ADDDATE(now(), -7) + GROUP BY a.tm_id, tm_datum_form, tm_standort + ORDER BY tm_datum ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + + if ($row1['tm_standort'] == 'L') { + $standort = 'Ludwigsburg'; + } + if ($row1['tm_standort'] == 'K') { + $standort = 'Kehl'; + } + + $row1['tm_standort'] = $standort; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'upload') { + # Den Testtermin wählt man, damit jede Hochschule seine eigenen Daten importieren kann. Wenn eine Hochschule am selben TAg einen Test hat vermeidet man dass ein halbfertiger Test importiert wird + if (isset($_POST["testtermin"])) { + $testtermin = $_POST["testtermin"]; + } else { + $testtermin = $_SESSION["testtermin"]; + } + + $_SESSION["testtermin"] = $testtermin; + + + # Uploadverzeichnis aufräumen. Temporäre Dateien, die älter als 2 Wochen sind, werden gelöscht + $dir = $_SERVER["DOCUMENT_ROOT"].dirname($_SERVER['PHP_SELF'])."/$verz"; + $folder = dir($dir); + while ($dateiname = $folder->read()) { + if (filetype($dir.$dateiname) != "dir") { + if (strtotime("-2 weeks") > + @filemtime($dir.$dateiname)) { + if (@unlink($dir.$dateiname) != false){ + # echo $dateiname.' wurde gelöscht
'; + }else{ + # echo $dateiname.' konnte nichtgelöscht werden
'; + } + } + } + } + + + # Fehler beim Upload anzeigen + if (isset($_GET['error'])) { + + $errorno = $_GET['error']; + $smarty->assign('index_error', 1); + + if ($errorno == 1) { + $smarty->assign('index_error_text', "Es dürfen nur CSV Dateien hochgeladen werden."); + } + if ($errorno == 2) { + # Tabelle bpm_parameter + $size_mb = trim(get_parameter(12)); + $smarty->assign('index_error_text', "Die Datei ist zu groß. Die Dateigröße darf max. $size_mb MB betragen."); + } + if ($errorno == 3) { + $smarty->assign('index_error_text', "Vorgang wurde abgebrochen. Die Datei wurde vom Server gelöscht"); + } + if ($errorno == 4) { + $smarty->assign('index_error_text', "Vorgang wurde abgebrochen. Die Datei wurde nicht vom Server gelöscht"); + } + } +} + +if ($action == 'csvimp') { + + $testtermin = $_SESSION["testtermin"]; + + // http://www.tutorials.de/tutorials65420.html + #echo '

', print_r($_POST, true), '
'; + + $tempname = $_FILES['file']['tmp_name']; + $name = $_FILES['file']['name']; + + $type = $_FILES['file']['type']; + $size = $_FILES['file']['size']; + $einheit = "Byte"; // Für die Efolgsmeldung. + + $limitedext = array( + ".csv" + ); //Erlaubte Dateieindung beim Upload + + $extlimit = "yes"; //Do you want to limit the extensions of files uploaded + $ext = strrchr($name, '.'); + + if (($extlimit == "yes") && (!in_array($ext, $limitedext))) { + echo ""; + exit; + } + + + # Tabelle bpm_parameter + $size_mb = trim(get_parameter(12)); + $size_bt = $size_mb * 1024 * 1024; + + if ($size > $size_bt) { + echo ""; + exit; + } + + + $name = str_replace(array( + "ä", + "ö", + "ü", + "ß", + "Ä", + "Ö", + "Ü", + " " + ), array( + "ae", + "oe", + "ue", + "ss", + "Ae", + "Oe", + "Ue", + "_" + ), $name); + $heute = mktime(date("H"), date("i"), date("s"), date("m"), date("d"), date("Y")); // heutiges Datum & Zeit: http://de2.php.net/manual/de/function.date.php + $heuteformat = date("H-i-s_Y-m-d", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $datum_db = date("Y-m-d H:i:s", $heute); // Formatierung, wie es vor dem Dateinamen erscheinen soll + $neu = $heuteformat . "_" . $name; + $_SESSION["ck_neu"] = $neu; + move_uploaded_file("$tempname", "$verz$neu"); // Unterverzeichnisse wie folgt: copy("$tempname", "pdf/$neu"); + + $handle = fopen("$verz$neu", "r"); // Datei zum Lesen öffnen + + # Bestehnswert 65 Punkte + $bestehenswert = trim(get_parameter(11)); + + # Hier vor der Schleife erste Zeile holen und ignorieren. Enthält Überschrift + fgetcsv($handle, 0, $trennzeichen_excel); + + while (($data = fgetcsv($handle, 0, $trennzeichen_excel)) !== FALSE) { // Daten werden aus der Datei in ein Array $data gelesen + #2020-02-23T17:44:56 + $tag = substr($data[11], 8, 2); + $monat = substr($data[11], 5, 2); + $jahr = substr($data[11], 0, 4); + $std = substr($data[11], 11, 2); + $min = substr($data[11], 14, 2); + $sek = substr($data[11], 17, 2); + $datum = "$tag.$monat.$jahr - $std:$min:$sek"; + $datum_db = "$jahr-$monat-$tag"; + $tan = $data[7]; + + $result_ct = $db->query("SELECT concat(vorname,' ', nachname) name, date_format(tm_datum, '%Y-%m-%d') tm_datum + FROM bpm_kandidat a, bpm_term_kand b, bpm_termine c, bpm_tanpool d + WHERE a.ka_id = b.ka_id + AND b.tm_id = c.tm_id + AND b.tp_id = d.tp_id + AND d.tan = '$tan' + AND c.tm_id = $testtermin"); + $row_ct = $result_ct->fetch_array(); + + if ($row_ct['name'] != '' AND $row_ct['tm_datum'] == $datum_db) { + + $satzerg_raw = $data[13]; + #$analogie_raw = $data[14]; + $gemeinsamkeiten_raw = $data[15]; + $rechenaufgaben_raw = $data[16]; + $zahlenreihen_raw = $data[17]; + $rechenzeichen_raw = $data[18]; + $matrizen_raw = $data[21]; + $merkf_raw = $data[26]; + + $row1['tan'] = $tan; + $row1['name'] = $row_ct['name']; + $row1['datum'] = $datum; + $row1['satzerg_raw'] = $satzerg_raw; + #$row1['analogie_raw'] = $analogie_raw; + $row1['gemeinsamkeiten_raw'] = $gemeinsamkeiten_raw; + $row1['rechenaufgaben_raw'] = $rechenaufgaben_raw; + $row1['zahlenreihen_raw'] = $zahlenreihen_raw; + $row1['rechenzeichen_raw'] = $rechenzeichen_raw; + $row1['matrizen_raw'] = $matrizen_raw; + $row1['merkf_raw'] = $merkf_raw; + + # In die Berechnung fliest verb/num Intelligenz nicht mit ein. Das sind interne Berechnungen und keine Testaufgaben + $summe = $satzerg_raw + $gemeinsamkeiten_raw + $rechenaufgaben_raw + $zahlenreihen_raw + $rechenzeichen_raw + $matrizen_raw + $merkf_raw; + + $row1['summe'] = $summe; + if ($summe >= $bestehenswert) { + $bestanden = 1; + } else { + $bestanden = 0; + } + $row1['bestanden'] = $bestanden; + $table_data1[] = $row1; + } + + } + + $smarty->assign('table_data1', $table_data1); + fclose($handle); + +} + +if ($action == 'csvimp2') { + $neu = $_SESSION["ck_neu"]; //CSV-Dateinamen um Datei löschen zu können + $verz = $_SESSION["ck_verz"]; //Uploadverzeichnis aus Cookie holen + $testtermin = $_SESSION["testtermin"]; + + + if ($_POST['import'] == "0") // DS sollen nicht importiert werden + { + $dateiname = "$verz$neu"; + if (@unlink($dateiname)) // Funktion löscht Dateien und gibt true / false zurück + { + # Abbruch, datei gelöscht + echo ""; + exit; + } else { + # Abbruch, datei nicht gelöscht + echo ""; + exit; + } // End if + + } elseif ($_POST['import'] == "1") // DS sollen importiert werden + { + $handle = fopen("$verz$neu", "r"); // Datei zum Lesen öffnen + + # Bestehnswert 65 Punkte + $bestehenswert = trim(get_parameter(11)); + + # Hier vor der Schleife erste Zeile holen und ignorieren. Enthält Überschrift + fgetcsv($handle, 0, $trennzeichen_excel); + + while (($data = fgetcsv($handle, 0, $trennzeichen_excel)) !== FALSE) { // Daten werden aus der Datei in ein Array $data gelesen + + #2020-02-23T17:44:56 + $tag = substr($data[11], 8, 2); + $monat = substr($data[11], 5, 2); + $jahr = substr($data[11], 0, 4); + $std = substr($data[11], 11, 2); + $min = substr($data[11], 14, 2); + $sek = substr($data[11], 17, 2); + $datum = "$tag.$monat.$jahr - $std:$min:$sek"; + $datum_db = "$jahr-$monat-$tag"; + $tan = $data[7]; + + $result_ct = $db->query("SELECT a.ka_id, concat(vorname,' ', nachname) name, date_format(tm_datum, '%Y-%m-%d') tm_datum + FROM bpm_kandidat a, bpm_term_kand b, bpm_termine c, bpm_tanpool d + WHERE a.ka_id = b.ka_id + AND b.tm_id = c.tm_id + AND b.tp_id = d.tp_id + AND d.tan = '$tan' + AND c.tm_id = $testtermin"); + $row_ct = $result_ct->fetch_array(); + + if ($row_ct['name'] != '' AND $row_ct['tm_datum'] == $datum_db) { + + $satzerg_raw = $data[13]; + #$analogie_raw = $data[14]; + $gemeinsamkeiten_raw = $data[15]; + $rechenaufgaben_raw = $data[16]; + $zahlenreihen_raw = $data[17]; + $rechenzeichen_raw = $data[18]; + $matrizen_raw = $data[21]; + $merkf_raw = $data[26]; + $summe = $satzerg_raw + $gemeinsamkeiten_raw + $rechenaufgaben_raw + $zahlenreihen_raw + $rechenzeichen_raw + $matrizen_raw + $merkf_raw; + if ($summe >= $bestehenswert) { + $bestanden = 1; + } else { + $bestanden = 0; + # Tan Inaktiv setzen + $result_1 = $db->query("UPDATE bpm_tanpool + SET aktiv='I' + WHERE tan = '$tan'"); + } + $result_ct1 = $db->query("SELECT count(*) Anz + FROM bpm_ergebnisse + WHERE ka_id = $row_ct[ka_id] + AND tan = '$tan'"); + $row_ct1 = $result_ct1->fetch_array(); + if ($row_ct1['Anz'] == 0) { + # keine Ergebnisse vorhanden, insert + + $sql1 = $db->query("insert into bpm_ergebnisse (ka_id + , tan + , satzerg + , gemeinsamkeiten + , rechenaufgaben + , zahlenreihen + , rechenzeichen + , matrizen + , merkf + , summe + , bestanden) + VALUES ('$row_ct[ka_id]' + , '$tan' + , '$satzerg_raw' + , '$gemeinsamkeiten_raw' + , '$rechenaufgaben_raw' + , '$zahlenreihen_raw' + , '$rechenzeichen_raw' + , '$matrizen_raw' + , '$merkf_raw' + , '$summe' + , '$bestanden')"); + if (!$sql1) { + $hinweis['hinweis'] = "TAN: " . $tan . " Fehler: Ergebnis nicht gespeichert
"; + $smarty->assign('index_error', 1); + } + } else { + # Ergebnisse gibt es schon, kein insert + $hinweis['hinweis'] = "TAN: " . $tan . " Ergebnisse schon gespeichert
"; + $smarty->assign('index_error', 1); + } + + } else { + # Testdatum stimmt nicht, kein Student gefunden + $hinweis['hinweis'] = "TAN: " . $tan . " in der CSV gehört nicht zu diesem Datum (Kein Fehler)
"; + $smarty->assign('index_error', 1); + } + $table_data2[] = $hinweis; + } + $smarty->assign('table_data2', $table_data2); + + + fclose($handle); + + } else { // Es wurde kein Radiobutton gewählt! Technisch aber ausgeschlossen + + echo "sie müssen eine Auswahl treffen"; + + } + + function deleteFiles($verz) + { + $handle = opendir($verz); + while ($file = readdir($handle)) { + if ($file != "." && $file != "..") { + + $datei = $verz . $file; + + if (@unlink($datei)) { + $error = TRUE; + } else { + $error = FALSE; + } + } + } + closedir($handle); + return $error; + } + + deleteFiles($verz); // Dateien werden im Uploadverzeichnis gelöscht, falls noch welche darin wären + +} // ende Action + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/parameter.php b/admin/parameter.php new file mode 100644 index 0000000..2f26268 --- /dev/null +++ b/admin/parameter.php @@ -0,0 +1,81 @@ +query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + # Passwort fr die Praxisstellen wird verschlsselt gespeichert + + if(!isset($zaehler) or $zaehler == 1){ + $zaehler = 0; + }else{ + $zaehler = 1; + } + $row1['zaehler'] = $zaehler; + $table_data1[] = $row1; + } + + $smarty->assign('table_data1', $table_data1); +} + +if($action == 'save'){ + + + $query2 = "SELECT pid + FROM jumi_parameter + ORDER BY pid ASC"; + $result2 = $db->query( $query2) + or die ("Cannot execute query2"); + + while ($row2 = $result2->fetch_array()){ + $pid = $row2['pid']; + $pid_value = $_POST[$pid]; + + + $sql1 = $db->query( "UPDATE jumi_parameter + SET wert = '$pid_value' + WHERE pid = $pid + " ); + + } + + if(!$sql1){ + $error = TRUE; + $error_reason .= "Fehler beim Update [jumi_parameter]
"; + }else{ + $error = FALSE; + $smarty->assign('parameter_inserterr', "2"); + echo ""; + } + + if($error){ + $smarty->assign('parameter_inserterr', "1"); + $smarty->assign('parameter_reason', "$error_reason"); // Kein Mailversand + } // Ende IF : Insert hat geklappt + +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/phpqrcode/CHANGELOG b/admin/phpqrcode/CHANGELOG new file mode 100644 index 0000000..1088530 --- /dev/null +++ b/admin/phpqrcode/CHANGELOG @@ -0,0 +1,38 @@ +* 1.0.0 build 2010031920 + + - first public release + - help in readme, install + - cleanup ans separation of QRtools and QRspec + - now TCPDF binding requires minimal changes in TCPDF, having most of job + done in QRtools tcpdfBarcodeArray + - nicer QRtools::timeBenchmark output + - license and copyright notices in files + - indent cleanup - from tab to 4spc, keep it that way please :) + - sf project, repository, wiki + - simple code generator in index.php + +* 1.1.0 build 2010032113 + + - added merge tool wich generate merged version of code + located in phpqrcode.php + - splited qrconst.php from qrlib.php + +* 1.1.1 build 2010032405 + + - patch by Rick Seymour allowing saving PNG and displaying it at the same time + - added version info in VERSION file + - modified merge tool to include version info into generated file + - fixed e-mail in almost all head comments + +* 1.1.2 build 2010032722 + + - full integration with TCPDF thanks to Nicola Asuni, it's author + - fixed bug with alphanumeric encoding detection + +* 1.1.3 build 2010081807 + + - short opening tags replaced with standard ones + +* 1.1.4 build 2010100721 + + - added missing static keyword QRinput::check (found by Luke Brookhart, Onjax LLC) diff --git a/admin/phpqrcode/INSTALL b/admin/phpqrcode/INSTALL new file mode 100644 index 0000000..eac6b07 --- /dev/null +++ b/admin/phpqrcode/INSTALL @@ -0,0 +1,67 @@ +== REQUIREMENTS == + + * PHP5 + * PHP GD2 extension with JPEG and PNG support + +== INSTALLATION == + +If you want to recreate cache by yourself make sure cache directory is +writable and you have permisions to write into it. Also make sure you are +able to read files in it if you have cache option enabled + +== CONFIGURATION == + +Feel free to modify config constants in qrconfig.php file. Read about it in +provided comments and project wiki page (links in README file) + +== QUICK START == + +Notice: probably you should'nt use all of this in same script :) + +encode('PHP QR Code :)'); +QRspec::debug($tab, true); + +== TCPDF INTEGRATION == + +Inside bindings/tcpdf you will find slightly modified 2dbarcodes.php. +Instal phpqrcode liblaty inside tcpdf folder, then overwrite (or merge) +2dbarcodes.php + +Then use similar as example #50 from TCPDF examples: + + true, + 'padding' => 4, + 'fgcolor' => array(0,0,0), + 'bgcolor' => false, //array(255,255,255) +); + +//code name: QR, specify error correction level after semicolon (L,M,Q,H) +$pdf->write2DBarcode('PHP QR Code :)', 'QR,L', '', '', 30, 30, $style, 'N'); diff --git a/admin/phpqrcode/LICENSE b/admin/phpqrcode/LICENSE new file mode 100644 index 0000000..1883303 --- /dev/null +++ b/admin/phpqrcode/LICENSE @@ -0,0 +1,165 @@ + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + + This version of the GNU Lesser General Public License incorporates +the terms and conditions of version 3 of the GNU General Public +License, supplemented by the additional permissions listed below. + + 0. Additional Definitions. + + As used herein, "this License" refers to version 3 of the GNU Lesser +General Public License, and the "GNU GPL" refers to version 3 of the GNU +General Public License. + + "The Library" refers to a covered work governed by this License, +other than an Application or a Combined Work as defined below. + + An "Application" is any work that makes use of an interface provided +by the Library, but which is not otherwise based on the Library. +Defining a subclass of a class defined by the Library is deemed a mode +of using an interface provided by the Library. + + A "Combined Work" is a work produced by combining or linking an +Application with the Library. The particular version of the Library +with which the Combined Work was made is also called the "Linked +Version". + + The "Minimal Corresponding Source" for a Combined Work means the +Corresponding Source for the Combined Work, excluding any source code +for portions of the Combined Work that, considered in isolation, are +based on the Application, and not on the Linked Version. + + The "Corresponding Application Code" for a Combined Work means the +object code and/or source code for the Application, including any data +and utility programs needed for reproducing the Combined Work from the +Application, but excluding the System Libraries of the Combined Work. + + 1. Exception to Section 3 of the GNU GPL. + + You may convey a covered work under sections 3 and 4 of this License +without being bound by section 3 of the GNU GPL. + + 2. Conveying Modified Versions. + + If you modify a copy of the Library, and, in your modifications, a +facility refers to a function or data to be supplied by an Application +that uses the facility (other than as an argument passed when the +facility is invoked), then you may convey a copy of the modified +version: + + a) under this License, provided that you make a good faith effort to + ensure that, in the event an Application does not supply the + function or data, the facility still operates, and performs + whatever part of its purpose remains meaningful, or + + b) under the GNU GPL, with none of the additional permissions of + this License applicable to that copy. + + 3. Object Code Incorporating Material from Library Header Files. + + The object code form of an Application may incorporate material from +a header file that is part of the Library. You may convey such object +code under terms of your choice, provided that, if the incorporated +material is not limited to numerical parameters, data structure +layouts and accessors, or small macros, inline functions and templates +(ten or fewer lines in length), you do both of the following: + + a) Give prominent notice with each copy of the object code that the + Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the object code with a copy of the GNU GPL and this license + document. + + 4. Combined Works. + + You may convey a Combined Work under terms of your choice that, +taken together, effectively do not restrict modification of the +portions of the Library contained in the Combined Work and reverse +engineering for debugging such modifications, if you also do each of +the following: + + a) Give prominent notice with each copy of the Combined Work that + the Library is used in it and that the Library and its use are + covered by this License. + + b) Accompany the Combined Work with a copy of the GNU GPL and this license + document. + + c) For a Combined Work that displays copyright notices during + execution, include the copyright notice for the Library among + these notices, as well as a reference directing the user to the + copies of the GNU GPL and this license document. + + d) Do one of the following: + + 0) Convey the Minimal Corresponding Source under the terms of this + License, and the Corresponding Application Code in a form + suitable for, and under terms that permit, the user to + recombine or relink the Application with a modified version of + the Linked Version to produce a modified Combined Work, in the + manner specified by section 6 of the GNU GPL for conveying + Corresponding Source. + + 1) Use a suitable shared library mechanism for linking with the + Library. A suitable mechanism is one that (a) uses at run time + a copy of the Library already present on the user's computer + system, and (b) will operate properly with a modified version + of the Library that is interface-compatible with the Linked + Version. + + e) Provide Installation Information, but only if you would otherwise + be required to provide such information under section 6 of the + GNU GPL, and only to the extent that such information is + necessary to install and execute a modified version of the + Combined Work produced by recombining or relinking the + Application with a modified version of the Linked Version. (If + you use option 4d0, the Installation Information must accompany + the Minimal Corresponding Source and Corresponding Application + Code. If you use option 4d1, you must provide the Installation + Information in the manner specified by section 6 of the GNU GPL + for conveying Corresponding Source.) + + 5. Combined Libraries. + + You may place library facilities that are a work based on the +Library side by side in a single library together with other library +facilities that are not Applications and are not covered by this +License, and convey such a combined library under terms of your +choice, if you do both of the following: + + a) Accompany the combined library with a copy of the same work based + on the Library, uncombined with any other library facilities, + conveyed under the terms of this License. + + b) Give prominent notice with the combined library that part of it + is a work based on the Library, and explaining where to find the + accompanying uncombined form of the same work. + + 6. Revised Versions of the GNU Lesser General Public License. + + The Free Software Foundation may publish revised and/or new versions +of the GNU Lesser General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the +Library as you received it specifies that a certain numbered version +of the GNU Lesser General Public License "or any later version" +applies to it, you have the option of following the terms and +conditions either of that published version or of any later version +published by the Free Software Foundation. If the Library as you +received it does not specify a version number of the GNU Lesser +General Public License, you may choose any version of the GNU Lesser +General Public License ever published by the Free Software Foundation. + + If the Library as you received it specifies that a proxy can decide +whether future versions of the GNU Lesser General Public License shall +apply, that proxy's public statement of acceptance of any version is +permanent authorization for you to choose that version for the +Library. diff --git a/admin/phpqrcode/README b/admin/phpqrcode/README new file mode 100644 index 0000000..a022fb5 --- /dev/null +++ b/admin/phpqrcode/README @@ -0,0 +1,45 @@ +This is PHP implementation of QR Code 2-D barcode generator. It is pure-php +LGPL-licensed implementation based on C libqrencode by Kentaro Fukuchi. + +== LICENSING == + +Copyright (C) 2010 by Dominik Dzienia + +This library is free software; you can redistribute it and/or modify it under +the terms of the GNU Lesser General Public License as published by the Free +Software Foundation; either version 3 of the License, or any later version. + +This library is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A +PARTICULAR PURPOSE. See the GNU Lesser General Public License (LICENSE file) +for more details. + +You should have received a copy of the GNU Lesser General Public License along +with this library; if not, write to the Free Software Foundation, Inc., 51 +Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +== INSTALATION AND USAGE == + + * INSTALL file + * http://sourceforge.net/apps/mediawiki/phpqrcode/index.php?title=Main_Page + +== CONTACT == + +Fell free to contact me via e-mail (deltalab at poczta dot fm) or using +folowing project pages: + + * http://sourceforge.net/projects/phpqrcode/ + * http://phpqrcode.sourceforge.net/ + +== ACKNOWLEDGMENTS == + +Based on C libqrencode library (ver. 3.1.1) +Copyright (C) 2006-2010 by Kentaro Fukuchi +http://megaui.net/fukuchi/works/qrencode/index.en.html + +QR Code is registered trademarks of DENSO WAVE INCORPORATED in JAPAN and other +countries. + +Reed-Solomon code encoder is written by Phil Karn, KA9Q. +Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + \ No newline at end of file diff --git a/admin/phpqrcode/VERSION b/admin/phpqrcode/VERSION new file mode 100644 index 0000000..9f99279 --- /dev/null +++ b/admin/phpqrcode/VERSION @@ -0,0 +1,2 @@ +1.1.4 +2010100721 \ No newline at end of file diff --git a/admin/phpqrcode/bindings/tcpdf/qrcode.php b/admin/phpqrcode/bindings/tcpdf/qrcode.php new file mode 100644 index 0000000..4cb1389 --- /dev/null +++ b/admin/phpqrcode/bindings/tcpdf/qrcode.php @@ -0,0 +1,2875 @@ + +// http://phpqrcode.sourceforge.net/ +// https://sourceforge.net/projects/phpqrcode/ +// +// The "PHP QR Code encoder" is based on +// "C libqrencode library" (ver. 3.1.1) +// License: GNU-LGPL 2.1 +// Copyright (C) 2006-2010 by Kentaro Fukuchi +// http://megaui.net/fukuchi/works/qrencode/index.en.html +// +// Reed-Solomon code encoder is written by Phil Karn, KA9Q. +// Copyright (C) 2002-2006 Phil Karn, KA9Q +// +// QR Code is registered trademark of DENSO WAVE INCORPORATED +// http://www.denso-wave.com/qrcode/index-e.html +// --------------------------------------------------------- +// +// Author: Nicola Asuni +// +// (c) Copyright 2010: +// Nicola Asuni +// Tecnick.com S.r.l. +// Via della Pace, 11 +// 09044 Quartucciu (CA) +// ITALY +// www.tecnick.com +// info@tecnick.com +//============================================================+ + +/** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + +// definitions +if (!defined('QRCODEDEFS')) { + + /** + * Indicate that definitions for this class are set + */ + define('QRCODEDEFS', true); + + // ----------------------------------------------------- + + // Encoding modes (characters which can be encoded in QRcode) + + /** + * Encoding mode + */ + define('QR_MODE_NL', -1); + + /** + * Encoding mode numeric (0-9). 3 characters are encoded to 10bit length. In theory, 7089 characters or less can be stored in a QRcode. + */ + define('QR_MODE_NM', 0); + + /** + * Encoding mode alphanumeric (0-9A-Z $%*+-./:) 45characters. 2 characters are encoded to 11bit length. In theory, 4296 characters or less can be stored in a QRcode. + */ + define('QR_MODE_AN', 1); + + /** + * Encoding mode 8bit byte data. In theory, 2953 characters or less can be stored in a QRcode. + */ + define('QR_MODE_8B', 2); + + /** + * Encoding mode KANJI. A KANJI character (multibyte character) is encoded to 13bit length. In theory, 1817 characters or less can be stored in a QRcode. + */ + define('QR_MODE_KJ', 3); + + /** + * Encoding mode STRUCTURED (currently unsupported) + */ + define('QR_MODE_ST', 4); + + // ----------------------------------------------------- + + // Levels of error correction. + // QRcode has a function of an error correcting for miss reading that white is black. + // Error correcting is defined in 4 level as below. + + /** + * Error correction level L : About 7% or less errors can be corrected. + */ + define('QR_ECLEVEL_L', 0); + + /** + * Error correction level M : About 15% or less errors can be corrected. + */ + define('QR_ECLEVEL_M', 1); + + /** + * Error correction level Q : About 25% or less errors can be corrected. + */ + define('QR_ECLEVEL_Q', 2); + + /** + * Error correction level H : About 30% or less errors can be corrected. + */ + define('QR_ECLEVEL_H', 3); + + // ----------------------------------------------------- + + // Version. Size of QRcode is defined as version. + // Version is from 1 to 40. + // Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. + // So version 40 is 177*177 matrix. + + /** + * Maximum QR Code version. + */ + define('QRSPEC_VERSION_MAX', 40); + + /** + * Maximum matrix size for maximum version (version 40 is 177*177 matrix). + */ + define('QRSPEC_WIDTH_MAX', 177); + + // ----------------------------------------------------- + + /** + * Matrix index to get width from $capacity array. + */ + define('QRCAP_WIDTH', 0); + + /** + * Matrix index to get number of words from $capacity array. + */ + define('QRCAP_WORDS', 1); + + /** + * Matrix index to get remainder from $capacity array. + */ + define('QRCAP_REMINDER', 2); + + /** + * Matrix index to get error correction level from $capacity array. + */ + define('QRCAP_EC', 3); + + // ----------------------------------------------------- + + // Structure (currently usupported) + + /** + * Number of header bits for structured mode + */ + define('STRUCTURE_HEADER_BITS', 20); + + /** + * Max number of symbols for structured mode + */ + define('MAX_STRUCTURED_SYMBOLS', 16); + + // ----------------------------------------------------- + + // Masks + + /** + * Down point base value for case 1 mask pattern (concatenation of same color in a line or a column) + */ + define('N1', 3); + + /** + * Down point base value for case 2 mask pattern (module block of same color) + */ + define('N2', 3); + + /** + * Down point base value for case 3 mask pattern (1:1:3:1:1(dark:bright:dark:bright:dark)pattern in a line or a column) + */ + define('N3', 40); + + /** + * Down point base value for case 4 mask pattern (ration of dark modules in whole) + */ + define('N4', 10); + + // ----------------------------------------------------- + + // Optimization settings + + /** + * if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + */ + define('QR_FIND_BEST_MASK', true); + + /** + * if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + */ + define('QR_FIND_FROM_RANDOM', 2); + + /** + * when QR_FIND_BEST_MASK === false + */ + define('QR_DEFAULT_MASK', 2); + + // ----------------------------------------------------- + +} // end of definitions + +// #*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*#*# + +if (!class_exists('QRcode', false)) { + + // for compaibility with PHP4 + if (!function_exists('str_split')) { + /** + * Convert a string to an array (needed for PHP4 compatibility) + * @param string $string The input string. + * @param int $split_length Maximum length of the chunk. + * @return If the optional split_length parameter is specified, the returned array will be broken down into chunks with each being split_length in length, otherwise each chunk will be one character in length. FALSE is returned if split_length is less than 1. If the split_length length exceeds the length of string , the entire string is returned as the first (and only) array element. + */ + function str_split($string, $split_length=1) { + if ((strlen($string) > $split_length) OR (!$split_length)) { + do { + $c = strlen($string); + $parts[] = substr($string, 0, $split_length); + $string = substr($string, $split_length); + } while ($string !== false); + } else { + $parts = array($string); + } + return $parts; + } + } + + // ##################################################### + + /** + * Class to create QR-code arrays for TCPDF class. + * QR Code symbol is a 2D barcode that can be scanned by handy terminals such as a mobile phone with CCD. + * The capacity of QR Code is up to 7000 digits or 4000 characters, and has high robustness. + * This class supports QR Code model 2, described in JIS (Japanese Industrial Standards) X0510:2004 or ISO/IEC 18004. + * Currently the following features are not supported: ECI and FNC1 mode, Micro QR Code, QR Code model 1, Structured mode. + * + * This class is derived from "PHP QR Code encoder" by Dominik Dzienia (http://phpqrcode.sourceforge.net/) based on "libqrencode C library 3.1.1." by Kentaro Fukuchi (http://megaui.net/fukuchi/works/qrencode/index.en.html), contains Reed-Solomon code written by Phil Karn, KA9Q. QR Code is registered trademark of DENSO WAVE INCORPORATED (http://www.denso-wave.com/qrcode/index-e.html). + * Please read comments on this class source file for full copyright and license information. + * + * @name QRcode + * @package com.tecnick.tcpdf + * @abstract Class for generating QR-code array for TCPDF. + * @author Nicola Asuni + * @copyright 2010 Nicola Asuni - Tecnick.com S.r.l (www.tecnick.com) Via Della Pace, 11 - 09044 - Quartucciu (CA) - ITALY - www.tecnick.com - info@tecnick.com + * @link http://www.tcpdf.org + * @license http://www.gnu.org/copyleft/lesser.html LGPL + * @version 1.0.002 + */ + class QRcode { + + /** + * @var barcode array to be returned which is readable by TCPDF + * @access protected + */ + protected $barcode_array = array(); + + /** + * @var QR code version. Size of QRcode is defined as version. Version is from 1 to 40. Version 1 is 21*21 matrix. And 4 modules increases whenever 1 version increases. So version 40 is 177*177 matrix. + * @access protected + */ + protected $version = 0; + + /** + * @var Levels of error correction. See definitions for possible values. + * @access protected + */ + protected $level = QR_ECLEVEL_L; + + /** + * @var Encoding mode + * @access protected + */ + protected $hint = QR_MODE_8B; + + /** + * @var if true the input string will be converted to uppercase + * @access protected + */ + protected $casesensitive = true; + + /** + * @var structured QR code (not supported yet) + * @access protected + */ + protected $structured = 0; + + /** + * @var mask data + * @access protected + */ + protected $data; + + // FrameFiller + + /** + * @var width + * @access protected + */ + protected $width; + + /** + * @var frame + * @access protected + */ + protected $frame; + + /** + * @var X position of bit + * @access protected + */ + protected $x; + + /** + * @var Y position of bit + * @access protected + */ + protected $y; + + /** + * @var direction + * @access protected + */ + protected $dir; + + /** + * @var single bit + * @access protected + */ + protected $bit; + + // ---- QRrawcode ---- + + /** + * @var data code + * @access protected + */ + protected $datacode = array(); + + /** + * @var error correction code + * @access protected + */ + protected $ecccode = array(); + + /** + * @var blocks + * @access protected + */ + protected $blocks; + + /** + * @var Reed-Solomon blocks + * @access protected + */ + protected $rsblocks = array(); //of RSblock + + /** + * @var counter + * @access protected + */ + protected $count; + + /** + * @var data length + * @access protected + */ + protected $dataLength; + + /** + * @var error correction length + * @access protected + */ + protected $eccLength; + + /** + * @var b1 + * @access protected + */ + protected $b1; + + // ---- QRmask ---- + + /** + * @var run length + * @access protected + */ + protected $runLength = array(); + + // ---- QRsplit ---- + + /** + * @var input data string + * @access protected + */ + protected $dataStr = ''; + + /** + * @var input items + * @access protected + */ + protected $items; + + // Reed-Solomon items + + /** + * @var Reed-Solomon items + * @access protected + */ + protected $rsitems = array(); + + /** + * @var array of frames + * @access protected + */ + protected $frames = array(); + + /** + * @var alphabet-numeric convesion table + * @access protected + */ + protected $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, // + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, // + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, // + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, // + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 // + ); + + /** + * @var array Table of the capacity of symbols + * See Table 1 (pp.13) and Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), // + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), // + array( 29, 70, 7, array( 15, 26, 36, 44)), // + array( 33, 100, 7, array( 20, 36, 52, 64)), // + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), // + array( 45, 196, 0, array( 40, 72, 108, 130)), // + array( 49, 242, 0, array( 48, 88, 132, 156)), // + array( 53, 292, 0, array( 60, 110, 160, 192)), // + array( 57, 346, 0, array( 72, 130, 192, 224)), // 10 + array( 61, 404, 0, array( 80, 150, 224, 264)), // + array( 65, 466, 0, array( 96, 176, 260, 308)), // + array( 69, 532, 0, array( 104, 198, 288, 352)), // + array( 73, 581, 3, array( 120, 216, 320, 384)), // + array( 77, 655, 3, array( 132, 240, 360, 432)), // 15 + array( 81, 733, 3, array( 144, 280, 408, 480)), // + array( 85, 815, 3, array( 168, 308, 448, 532)), // + array( 89, 901, 3, array( 180, 338, 504, 588)), // + array( 93, 991, 3, array( 196, 364, 546, 650)), // + array( 97, 1085, 3, array( 224, 416, 600, 700)), // 20 + array(101, 1156, 4, array( 224, 442, 644, 750)), // + array(105, 1258, 4, array( 252, 476, 690, 816)), // + array(109, 1364, 4, array( 270, 504, 750, 900)), // + array(113, 1474, 4, array( 300, 560, 810, 960)), // + array(117, 1588, 4, array( 312, 588, 870, 1050)), // 25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), // + array(125, 1828, 4, array( 360, 700, 1020, 1200)), // + array(129, 1921, 3, array( 390, 728, 1050, 1260)), // + array(133, 2051, 3, array( 420, 784, 1140, 1350)), // + array(137, 2185, 3, array( 450, 812, 1200, 1440)), // 30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), // + array(145, 2465, 3, array( 510, 924, 1350, 1620)), // + array(149, 2611, 3, array( 540, 980, 1440, 1710)), // + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), // + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), // 35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), // + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), // + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), // + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), // + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) // 40 + ); + + /** + * @var array Length indicator + * @access protected + */ + protected $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + /** + * @var array Table of the error correction code (Reed-Solomon block) + * See Table 12-16 (pp.30-36), JIS X0510:2004. + * @access protected + */ + protected $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), // + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), // + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), // + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), // + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), // + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), // + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), // 10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), // + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), // + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), // + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), // + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), // 15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), // + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), // + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), // + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), // + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), // 20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), // + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), // + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), // + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), // + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), // 25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), // + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), // + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), // + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), // + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), // 30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), // + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), // + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), // + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), // + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), // 35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), // + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), // + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), // + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), // + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)) // 40 + ); + + /** + * @var array Positions of alignment patterns. + * This array includes only the second and the third position of the alignment patterns. Rest of them can be calculated from the distance between them. + * See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + * @access protected + */ + protected $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), // 11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), // 16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), // 21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), // 26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), // 31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58) // 35-40 + ); + + /** + * @var array Version information pattern (BCH coded). + * See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + * size: [QRSPEC_VERSION_MAX - 6] + * @access protected + */ + protected $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, // + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, // + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, // + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, // + 0x27541, 0x28c69 + ); + + /** + * @var array Format information + * @access protected + */ + protected $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), // + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), // + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), // + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) // + ); + + + // ------------------------------------------------- + // ------------------------------------------------- + + + /** + * This is the class constructor. + * Creates a QRcode object + * @param string $code code to represent using QRcode + * @param string $eclevel error level:
  • L : About 7% or less errors can be corrected.
  • M : About 15% or less errors can be corrected.
  • Q : About 25% or less errors can be corrected.
  • H : About 30% or less errors can be corrected.
+ * @access public + * @since 1.0.000 + */ + public function __construct($code, $eclevel = 'L') { + $barcode_array = array(); + if ((is_null($code)) OR ($code == '\0') OR ($code == '')) { + return false; + } + // set error correction level + $this->level = array_search($eclevel, array('L', 'M', 'Q', 'H')); + if ($this->level === false) { + $this->level = QR_ECLEVEL_L; + } + if (($this->hint != QR_MODE_8B) AND ($this->hint != QR_MODE_KJ)) { + return false; + } + if (($this->version < 0) OR ($this->version > QRSPEC_VERSION_MAX)) { + return false; + } + $this->items = array(); + $this->encodeString($code); + $qrTab = $this->binarize($this->data); + $size = count($qrTab); + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach (str_split($line) as $char) { + $arrAdd[] = ($char=='1')?1:0; + } + $barcode_array['bcode'][] = $arrAdd; + } + $this->barcode_array = $barcode_array; + } + + /** + * Returns a barcode array which is readable by TCPDF + * @return array barcode array readable by TCPDF; + * @access public + */ + public function getBarcodeArray() { + return $this->barcode_array; + } + + /** + * Convert the frame in binary form + * @param array $frame array to binarize + * @return array frame in binary form + */ + protected function binarize($frame) { + $len = count($frame); + // the frame is square (width = height) + foreach ($frame as &$frameLine) { + for ($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + return $frame; + } + + /** + * Encode the input string to QR code + * @param string $string input string to encode + */ + protected function encodeString($string) { + $this->dataStr = $string; + if (!$this->casesensitive) { + $this->toUpper(); + } + $ret = $this->splitString(); + if ($ret < 0) { + return NULL; + } + $this->encodeMask(-1); + } + + /** + * Encode mask + * @param int $mask masking mode + */ + protected function encodeMask($mask) { + $spec = array(0, 0, 0, 0, 0); + $this->datacode = $this->getByteStream($this->items); + if (is_null($this->datacode)) { + return NULL; + } + $spec = $this->getEccSpec($this->version, $this->level, $spec); + $this->b1 = $this->rsBlockNum1($spec); + $this->dataLength = $this->rsDataLength($spec); + $this->eccLength = $this->rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = $this->rsBlockNum($spec); + $ret = $this->init($spec); + if ($ret < 0) { + return NULL; + } + $this->count = 0; + $this->width = $this->getWidth($this->version); + $this->frame = $this->newFrame($this->version); + $this->x = $this->width - 1; + $this->y = $this->width - 1; + $this->dir = -1; + $this->bit = -1; + // inteleaved data and ecc codes + for ($i=0; $i < ($this->dataLength + $this->eccLength); $i++) { + $code = $this->getCode(); + $bit = 0x80; + for ($j=0; $j<8; $j++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + // remainder bits + $j = $this->getRemainder($this->version); + for ($i=0; $i<$j; $i++) { + $addr = $this->getNextPosition(); + $this->setFrameAt($addr, 0x02); + } + // masking + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + if ($mask < 0) { + if (QR_FIND_BEST_MASK) { + $masked = $this->mask($this->width, $this->frame, $this->level); + } else { + $masked = $this->makeMask($this->width, $this->frame, (intval(QR_DEFAULT_MASK) % 8), $this->level); + } + } else { + $masked = $this->makeMask($this->width, $this->frame, $mask, $this->level); + } + if ($masked == NULL) { + return NULL; + } + $this->data = $masked; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // FrameFiller + + /** + * Set frame value at specified position + * @param array $at x,y position + * @param int $val value of the character to set + */ + protected function setFrameAt($at, $val) { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + /** + * Get frame value at specified position + * @param array $at x,y position + * @return value at specified position + */ + protected function getFrameAt($at) { + return ord($this->frame[$at['y']][$at['x']]); + } + + /** + * Return the next frame position + * @return array of x,y coordinates + */ + protected function getNextPosition() { + do { + if ($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + $x = $this->x; + $y = $this->y; + $w = $this->width; + if ($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + if ($this->dir < 0) { + if ($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if ($x == 6) { + $x--; + $y = 9; + } + } + } else { + if ($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if ($x == 6) { + $x--; + $y -= 8; + } + } + } + if (($x < 0) OR ($y < 0)) { + return NULL; + } + $this->x = $x; + $this->y = $y; + } while(ord($this->frame[$y][$x]) & 0x80); + return array('x'=>$x, 'y'=>$y); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrawcode + + /** + * Initialize code. + * @param array $spec array of ECC specification + * @return 0 in case of success, -1 in case of error + */ + protected function init($spec) { + $dl = $this->rsDataCodes1($spec); + $el = $this->rsEccCodes1($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + $endfor = $this->rsBlockNum1($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + if ($this->rsBlockNum2($spec) == 0) { + return 0; + } + $dl = $this->rsDataCodes2($spec); + $el = $this->rsEccCodes2($spec); + $rs = $this->init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + if ($rs == NULL) { + return -1; + } + $endfor = $this->rsBlockNum2($spec); + for ($i=0; $i < $endfor; ++$i) { + $ecc = array_slice($this->ecccode, $eccPos); + $this->rsblocks[$blockNo] = array(); + $this->rsblocks[$blockNo]['dataLength'] = $dl; + $this->rsblocks[$blockNo]['data'] = array_slice($this->datacode, $dataPos); + $this->rsblocks[$blockNo]['eccLength'] = $el; + $ecc = $this->encode_rs_char($rs, $this->rsblocks[$blockNo]['data'], $ecc); + $this->rsblocks[$blockNo]['ecc'] = $ecc; + $this->ecccode = array_merge(array_slice($this->ecccode, 0, $eccPos), $ecc); + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + return 0; + } + + /** + * Return Reed-Solomon block code. + * @return array rsblocks + */ + protected function getCode() { + if ($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if ($col >= $this->rsblocks[0]['dataLength']) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]['data'][$col]; + } elseif ($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]['ecc'][$col]; + } else { + return 0; + } + $this->count++; + return $ret; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRmask + + /** + * Write Format Information on frame and returns the number of black bits + * @param int $width frame width + * @param array $frame frame + * @param array $mask masking mode + * @param int $level error correction level + * @return int blacks + */ + protected function writeFormatInformation($width, &$frame, $mask, $level) { + $blacks = 0; + $format = $this->getFormatInfo($mask, $level); + for ($i=0; $i<8; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[8][$width - 1 - $i] = chr($v); + if ($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + for ($i=0; $i<7; ++$i) { + if ($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + $frame[$width - 7 + $i][8] = chr($v); + if ($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + $format = $format >> 1; + } + return $blacks; + } + + /** + * mask0 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask0($x, $y) { + return ($x + $y) & 1; + } + + /** + * mask1 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask1($x, $y) { + return ($y & 1); + } + + /** + * mask2 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask2($x, $y) { + return ($x % 3); + } + + /** + * mask3 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask3($x, $y) { + return ($x + $y) % 3; + } + + /** + * mask4 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask4($x, $y) { + return (((int)($y / 2)) + ((int)($x / 3))) & 1; + } + + /** + * mask5 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask5($x, $y) { + return (($x * $y) & 1) + ($x * $y) % 3; + } + + /** + * mask6 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask6($x, $y) { + return ((($x * $y) & 1) + ($x * $y) % 3) & 1; + } + + /** + * mask7 + * @param int $x X position + * @param int $y Y position + * @return int mask + */ + protected function mask7($x, $y) { + return ((($x * $y) % 3) + (($x + $y) & 1)) & 1; + } + + /** + * Return bitmask + * @param int $maskNo mask number + * @param int $width width + * @param array $frame frame + * @return array bitmask + */ + protected function generateMaskNo($maskNo, $width, $frame) { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if (ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + } + } + return $bitMask; + } + + /** + * makeMaskNo + * @param int $maskNo + * @param int $width + * @param int $s + * @param int $d + * @param boolean $maskGenOnly + * @return int b + */ + protected function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly=false) { + $b = 0; + $bitMask = array(); + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if ($maskGenOnly) { + return; + } + $d = $s; + for ($y=0; $y<$width; ++$y) { + for ($x=0; $x<$width; ++$x) { + if ($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + return $b; + } + + /** + * makeMask + * @param int $width + * @param array $frame + * @param int $maskNo + * @param int $level + * @return array mask + */ + protected function makeMask($width, $frame, $maskNo, $level) { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + return $masked; + } + + /** + * calcN1N3 + * @param int $length + * @return int demerit + */ + protected function calcN1N3($length) { + $demerit = 0; + for ($i=0; $i<$length; ++$i) { + if ($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if ($i & 1) { + if (($i >= 3) AND ($i < ($length-2)) AND ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if (($this->runLength[$i-2] == $fact) + AND ($this->runLength[$i-1] == $fact) + AND ($this->runLength[$i+1] == $fact) + AND ($this->runLength[$i+2] == $fact)) { + if (($this->runLength[$i-3] < 0) OR ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } elseif ((($i+3) >= $length) OR ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + /** + * evaluateSymbol + * @param int $width + * @param array $frame + * @return int demerit + */ + protected function evaluateSymbol($width, $frame) { + $head = 0; + $demerit = 0; + for ($y=0; $y<$width; ++$y) { + $head = 0; + $this->runLength[0] = 1; + $frameY = $frame[$y]; + if ($y > 0) { + $frameYM = $frame[$y-1]; + } + for ($x=0; $x<$width; ++$x) { + if (($x > 0) AND ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + if (($b22 | ($w22 ^ 1)) & 1) { + $demerit += N2; + } + } + if (($x == 0) AND (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($x > 0) { + if ((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + for ($x=0; $x<$width; ++$x) { + $head = 0; + $this->runLength[0] = 1; + for ($y=0; $y<$width; ++$y) { + if (($y == 0) AND (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } elseif ($y > 0) { + if ((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + $demerit += $this->calcN1N3($head+1); + } + return $demerit; + } + + /** + * mask + * @param int $width + * @param array $frame + * @param int $level + * @return array best mask + */ + protected function mask($width, $frame, $level) { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + $checked_masks = array(0, 1, 2, 3, 4, 5, 6, 7); + if (QR_FIND_FROM_RANDOM !== false) { + $howManuOut = 8 - (QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; ++$i) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + } + $bestMask = $frame; + foreach ($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + if ($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + return $bestMask; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRsplit + + /** + * Return true if the character at specified position is a number + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isdigitat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + /** + * Return true if the character at specified position is an alphanumeric character + * @param string $str string + * @param int $pos characted position + * @return boolean true of false + */ + protected function isalnumat($str, $pos) { + if ($pos >= strlen($str)) { + return false; + } + return ($this->lookAnTable(ord($str[$pos])) >= 0); + } + + /** + * identifyMode + * @param int $pos + * @return int mode + */ + protected function identifyMode($pos) { + if ($pos >= strlen($this->dataStr)) { + return QR_MODE_NL; + } + $c = $this->dataStr[$pos]; + if ($this->isdigitat($this->dataStr, $pos)) { + return QR_MODE_NM; + } elseif ($this->isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } elseif ($this->hint == QR_MODE_KJ) { + if ($pos+1 < strlen($this->dataStr)) { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if (($word >= 0x8140 && $word <= 0x9ffc) OR ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KJ; + } + } + } + return QR_MODE_8B; + } + + /** + * eatNum + * @return int run + */ + protected function eatNum() { + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isdigitat($this->dataStr, $p)) { + $p++; + } + $run = $p; + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_8B) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + if ($mode == QR_MODE_AN) { + $dif = $this->estimateBitsModeNum($run) + 4 + $ln + + $this->estimateBitsModeAn(1) // + 4 + la + - $this->estimateBitsModeAn($run + 1);// - 4 - la + if ($dif > 0) { + return $this->eatAn(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_NM, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatAn + * @return int run + */ + protected function eatAn() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 0; + while($this->isalnumat($this->dataStr, $p)) { + if ($this->isdigitat($this->dataStr, $p)) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsModeAn($p) // + 4 + la + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsModeAn($q); // - 4 - la + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + if (!$this->isalnumat($this->dataStr, $p)) { + $dif = $this->estimateBitsModeAn($run) + 4 + $la + + $this->estimateBitsMode8(1) // + 4 + l8 + - $this->estimateBitsMode8($run + 1); // - 4 - l8 + if ($dif > 0) { + return $this->eat8(); + } + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_AN, $run, str_split($this->dataStr)); + return $run; + } + + /** + * eatKanji + * @return int run + */ + protected function eatKanji() { + $p = 0; + while($this->identifyMode($p) == QR_MODE_KJ) { + $p += 2; + } + $this->items = $this->appendNewInputItem($this->items, QR_MODE_KJ, $p, str_split($this->dataStr)); + return $run; + } + + /** + * eat8 + * @return int run + */ + protected function eat8() { + $la = $this->lengthIndicator(QR_MODE_AN, $this->version); + $ln = $this->lengthIndicator(QR_MODE_NM, $this->version); + $p = 1; + $dataStrLen = strlen($this->dataStr); + while($p < $dataStrLen) { + $mode = $this->identifyMode($p); + if ($mode == QR_MODE_KJ) { + break; + } + if ($mode == QR_MODE_NM) { + $q = $p; + while($this->isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeNum($q - $p) + 4 + $ln + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } elseif ($mode == QR_MODE_AN) { + $q = $p; + while($this->isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = $this->estimateBitsMode8($p) // + 4 + l8 + + $this->estimateBitsModeAn($q - $p) + 4 + $la + - $this->estimateBitsMode8($q); // - 4 - l8 + if ($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + $run = $p; + $this->items = $this->appendNewInputItem($this->items, QR_MODE_8B, $run, str_split($this->dataStr)); + return $run; + } + + /** + * splitString + */ + protected function splitString() { + while (strlen($this->dataStr) > 0) { + if ($this->dataStr == '') { + return 0; + } + $mode = $this->identifyMode(0); + switch ($mode) { + case QR_MODE_NM: { + $length = $this->eatNum(); + break; + } + case QR_MODE_AN: { + $length = $this->eatAn(); + break; + } + case QR_MODE_KJ: { + if ($hint == QR_MODE_KJ) { + $length = $this->eatKanji(); + } else { + $length = $this->eat8(); + } + break; + } + default: { + $length = $this->eat8(); + break; + } + } + if ($length == 0) { + return 0; + } + if ($length < 0) { + return -1; + } + $this->dataStr = substr($this->dataStr, $length); + } + } + + /** + * toUpper + */ + protected function toUpper() { + $stringLen = strlen($this->dataStr); + $p = 0; + while ($p < $stringLen) { + $mode = $this->identifyMode(substr($this->dataStr, $p), $this->hint); + if ($mode == QR_MODE_KJ) { + $p += 2; + } else { + if ((ord($this->dataStr[$p]) >= ord('a')) AND (ord($this->dataStr[$p]) <= ord('z'))) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + return $this->dataStr; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinputItem + + /** + * newInputItem + * @param int $mode + * @param int $size + * @param array $data + * @param array $bstream + * @return array input item + */ + protected function newInputItem($mode, $size, $data, $bstream=null) { + $setData = array_slice($data, 0, $size); + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0, ($size - count($setData)), 0)); + } + if (!$this->check($mode, $size, $setData)) { + return NULL; + } + $inputitem = array(); + $inputitem['mode'] = $mode; + $inputitem['size'] = $size; + $inputitem['data'] = $setData; + $inputitem['bstream'] = $bstream; + return $inputitem; + } + + /** + * encodeModeNum + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeNum($inputitem, $version) { + $words = (int)($inputitem['size'] / 3); + $inputitem['bstream'] = array(); + $val = 0x1; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_NM, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (ord($inputitem['data'][$i*3 ]) - ord('0')) * 100; + $val += (ord($inputitem['data'][$i*3+1]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$i*3+2]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 10, $val); + } + if ($inputitem['size'] - $words * 3 == 1) { + $val = ord($inputitem['data'][$words*3]) - ord('0'); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, $val); + } elseif (($inputitem['size'] - ($words * 3)) == 2) { + $val = (ord($inputitem['data'][$words*3 ]) - ord('0')) * 10; + $val += (ord($inputitem['data'][$words*3+1]) - ord('0')); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 7, $val); + } + return $inputitem; + } + + /** + * encodeModeAn + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeAn($inputitem, $version) { + $words = (int)($inputitem['size'] / 2); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x02); + $inputitem['bstream'] = $this->appendNum(v, $this->lengthIndicator(QR_MODE_AN, $version), $inputitem['size']); + for ($i=0; $i < $words; ++$i) { + $val = (int)$this->lookAnTable(ord($inputitem['data'][$i*2 ])) * 45; + $val += (int)$this->lookAnTable(ord($inputitem['data'][$i*2+1])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 11, $val); + } + if ($inputitem['size'] & 1) { + $val = $this->lookAnTable(ord($inputitem['data'][($words * 2)])); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 6, $val); + } + return $inputitem; + } + + /** + * encodeMode8 + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeMode8($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x4); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_8B, $version), $inputitem['size']); + for ($i=0; $i < $inputitem['size']; ++$i) { + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][$i])); + } + return $inputitem; + } + + /** + * encodeModeKanji + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeModeKanji($inputitem, $version) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x8); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], $this->lengthIndicator(QR_MODE_KJ, $version), (int)($inputitem['size'] / 2)); + for ($i=0; $i<$inputitem['size']; $i+=2) { + $val = (ord($inputitem['data'][$i]) << 8) | ord($inputitem['data'][$i+1]); + if ($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 13, $val); + } + return $inputitem; + } + + /** + * encodeModeStructure + * @param array $inputitem + * @return array input item + */ + protected function encodeModeStructure($inputitem) { + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, 0x03); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][1]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 4, ord($inputitem['data'][0]) - 1); + $inputitem['bstream'] = $this->appendNum($inputitem['bstream'], 8, ord($inputitem['data'][2])); + return $inputitem; + } + + /** + * encodeBitStream + * @param array $inputitem + * @param int $version + * @return array input item + */ + protected function encodeBitStream($inputitem, $version) { + $inputitem['bstream'] = array(); + $words = $this->maximumWords($inputitem['mode'], $version); + if ($inputitem['size'] > $words) { + $st1 = $this->newInputItem($inputitem['mode'], $words, $inputitem['data']); + $st2 = $this->newInputItem($inputitem['mode'], $inputitem['size'] - $words, array_slice($inputitem['data'], $words)); + $st1 = $this->encodeBitStream($st1, $version); + $st2 = $this->encodeBitStream($st2, $version); + $inputitem['bstream'] = array(); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st1['bstream']); + $inputitem['bstream'] = $this->appendBitstream($inputitem['bstream'], $st2['bstream']); + } else { + switch($inputitem['mode']) { + case QR_MODE_NM: { + $inputitem = $this->encodeModeNum($inputitem, $version); + break; + } + case QR_MODE_AN: { + $inputitem = $this->encodeModeAn($inputitem, $version); + break; + } + case QR_MODE_8B: { + $inputitem = $this->encodeMode8($inputitem, $version); + break; + } + case QR_MODE_KJ: { + $inputitem = $this->encodeModeKanji($inputitem, $version); + break; + } + case QR_MODE_ST: { + $inputitem = $this->encodeModeStructure($inputitem); + break; + } + default: { + break; + } + } + } + return $inputitem; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRinput + + /** + * Append data to an input object. + * The data is copied and appended to the input object. + * @param array items input items + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array $data array of input data. + * @return items + * + */ + protected function appendNewInputItem($items, $mode, $size, $data) { + $items[] = $this->newInputItem($mode, $size, $data); + return $items; + } + + /** + * insertStructuredAppendHeader + * @param array $items + * @param int $size + * @param int $index + * @param int $parity + * @return array items + */ + protected function insertStructuredAppendHeader($items, $size, $index, $parity) { + if ($size > MAX_STRUCTURED_SYMBOLS) { + return -1; + } + if (($index <= 0) OR ($index > MAX_STRUCTURED_SYMBOLS)) { + return -1; + } + $buf = array($size, $index, $parity); + $entry = $this->newInputItem(QR_MODE_ST, 3, buf); + array_unshift($items, $entry); + return $items; + } + + /** + * calcParity + * @param array $items + * @return int parity + */ + protected function calcParity($items) { + $parity = 0; + foreach ($items as $item) { + if ($item['mode'] != QR_MODE_ST) { + for ($i=$item['size']-1; $i>=0; --$i) { + $parity ^= $item['data'][$i]; + } + } + } + return $parity; + } + + /** + * checkModeNum + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeNum($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ((ord($data[$i]) < ord('0')) OR (ord($data[$i]) > ord('9'))){ + return false; + } + } + return true; + } + + /** + * estimateBitsModeNum + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeNum($size) { + $w = (int)$size / 3; + $bits = $w * 10; + switch($size - $w * 3) { + case 1: { + $bits += 4; + break; + } + case 2: { + $bits += 7; + break; + } + default: { + break; + } + } + return $bits; + } + + /** + * Look up the alphabet-numeric convesion table (see JIS X0510:2004, pp.19). + * @param int $c character value + * @return value + */ + protected function lookAnTable($c) { + return (($c > 127)?-1:$this->anTable[$c]); + } + + /** + * checkModeAn + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeAn($size, $data) { + for ($i=0; $i<$size; ++$i) { + if ($this->lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + return true; + } + + /** + * estimateBitsModeAn + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeAn($size) { + $w = (int)($size / 2); + $bits = $w * 11; + if ($size & 1) { + $bits += 6; + } + return $bits; + } + + /** + * estimateBitsMode8 + * @param int $size + * @return int number of bits + */ + protected function estimateBitsMode8($size) { + return $size * 8; + } + + /** + * estimateBitsModeKanji + * @param int $size + * @return int number of bits + */ + protected function estimateBitsModeKanji($size) { + return (int)(($size / 2) * 13); + } + + /** + * checkModeKanji + * @param int $size + * @param array $data + * @return boolean true or false + */ + protected function checkModeKanji($size, $data) { + if ($size & 1) { + return false; + } + for ($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if (($val < 0x8140) OR (($val > 0x9ffc) AND ($val < 0xe040)) OR ($val > 0xebbf)) { + return false; + } + } + return true; + } + + /** + * Validate the input data. + * @param int $mode encoding mode. + * @param int $size size of data (byte). + * @param array data data to validate + * @return boolean true in case of valid data, false otherwise + */ + protected function check($mode, $size, $data) { + if ($size <= 0) { + return false; + } + switch($mode) { + case QR_MODE_NM: { + return $this->checkModeNum($size, $data); + } + case QR_MODE_AN: { + return $this->checkModeAn($size, $data); + } + case QR_MODE_KJ: { + return $this->checkModeKanji($size, $data); + } + case QR_MODE_8B: { + return true; + } + case QR_MODE_ST: { + return true; + } + default: { + break; + } + } + return false; + } + + /** + * estimateBitStreamSize + * @param array $items + * @param int $version + * @return int bits + */ + protected function estimateBitStreamSize($items, $version) { + $bits = 0; + if ($version == 0) { + $version = 1; + } + foreach ($items as $item) { + switch($item['mode']) { + case QR_MODE_NM: { + $bits = $this->estimateBitsModeNum($item['size']); + break; + } + case QR_MODE_AN: { + $bits = $this->estimateBitsModeAn($item['size']); + break; + } + case QR_MODE_8B: { + $bits = $this->estimateBitsMode8($item['size']); + break; + } + case QR_MODE_KJ: { + $bits = $this->estimateBitsModeKanji($item['size']); + break; + } + case QR_MODE_ST: { + return STRUCTURE_HEADER_BITS; + } + default: { + return 0; + } + } + $l = $this->lengthIndicator($item['mode'], $version); + $m = 1 << $l; + $num = (int)(($item['size'] + $m - 1) / $m); + $bits += $num * (4 + $l); + } + return $bits; + } + + /** + * estimateVersion + * @param array $items + * @return int version + */ + protected function estimateVersion($items) { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($items, $prev); + $version = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + return $version; + } + + /** + * lengthOfCode + * @param int $mode + * @param int $version + * @param int $bits + * @return int size + */ + protected function lengthOfCode($mode, $version, $bits) { + $payload = $bits - 4 - $this->lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NM: { + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if ($remain >= 7) { + $size += 2; + } elseif ($remain >= 4) { + $size += 1; + } + break; + } + case QR_MODE_AN: { + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if ($remain >= 6) { + ++$size; + } + break; + } + case QR_MODE_8B: { + $size = (int)($payload / 8); + break; + } + case QR_MODE_KJ: { + $size = (int)(($payload / 13) * 2); + break; + } + case QR_MODE_ST: { + $size = (int)($payload / 8); + break; + } + default: { + $size = 0; + break; + } + } + $maxsize = $this->maximumWords($mode, $version); + if ($size < 0) { + $size = 0; + } + if ($size > $maxsize) { + $size = $maxsize; + } + return $size; + } + + /** + * createBitStream + * @param array $items + * @return array of items and total bits + */ + protected function createBitStream($items) { + $total = 0; + foreach ($items as $key => $item) { + $items[$key] = $this->encodeBitStream($item, $this->version); + $bits = count($items[$key]['bstream']); + $total += $bits; + } + return array($items, $total); + } + + /** + * convertData + * @param array $items + * @return array items + */ + protected function convertData($items) { + $ver = $this->estimateVersion($items); + if ($ver > $this->version) { + $this->version = $ver; + } + for (;;) { + $cbs = $this->createBitStream($items); + $items = $cbs[0]; + $bits = $cbs[1]; + if ($bits < 0) { + return -1; + } + $ver = $this->getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($ver < 0) { + return -1; + } elseif ($ver > $this->version) { + $this->version = $ver; + } else { + break; + } + } + return $items; + } + + /** + * Append Padding Bit to bitstream + * @param array $bstream + * @return array bitstream + */ + protected function appendPaddingBit($bstream) { + $bits = count($bstream); + $maxwords = $this->getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + if ($maxbits == $bits) { + return 0; + } + if ($maxbits - $bits < 5) { + return $this->appendNum($bstream, $maxbits - $bits, 0); + } + $bits += 4; + $words = (int)(($bits + 7) / 8); + $padding = array(); + $padding = $this->appendNum($padding, $words * 8 - $bits + 4, 0); + $padlen = $maxwords - $words; + if ($padlen > 0) { + $padbuf = array(); + for ($i=0; $i<$padlen; ++$i) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + $padding = $this->appendBytes($padding, $padlen, $padbuf); + } + return $this->appendBitstream($bstream, $padding); + } + + /** + * mergeBitStream + * @param array $bstream + * @return array bitstream + */ + protected function mergeBitStream($items) { + $items = $this->convertData($items); + $bstream = array(); + foreach ($items as $item) { + $bstream = $this->appendBitstream($bstream, $item['bstream']); + } + return $bstream; + } + + /** + * Returns a stream of bits. + * @param int $items + * @return array padded merged byte stream + */ + protected function getBitStream($items) { + $bstream = $this->mergeBitStream($items); + return $this->appendPaddingBit($bstream); + } + + /** + * Pack all bit streams padding bits into a byte array. + * @param int $items + * @return array padded merged byte stream + */ + protected function getByteStream($items) { + $bstream = $this->getBitStream($items); + return $this->bitstreamToByte($bstream); + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRbitstream + + /** + * Return an array with zeros + * @param int $setLength array size + * @return array + */ + protected function allocate($setLength) { + return array_fill(0, $setLength, 0); + } + + /** + * Return new bitstream from number + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function newFromNum($bits, $num) { + $bstream = $this->allocate($bits); + $mask = 1 << ($bits - 1); + for ($i=0; $i<$bits; ++$i) { + if ($num & $mask) { + $bstream[$i] = 1; + } else { + $bstream[$i] = 0; + } + $mask = $mask >> 1; + } + return $bstream; + } + + /** + * Return new bitstream from bytes + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function newFromBytes($size, $data) { + $bstream = $this->allocate($size * 8); + $p=0; + for ($i=0; $i<$size; ++$i) { + $mask = 0x80; + for ($j=0; $j<8; ++$j) { + if ($data[$i] & $mask) { + $bstream[$p] = 1; + } else { + $bstream[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + return $bstream; + } + + /** + * Append one bitstream to another + * @param array $bitstream original bitstream + * @param array $append bitstream to append + * @return array bitstream + */ + protected function appendBitstream($bitstream, $append) { + if ((!is_array($append)) OR (count($append) == 0)) { + return $bitstream; + } + if (count($bitstream) == 0) { + return $append; + } + return array_values(array_merge($bitstream, $append)); + } + + /** + * Append one bitstream created from number to another + * @param array $bitstream original bitstream + * @param int $bits number of bits + * @param int $num number + * @return array bitstream + */ + protected function appendNum($bitstream, $bits, $num) { + if ($bits == 0) { + return 0; + } + $b = $this->newFromNum($bits, $num); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Append one bitstream created from bytes to another + * @param array $bitstream original bitstream + * @param int $size size + * @param array $data bytes + * @return array bitstream + */ + protected function appendBytes($bitstream, $size, $data) { + if ($size == 0) { + return 0; + } + $b = $this->newFromBytes($size, $data); + return $this->appendBitstream($bitstream, $b); + } + + /** + * Convert bitstream to bytes + * @param array $bitstream original bitstream + * @return array of bytes + */ + protected function bitstreamToByte($bstream) { + $size = count($bstream); + if ($size == 0) { + return array(); + } + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + $p = 0; + for ($i=0; $i<$bytes; $i++) { + $v = 0; + for ($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$i] = $v; + } + if ($size & 7) { + $v = 0; + for ($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $bstream[$p]; + $p++; + } + $data[$bytes] = $v; + } + return $data; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRspec + + /** + * Replace a value on the array at the specified position + * @param array $srctab + * @param int $x X position + * @param int $y Y position + * @param string $repl value to replace + * @param int $replLen length of the repl string + * @return array srctab + */ + protected function qrstrset($srctab, $x, $y, $repl, $replLen=false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + return $srctab; + } + + /** + * Return maximum data code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int maximum size (bytes) + */ + protected function getDataLength($version, $level) { + return $this->capacity[$version][QRCAP_WORDS] - $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return maximum error correction code length (bytes) for the version. + * @param int $version version + * @param int $level error correction level + * @return int ECC size (bytes) + */ + protected function getECCLength($version, $level){ + return $this->capacity[$version][QRCAP_EC][$level]; + } + + /** + * Return the width of the symbol for the version. + * @param int $version version + * @return int width + */ + protected function getWidth($version) { + return $this->capacity[$version][QRCAP_WIDTH]; + } + + /** + * Return the numer of remainder bits. + * @param int $version version + * @return int number of remainder bits + */ + protected function getRemainder($version) { + return $this->capacity[$version][QRCAP_REMINDER]; + } + + /** + * Return a version number that satisfies the input code length. + * @param int $size input code length (byte) + * @param int $level error correction level + * @return int version number + */ + protected function getMinimumVersion($size, $level) { + for ($i=1; $i <= QRSPEC_VERSION_MAX; ++$i) { + $words = $this->capacity[$i][QRCAP_WORDS] - $this->capacity[$i][QRCAP_EC][$level]; + if ($words >= $size) { + return $i; + } + } + return -1; + } + + /** + * Return the size of length indicator for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the size of the appropriate length indicator (bits). + */ + protected function lengthIndicator($mode, $version) { + if ($mode == QR_MODE_ST) { + return 0; + } + if ($version <= 9) { + $l = 0; + } elseif ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + return $this->lengthTableBits[$mode][$l]; + } + + /** + * Return the maximum length for the mode and version. + * @param int $mode encoding mode + * @param int $version version + * @return int the maximum length (bytes) + */ + protected function maximumWords($mode, $version) { + if ($mode == QR_MODE_ST) { + return 3; + } + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + $bits = $this->lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + if ($mode == QR_MODE_KJ) { + $words *= 2; // the number of bytes is required + } + return $words; + } + + /** + * Return an array of ECC specification. + * @param int $version version + * @param int $level error correction level + * @param array $spec an array of ECC specification contains as following: {# of type1 blocks, # of data code, # of ecc code, # of type2 blocks, # of data code} + * @return array spec + */ + protected function getEccSpec($version, $level, $spec) { + if (count($spec) < 5) { + $spec = array(0, 0, 0, 0, 0); + } + $b1 = $this->eccTable[$version][$level][0]; + $b2 = $this->eccTable[$version][$level][1]; + $data = $this->getDataLength($version, $level); + $ecc = $this->getECCLength($version, $level); + if ($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + return $spec; + } + + /** + * Put an alignment marker. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putAlignmentMarker($frame, $ox, $oy) { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + $yStart = $oy - 2; + $xStart = $ox - 2; + for ($y=0; $y < 5; $y++) { + $frame = $this->qrstrset($frame, $xStart, $yStart+$y, $finder[$y]); + } + return $frame; + } + + /** + * Put an alignment pattern. + * @param int $version version + * @param array $fram frame + * @param int $width width + * @return array frame + */ + protected function putAlignmentPattern($version, $frame, $width) { + if ($version < 2) { + return $frame; + } + $d = $this->alignmentPattern[$version][1] - $this->alignmentPattern[$version][0]; + if ($d < 0) { + $w = 2; + } else { + $w = (int)(($width - $this->alignmentPattern[$version][0]) / $d + 2); + } + if ($w * $w - 3 == 1) { + $x = $this->alignmentPattern[$version][0]; + $y = $this->alignmentPattern[$version][0]; + $frame = $this->putAlignmentMarker($frame, $x, $y); + return $frame; + } + $cx = $this->alignmentPattern[$version][0]; + $wo = $w - 1; + for ($x=1; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, 6, $cx); + $frame = $this->putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + $cy = $this->alignmentPattern[$version][0]; + for ($y=0; $y < $wo; ++$y) { + $cx = $this->alignmentPattern[$version][0]; + for ($x=0; $x < $wo; ++$x) { + $frame = $this->putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + return $frame; + } + + /** + * Return BCH encoded version information pattern that is used for the symbol of version 7 or greater. Use lower 18 bits. + * @param int $version version + * @return BCH encoded version information pattern + */ + protected function getVersionPattern($version) { + if (($version < 7) OR ($version > QRSPEC_VERSION_MAX)) { + return 0; + } + return $this->versionPattern[($version - 7)]; + } + + /** + * Return BCH encoded format information pattern. + * @param array $mask + * @param int $level error correction level + * @return BCH encoded format information pattern + */ + protected function getFormatInfo($mask, $level) { + if (($mask < 0) OR ($mask > 7)) { + return 0; + } + if (($level < 0) OR ($level > 3)) { + return 0; + } + return $this->formatInfo[$level][$mask]; + } + + /** + * Put a finder pattern. + * @param array $frame frame + * @param int $width width + * @param int $ox X center coordinate of the pattern + * @param int $oy Y center coordinate of the pattern + * @return array frame + */ + protected function putFinderPattern($frame, $ox, $oy) { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + for ($y=0; $y < 7; $y++) { + $frame = $this->qrstrset($frame, $ox, ($oy + $y), $finder[$y]); + } + return $frame; + } + + /** + * Return a copy of initialized frame. + * @param int $version version + * @return Array of unsigned char. + */ + protected function createFrame($version) { + $width = $this->capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + // Finder pattern + $frame = $this->putFinderPattern($frame, 0, 0); + $frame = $this->putFinderPattern($frame, $width - 7, 0); + $frame = $this->putFinderPattern($frame, 0, $width - 7); + // Separator + $yOffset = $width - 7; + for ($y=0; $y < 7; ++$y) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + ++$yOffset; + } + $setPattern = str_repeat("\xc0", 8); + $frame = $this->qrstrset($frame, 0, 7, $setPattern); + $frame = $this->qrstrset($frame, $width-8, 7, $setPattern); + $frame = $this->qrstrset($frame, 0, $width - 8, $setPattern); + // Format info + $setPattern = str_repeat("\x84", 9); + $frame = $this->qrstrset($frame, 0, 8, $setPattern); + $frame = $this->qrstrset($frame, $width - 8, 8, $setPattern, 8); + $yOffset = $width - 8; + for ($y=0; $y < 8; ++$y,++$yOffset) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + // Timing pattern + $wo = $width - 15; + for ($i=1; $i < $wo; ++$i) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + // Alignment pattern + $frame = $this->putAlignmentPattern($version, $frame, $width); + // Version information + if ($version >= 7) { + $vinf = $this->getVersionPattern($version); + $v = $vinf; + for ($x=0; $x<6; ++$x) { + for ($y=0; $y<3; ++$y) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + $v = $vinf; + for ($y=0; $y<6; ++$y) { + for ($x=0; $x<3; ++$x) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + // and a little bit... + $frame[$width - 8][8] = "\x81"; + return $frame; + } + + /** + * Set new frame for the specified version. + * @param int $version version + * @return Array of unsigned char. + */ + protected function newFrame($version) { + if (($version < 1) OR ($version > QRSPEC_VERSION_MAX)) { + return NULL; + } + if (!isset($this->frames[$version])) { + $this->frames[$version] = $this->createFrame($version); + } + if (is_null($this->frames[$version])) { + return NULL; + } + return $this->frames[$version]; + } + + /** + * Return block number 0 + * @param array $spec + * @return int value + */ + protected function rsBlockNum($spec) { + return ($spec[0] + $spec[3]); + } + + /** + * Return block number 1 + * @param array $spec + * @return int value + */ + protected function rsBlockNum1($spec) { + return $spec[0]; + } + + /** + * Return data codes 1 + * @param array $spec + * @return int value + */ + protected function rsDataCodes1($spec) { + return $spec[1]; + } + + /** + * Return ecc codes 1 + * @param array $spec + * @return int value + */ + protected function rsEccCodes1($spec) { + return $spec[2]; + } + + /** + * Return block number 2 + * @param array $spec + * @return int value + */ + protected function rsBlockNum2($spec) { + return $spec[3]; + } + + /** + * Return data codes 2 + * @param array $spec + * @return int value + */ + protected function rsDataCodes2($spec) { + return $spec[4]; + } + + /** + * Return ecc codes 2 + * @param array $spec + * @return int value + */ + protected function rsEccCodes2($spec) { + return $spec[2]; + } + + /** + * Return data length + * @param array $spec + * @return int value + */ + protected function rsDataLength($spec) { + return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); + } + + /** + * Return ecc length + * @param array $spec + * @return int value + */ + protected function rsEccLength($spec) { + return ($spec[0] + $spec[3]) * $spec[2]; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrs + + /** + * Initialize a Reed-Solomon codec and add it to existing rsitems + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
. + */ + protected function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + foreach ($this->rsitems as $rs) { + if (($rs['pad'] != $pad) OR ($rs['nroots'] != $nroots) OR ($rs['mm'] != $symsize) + OR ($rs['gfpoly'] != $gfpoly) OR ($rs['fcr'] != $fcr) OR ($rs['prim'] != $prim)) { + continue; + } + return $rs; + } + $rs = $this->init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift($this->rsitems, $rs); + return $rs; + } + + // - - - - - - - - - - - - - - - - - - - - - - - - - + + // QRrsItem + + /** + * modnn + * @param array RS values + * @param int $x X position + * @return int X osition + */ + protected function modnn($rs, $x) { + while ($x >= $rs['nn']) { + $x -= $rs['nn']; + $x = ($x >> $rs['mm']) + ($x & $rs['nn']); + } + return $x; + } + + /** + * Initialize a Reed-Solomon codec and returns an array of values. + * @param int $symsize symbol size, bits + * @param int $gfpoly Field generator polynomial coefficients + * @param int $fcr first root of RS code generator polynomial, index form + * @param int $prim primitive element to generate polynomial roots + * @param int $nroots RS code generator polynomial degree (number of roots) + * @param int $pad padding bytes at front of shortened block + * @return array Array of RS values:
  • mm = Bits per symbol;
  • nn = Symbols per block;
  • alpha_to = log lookup table array;
  • index_of = Antilog lookup table array;
  • genpoly = Generator polynomial array;
  • nroots = Number of generator;
  • roots = number of parity symbols;
  • fcr = First consecutive root, index form;
  • prim = Primitive element, index form;
  • iprim = prim-th root of 1, index form;
  • pad = Padding bytes in shortened block;
  • gfpoly
. + */ + protected function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) { + // Based on Reed solomon encoder by Phil Karn, KA9Q (GNU-LGPLv2) + $rs = null; + // Check parameter ranges + if (($symsize < 0) OR ($symsize > 8)) { + return $rs; + } + if (($fcr < 0) OR ($fcr >= (1<<$symsize))) { + return $rs; + } + if (($prim <= 0) OR ($prim >= (1<<$symsize))) { + return $rs; + } + if (($nroots < 0) OR ($nroots >= (1<<$symsize))) { + return $rs; + } + if (($pad < 0) OR ($pad >= ((1<<$symsize) -1 - $nroots))) { + return $rs; + } + $rs = array(); + $rs['mm'] = $symsize; + $rs['nn'] = (1 << $symsize) - 1; + $rs['pad'] = $pad; + $rs['alpha_to'] = array_fill(0, ($rs['nn'] + 1), 0); + $rs['index_of'] = array_fill(0, ($rs['nn'] + 1), 0); + // PHP style macro replacement ;) + $NN =& $rs['nn']; + $A0 =& $NN; + // Generate Galois field lookup tables + $rs['index_of'][0] = $A0; // log(zero) = -inf + $rs['alpha_to'][$A0] = 0; // alpha**-inf = 0 + $sr = 1; + for ($i=0; $i<$rs['nn']; ++$i) { + $rs['index_of'][$sr] = $i; + $rs['alpha_to'][$i] = $sr; + $sr <<= 1; + if ($sr & (1 << $symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs['nn']; + } + if ($sr != 1) { + // field generator polynomial is not primitive! + return NULL; + } + // Form RS code generator polynomial from its roots + $rs['genpoly'] = array_fill(0, ($nroots + 1), 0); + $rs['fcr'] = $fcr; + $rs['prim'] = $prim; + $rs['nroots'] = $nroots; + $rs['gfpoly'] = $gfpoly; + // Find prim-th root of 1, used in decoding + for ($iprim=1; ($iprim % $prim) != 0; $iprim += $rs['nn']) { + ; // intentional empty-body loop! + } + $rs['iprim'] = (int)($iprim / $prim); + $rs['genpoly'][0] = 1; + + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs['genpoly'][$i+1] = 1; + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; --$j) { + if ($rs['genpoly'][$j] != 0) { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1] ^ $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][$j]] + $root)]; + } else { + $rs['genpoly'][$j] = $rs['genpoly'][$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs['genpoly'][0] = $rs['alpha_to'][$this->modnn($rs, $rs['index_of'][$rs['genpoly'][0]] + $root)]; + } + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; ++$i) { + $rs['genpoly'][$i] = $rs['index_of'][$rs['genpoly'][$i]]; + } + return $rs; + } + + /** + * Encode a Reed-Solomon codec and returns the parity array + * @param array $rs RS values + * @param array $data data + * @param array $parity parity + * @return parity array + */ + protected function encode_rs_char($rs, $data, $parity) { + $MM =& $rs['mm']; // bits per symbol + $NN =& $rs['nn']; // the total number of symbols in a RS block + $ALPHA_TO =& $rs['alpha_to']; // the address of an array of NN elements to convert Galois field elements in index (log) form to polynomial form + $INDEX_OF =& $rs['index_of']; // the address of an array of NN elements to convert Galois field elements in polynomial form to index (log) form + $GENPOLY =& $rs['genpoly']; // an array of NROOTS+1 elements containing the generator polynomial in index form + $NROOTS =& $rs['nroots']; // the number of roots in the RS code generator polynomial, which is the same as the number of parity symbols in a block + $FCR =& $rs['fcr']; // first consecutive root, index form + $PRIM =& $rs['prim']; // primitive element, index form + $IPRIM =& $rs['iprim']; // prim-th root of 1, index form + $PAD =& $rs['pad']; // the number of pad symbols in a block + $A0 =& $NN; + $parity = array_fill(0, $NROOTS, 0); + for ($i=0; $i < ($NN - $NROOTS - $PAD); $i++) { + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if ($feedback != $A0) { + // feedback term is non-zero + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($rs, $NN - $GENPOLY[$NROOTS] + $feedback); + for ($j=1; $j < $NROOTS; ++$j) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[($NROOTS - $j)])]; + } + } + // Shift + array_shift($parity); + if ($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($rs, $feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + return $parity; + } + + } // end QRcode class + +} // END OF "class_exists QRcode" +?> diff --git a/admin/phpqrcode/cache/frame_1.dat b/admin/phpqrcode/cache/frame_1.dat new file mode 100644 index 0000000..be28fea --- /dev/null +++ b/admin/phpqrcode/cache/frame_1.dat @@ -0,0 +1,2 @@ +xڝ E9u`"PńC牗T!0$ +EɲQmh۾9{kI" 9Ln)Ap־>^zmnŖ;mn \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_1.png b/admin/phpqrcode/cache/frame_1.png new file mode 100644 index 0000000..86ce6e9 Binary files /dev/null and b/admin/phpqrcode/cache/frame_1.png differ diff --git a/admin/phpqrcode/cache/frame_10.dat b/admin/phpqrcode/cache/frame_10.dat new file mode 100644 index 0000000..aff163f Binary files /dev/null and b/admin/phpqrcode/cache/frame_10.dat differ diff --git a/admin/phpqrcode/cache/frame_10.png b/admin/phpqrcode/cache/frame_10.png new file mode 100644 index 0000000..dbfcd70 Binary files /dev/null and b/admin/phpqrcode/cache/frame_10.png differ diff --git a/admin/phpqrcode/cache/frame_11.dat b/admin/phpqrcode/cache/frame_11.dat new file mode 100644 index 0000000..95af68a Binary files /dev/null and b/admin/phpqrcode/cache/frame_11.dat differ diff --git a/admin/phpqrcode/cache/frame_11.png b/admin/phpqrcode/cache/frame_11.png new file mode 100644 index 0000000..c07c761 Binary files /dev/null and b/admin/phpqrcode/cache/frame_11.png differ diff --git a/admin/phpqrcode/cache/frame_12.dat b/admin/phpqrcode/cache/frame_12.dat new file mode 100644 index 0000000..73228b3 Binary files /dev/null and b/admin/phpqrcode/cache/frame_12.dat differ diff --git a/admin/phpqrcode/cache/frame_12.png b/admin/phpqrcode/cache/frame_12.png new file mode 100644 index 0000000..8ba6782 Binary files /dev/null and b/admin/phpqrcode/cache/frame_12.png differ diff --git a/admin/phpqrcode/cache/frame_13.dat b/admin/phpqrcode/cache/frame_13.dat new file mode 100644 index 0000000..2256f0e Binary files /dev/null and b/admin/phpqrcode/cache/frame_13.dat differ diff --git a/admin/phpqrcode/cache/frame_13.png b/admin/phpqrcode/cache/frame_13.png new file mode 100644 index 0000000..6e49d35 Binary files /dev/null and b/admin/phpqrcode/cache/frame_13.png differ diff --git a/admin/phpqrcode/cache/frame_14.dat b/admin/phpqrcode/cache/frame_14.dat new file mode 100644 index 0000000..e9ae093 Binary files /dev/null and b/admin/phpqrcode/cache/frame_14.dat differ diff --git a/admin/phpqrcode/cache/frame_14.png b/admin/phpqrcode/cache/frame_14.png new file mode 100644 index 0000000..efc36c0 Binary files /dev/null and b/admin/phpqrcode/cache/frame_14.png differ diff --git a/admin/phpqrcode/cache/frame_15.dat b/admin/phpqrcode/cache/frame_15.dat new file mode 100644 index 0000000..1872781 Binary files /dev/null and b/admin/phpqrcode/cache/frame_15.dat differ diff --git a/admin/phpqrcode/cache/frame_15.png b/admin/phpqrcode/cache/frame_15.png new file mode 100644 index 0000000..a9f416c Binary files /dev/null and b/admin/phpqrcode/cache/frame_15.png differ diff --git a/admin/phpqrcode/cache/frame_16.dat b/admin/phpqrcode/cache/frame_16.dat new file mode 100644 index 0000000..60af678 --- /dev/null +++ b/admin/phpqrcode/cache/frame_16.dat @@ -0,0 +1 @@ +xA E]sIX;n6`qW6`%A/3!!g̡1N) E|;>6⸏97$c]kkw1[mC͜cR>E,hʼnp#xFyWVWG3+˓S}Ğ#G8b^c^cpc&3YQ"vk9܇} ĿQL/ \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_16.png b/admin/phpqrcode/cache/frame_16.png new file mode 100644 index 0000000..6ac8fe8 Binary files /dev/null and b/admin/phpqrcode/cache/frame_16.png differ diff --git a/admin/phpqrcode/cache/frame_17.dat b/admin/phpqrcode/cache/frame_17.dat new file mode 100644 index 0000000..87f0cf5 Binary files /dev/null and b/admin/phpqrcode/cache/frame_17.dat differ diff --git a/admin/phpqrcode/cache/frame_17.png b/admin/phpqrcode/cache/frame_17.png new file mode 100644 index 0000000..5b929ac Binary files /dev/null and b/admin/phpqrcode/cache/frame_17.png differ diff --git a/admin/phpqrcode/cache/frame_18.dat b/admin/phpqrcode/cache/frame_18.dat new file mode 100644 index 0000000..bb7138c --- /dev/null +++ b/admin/phpqrcode/cache/frame_18.dat @@ -0,0 +1,2 @@ +xA +0E]օ,2;s&͚hO1&09OIv@DD &ىKXFv<dq9<%h Ys !(ds;~||b(Yůg#`KSĶsidߍLg:әt/gmkM3{4rTQes><әt3;H#љt3Y+oghٽlnF>i^#awm;g~pgNs{6zp' \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_18.png b/admin/phpqrcode/cache/frame_18.png new file mode 100644 index 0000000..ee0d6a3 Binary files /dev/null and b/admin/phpqrcode/cache/frame_18.png differ diff --git a/admin/phpqrcode/cache/frame_19.dat b/admin/phpqrcode/cache/frame_19.dat new file mode 100644 index 0000000..95e26ad --- /dev/null +++ b/admin/phpqrcode/cache/frame_19.dat @@ -0,0 +1,3 @@ +xA + E.No7ћiiRN2W%x@ڜ' +u6.*S;}àT zrt%,};)ZLP$qgLdJ;w.]z#[͝Og" B}};w#1Gb;w_C+w@Dfu2N9R7|pWkk \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_19.png b/admin/phpqrcode/cache/frame_19.png new file mode 100644 index 0000000..20fddd8 Binary files /dev/null and b/admin/phpqrcode/cache/frame_19.png differ diff --git a/admin/phpqrcode/cache/frame_2.dat b/admin/phpqrcode/cache/frame_2.dat new file mode 100644 index 0000000..7e42f31 --- /dev/null +++ b/admin/phpqrcode/cache/frame_2.dat @@ -0,0 +1 @@ +x͒ F{v& &Y+?Z1S'y!a815&۴HٞclF1#6 f6O7C֏8gIfB\DԻ( \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_2.png b/admin/phpqrcode/cache/frame_2.png new file mode 100644 index 0000000..9c150eb Binary files /dev/null and b/admin/phpqrcode/cache/frame_2.png differ diff --git a/admin/phpqrcode/cache/frame_20.dat b/admin/phpqrcode/cache/frame_20.dat new file mode 100644 index 0000000..d5ecc1d Binary files /dev/null and b/admin/phpqrcode/cache/frame_20.dat differ diff --git a/admin/phpqrcode/cache/frame_20.png b/admin/phpqrcode/cache/frame_20.png new file mode 100644 index 0000000..23a061d Binary files /dev/null and b/admin/phpqrcode/cache/frame_20.png differ diff --git a/admin/phpqrcode/cache/frame_21.dat b/admin/phpqrcode/cache/frame_21.dat new file mode 100644 index 0000000..1974dd9 --- /dev/null +++ b/admin/phpqrcode/cache/frame_21.dat @@ -0,0 +1 @@ +xA E]sIX;n6Upв]٘< i-eW)ŕ…H\jvqHL\6ЅrILܹ%@Vv(P4|Xngɝ~]Du1Us S\,2N?DKF-:eJ]p_,a0` X` w,` X]5 Y4{2vJs9)u۹,]^_7$_ \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_21.png b/admin/phpqrcode/cache/frame_21.png new file mode 100644 index 0000000..291598c Binary files /dev/null and b/admin/phpqrcode/cache/frame_21.png differ diff --git a/admin/phpqrcode/cache/frame_22.dat b/admin/phpqrcode/cache/frame_22.dat new file mode 100644 index 0000000..0f01802 --- /dev/null +++ b/admin/phpqrcode/cache/frame_22.dat @@ -0,0 +1,3 @@ +xA +0 E]{.]{{{ZBepwe@VERZ3"*2o4y)i#dbdF҅I"4WIu45x.ZS{8k={o.q[:帒qy +)t#N8dCj-OOG}:/:sz!)^IO- 7p 7$}>ɷ7p tssrs Vmҹ}R~7&?7ԦIbh{<Mi- \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_23.png b/admin/phpqrcode/cache/frame_23.png new file mode 100644 index 0000000..b8f16ae Binary files /dev/null and b/admin/phpqrcode/cache/frame_23.png differ diff --git a/admin/phpqrcode/cache/frame_24.dat b/admin/phpqrcode/cache/frame_24.dat new file mode 100644 index 0000000..7b92e29 --- /dev/null +++ b/admin/phpqrcode/cache/frame_24.dat @@ -0,0 +1 @@ +xA EMX0;nVP4HSSxU3/O LiJ4V JC%6VR&DBHjDJ??BlcDZ'UXUޏ0ywįj똳3ścj{:GqGNv;笓J <]#8#8H'GqGtr:9#8#8ؓhNt_>teS^\gQe?vuo;>*wlm \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_24.png b/admin/phpqrcode/cache/frame_24.png new file mode 100644 index 0000000..397c64f Binary files /dev/null and b/admin/phpqrcode/cache/frame_24.png differ diff --git a/admin/phpqrcode/cache/frame_25.dat b/admin/phpqrcode/cache/frame_25.dat new file mode 100644 index 0000000..ba12518 --- /dev/null +++ b/admin/phpqrcode/cache/frame_25.dat @@ -0,0 +1,3 @@ +xA + s낋]rxY51mMBG +*Sx|Ua5ƵZ-,1HPRjX5iG>WR/+uT廯 ӯ嗴u[Sa[kv5+5nJ%+VXbŊ߬u'SRtzZ++VXbŊٟٟٟ+VXb}Ŋ+VXVI+kq[toVZvoNVw}{r<ýR"R] Wr} \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_25.png b/admin/phpqrcode/cache/frame_25.png new file mode 100644 index 0000000..25bc445 Binary files /dev/null and b/admin/phpqrcode/cache/frame_25.png differ diff --git a/admin/phpqrcode/cache/frame_26.dat b/admin/phpqrcode/cache/frame_26.dat new file mode 100644 index 0000000..d34a73f --- /dev/null +++ b/admin/phpqrcode/cache/frame_26.dat @@ -0,0 +1,2 @@ +xA + Eօ,t77ћU E)i7*~cXEBFC6:&L,Mv.KgոYM>>mۚ?vmg?ұηdCUIkE\Msfafa>[sӈ9쬩ެ8b]LgEo w1 \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_26.png b/admin/phpqrcode/cache/frame_26.png new file mode 100644 index 0000000..f4a6b39 Binary files /dev/null and b/admin/phpqrcode/cache/frame_26.png differ diff --git a/admin/phpqrcode/cache/frame_27.dat b/admin/phpqrcode/cache/frame_27.dat new file mode 100644 index 0000000..b4d9ffd Binary files /dev/null and b/admin/phpqrcode/cache/frame_27.dat differ diff --git a/admin/phpqrcode/cache/frame_27.png b/admin/phpqrcode/cache/frame_27.png new file mode 100644 index 0000000..8419ec2 Binary files /dev/null and b/admin/phpqrcode/cache/frame_27.png differ diff --git a/admin/phpqrcode/cache/frame_28.dat b/admin/phpqrcode/cache/frame_28.dat new file mode 100644 index 0000000..8cbaa19 Binary files /dev/null and b/admin/phpqrcode/cache/frame_28.dat differ diff --git a/admin/phpqrcode/cache/frame_28.png b/admin/phpqrcode/cache/frame_28.png new file mode 100644 index 0000000..7609d8e Binary files /dev/null and b/admin/phpqrcode/cache/frame_28.png differ diff --git a/admin/phpqrcode/cache/frame_29.dat b/admin/phpqrcode/cache/frame_29.dat new file mode 100644 index 0000000..5e4a711 --- /dev/null +++ b/admin/phpqrcode/cache/frame_29.dat @@ -0,0 +1,2 @@ +xA a޺ @n7+*4!?J 抮]STf)sI"Ȕb0|"Luٸ,E1\6*uQ?>aυR-rn.ꯋ\T:*)|) , ,x_}:^RUoɢu~މX`XЏЏЏЏ_`X`XЏЏЏ_`X`XЏЏЏЏwbX`PU)D"c{z3<}^?bm잃a.] +{Q6uT,9 \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_29.png b/admin/phpqrcode/cache/frame_29.png new file mode 100644 index 0000000..ffe072c Binary files /dev/null and b/admin/phpqrcode/cache/frame_29.png differ diff --git a/admin/phpqrcode/cache/frame_3.dat b/admin/phpqrcode/cache/frame_3.dat new file mode 100644 index 0000000..188d531 --- /dev/null +++ b/admin/phpqrcode/cache/frame_3.dat @@ -0,0 +1 @@ +x E{v& &Y+bk'ya:TXl޶$W+ӏv9}gR@H0YPBEm?s"bt2cn:ﺭ;YzQ7 \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_3.png b/admin/phpqrcode/cache/frame_3.png new file mode 100644 index 0000000..945ee7c Binary files /dev/null and b/admin/phpqrcode/cache/frame_3.png differ diff --git a/admin/phpqrcode/cache/frame_30.dat b/admin/phpqrcode/cache/frame_30.dat new file mode 100644 index 0000000..44cf3d3 Binary files /dev/null and b/admin/phpqrcode/cache/frame_30.dat differ diff --git a/admin/phpqrcode/cache/frame_30.png b/admin/phpqrcode/cache/frame_30.png new file mode 100644 index 0000000..75dbddd Binary files /dev/null and b/admin/phpqrcode/cache/frame_30.png differ diff --git a/admin/phpqrcode/cache/frame_31.dat b/admin/phpqrcode/cache/frame_31.dat new file mode 100644 index 0000000..ce429d0 --- /dev/null +++ b/admin/phpqrcode/cache/frame_31.dat @@ -0,0 +1 @@ +xA a޺ &r4yķ!mV3Iv!Ҝ2i\NSS4EF2+65e/Ws]!?p=S~Đ?+x6r6y}ǴeR1-WllҌXz/>V櫷:ñA8-+mTbllltM&]ll&]Ill&]y 6` 6`iuyXWi\tz>.zk t77wJϔ4w҈85 \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_31.png b/admin/phpqrcode/cache/frame_31.png new file mode 100644 index 0000000..b14d1fa Binary files /dev/null and b/admin/phpqrcode/cache/frame_31.png differ diff --git a/admin/phpqrcode/cache/frame_32.dat b/admin/phpqrcode/cache/frame_32.dat new file mode 100644 index 0000000..aaa0808 --- /dev/null +++ b/admin/phpqrcode/cache/frame_32.dat @@ -0,0 +1,2 @@ +x + ־. Dl, Mz6Ç gcJD;'.AIqމI,IrYFk%DOy|EDD(L_Y>*ߚ?aOkL_<[c>c˘uLI%#0#0#otѢ}4fv_)Eph5R881#0#0itZ#0#0#0itZ#0#0#0itZl0#09q"HܜHQ"L5}-Y׾k`>z鸳4&p!!`:5 \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_32.png b/admin/phpqrcode/cache/frame_32.png new file mode 100644 index 0000000..58d42db Binary files /dev/null and b/admin/phpqrcode/cache/frame_32.png differ diff --git a/admin/phpqrcode/cache/frame_33.dat b/admin/phpqrcode/cache/frame_33.dat new file mode 100644 index 0000000..a261375 --- /dev/null +++ b/admin/phpqrcode/cache/frame_33.dat @@ -0,0 +1,14 @@ +xA a޺@n7+*L++柮bb*LCc kHrjJ5Yi~0_TT}e>5b_w͟?\Rai+7W\wLUNL ++ ++jOkc\˩|%o} 8 ++ ++ ++ 3g ++ ++ ++3g@ ++ ++ ++:RXB9I=ko/Swؘٯ`gr_ٙYVSYzIefnmQoz > \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_33.png b/admin/phpqrcode/cache/frame_33.png new file mode 100644 index 0000000..924c728 Binary files /dev/null and b/admin/phpqrcode/cache/frame_33.png differ diff --git a/admin/phpqrcode/cache/frame_34.dat b/admin/phpqrcode/cache/frame_34.dat new file mode 100644 index 0000000..7ceb025 Binary files /dev/null and b/admin/phpqrcode/cache/frame_34.dat differ diff --git a/admin/phpqrcode/cache/frame_34.png b/admin/phpqrcode/cache/frame_34.png new file mode 100644 index 0000000..a477042 Binary files /dev/null and b/admin/phpqrcode/cache/frame_34.png differ diff --git a/admin/phpqrcode/cache/frame_35.dat b/admin/phpqrcode/cache/frame_35.dat new file mode 100644 index 0000000..56bc3e2 Binary files /dev/null and b/admin/phpqrcode/cache/frame_35.dat differ diff --git a/admin/phpqrcode/cache/frame_35.png b/admin/phpqrcode/cache/frame_35.png new file mode 100644 index 0000000..d29806c Binary files /dev/null and b/admin/phpqrcode/cache/frame_35.png differ diff --git a/admin/phpqrcode/cache/frame_36.dat b/admin/phpqrcode/cache/frame_36.dat new file mode 100644 index 0000000..282c60d Binary files /dev/null and b/admin/phpqrcode/cache/frame_36.dat differ diff --git a/admin/phpqrcode/cache/frame_36.png b/admin/phpqrcode/cache/frame_36.png new file mode 100644 index 0000000..96ecb42 Binary files /dev/null and b/admin/phpqrcode/cache/frame_36.png differ diff --git a/admin/phpqrcode/cache/frame_37.dat b/admin/phpqrcode/cache/frame_37.dat new file mode 100644 index 0000000..015c0f2 Binary files /dev/null and b/admin/phpqrcode/cache/frame_37.dat differ diff --git a/admin/phpqrcode/cache/frame_37.png b/admin/phpqrcode/cache/frame_37.png new file mode 100644 index 0000000..fcc5162 Binary files /dev/null and b/admin/phpqrcode/cache/frame_37.png differ diff --git a/admin/phpqrcode/cache/frame_38.dat b/admin/phpqrcode/cache/frame_38.dat new file mode 100644 index 0000000..71cf53e --- /dev/null +++ b/admin/phpqrcode/cache/frame_38.dat @@ -0,0 +1 @@ +xA0ЎuA2;Нk(gytp9$D\e^'t-aIFMSkIŤ:7|LkN8N7i}i,[WgӴ?31iN}}=OM:4)SL2eʔ)SL#$ JJM:}]L٧SQL2eʔ)SL2աPt(:)SL2eʔ)S:ECq2eʔ)SL2eʔECѡ8O2eʔ)SL2eTCѡPL2eʔ)SL2ݓsJCIKԂi93n_ +Ri4\g;% }an \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_38.png b/admin/phpqrcode/cache/frame_38.png new file mode 100644 index 0000000..89238f3 Binary files /dev/null and b/admin/phpqrcode/cache/frame_38.png differ diff --git a/admin/phpqrcode/cache/frame_39.dat b/admin/phpqrcode/cache/frame_39.dat new file mode 100644 index 0000000..53511f7 Binary files /dev/null and b/admin/phpqrcode/cache/frame_39.dat differ diff --git a/admin/phpqrcode/cache/frame_39.png b/admin/phpqrcode/cache/frame_39.png new file mode 100644 index 0000000..1dc9cd1 Binary files /dev/null and b/admin/phpqrcode/cache/frame_39.png differ diff --git a/admin/phpqrcode/cache/frame_4.dat b/admin/phpqrcode/cache/frame_4.dat new file mode 100644 index 0000000..67b30e8 --- /dev/null +++ b/admin/phpqrcode/cache/frame_4.dat @@ -0,0 +1 @@ +x E=u pجQCOM'ˏ$ @3eF\FNXRyؾC{a8R Ńa2@qkH1(`cj~0ܨعnXGĀ \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_4.png b/admin/phpqrcode/cache/frame_4.png new file mode 100644 index 0000000..b72f9e7 Binary files /dev/null and b/admin/phpqrcode/cache/frame_4.png differ diff --git a/admin/phpqrcode/cache/frame_40.dat b/admin/phpqrcode/cache/frame_40.dat new file mode 100644 index 0000000..90d36dd --- /dev/null +++ b/admin/phpqrcode/cache/frame_40.dat @@ -0,0 +1,2 @@ +xA@Ь@o7`Qfe䕫PA><]߳bZn^AQ}[9^]ynajM܇K̘1cƌ3f̘1{W5}{7lMޚxI<Kαyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘1ۻٻ={αyl3f̘1cƌ3f̘SʑӒ7HK޼g\u_r'4[-]qL8ƝY1q!/(% \ No newline at end of file diff --git a/admin/phpqrcode/cache/frame_40.png b/admin/phpqrcode/cache/frame_40.png new file mode 100644 index 0000000..8034d86 Binary files /dev/null and b/admin/phpqrcode/cache/frame_40.png differ diff --git a/admin/phpqrcode/cache/frame_5.dat b/admin/phpqrcode/cache/frame_5.dat new file mode 100644 index 0000000..d5dafe1 --- /dev/null +++ b/admin/phpqrcode/cache/frame_5.dat @@ -0,0 +1 @@ +x1 Eu7ЛZ|ND B0@R$l,->VKZ[I9+Es=ϤL1̄[FZU4?i<;7;P#W-[ݯ6ddddddc",;"sk摑Q&erw######L.摑Иy1^˲\3 v \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_117_0.dat b/admin/phpqrcode/cache/mask_0/mask_117_0.dat new file mode 100644 index 0000000..781c7f8 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_117_0.dat @@ -0,0 +1,2 @@ +xA +0 }OrR,#3,o5Cq:;;wvNJZG=m} ѱ2iRkj_YYYYYYYYe_/WVVVVVVkd-Ϻ,#OZc]|{ž$ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_121_0.dat b/admin/phpqrcode/cache/mask_0/mask_121_0.dat new file mode 100644 index 0000000..68810c3 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_121_0.dat @@ -0,0 +1 @@ +x1 О/w YMS8>2SFOEcW\ۼ{cpKGBКmxhfffffff/s22W|*d1*5̬RWas\xm~8߮r0wjsdm&y \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_125_0.dat b/admin/phpqrcode/cache/mask_0/mask_125_0.dat new file mode 100644 index 0000000..2c73ef1 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_125_0.dat @@ -0,0 +1,2 @@ +xA + н_TH`3AOL4 k(ewGW. #2} \Ygggggggggg_d>j^s;;;;;;;;;;'q;;;;;;;;;'˰qu_PYw{e=dG/ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_129_0.dat b/admin/phpqrcode/cache/mask_0/mask_129_0.dat new file mode 100644 index 0000000..812ee8a --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_129_0.dat @@ -0,0 +1,2 @@ +x1 + /*DE'hgt-}_pV \"b=s[J=8Dho۞' 0X ۴e0`  j" 0`Wf`^P0`2Ȁ  d07(Y/XLGby"pT \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_137_0.dat b/admin/phpqrcode/cache/mask_0/mask_137_0.dat new file mode 100644 index 0000000..f6d993b --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_137_0.dat @@ -0,0 +1 @@ +x1 О/+FZ?J L7Ժ*Ba%L~˻ʓCJYIWJ .K]R0a„ $INTwlLaL0a„ &Ld@PO0a„ &L0e@P?a„ &L0aDe@ &L0aMIlL&)dlgacR<$v,ɺ?U2] \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_141_0.dat b/admin/phpqrcode/cache/mask_0/mask_141_0.dat new file mode 100644 index 0000000..8c685c8 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_141_0.dat @@ -0,0 +1,2 @@ +x= +0 нi9'EDx͘%I9+E{$m^&uS"D6ڟ]98UMbҾY[2拉Ĉ#F1bĈ%iRN潝ѳ#;#F1bĈN1i#F1bĈ#FtZ}Nk1bĈ#F1bktZ;#F1bFV-u"IoD-*7uj>bMV+ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_149_0.dat b/admin/phpqrcode/cache/mask_0/mask_149_0.dat new file mode 100644 index 0000000..d258350 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_149_0.dat @@ -0,0 +1,3 @@ +xA + н_MEQXP৞.|94e{JLv#^n[ ?; +ZIV-*w˒1*+VXbŊXgwqX}JRYbŊ+VXbeΠwfeΠ^bŊ+VXbʜAʜAbŊ+VXbŊ9ٜAbŊ+VXbŊl0*0Tj`?Ϊ;X=zZr* \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_153_0.dat b/admin/phpqrcode/cache/mask_0/mask_153_0.dat new file mode 100644 index 0000000..fc79e9e --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_153_0.dat @@ -0,0 +1 @@ +x1 Н/礑h&F`Ҽ@I;PZ^X͌mf.=5 [if-R+!wr˜g\j̘1cƌ3f̘1cfo.2?1z `ƌ3f̘1cƌzƌ3f̘1cƌ3fztf3f̘1cƌ3f̘kk030cƌ3f̘1c9;Ď`vf͚̆ZϘW9 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_157_0.dat b/admin/phpqrcode/cache/mask_0/mask_157_0.dat new file mode 100644 index 0000000..ad749f3 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_157_0.dat @@ -0,0 +1,2 @@ +xA + н_QRY k*q͵=j7~nN.p%ڵsi.رcǎ;vر{.-W2={mgy+رcǎ;vɳ2;yּcǎ;vرcNɳ;vرcǎ;v2I9+DyI4ˠ5:Wvdqߜܴ<d2x%[U%2]&K,Ydɒ%ˡ,S՗r2yd=,k_{Xdɒ%K,Yd)0m,Ydɒ%K,Yd)0m,Ydɒ%K,Yme,e%K,Ydɒ%K,eq Ò%K,Ydɒe:I9EQ=Ls I{ZtR}Sn:|R[?_*SL2eʔ)SL&ϦI O2O2eʔ)SL2e*C1PPSL2eʔ)SLP22)SL2eʔ)SLe(}2)SL2eʔ)SLe(}2)SL2eʔ)Sic7;"ޙFͦސٙvL ^2}oO'r \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_173_0.dat b/admin/phpqrcode/cache/mask_0/mask_173_0.dat new file mode 100644 index 0000000..5ef85e7 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_173_0.dat @@ -0,0 +1 @@ +x10ޯT [4v2ƽok݇;Ӳ]f֞dljlG0n+߻mG˖-[lٲe"Y}oV[lٲe˖-[lٲeհՃ[2lٲe˖-[lٲeհՃ[2lٲe˖-[lٲeհՃ[lٲe˖-[lٲeValٲe˖-[lٲef[BmаE;N-ۜT/rl?* \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_177_0.dat b/admin/phpqrcode/cache/mask_0/mask_177_0.dat new file mode 100644 index 0000000..78a26a7 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_177_0.dat @@ -0,0 +1,2 @@ +x1 +0>I9+?߁iև d̹xֈxN/է|{ظ8d0h=cFf̘1cƌ3f̘qq=w6;l4cƕ<nj3f̘1cƌ3fXһ1ֻcƌ3f̘1cƌ3fXbwnj3f̘1cƌ3f̘M'X&1cƌ3f̘1cƌ3ֻnn1cƌ3f̘1cƌÍ3U< \7+(<OƌΊnj4@ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_21_0.dat b/admin/phpqrcode/cache/mask_0/mask_21_0.dat new file mode 100644 index 0000000..368c994 Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_21_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_25_0.dat b/admin/phpqrcode/cache/mask_0/mask_25_0.dat new file mode 100644 index 0000000..e4a5b6d Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_25_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_29_0.dat b/admin/phpqrcode/cache/mask_0/mask_29_0.dat new file mode 100644 index 0000000..74a216b Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_29_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_33_0.dat b/admin/phpqrcode/cache/mask_0/mask_33_0.dat new file mode 100644 index 0000000..2ec712a Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_33_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_37_0.dat b/admin/phpqrcode/cache/mask_0/mask_37_0.dat new file mode 100644 index 0000000..1588cfc Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_37_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_41_0.dat b/admin/phpqrcode/cache/mask_0/mask_41_0.dat new file mode 100644 index 0000000..e369027 Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_41_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_45_0.dat b/admin/phpqrcode/cache/mask_0/mask_45_0.dat new file mode 100644 index 0000000..452f126 Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_45_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_49_0.dat b/admin/phpqrcode/cache/mask_0/mask_49_0.dat new file mode 100644 index 0000000..fdd2aac --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_49_0.dat @@ -0,0 +1,2 @@ +xK E9o#?H/6g$-,X] +xݘ; X԰9<Ѻq2AfH7/5We{#fި?4=N > \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_53_0.dat b/admin/phpqrcode/cache/mask_0/mask_53_0.dat new file mode 100644 index 0000000..572d279 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_53_0.dat @@ -0,0 +1,2 @@ +xK +@!йoQϺ:(m&s-6Z{m4YX.F٭XZij=:έ֋b忑VH 8 #[Y^Xe \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_57_0.dat b/admin/phpqrcode/cache/mask_0/mask_57_0.dat new file mode 100644 index 0000000..ea81e6d --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_57_0.dat @@ -0,0 +1,4 @@ +xA + {^s=YL՚ ( +ouj)  +Z7yv,ԴwVQ iGiҤDfەwo4ѤoLLȼ}4 h \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_61_0.dat b/admin/phpqrcode/cache/mask_0/mask_61_0.dat new file mode 100644 index 0000000..93d2444 Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_61_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_65_0.dat b/admin/phpqrcode/cache/mask_0/mask_65_0.dat new file mode 100644 index 0000000..df29d7b Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_65_0.dat differ diff --git a/admin/phpqrcode/cache/mask_0/mask_69_0.dat b/admin/phpqrcode/cache/mask_0/mask_69_0.dat new file mode 100644 index 0000000..8a2cfbd --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_69_0.dat @@ -0,0 +1 @@ +xK =_+mBd|Q"s+1"),=Ea T"ŐnE-3 ,KYw=ZZT .,K1#֞!Ŋ+V嬪.2XbŊ+VX.kBzwձ̀gkYZ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_89_0.dat b/admin/phpqrcode/cache/mask_0/mask_89_0.dat new file mode 100644 index 0000000..aaa4c52 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_89_0.dat @@ -0,0 +1 @@ +x1 ὧi9'Hl?L^"&M?bq?˸,9!z]VScƌ3_c!`n3f̘1č 3f̘1/f>.Uc˻; 2;Y+7 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_93_0.dat b/admin/phpqrcode/cache/mask_0/mask_93_0.dat new file mode 100644 index 0000000..e218fa0 --- /dev/null +++ b/admin/phpqrcode/cache/mask_0/mask_93_0.dat @@ -0,0 +1,3 @@ +xK + EyV,OmޠrPH0{2bc{tQ] +{Q{{弬֒ǎ;v_ڳ}L}l߱cǎ;v̑̑̑رcǎ.Legw3qeѾ@i \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_0/mask_97_0.dat b/admin/phpqrcode/cache/mask_0/mask_97_0.dat new file mode 100644 index 0000000..74ac719 Binary files /dev/null and b/admin/phpqrcode/cache/mask_0/mask_97_0.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_101_1.dat b/admin/phpqrcode/cache/mask_1/mask_101_1.dat new file mode 100644 index 0000000..ec939b5 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_101_1.dat @@ -0,0 +1,2 @@ +x1 + н\QEd  1N<#Ֆ-7u.lԦeiXXXXXRZVVeIo1,,,,,v%?gaaaaY K&K=/+ۍ˱ގ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_105_1.dat b/admin/phpqrcode/cache/mask_1/mask_105_1.dat new file mode 100644 index 0000000..e1f5c99 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_105_1.dat @@ -0,0 +1 @@ +x1 Ӕ_Υb KB?"*#WʘtgӎJqUM9TLLvǤLLLLLLzgG01111yiߘ4m=՛n+2 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_109_1.dat b/admin/phpqrcode/cache/mask_1/mask_109_1.dat new file mode 100644 index 0000000..7e0d6d1 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_109_1.dat @@ -0,0 +1 @@ +xֱ >ӘK}:!iY'*3]fsmb[JƶŖK9}cccccc'u.6Ʀs6666R[^g{/lٷ 7͂ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_113_1.dat b/admin/phpqrcode/cache/mask_1/mask_113_1.dat new file mode 100644 index 0000000..1dd666d --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_113_1.dat @@ -0,0 +1 @@ +x1  -8fL(pBlDM9";-;?1p{\%-3:@ad4*Nadddddd########c]751xYu \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_117_1.dat b/admin/phpqrcode/cache/mask_1/mask_117_1.dat new file mode 100644 index 0000000..8921f64 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_117_1.dat @@ -0,0 +1,2 @@ +xֻ >ӘK$^ 8YQSV'z8jzʇ^]סekXYYYYYYYjݵ# ++yeeeeeeee#WVVVVVVVV;"+yeeeeeeel'e;b&^9{/J$p \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_121_1.dat b/admin/phpqrcode/cache/mask_1/mask_121_1.dat new file mode 100644 index 0000000..64bd8ba --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_121_1.dat @@ -0,0 +1,2 @@ +x1 + н\CPbїE$DdƩYtڅλ0$ήꝝga7yٯ痽Y??{{D \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_129_1.dat b/admin/phpqrcode/cache/mask_1/mask_129_1.dat new file mode 100644 index 0000000..62cd1c9 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_129_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_133_1.dat b/admin/phpqrcode/cache/mask_1/mask_133_1.dat new file mode 100644 index 0000000..18d68dc --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_133_1.dat @@ -0,0 +1 @@ +x1 Ӕ_΅hh|"zۉ-*dNHQĢR ,X`c9Y(na_` ,X,X,X` #:8  ,X`Bd¾` ,X|ϢY\X; 7-; ` \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_137_1.dat b/admin/phpqrcode/cache/mask_1/mask_137_1.dat new file mode 100644 index 0000000..284d7be --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_137_1.dat @@ -0,0 +1,3 @@ +x1 +0 ӤKh]D,-t #ڌQ[T Ks7_?9|B&X^L0a„&3„M&L0a„ &2D4c0a„ &LȀЌe„ &L0abwȀf,&L0a„7&y2anoL<01O + \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_141_1.dat b/admin/phpqrcode/cache/mask_1/mask_141_1.dat new file mode 100644 index 0000000..83220dd --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_141_1.dat @@ -0,0 +1,2 @@ +x1 + >946)3$`s uʮ>Wd )g'M{3\d6ubذaÆ 6lؼn]Nذ9FްaÆ 6lذa3a#oذaÆ 6lذذ5e16lذaÆ ]Sbk6lذaÆ mͤ;CcfIdsG \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_145_1.dat b/admin/phpqrcode/cache/mask_1/mask_145_1.dat new file mode 100644 index 0000000..6a9950f --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_145_1.dat @@ -0,0 +1 @@ +x!0@k 4a)q2i.YCUO{35UZFn]fN>bdwtzJF}F1bĈ#F(F6r1bĈ#F1E1ilF1bĈ#FtF#F1bĈ#FtZ}##F1bĈleHGܣ@ٝ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_149_1.dat b/admin/phpqrcode/cache/mask_1/mask_149_1.dat new file mode 100644 index 0000000..02a3cdc --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_149_1.dat @@ -0,0 +1 @@ +x1 Ӕ_΅qH_Xci#Gd̘Ք՛gLU^ݮVR>dKVXbŊ+VXeoXJ_bŊ+VXb;ݙ+}Ŋ+VXbŊ+VAVngŊ+VXbŊ}+ +VXbŊVj>hewf*`uTq \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_153_1.dat b/admin/phpqrcode/cache/mask_1/mask_153_1.dat new file mode 100644 index 0000000..2abfca2 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_153_1.dat @@ -0,0 +1,2 @@ +x1 +0\9btEc'HH9efߞmffM#.̘1cƌ3f̘1cf73f̘g̘1cƌ3f̘1co2c]?3f̘1cƌ3f5Mf3f̘1cƌ3f̘17utf3f̘1cƌ3f̘=lj3>V \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_157_1.dat b/admin/phpqrcode/cache/mask_1/mask_157_1.dat new file mode 100644 index 0000000..17344b8 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_157_1.dat @@ -0,0 +1,2 @@ +x1 + >94Sd/51V)SkJv7eGcǎ;vرc]Zٱc'رcǎ;vر+رg;vرcǎ;}V`N+رcǎ;v:;v;vرcǎ;;}Vޱcǎ;vص'vz#;]klwoA` \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_161_1.dat b/admin/phpqrcode/cache/mask_1/mask_161_1.dat new file mode 100644 index 0000000..669ade1 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_161_1.dat @@ -0,0 +1 @@ +x10_΅Xš yi~Qbkvp7'M u=]([ 2dȐ +\' 2 2dȐ!C 2s0/3d() 2dȐ!C 241dh 2dȐ!C 2dhcȐSL2eʔ)SL2M SLSL2eʔ)SL2M}LSSL2eʔ)SLeSy)SŔ)SL2eʔ)S;ٔ)S;)SL2eʔ)Sv()Sv()SL2eʔ)SLdT6}a*3mljmzC' \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_173_1.dat b/admin/phpqrcode/cache/mask_1/mask_173_1.dat new file mode 100644 index 0000000..436918c --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_173_1.dat @@ -0,0 +1 @@ +x1 Ӕ_Υ''@y]X1?"g:1犝fn˶˻mm.?lٲe˖-F>glٲ2lٲe˖-[lٲeO`˖e˖-[lٲe˖-[l lٲlٲe˖-[lٲeVO`˖e˖-[lٲe˖-[z0}[z0y˖-[lٲe˖-[Ee[hOVWö=t*| \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_177_1.dat b/admin/phpqrcode/cache/mask_1/mask_177_1.dat new file mode 100644 index 0000000..12e2e52 --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_177_1.dat @@ -0,0 +1 @@ +x1 Ep0X,a#r}6}nj~\8ƌ3f̘1cƌ7{3f,y3f̘1cƌ3fX_`X&3f̘1cƌ3f̘M_1cy̘1cƌ3f̘1cƌ+3f,y3f̘1cƌ3fX_bX&3f̘1cƌ3fx2dX'x[cy| 3 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_21_1.dat b/admin/phpqrcode/cache/mask_1/mask_21_1.dat new file mode 100644 index 0000000..f87e0a1 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_21_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_25_1.dat b/admin/phpqrcode/cache/mask_1/mask_25_1.dat new file mode 100644 index 0000000..3a225e3 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_25_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_29_1.dat b/admin/phpqrcode/cache/mask_1/mask_29_1.dat new file mode 100644 index 0000000..0a1cb3b Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_29_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_33_1.dat b/admin/phpqrcode/cache/mask_1/mask_33_1.dat new file mode 100644 index 0000000..318949d Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_33_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_37_1.dat b/admin/phpqrcode/cache/mask_1/mask_37_1.dat new file mode 100644 index 0000000..5bd9e3a Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_37_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_41_1.dat b/admin/phpqrcode/cache/mask_1/mask_41_1.dat new file mode 100644 index 0000000..52e9e58 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_41_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_45_1.dat b/admin/phpqrcode/cache/mask_1/mask_45_1.dat new file mode 100644 index 0000000..b35c567 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_45_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_49_1.dat b/admin/phpqrcode/cache/mask_1/mask_49_1.dat new file mode 100644 index 0000000..d20d717 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_49_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_53_1.dat b/admin/phpqrcode/cache/mask_1/mask_53_1.dat new file mode 100644 index 0000000..a676d7d Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_53_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_57_1.dat b/admin/phpqrcode/cache/mask_1/mask_57_1.dat new file mode 100644 index 0000000..896ed43 Binary files /dev/null and b/admin/phpqrcode/cache/mask_1/mask_57_1.dat differ diff --git a/admin/phpqrcode/cache/mask_1/mask_61_1.dat b/admin/phpqrcode/cache/mask_1/mask_61_1.dat new file mode 100644 index 0000000..4165a4b --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_61_1.dat @@ -0,0 +1 @@ +x30CbpPi`@&H^nadQG{n_.4Iy킎`)-5*(of[sm}6YM ;;;;;G{zطz1vw}=wuL%?"=~ei \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_1/mask_97_1.dat b/admin/phpqrcode/cache/mask_1/mask_97_1.dat new file mode 100644 index 0000000..24fa60f --- /dev/null +++ b/admin/phpqrcode/cache/mask_1/mask_97_1.dat @@ -0,0 +1,2 @@ +x1 +0н1\tncKD"H$DH$D"Q&WerH$D"*x[(?/'nd \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_117_2.dat b/admin/phpqrcode/cache/mask_2/mask_117_2.dat new file mode 100644 index 0000000..b4dcce4 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_117_2.dat @@ -0,0 +1,2 @@ +x1 + >94!m dOs\0X,la5#E>Z[ַRT*JR?Q-*T*JR?UW*JRTݟ+JRԤ~m5;S&+ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_121_2.dat b/admin/phpqrcode/cache/mask_2/mask_121_2.dat new file mode 100644 index 0000000..a2a0097 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_121_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_125_2.dat b/admin/phpqrcode/cache/mask_2/mask_125_2.dat new file mode 100644 index 0000000..0ea40fd --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_125_2.dat @@ -0,0 +1 @@ +x! PӔ_@ U(kp@^Mڮ5-:VF_\t:NtyNqt:NtG;Nt:.8:NtzA}yNq;+n& \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_129_2.dat b/admin/phpqrcode/cache/mask_2/mask_129_2.dat new file mode 100644 index 0000000..bf04839 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_129_2.dat @@ -0,0 +1,2 @@ +x1 +0н_KVڡ'.!w]A0X~  !࣠fK# xFy4 vey@^+  ~  L#veI \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_133_2.dat b/admin/phpqrcode/cache/mask_2/mask_133_2.dat new file mode 100644 index 0000000..9e78b6d --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_133_2.dat @@ -0,0 +1,10 @@ +x1 + н&`LQ-g=Aqbʪl fƄȚ44& )OȚYF4444444444c4~9S:3ЌטpǮ> \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_145_2.dat b/admin/phpqrcode/cache/mask_2/mask_145_2.dat new file mode 100644 index 0000000..9ff2bbf --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_145_2.dat @@ -0,0 +1,4 @@ +x1 + нr] +,tQ^&C~ +щj~mɾ.FgMDDDDDDDDDDDST׈DHdZL+ɴDDDDDDDDDDD2-'"""""""":BתEYDd \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_149_2.dat b/admin/phpqrcode/cache/mask_2/mask_149_2.dat new file mode 100644 index 0000000..d52e048 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_149_2.dat @@ -0,0 +1 @@ +x;@/gcaGBXB'-ˆouէUQdRVOmT*ǫ;;j廝Ee2PQQQQQQQQQQQ TTTTTTTTTTTTr33R &Tskz_e2P=d \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_153_2.dat b/admin/phpqrcode/cache/mask_2/mask_153_2.dat new file mode 100644 index 0000000..3b06041 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_153_2.dat @@ -0,0 +1,2 @@ +x1 +0 Ӥ8ZP!BZu賶"bu*)]MFFFFFFFFFFFF%= #ddddddddddddr ot2yFFFFFFFFFFFF& #k5L 2222222222(Y7"d@H \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_157_2.dat b/admin/phpqrcode/cache/mask_2/mask_157_2.dat new file mode 100644 index 0000000..2baf535 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_157_2.dat @@ -0,0 +1,3 @@ +x1 +0>s6MqUH1X&U̘f/u-'.[KGGGGGGGGGGH|NG(ttttttttttNF;::::::::::}Nz$ +>n A#^AG(t =3{ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_161_2.dat b/admin/phpqrcode/cache/mask_2/mask_161_2.dat new file mode 100644 index 0000000..d2df759 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_161_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_165_2.dat b/admin/phpqrcode/cache/mask_2/mask_165_2.dat new file mode 100644 index 0000000..2e6cd7c --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_165_2.dat @@ -0,0 +1,2 @@ +x1 +0 Ӥ?BVUG%*+_fs MIIIIIIIII2d;l4()))))))))))eqJنIDIIIIIIIIIII)۠mPRRRRRRRRRRR6l JJJJJJJJJJJJن}RaQRRRRRRRRRRNeK?R퐔͔&W3U \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_169_2.dat b/admin/phpqrcode/cache/mask_2/mask_169_2.dat new file mode 100644 index 0000000..4052062 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_169_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_173_2.dat b/admin/phpqrcode/cache/mask_2/mask_173_2.dat new file mode 100644 index 0000000..0a30ba5 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_173_2.dat @@ -0,0 +1 @@ +x+@ Pift:>y &d U߬S[]5Z;a5V۞A[Z˴VՃI0ZZZZZZZZZZZZZZ=-Lhi`VFK?ݧhioJ0}o \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_177_2.dat b/admin/phpqrcode/cache/mask_2/mask_177_2.dat new file mode 100644 index 0000000..d2c52f9 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_177_2.dat @@ -0,0 +1,2 @@ +x1 + E>Y4V$~ ,C&U;Ook5bϙGx9%&&&&&&&&&&&n$OL|v#&&&&&&&&&&&&&bbݍXw#&l7bbbbbbbbbbbbbbM"l7bbbbbbbbbbbbbbMa!&݈3)U*F> \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_45_2.dat b/admin/phpqrcode/cache/mask_2/mask_45_2.dat new file mode 100644 index 0000000..ad44ff1 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_45_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_49_2.dat b/admin/phpqrcode/cache/mask_2/mask_49_2.dat new file mode 100644 index 0000000..6e8edff Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_49_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_53_2.dat b/admin/phpqrcode/cache/mask_2/mask_53_2.dat new file mode 100644 index 0000000..682cae2 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_53_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_57_2.dat b/admin/phpqrcode/cache/mask_2/mask_57_2.dat new file mode 100644 index 0000000..66a5c05 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_57_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_61_2.dat b/admin/phpqrcode/cache/mask_2/mask_61_2.dat new file mode 100644 index 0000000..77d3815 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_61_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_65_2.dat b/admin/phpqrcode/cache/mask_2/mask_65_2.dat new file mode 100644 index 0000000..caf184a Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_65_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_69_2.dat b/admin/phpqrcode/cache/mask_2/mask_69_2.dat new file mode 100644 index 0000000..6a3801b Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_69_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_73_2.dat b/admin/phpqrcode/cache/mask_2/mask_73_2.dat new file mode 100644 index 0000000..74945b7 Binary files /dev/null and b/admin/phpqrcode/cache/mask_2/mask_73_2.dat differ diff --git a/admin/phpqrcode/cache/mask_2/mask_77_2.dat b/admin/phpqrcode/cache/mask_2/mask_77_2.dat new file mode 100644 index 0000000..903cba4 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_77_2.dat @@ -0,0 +1 @@ +x1 н_CM>Gt ѫe+FWZEm&gއFѶhF+t/FYvFj[*7a \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_81_2.dat b/admin/phpqrcode/cache/mask_2/mask_81_2.dat new file mode 100644 index 0000000..17a9ac2 --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_81_2.dat @@ -0,0 +1,2 @@ +x1 +0н_KҩVi!O\"A]:xbW1uȦ&_T ΋6H$U^D~bׯb=gX \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_85_2.dat b/admin/phpqrcode/cache/mask_2/mask_85_2.dat new file mode 100644 index 0000000..72c74ff --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_85_2.dat @@ -0,0 +1,2 @@ +x1 +0=1\B7O$A0$8Wwjguu槊RT*uS֧JRTJRRޢN浘V \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_2/mask_89_2.dat b/admin/phpqrcode/cache/mask_2/mask_89_2.dat new file mode 100644 index 0000000..06c9a4f --- /dev/null +++ b/admin/phpqrcode/cache/mask_2/mask_89_2.dat @@ -0,0 +1 @@ +xٱ 0 >/&E*cQqŃ zf$rM)_%s_d3KO1^aL,$H"$KzRPt[I&X9$H"$I$ysI$DI$ɓI$I$Dɍ%es!=LAZ5'̓IVrn/2oƅ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_113_3.dat b/admin/phpqrcode/cache/mask_3/mask_113_3.dat new file mode 100644 index 0000000..023b273 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_113_3.dat @@ -0,0 +1,2 @@ +xA +0 D}NrnDFj2KCt?WݲZi.qoP %Smj7ަ:*N:@:***fW9d2*j*}S@`*j৪6Jlѿ}}էTUa24hnt \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_117_3.dat b/admin/phpqrcode/cache/mask_3/mask_117_3.dat new file mode 100644 index 0000000..79cc04d --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_117_3.dat @@ -0,0 +1,4 @@ +x1 +0 ]Q.xIB$?~!z#E)RHZ@bl-)ݿ<ߧ*OUR"5&5*ie J]+ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_145_3.dat b/admin/phpqrcode/cache/mask_3/mask_145_3.dat new file mode 100644 index 0000000..338b7e7 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_145_3.dat @@ -0,0 +1,3 @@ +x +@|:^ Jy̡yMj-' +9VS֦K9e)PyUwe-m jԨQF5jԨRi٫F4_wk}0+jRBRF5jԨQeOMBJHjԨQF5jwP״˪IH I5jԨQFͳc w5jԨQF:zS*2UZ_C*e_OZ%dIȯb \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_149_3.dat b/admin/phpqrcode/cache/mask_3/mask_149_3.dat new file mode 100644 index 0000000..30bc5fa --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_149_3.dat @@ -0,0 +1 @@ +xA0}Oܠ⦐H頯'Z2{oV|Ι%>yR{!8ÂI+JpI|#f5κ[P A $H Q})&X{ט+Wb`I)5%d \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_153_3.dat b/admin/phpqrcode/cache/mask_3/mask_153_3.dat new file mode 100644 index 0000000..89cdec0 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_153_3.dat @@ -0,0 +1,2 @@ +xA +0}Ns˹)7mJ,}8X=cW^GeN}o%uJV/{%O>}ӧO}K~O>}ӧO>Q=/ї>}ӧO>}u{ח>}ӧO>}u{蟪/%?}ӧO>}ׯ.N4჏VMmRt(1| \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_177_3.dat b/admin/phpqrcode/cache/mask_3/mask_177_3.dat new file mode 100644 index 0000000..9586979 Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_177_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_21_3.dat b/admin/phpqrcode/cache/mask_3/mask_21_3.dat new file mode 100644 index 0000000..bcb4eec Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_21_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_25_3.dat b/admin/phpqrcode/cache/mask_3/mask_25_3.dat new file mode 100644 index 0000000..0ffc375 Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_25_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_29_3.dat b/admin/phpqrcode/cache/mask_3/mask_29_3.dat new file mode 100644 index 0000000..6150ac1 Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_29_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_33_3.dat b/admin/phpqrcode/cache/mask_3/mask_33_3.dat new file mode 100644 index 0000000..6053b5e Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_33_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_37_3.dat b/admin/phpqrcode/cache/mask_3/mask_37_3.dat new file mode 100644 index 0000000..5dea5b9 Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_37_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_41_3.dat b/admin/phpqrcode/cache/mask_3/mask_41_3.dat new file mode 100644 index 0000000..ca9ddc2 Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_41_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_45_3.dat b/admin/phpqrcode/cache/mask_3/mask_45_3.dat new file mode 100644 index 0000000..3daad97 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_45_3.dat @@ -0,0 +1,2 @@ +xK + DsFJ(&)0dЇFg![8=&iaD)d8&Aլa 1'II׳79 ex߾ I&֝CuJy \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_49_3.dat b/admin/phpqrcode/cache/mask_3/mask_49_3.dat new file mode 100644 index 0000000..7f6508d Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_49_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_53_3.dat b/admin/phpqrcode/cache/mask_3/mask_53_3.dat new file mode 100644 index 0000000..8800bea --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_53_3.dat @@ -0,0 +1,2 @@ +xK +0Ds ! -(.Bp&|"-t&`qQ-"9_+)Be/H8D%a~}spKFN=,;;a^t4\FSN \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_57_3.dat b/admin/phpqrcode/cache/mask_3/mask_57_3.dat new file mode 100644 index 0000000..4e1e5da Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_57_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_61_3.dat b/admin/phpqrcode/cache/mask_3/mask_61_3.dat new file mode 100644 index 0000000..bf1a3cc --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_61_3.dat @@ -0,0 +1,2 @@ +xA +0fz4-%*dp!yZܫu(~=&ۓ)R2"/"<9FΊ=rb"/rw"2B#3-0-KW \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_65_3.dat b/admin/phpqrcode/cache/mask_3/mask_65_3.dat new file mode 100644 index 0000000..8589208 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_65_3.dat @@ -0,0 +1,2 @@ +xQ + D4\?R ,!O-Nv1:cZu "UMÕF ~jK-la[^q^Q\=o-laZpUB @IKJzɢ|1Í  \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_69_3.dat b/admin/phpqrcode/cache/mask_3/mask_69_3.dat new file mode 100644 index 0000000..55318a8 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_69_3.dat @@ -0,0 +1,2 @@ +x +0 {&2'd l=,Fy;$쇤WE-R:%T,O2g"",Ȣ/DyĈɧ{O䮳",:NvEWN#(&,,]x؅ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_73_3.dat b/admin/phpqrcode/cache/mask_3/mask_73_3.dat new file mode 100644 index 0000000..15be77f --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_73_3.dat @@ -0,0 +1,2 @@ +xQ +0 C{g;JJ?dԬK=RasJhTJ6exka\$nIE,-/XB*х=wee4t̒tLщtt߫b gFf qoddn-? \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_77_3.dat b/admin/phpqrcode/cache/mask_3/mask_77_3.dat new file mode 100644 index 0000000..ec78280 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_77_3.dat @@ -0,0 +1,2 @@ +xA +0 &BiRaK"t`I@|fXyilE:Sza18GifK*?:YC1쌞졘(ቷJ*jl*TRIKR^ؙks)c)c)JZa \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_81_3.dat b/admin/phpqrcode/cache/mask_3/mask_81_3.dat new file mode 100644 index 0000000..47bc0f7 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_81_3.dat @@ -0,0 +1,2 @@ +x1 + F=\,JGAġhj>#3X:kԹ\FM Jhu3>TZ{PSgP'kVjժU_ۯUV=P oO:Wҝj[Wxm 5 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_85_3.dat b/admin/phpqrcode/cache/mask_3/mask_85_3.dat new file mode 100644 index 0000000..02c4f8c Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_85_3.dat differ diff --git a/admin/phpqrcode/cache/mask_3/mask_89_3.dat b/admin/phpqrcode/cache/mask_3/mask_89_3.dat new file mode 100644 index 0000000..2b4cb59 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_89_3.dat @@ -0,0 +1,2 @@ +x1 ὧ) *.@U |eŵ6ۢw5*) oiK4nk>1}d>@ 4XYCo ۡ1<AhFt + 4@51Wr>7G}}x7|NgN \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_93_3.dat b/admin/phpqrcode/cache/mask_3/mask_93_3.dat new file mode 100644 index 0000000..b4cc8a9 --- /dev/null +++ b/admin/phpqrcode/cache/mask_3/mask_93_3.dat @@ -0,0 +1,2 @@ +xA +0 D}NrnJɪQ~B06na<<ׇe6MRCP L̓i9M 2 LkŮdDv*"aXjBdAddZTdAdqY0exqeN&WVQvc \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_3/mask_97_3.dat b/admin/phpqrcode/cache/mask_3/mask_97_3.dat new file mode 100644 index 0000000..7adc9eb Binary files /dev/null and b/admin/phpqrcode/cache/mask_3/mask_97_3.dat differ diff --git a/admin/phpqrcode/cache/mask_4/mask_101_4.dat b/admin/phpqrcode/cache/mask_4/mask_101_4.dat new file mode 100644 index 0000000..1c97dc0 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_101_4.dat @@ -0,0 +1,2 @@ +xA Fs^1bИ]4m+8+Ve^HR]\c +oWN#X+l HEcp \^.9qW9":.BB \0aPǨcp \ONqjpG}}$.˅ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_105_4.dat b/admin/phpqrcode/cache/mask_4/mask_105_4.dat new file mode 100644 index 0000000..0211cdb --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_105_4.dat @@ -0,0 +1,2 @@ +xK +0 D=Mr˹A TeEFL2 #鹢_I!딤Ѻ-իkmO]sS T6*'8 N$'NZ^}rU*G9r|c[cN[_=׫5^J 1*qv \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_117_4.dat b/admin/phpqrcode/cache/mask_4/mask_117_4.dat new file mode 100644 index 0000000..3867259 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_117_4.dat @@ -0,0 +1,2 @@ +x + н_s]4Dgn2Jj}ҾRsSWGRɧ)5Em#ܯk_"z3\rʕ+r Lk|/{;'/#\p\p># \p\p#>qp\p.$Iq dGR_4  \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_137_4.dat b/admin/phpqrcode/cache/mask_4/mask_137_4.dat new file mode 100644 index 0000000..0c09c48 Binary files /dev/null and b/admin/phpqrcode/cache/mask_4/mask_137_4.dat differ diff --git a/admin/phpqrcode/cache/mask_4/mask_141_4.dat b/admin/phpqrcode/cache/mask_4/mask_141_4.dat new file mode 100644 index 0000000..62b03f2 Binary files /dev/null and b/admin/phpqrcode/cache/mask_4/mask_141_4.dat differ diff --git a/admin/phpqrcode/cache/mask_4/mask_145_4.dat b/admin/phpqrcode/cache/mask_4/mask_145_4.dat new file mode 100644 index 0000000..33fb211 Binary files /dev/null and b/admin/phpqrcode/cache/mask_4/mask_145_4.dat differ diff --git a/admin/phpqrcode/cache/mask_4/mask_149_4.dat b/admin/phpqrcode/cache/mask_4/mask_149_4.dat new file mode 100644 index 0000000..de99310 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_149_4.dat @@ -0,0 +1,2 @@ +x +!н_sm +XӋ9=.=Zka]ޒ> Kjo |SSWKZm׌j\Ъ2 W\qW\q"~ jvtv_\qW\qW\q%g3 }+++ r9ArW\qW\qŕA g3WA W\qW\qW]V~v{D3Ȝ!\W^Tڍ[S7vۜgq? +{peo383838{YXz,_OYfe3s38383\C!Ms38383r \C?37938383\C!07M8383q,mMrskWv3~W WB \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_157_4.dat b/admin/phpqrcode/cache/mask_4/mask_157_4.dat new file mode 100644 index 0000000..ad5fcf6 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_157_4.dat @@ -0,0 +1 @@ +x10ޯs4"FP=iRX¢X0멪u 4ftl}m➭S|юS P5<]rwqwq^QN6ÏZsߙ,wqwqǝ>Μ5g;;Y}Vgw,wqwqw>9wqwq>3gY;[ww?P3Ƙggt퐮;].3w4A \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_161_4.dat b/admin/phpqrcode/cache/mask_4/mask_161_4.dat new file mode 100644 index 0000000..7604c45 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_161_4.dat @@ -0,0 +1 @@ +xA@ fs!AL_|,4l)iml׉0' +E ]N\x#2/_{7g9쏼ٷ}2r!?}-#Te9C9C9~6Sʇ겺!r!r!ۘse9C9C94_Ɯ|.r!r!s/s0 2r!r8}DwrDXΡ|x|!2 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_165_4.dat b/admin/phpqrcode/cache/mask_4/mask_165_4.dat new file mode 100644 index 0000000..d83d631 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_165_4.dat @@ -0,0 +1,3 @@ +xA +1 }Or."*?fPLHIkΫZQ8 +Gyqk-n5+?|֎kKnEŹK.K.?2.|EJ{2<:.Ku\K.K.ǝmu)_8\r%\r%\Џ;'2!_8\r%\r%\Џ;'2!_\r%\r%\rinC?nn9 RK.K.;.HqY'ݽNF?K㕢,R| My*3 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_169_4.dat b/admin/phpqrcode/cache/mask_4/mask_169_4.dat new file mode 100644 index 0000000..4aac95c Binary files /dev/null and b/admin/phpqrcode/cache/mask_4/mask_169_4.dat differ diff --git a/admin/phpqrcode/cache/mask_4/mask_173_4.dat b/admin/phpqrcode/cache/mask_4/mask_173_4.dat new file mode 100644 index 0000000..9df4d86 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_173_4.dat @@ -0,0 +1,2 @@ +xK +1}Nrna ~ZY!Jt^5(/jkz[pj_?~v:|jwՖ_mXzo6?naCe \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_81_4.dat b/admin/phpqrcode/cache/mask_4/mask_81_4.dat new file mode 100644 index 0000000..dd65216 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_81_4.dat @@ -0,0 +1,3 @@ +xA +0 yMyXE m7"892ѸQ1ݳ+xx;t35DIY1x\:u}e/ #Th< +UBz<5G<5{G<5<饫>]Urxu \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_85_4.dat b/admin/phpqrcode/cache/mask_4/mask_85_4.dat new file mode 100644 index 0000000..c8d5123 Binary files /dev/null and b/admin/phpqrcode/cache/mask_4/mask_85_4.dat differ diff --git a/admin/phpqrcode/cache/mask_4/mask_89_4.dat b/admin/phpqrcode/cache/mask_4/mask_89_4.dat new file mode 100644 index 0000000..5b9bd7e --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_89_4.dat @@ -0,0 +1,2 @@ +x1 +0 ὧI9%  Vڀfr0}z=#9ҕ:~s1BՁg&4pgq.p.&gT05rgsgqrg捯u38k.Egmb*&7? : \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_93_4.dat b/admin/phpqrcode/cache/mask_4/mask_93_4.dat new file mode 100644 index 0000000..be7f5e5 --- /dev/null +++ b/admin/phpqrcode/cache/mask_4/mask_93_4.dat @@ -0,0 +1,2 @@ +xK + ὧIn$}PŌB]N@%sfkҫ}CzoA}aʽ2|~D&l=Ywq}q\EYjK_ywqwz$==;_݋>+pH9Di \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_4/mask_97_4.dat b/admin/phpqrcode/cache/mask_4/mask_97_4.dat new file mode 100644 index 0000000..5d848ca Binary files /dev/null and b/admin/phpqrcode/cache/mask_4/mask_97_4.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_101_5.dat b/admin/phpqrcode/cache/mask_5/mask_101_5.dat new file mode 100644 index 0000000..c21869e --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_101_5.dat @@ -0,0 +1,2 @@ +x + E+%=M3Cbv ѬNkûgqkqq{%Oo,iKee3[|iVh]` ` 0ʕz˴T0Gu/q8F13:W>#ȕ0c0Q8E=F#+a X͞+cV%9W>Q]TkY-gLqD艋 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_105_5.dat b/admin/phpqrcode/cache/mask_5/mask_105_5.dat new file mode 100644 index 0000000..bc8798c Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_105_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_109_5.dat b/admin/phpqrcode/cache/mask_5/mask_109_5.dat new file mode 100644 index 0000000..25a3944 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_109_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_113_5.dat b/admin/phpqrcode/cache/mask_5/mask_113_5.dat new file mode 100644 index 0000000..25f42b8 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_113_5.dat @@ -0,0 +1,9 @@ +x +0D^6I63[[EDqc+jy81\c +7c?u}DK4},kkg--3[UƂyUXUXSV:ϫ՝,|кS⫰ + + +Vɫ*X[* + + +zU*NV*JUXUXSXijTi4fZkU^_~Ux }ծZ/r \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_117_5.dat b/admin/phpqrcode/cache/mask_5/mask_117_5.dat new file mode 100644 index 0000000..f236940 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_117_5.dat @@ -0,0 +1 @@ +x D|Mn/*{M+pI_&m-ѾC32u?o-kgB7wc=U%yoRhӯșDo:ֶyRJkQ^aaaqOgiJ ;qOg)ӊ0 0 0 [vö>=>0 0 0 Ofz3=>0 0 0.3Z$׷8\pw4:Zp:qX 7 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_121_5.dat b/admin/phpqrcode/cache/mask_5/mask_121_5.dat new file mode 100644 index 0000000..9bb5c41 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_121_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_125_5.dat b/admin/phpqrcode/cache/mask_5/mask_125_5.dat new file mode 100644 index 0000000..2161c50 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_125_5.dat @@ -0,0 +1,2 @@ +xA + E&fc;S$?؏Q4YahûyJ}9g==li.;nh_wz.qCWȧy uPk;<<<|*q, mkWqNl% yyyy^2䰅sX|aaaa3ϙ9lH<<<<̿웁[n`Tq8^vy \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_129_5.dat b/admin/phpqrcode/cache/mask_5/mask_129_5.dat new file mode 100644 index 0000000..f0c1d65 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_129_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_133_5.dat b/admin/phpqrcode/cache/mask_5/mask_133_5.dat new file mode 100644 index 0000000..46be8b0 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_133_5.dat @@ -0,0 +1,2 @@ +xA +0 DѽOcr]4%1mCTxΜ[Dv={FEϏq?ݿ9keѭ}'2^c4G:3=JK-F0`#Hw'#<{~Z4 :BG舻F0`G~:`#?#tw-`#?##t#F0r}Q}eR;M/k1mX=hsH"k M:3qOW}9ԖIH1G;- sڶ?[%M + v#;zg^3d}69Ψޙ@7҄#gv`;׳ީ\$wlv`v;ލ}7wߑa;vkA#gv`=N2wxgWӤ@n?c}SQ:Zd?+9vz)P \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_141_5.dat b/admin/phpqrcode/cache/mask_5/mask_141_5.dat new file mode 100644 index 0000000..60c1a8e Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_141_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_145_5.dat b/admin/phpqrcode/cache/mask_5/mask_145_5.dat new file mode 100644 index 0000000..9303c07 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_145_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_149_5.dat b/admin/phpqrcode/cache/mask_5/mask_149_5.dat new file mode 100644 index 0000000..4256cef --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_149_5.dat @@ -0,0 +1,3 @@ +x[ +0&c}-s+'^;Ax=Q_gUݏﵪxGTȺV¹UUE_IǴ;T1̠ +]W 2 2 |o5uꆬuI:(WKU躒rPAdAdA; vo_zNO{2rPA9 2 29}^O挞rwQdAdAnMA9(dAdA^W Z.+G^K`׵}`_Fk \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_153_5.dat b/admin/phpqrcode/cache/mask_5/mask_153_5.dat new file mode 100644 index 0000000..deea09d --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_153_5.dat @@ -0,0 +1,2 @@ +x +@wfЬ`D"Ie<:au,7Of۳uP6~szs,jլcVZvߨm s^uHYu&l&l&_9 ;]^jsO;ܔrSn&l&l9yכzA rSnM6dM6dM6ރ@/$7ܔl&l&lzŽzACrSnM6dM6dOl7ᰚUuN֛FcPPS,l;HO \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_157_5.dat b/admin/phpqrcode/cache/mask_5/mask_157_5.dat new file mode 100644 index 0000000..176e2a6 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_157_5.dat @@ -0,0 +1 @@ +x10Dާri( r* \~>C*vs]Ŝ_{W!zﶬ/)˙v V6V޻,f1Yb n^o>\O],,b,f1YyVgYYYb,f1+ʳ<˳<˳1YbŬ<+ʳ,,b,f1YyVgYYYb,fukys77}vmb=wsw)tW: \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_161_5.dat b/admin/phpqrcode/cache/mask_5/mask_161_5.dat new file mode 100644 index 0000000..70d5fb0 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_161_5.dat @@ -0,0 +1,2 @@ +xI +@нDp@ o|m rHk㨤~co^Jzװ#5l¦S_92 [}ZÊ=T2ƀP2[cV衆CYf'-X9>v~usK5`e,2,2,2-///o_q}K\reYfeYf峖o+/,\feYfeYfٳexB.e2,2,̲g+l\r16,2,>ϰ=te&_4=tU}/>>>Or5/u>/g}g}gOsvO}/g}g}ٷGo-w{r_{g}g}g_n=n]4Nkβ_M8m?SF< \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_173_5.dat b/admin/phpqrcode/cache/mask_5/mask_173_5.dat new file mode 100644 index 0000000..f9a6741 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_173_5.dat @@ -0,0 +1,4 @@ +x[ +0&G1gD)[CzeDѷц=RN6FJm JqP}x s_}GFy; +[;]ek[QbTmy&0 L`̄Y?رw؛ fcVN9&0 L`ׄZ}0=F=F9ANL`&0 L`BzYfI=F9AN&0 L`&0 fIsr ' L`&0 L`<i͒"9AN&0 L`VaBX",Um> +=wZgBΜP !8 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_177_5.dat b/admin/phpqrcode/cache/mask_5/mask_177_5.dat new file mode 100644 index 0000000..b07c636 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_177_5.dat @@ -0,0 +1,11 @@ +xъ0~ܾح uO,"% :$Xui=ѶՃgƸ?Ώq.So~z׉W:=h1cq]Ƕi!r8Ɓ`+X +V jj;8ƁX+ +oV`+X +V?[1^h-ֳ5Z;rmS+ +oV`+X +V;Z,YMB+ +V`+X +VZeڦ}r\!W`+X +V`+3Km>SB+ +V`+X +Vc㊛{g;^Qq5ZUݮQL0+*&YDq*6 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_21_5.dat b/admin/phpqrcode/cache/mask_5/mask_21_5.dat new file mode 100644 index 0000000..04f97ea Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_21_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_25_5.dat b/admin/phpqrcode/cache/mask_5/mask_25_5.dat new file mode 100644 index 0000000..c20b59b --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_25_5.dat @@ -0,0 +1,2 @@ +xڝa +@!4 ޳ʢ ?,""j?n=GZy:DR \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_33_5.dat b/admin/phpqrcode/cache/mask_5/mask_33_5.dat new file mode 100644 index 0000000..726d7fd Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_33_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_37_5.dat b/admin/phpqrcode/cache/mask_5/mask_37_5.dat new file mode 100644 index 0000000..6d32ca6 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_37_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_41_5.dat b/admin/phpqrcode/cache/mask_5/mask_41_5.dat new file mode 100644 index 0000000..e07c617 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_41_5.dat @@ -0,0 +1,2 @@ +xTA + 5?7XMtxҴx ?@7@~"N$Sɰ{+CA'r\Pp<ޏ- ͺ:S3sԉۻީz#qw > \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_45_5.dat b/admin/phpqrcode/cache/mask_5/mask_45_5.dat new file mode 100644 index 0000000..5168a17 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_45_5.dat @@ -0,0 +1 @@ +xUA 5?U:N&Z":;4P1=bNvSGM1˛n'(κ J{Eѵs] ,sq \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_49_5.dat b/admin/phpqrcode/cache/mask_5/mask_49_5.dat new file mode 100644 index 0000000..9f3f3cd Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_49_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_53_5.dat b/admin/phpqrcode/cache/mask_5/mask_53_5.dat new file mode 100644 index 0000000..449807b --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_53_5.dat @@ -0,0 +1 @@ +xVA " zYf5ƐJC A;l\,dR. \(e_ еaNi5\żaLP(;2שjN6O u+l{y6od^ C[%  \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_57_5.dat b/admin/phpqrcode/cache/mask_5/mask_57_5.dat new file mode 100644 index 0000000..c7dd81f --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_57_5.dat @@ -0,0 +1,2 @@ +xVA + 5?NlZHAbBZ0a Md`1z'"<Ր19nvͨ. )bݻ~;9Z#tB~ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_65_5.dat b/admin/phpqrcode/cache/mask_5/mask_65_5.dat new file mode 100644 index 0000000..ecd9380 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_65_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_69_5.dat b/admin/phpqrcode/cache/mask_5/mask_69_5.dat new file mode 100644 index 0000000..ead4edc Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_69_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_73_5.dat b/admin/phpqrcode/cache/mask_5/mask_73_5.dat new file mode 100644 index 0000000..0000117 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_73_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_77_5.dat b/admin/phpqrcode/cache/mask_5/mask_77_5.dat new file mode 100644 index 0000000..1652cdc --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_77_5.dat @@ -0,0 +1 @@ +xQ Cw#&C`T6ƹB(9 'ֆڢzk"hv.` cXB5[(F>71/34Ϊz^'[FyglgM>OTL4ϔ{&3Wy*ʧb*`<3;Vo0/s6n0ya[mcE \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_81_5.dat b/admin/phpqrcode/cache/mask_5/mask_81_5.dat new file mode 100644 index 0000000..71215e9 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_81_5.dat @@ -0,0 +1,3 @@ +x + C~M?tzU4" }tMX2|.ɋ˙F\~m4Xu +ٔ, w:EƄ>X̯=_]g>>zמ/)5ךkkkZsXXY{ܮ}~mt:S#&;U#) \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_85_5.dat b/admin/phpqrcode/cache/mask_5/mask_85_5.dat new file mode 100644 index 0000000..09cf0e2 Binary files /dev/null and b/admin/phpqrcode/cache/mask_5/mask_85_5.dat differ diff --git a/admin/phpqrcode/cache/mask_5/mask_89_5.dat b/admin/phpqrcode/cache/mask_5/mask_89_5.dat new file mode 100644 index 0000000..5fff530 --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_89_5.dat @@ -0,0 +1,2 @@ +x + 45enpQ Gcfl^^;;b5;`kU͹߮j`NsO=\[a6~nLD? !6uF%w*Ȭkf77SĆbÆXodw_—mbClNۙ ck&YVoܡ׷BעبAl6 Jjx \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_5/mask_93_5.dat b/admin/phpqrcode/cache/mask_5/mask_93_5.dat new file mode 100644 index 0000000..ec4240b --- /dev/null +++ b/admin/phpqrcode/cache/mask_5/mask_93_5.dat @@ -0,0 +1,2 @@ +xK +0 D>&&  fP^8BY5s(imҮ=f3/wۧEyYQwf[} [90303ef̙3'3=,ͼwxDַ.,;s%g,,,=Rὓ7uKKTD<(n lYhV۹sޕyPEtyY]ns ;ss,!LkԅcbL12cX91Z#XEn#;svT~L~LR11vs.1111J1&؍Ń111J1&ƞg KLƪjlk{gڞ5K1/ǐ~,ac$ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_105_6.dat b/admin/phpqrcode/cache/mask_6/mask_105_6.dat new file mode 100644 index 0000000..a58fec7 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_105_6.dat @@ -0,0 +1,3 @@ +xQ +@ DskBZ#o)Sd}Gܷl쯯^)G]S4S?#BZ:+{sHKNiI!me1 +RWe9!``Uyˀu:檞U=w-oԺwB}cMK蹰{{=y蹰{{=y蹰{wScaoi'fyO=CyO=Cy[{S޻=;|v4}ϯ20 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_109_6.dat b/admin/phpqrcode/cache/mask_6/mask_109_6.dat new file mode 100644 index 0000000..be7b474 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_109_6.dat @@ -0,0 +1 @@ +xA0 ~ρDBHCHV20nuol쯯˻=ۢs9[l'?7R" &2:7QqX_n ]$՚EIY*Lq0 0 0{LJз(s\ɳwX-7^ItIII$~?N0 0 0O'Itg7L$L-Iuzrfr M^'}(O~R]1YLĞu9Qӕ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_113_6.dat b/admin/phpqrcode/cache/mask_6/mask_113_6.dat new file mode 100644 index 0000000..397f527 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_113_6.dat @@ -0,0 +1,3 @@ +x E5NՉbF6on,m>gS9RWcǕ9&%1_cx= GR^w-z?dzv=,}ԥ?ǹژ:9m==@U䲉UXUXVe~by4Wi:e=ɼÆ$<>Ov'Cytaaaa~|'9liΣ<<<<Iæ<:<<<ٕWDzy:.z= ݓʯ sVöE=ll_k0_#vίmj \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_129_6.dat b/admin/phpqrcode/cache/mask_6/mask_129_6.dat new file mode 100644 index 0000000..b4695c3 Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_129_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_133_6.dat b/admin/phpqrcode/cache/mask_6/mask_133_6.dat new file mode 100644 index 0000000..40911dc Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_133_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_137_6.dat b/admin/phpqrcode/cache/mask_6/mask_137_6.dat new file mode 100644 index 0000000..43ccb68 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_137_6.dat @@ -0,0 +1,2 @@ +x E5?e^4fHp[1-e)UQV]UWN5o*8|۩W6bk?{f|>s֪r666rҟ=vڲWy -' +Ο;q tQE>U϶f곭xN]Tc(s❮7tAw`v`v`v`kvwfwt;];;;;;!ޙ;ao];l;;;÷| ʷ(3}l.?"މr};\}S-Aw<9;EV'ם \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_141_6.dat b/admin/phpqrcode/cache/mask_6/mask_141_6.dat new file mode 100644 index 0000000..0340409 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_141_6.dat @@ -0,0 +1,10 @@ +xa F4/c]زȐ[=[E럓sm,fn/|kj\j?g[q(NOZc5SGGP[oMVָfvL<WóCaz6U~һ{`nݻdvVy~rZ"qk{>g$XKU}m\bjaGx,f1Yb]z̞^.5[?嬜r,f1YY>grVb,f1Y>g,rVmYb,f,|VY9Yb,f,|VY9+g1Ybً ̦M7>2{9z϶hm3l|9xټ#f#x6 -v%N' \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_161_6.dat b/admin/phpqrcode/cache/mask_6/mask_161_6.dat new file mode 100644 index 0000000..ecec68b Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_161_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_165_6.dat b/admin/phpqrcode/cache/mask_6/mask_165_6.dat new file mode 100644 index 0000000..d641dfa Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_165_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_169_6.dat b/admin/phpqrcode/cache/mask_6/mask_169_6.dat new file mode 100644 index 0000000..ae68972 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_169_6.dat @@ -0,0 +1 @@ +xJ0i9[Jɘk{1b!gnhHkS뉭-V?KIׁ1큏1ƣݎ/`/z)*=3ڏg6^k65CY>㵾+'{է_Vˊx-J<ӛܗr_>>i;rO}/g}g}ٿ}}xO}/g}g}ٷGo/{{r_>>o/z^#}g}ٿd'ʳ|QRNS3YڳZ'msEǷj5 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_173_6.dat b/admin/phpqrcode/cache/mask_6/mask_173_6.dat new file mode 100644 index 0000000..95fa97c --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_173_6.dat @@ -0,0 +1 @@ +xa09MrM S*:a_-5hh_)uZ֭[loےsmKN{H?x`l#f9>ڟ[eЄώߓ ?^m*/Kmhy%v-nKlkKL`&& g5(gwxYܞa¬pVcZ[#O=SN9&0 L`DŽ 'tjj]QN9&0 L`sYRc@QN9 L`&0 L`"YRc\ ' r&0 L`EH9AN&0 L`& 7p6`|hms R5Ƙȉ k\X/ )g9 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_177_6.dat b/admin/phpqrcode/cache/mask_6/mask_177_6.dat new file mode 100644 index 0000000..e9f0476 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_177_6.dat @@ -0,0 +1,14 @@ +xn {ڤ*4v۴u1{f{_,,K9o 4ǵ7lniJiggir<-MG + + + +xuV+zRCr9+Gq6QWb"Qe"WL+ + XXXXX/|~j,nmuMۤ+ + XXXXXYa,X;M+ + XXXXXe)oӘf|5H늚7/D \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_21_6.dat b/admin/phpqrcode/cache/mask_6/mask_21_6.dat new file mode 100644 index 0000000..6bd505b --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_21_6.dat @@ -0,0 +1 @@ +xڝQ C9M{i]X1- C!D7 W ٜ&rD)~]<M 3(>{A aS \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_25_6.dat b/admin/phpqrcode/cache/mask_6/mask_25_6.dat new file mode 100644 index 0000000..d45083a --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_25_6.dat @@ -0,0 +1 @@ +xڝQA 52)e+(XmZt*(ڹ;tJ<峂_ڤ3oڴ"̢azh}&qvSG֙,-J4}oS[}w \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_29_6.dat b/admin/phpqrcode/cache/mask_6/mask_29_6.dat new file mode 100644 index 0000000..0408e22 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_29_6.dat @@ -0,0 +1,3 @@ +xRA +0 XcL(4EԈB +8Cܾ޳nM+lǝՆO1]&ڍ4UD-6-$:6dZ?ylf? 8?߲_ݏ`8G1`B`;+}&s]<iK'l'9%.7 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_65_6.dat b/admin/phpqrcode/cache/mask_6/mask_65_6.dat new file mode 100644 index 0000000..550fc8f --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_65_6.dat @@ -0,0 +1 @@ +xWQ i{KNLk?e$Qik41{`+!ڮM ? 1b8 .^wsnFj5EaQX|=w@2v<ŋŞ|4w\UXBQz+TTcBz/48,5`ȱ OV$ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_69_6.dat b/admin/phpqrcode/cache/mask_6/mask_69_6.dat new file mode 100644 index 0000000..a3e4fa0 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_69_6.dat @@ -0,0 +1 @@ +xK @dTh hLSSEq eY@<+*|窮 %>z*7e6QS`.>sE '%@[6@P0h aFxtpl2 Q-g1Nfeo^0FdT>N_OwG3ug {3<[Ժ b?'6^ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_73_6.dat b/admin/phpqrcode/cache/mask_6/mask_73_6.dat new file mode 100644 index 0000000..ab71b70 Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_73_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_77_6.dat b/admin/phpqrcode/cache/mask_6/mask_77_6.dat new file mode 100644 index 0000000..ad5a660 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_77_6.dat @@ -0,0 +1 @@ +x E۲iVa.FpSTY4q~z=:͒ 6m8:#0PضiDy:2Š'Zs&}滜\r0\ŚXw;iPȔL)Seԕ{hDu9LbJSS))gZ{e)qJdLw+#3-V0շljڠS-S 9=ݯ5PPq1M?g \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_81_6.dat b/admin/phpqrcode/cache/mask_6/mask_81_6.dat new file mode 100644 index 0000000..28a6d07 --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_81_6.dat @@ -0,0 +1,3 @@ +xQ0D9 rRLvk`0 ;i6\|_cc1huio#2}x*.Yt& +ְq/K;3ve̢ȊAH?`]5Kw!}{Zû߲W +yⷾ^_ykk^Kתb-bYSڸ'֜Nu#MfHSQ?|]IAiMyyuW \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_6/mask_85_6.dat b/admin/phpqrcode/cache/mask_6/mask_85_6.dat new file mode 100644 index 0000000..d5403e4 Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_85_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_89_6.dat b/admin/phpqrcode/cache/mask_6/mask_89_6.dat new file mode 100644 index 0000000..eeeb5d1 Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_89_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_93_6.dat b/admin/phpqrcode/cache/mask_6/mask_93_6.dat new file mode 100644 index 0000000..6ff38db Binary files /dev/null and b/admin/phpqrcode/cache/mask_6/mask_93_6.dat differ diff --git a/admin/phpqrcode/cache/mask_6/mask_97_6.dat b/admin/phpqrcode/cache/mask_6/mask_97_6.dat new file mode 100644 index 0000000..3a2072e --- /dev/null +++ b/admin/phpqrcode/cache/mask_6/mask_97_6.dat @@ -0,0 +1,2 @@ +xa0sdFx[=4Hoj34&s}* a Vc&35arW^aLClzq,1x SQN]/Giu`&w%,%DY"Kt+HE'|R2(v1vqiqd,%D~%ػJj}ͺĺgY"Kd,+K +]Wt+sF/)].zN'`>1='#`+bl]Z \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_101_7.dat b/admin/phpqrcode/cache/mask_7/mask_101_7.dat new file mode 100644 index 0000000..1f6bc51 --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_101_7.dat @@ -0,0 +1 @@ +xQ C}rm`fjT#54'tfaЇo$cmOJ23c<6Xn0F ) \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_105_7.dat b/admin/phpqrcode/cache/mask_7/mask_105_7.dat new file mode 100644 index 0000000..6b0cacf --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_105_7.dat @@ -0,0 +1,2 @@ +xA +0EFaMҙNPx)pQ_~|ñ(bF$.aoWGNPUǖM%{oHQUlִL^>+m#{{eo&Y2soM)gncO9sZ3wo+{=f.zޣ{{=zGcskCQϞp^&{^NʷU e5}EwGn+o \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_109_7.dat b/admin/phpqrcode/cache/mask_7/mask_109_7.dat new file mode 100644 index 0000000..9875cbe --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_109_7.dat @@ -0,0 +1,2 @@ +xA +0 D9Mr}* _x-d:"NJ-k"⨚d{ջגɬ|'rQ5+ s)c7-1nn햺qɔJtg^ʉw̘Ň-?*&Mm@ee5^ +c + +,b\13j4TZfŢo* + + +:Ut* + + +Xů0"%6ed 8rS NsUnk5XejުuVXg,l`u!hXZ\VlM|[ͬ0 0 0 #hF'c]i>Hataaa~<ÆzyqkO0 0 0 㪞Faaa)2˰fÒ%z8tO=3=3:cw +V$ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_121_7.dat b/admin/phpqrcode/cache/mask_7/mask_121_7.dat new file mode 100644 index 0000000..d5d577f --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_121_7.dat @@ -0,0 +1,2 @@ +x[ + Edi;^az,#6ƞ^rh&^amY9_غ5Cr6t^^WlEز~ɿ|MmmS}( ۰ ۰ ۰}mQ]ZVq]vѲ"M1fG, qBmtaaazeF3cxIDmtaaamný$n۰ ۰ ۰ ۏa[}`[yޖ޻)n<4K/Oslnlm/G \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_125_7.dat b/admin/phpqrcode/cache/mask_7/mask_125_7.dat new file mode 100644 index 0000000..f9ec088 Binary files /dev/null and b/admin/phpqrcode/cache/mask_7/mask_125_7.dat differ diff --git a/admin/phpqrcode/cache/mask_7/mask_129_7.dat b/admin/phpqrcode/cache/mask_7/mask_129_7.dat new file mode 100644 index 0000000..9bf51d5 Binary files /dev/null and b/admin/phpqrcode/cache/mask_7/mask_129_7.dat differ diff --git a/admin/phpqrcode/cache/mask_7/mask_133_7.dat b/admin/phpqrcode/cache/mask_7/mask_133_7.dat new file mode 100644 index 0000000..b643ffe Binary files /dev/null and b/admin/phpqrcode/cache/mask_7/mask_133_7.dat differ diff --git a/admin/phpqrcode/cache/mask_7/mask_137_7.dat b/admin/phpqrcode/cache/mask_7/mask_137_7.dat new file mode 100644 index 0000000..11d212b --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_137_7.dat @@ -0,0 +1,5 @@ +x + F4/ c_ǂ+{SK<o[l +Ο +07։Vl;b7fMS;1LCvR|KMH +#Н(Sqd \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_141_7.dat b/admin/phpqrcode/cache/mask_7/mask_141_7.dat new file mode 100644 index 0000000..98dffab --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_141_7.dat @@ -0,0 +1 @@ +xA E= rITY@Ä0!|1tbG0ԗѤs2Z/oa\qzOnҋMntX"KmeM}CpPL^S0S0S0SL )ǔژY߾%b,Sl?zC)tLLLLI2zRXh@)tLLLLI1zbϷB)~0S0S0S07)|B)))3ՖL% tfwM*:~hZsnc$1UTtJg8OYE \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_145_7.dat b/admin/phpqrcode/cache/mask_7/mask_145_7.dat new file mode 100644 index 0000000..4aa2bac --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_145_7.dat @@ -0,0 +1,2 @@ +x + E5?W6Z-^2qbGX6(Ɖu"LbbGuμGk:HwA[jmHݞ3OkQ{l|TEm JfL?2"&)kRfc̉F,z=5X5X5X7F\pUs#5X5X5XFdYk!a ` ` `o8ct ]CC gM5[N%khZp?Iܣϲ^n$Y7AZP[ fȓ0 \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_149_7.dat b/admin/phpqrcode/cache/mask_7/mask_149_7.dat new file mode 100644 index 0000000..809f005 --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_149_7.dat @@ -0,0 +1 @@ +xn {? uچ2G$ncFKb3֪tPc ̥7[?9:['9'*Ӗ Gah_/z+6XB>2qYJ0黏Bfa 1 9c7G Ol,^꽓3A:H  1A b0X4%٫#d>&C  1A b+g嬜,f1Yb|Y>+g嬜,f1Ylio.\Ɲo=gϙ-yk_TA \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_161_7.dat b/admin/phpqrcode/cache/mask_7/mask_161_7.dat new file mode 100644 index 0000000..35ba8ff --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_161_7.dat @@ -0,0 +1 @@ +xю y/皨E)Ʈ1~493,˵+ZT=ZeC.~iߏ&>,6e~,lW] 2\;׵2j"e,rXݵV(c쵵ZӖ18ީ/,'t.ee,cX2߱,_|yt|]t.cX2e,cy/ɗys.eLe,cX2lo|Z{+2]bl,cX2e{+֊[A2]X2e,c9CX;QIQH8R҈G"z,&;'o97%P8%6oǽ;]NWn[f7v \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_29_7.dat b/admin/phpqrcode/cache/mask_7/mask_29_7.dat new file mode 100644 index 0000000..e3d7391 --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_29_7.dat @@ -0,0 +1,2 @@ +xR9 QpX$lŲf!I2pgSMZj"te0#ԛ`_1-cha~/Eh4"~ \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_37_7.dat b/admin/phpqrcode/cache/mask_7/mask_37_7.dat new file mode 100644 index 0000000..87d9a1a Binary files /dev/null and b/admin/phpqrcode/cache/mask_7/mask_37_7.dat differ diff --git a/admin/phpqrcode/cache/mask_7/mask_41_7.dat b/admin/phpqrcode/cache/mask_7/mask_41_7.dat new file mode 100644 index 0000000..8acec04 --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_41_7.dat @@ -0,0 +1 @@ +xTA 5[fDY(O^bR3/~t/L"7SQQ5j\Sib#Նȏ+ǣw#zx?㽧A-wu曑Y7$b.%A;wRoxG}? \ No newline at end of file diff --git a/admin/phpqrcode/cache/mask_7/mask_45_7.dat b/admin/phpqrcode/cache/mask_7/mask_45_7.dat new file mode 100644 index 0000000..dbba31d Binary files /dev/null and b/admin/phpqrcode/cache/mask_7/mask_45_7.dat differ diff --git a/admin/phpqrcode/cache/mask_7/mask_49_7.dat b/admin/phpqrcode/cache/mask_7/mask_49_7.dat new file mode 100644 index 0000000..be5dce8 --- /dev/null +++ b/admin/phpqrcode/cache/mask_7/mask_49_7.dat @@ -0,0 +1 @@ +xV0khC-X.ukv o40T%96U5*sI{`_>S?}(:yTl{G&E\6}"AX XϬback'); + + // user data + $filename = $PNG_TEMP_DIR.'test'.md5($_REQUEST['data'].'|'.$errorCorrectionLevel.'|'.$matrixPointSize).'.png'; + QRcode::png($_REQUEST['data'], $filename, $errorCorrectionLevel, $matrixPointSize, 2); + + } else { + + //default data + echo 'You can provide data in GET parameter: like that
'; + QRcode::png('PHP QR Code :)', $filename, $errorCorrectionLevel, $matrixPointSize, 2); + + } + + //display generated file + echo '
'; + + //config form + echo ' + Data:   + ECC:   + Size:   +
'; + + // benchmark + QRtools::timeBenchmark(); + + \ No newline at end of file diff --git a/admin/phpqrcode/phpqrcode.php b/admin/phpqrcode/phpqrcode.php new file mode 100644 index 0000000..13307b6 --- /dev/null +++ b/admin/phpqrcode/phpqrcode.php @@ -0,0 +1,3312 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + + +/* + * Version: 1.1.4 + * Build: 2010100721 + */ + + + +//---- qrconst.php ----------------------------- + + + + + +/* + * PHP QR Code encoder + * + * Common constants + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } + + + +//---- merged_config.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Config file, tuned-up for merged verion + */ + + define('QR_CACHEABLE', false); // use cache - more disk reads but less CPU power, masks and format templates are stored there + define('QR_CACHE_DIR', false); // used when QR_CACHEABLE === true + define('QR_LOG_DIR', false); // default error logs dir + + define('QR_FIND_BEST_MASK', true); // if true, estimates best mask (spec. default, but extremally slow; set to false to significant performance boost but (propably) worst quality code + define('QR_FIND_FROM_RANDOM', 2); // if false, checks all masks available, otherwise value tells count of masks need to be checked, mask id are got randomly + define('QR_DEFAULT_MASK', 2); // when QR_FIND_BEST_MASK === false + + define('QR_PNG_MAXIMUM_SIZE', 1024); // maximum allowed png image width (in pixels), tune to make sure GD and PHP can handle such big images + + + + +//---- qrtools.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Toolset, handy and debug utilites. + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + + + + +//---- qrspec.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * QR Code specifications + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


        '; + echo join("
        ", $frame); + echo '






'; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
", $frame); + echo "
"; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } + + + +//---- qrimage.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Image output of code using GD2 + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } + + + +//---- qrinput.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input encoding class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + + + + +//---- qrbitstream.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Bitstream class + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } + + + + +//---- qrsplit.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Input splitting classes + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } + + + +//---- qrrscode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Reed-Solomon error correction support + * + * Copyright (C) 2002, 2003, 2004, 2006 Phil Karn, KA9Q + * (libfec is released under the GNU Lesser General Public License.) + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } + + + +//---- qrmask.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Masking + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } + + + + +//---- qrencode.php ----------------------------- + + + + +/* + * PHP QR Code encoder + * + * Main encoder classes. + * + * Based on libqrencode C library distributed under LGPL 2.1 + * Copyright (C) 2006, 2007, 2008, 2009 Kentaro Fukuchi + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } + + diff --git a/admin/phpqrcode/qrbitstream.php b/admin/phpqrcode/qrbitstream.php new file mode 100644 index 0000000..7d4ec4a --- /dev/null +++ b/admin/phpqrcode/qrbitstream.php @@ -0,0 +1,180 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRbitstream { + + public $data = array(); + + //---------------------------------------------------------------------- + public function size() + { + return count($this->data); + } + + //---------------------------------------------------------------------- + public function allocate($setLength) + { + $this->data = array_fill(0, $setLength, 0); + return 0; + } + + //---------------------------------------------------------------------- + public static function newFromNum($bits, $num) + { + $bstream = new QRbitstream(); + $bstream->allocate($bits); + + $mask = 1 << ($bits - 1); + for($i=0; $i<$bits; $i++) { + if($num & $mask) { + $bstream->data[$i] = 1; + } else { + $bstream->data[$i] = 0; + } + $mask = $mask >> 1; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public static function newFromBytes($size, $data) + { + $bstream = new QRbitstream(); + $bstream->allocate($size * 8); + $p=0; + + for($i=0; $i<$size; $i++) { + $mask = 0x80; + for($j=0; $j<8; $j++) { + if($data[$i] & $mask) { + $bstream->data[$p] = 1; + } else { + $bstream->data[$p] = 0; + } + $p++; + $mask = $mask >> 1; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function append(QRbitstream $arg) + { + if (is_null($arg)) { + return -1; + } + + if($arg->size() == 0) { + return 0; + } + + if($this->size() == 0) { + $this->data = $arg->data; + return 0; + } + + $this->data = array_values(array_merge($this->data, $arg->data)); + + return 0; + } + + //---------------------------------------------------------------------- + public function appendNum($bits, $num) + { + if ($bits == 0) + return 0; + + $b = QRbitstream::newFromNum($bits, $num); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function appendBytes($size, $data) + { + if ($size == 0) + return 0; + + $b = QRbitstream::newFromBytes($size, $data); + + if(is_null($b)) + return -1; + + $ret = $this->append($b); + unset($b); + + return $ret; + } + + //---------------------------------------------------------------------- + public function toByte() + { + + $size = $this->size(); + + if($size == 0) { + return array(); + } + + $data = array_fill(0, (int)(($size + 7) / 8), 0); + $bytes = (int)($size / 8); + + $p = 0; + + for($i=0; $i<$bytes; $i++) { + $v = 0; + for($j=0; $j<8; $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$i] = $v; + } + + if($size & 7) { + $v = 0; + for($j=0; $j<($size & 7); $j++) { + $v = $v << 1; + $v |= $this->data[$p]; + $p++; + } + $data[$bytes] = $v; + } + + return $data; + } + + } diff --git a/admin/phpqrcode/qrconfig.php b/admin/phpqrcode/qrconfig.php new file mode 100644 index 0000000..e53dff8 --- /dev/null +++ b/admin/phpqrcode/qrconfig.php @@ -0,0 +1,17 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + // Encoding modes + + define('QR_MODE_NUL', -1); + define('QR_MODE_NUM', 0); + define('QR_MODE_AN', 1); + define('QR_MODE_8', 2); + define('QR_MODE_KANJI', 3); + define('QR_MODE_STRUCTURE', 4); + + // Levels of error correction. + + define('QR_ECLEVEL_L', 0); + define('QR_ECLEVEL_M', 1); + define('QR_ECLEVEL_Q', 2); + define('QR_ECLEVEL_H', 3); + + // Supported output formats + + define('QR_FORMAT_TEXT', 0); + define('QR_FORMAT_PNG', 1); + + class qrstr { + public static function set(&$srctab, $x, $y, $repl, $replLen = false) { + $srctab[$y] = substr_replace($srctab[$y], ($replLen !== false)?substr($repl,0,$replLen):$repl, $x, ($replLen !== false)?$replLen:strlen($repl)); + } + } \ No newline at end of file diff --git a/admin/phpqrcode/qrencode.php b/admin/phpqrcode/qrencode.php new file mode 100644 index 0000000..4b77a5b --- /dev/null +++ b/admin/phpqrcode/qrencode.php @@ -0,0 +1,502 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsblock { + public $dataLength; + public $data = array(); + public $eccLength; + public $ecc = array(); + + public function __construct($dl, $data, $el, &$ecc, QRrsItem $rs) + { + $rs->encode_rs_char($data, $ecc); + + $this->dataLength = $dl; + $this->data = $data; + $this->eccLength = $el; + $this->ecc = $ecc; + } + }; + + //########################################################################## + + class QRrawcode { + public $version; + public $datacode = array(); + public $ecccode = array(); + public $blocks; + public $rsblocks = array(); //of RSblock + public $count; + public $dataLength; + public $eccLength; + public $b1; + + //---------------------------------------------------------------------- + public function __construct(QRinput $input) + { + $spec = array(0,0,0,0,0); + + $this->datacode = $input->getByteStream(); + if(is_null($this->datacode)) { + throw new Exception('null imput string'); + } + + QRspec::getEccSpec($input->getVersion(), $input->getErrorCorrectionLevel(), $spec); + + $this->version = $input->getVersion(); + $this->b1 = QRspec::rsBlockNum1($spec); + $this->dataLength = QRspec::rsDataLength($spec); + $this->eccLength = QRspec::rsEccLength($spec); + $this->ecccode = array_fill(0, $this->eccLength, 0); + $this->blocks = QRspec::rsBlockNum($spec); + + $ret = $this->init($spec); + if($ret < 0) { + throw new Exception('block alloc error'); + return null; + } + + $this->count = 0; + } + + //---------------------------------------------------------------------- + public function init(array $spec) + { + $dl = QRspec::rsDataCodes1($spec); + $el = QRspec::rsEccCodes1($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + + $blockNo = 0; + $dataPos = 0; + $eccPos = 0; + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + if(QRspec::rsBlockNum2($spec) == 0) + return 0; + + $dl = QRspec::rsDataCodes2($spec); + $el = QRspec::rsEccCodes2($spec); + $rs = QRrs::init_rs(8, 0x11d, 0, 1, $el, 255 - $dl - $el); + + if($rs == NULL) return -1; + + for($i=0; $iecccode,$eccPos); + $this->rsblocks[$blockNo] = new QRrsblock($dl, array_slice($this->datacode, $dataPos), $el, $ecc, $rs); + $this->ecccode = array_merge(array_slice($this->ecccode,0, $eccPos), $ecc); + + $dataPos += $dl; + $eccPos += $el; + $blockNo++; + } + + return 0; + } + + //---------------------------------------------------------------------- + public function getCode() + { + $ret; + + if($this->count < $this->dataLength) { + $row = $this->count % $this->blocks; + $col = $this->count / $this->blocks; + if($col >= $this->rsblocks[0]->dataLength) { + $row += $this->b1; + } + $ret = $this->rsblocks[$row]->data[$col]; + } else if($this->count < $this->dataLength + $this->eccLength) { + $row = ($this->count - $this->dataLength) % $this->blocks; + $col = ($this->count - $this->dataLength) / $this->blocks; + $ret = $this->rsblocks[$row]->ecc[$col]; + } else { + return 0; + } + $this->count++; + + return $ret; + } + } + + //########################################################################## + + class QRcode { + + public $version; + public $width; + public $data; + + //---------------------------------------------------------------------- + public function encodeMask(QRinput $input, $mask) + { + if($input->getVersion() < 0 || $input->getVersion() > QRSPEC_VERSION_MAX) { + throw new Exception('wrong version'); + } + if($input->getErrorCorrectionLevel() > QR_ECLEVEL_H) { + throw new Exception('wrong level'); + } + + $raw = new QRrawcode($input); + + QRtools::markTime('after_raw'); + + $version = $raw->version; + $width = QRspec::getWidth($version); + $frame = QRspec::newFrame($version); + + $filler = new FrameFiller($width, $frame); + if(is_null($filler)) { + return NULL; + } + + // inteleaved data and ecc codes + for($i=0; $i<$raw->dataLength + $raw->eccLength; $i++) { + $code = $raw->getCode(); + $bit = 0x80; + for($j=0; $j<8; $j++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02 | (($bit & $code) != 0)); + $bit = $bit >> 1; + } + } + + QRtools::markTime('after_filler'); + + unset($raw); + + // remainder bits + $j = QRspec::getRemainder($version); + for($i=0; $i<$j; $i++) { + $addr = $filler->next(); + $filler->setFrameAt($addr, 0x02); + } + + $frame = $filler->frame; + unset($filler); + + + // masking + $maskObj = new QRmask(); + if($mask < 0) { + + if (QR_FIND_BEST_MASK) { + $masked = $maskObj->mask($width, $frame, $input->getErrorCorrectionLevel()); + } else { + $masked = $maskObj->makeMask($width, $frame, (intval(QR_DEFAULT_MASK) % 8), $input->getErrorCorrectionLevel()); + } + } else { + $masked = $maskObj->makeMask($width, $frame, $mask, $input->getErrorCorrectionLevel()); + } + + if($masked == NULL) { + return NULL; + } + + QRtools::markTime('after_mask'); + + $this->version = $version; + $this->width = $width; + $this->data = $masked; + + return $this; + } + + //---------------------------------------------------------------------- + public function encodeInput(QRinput $input) + { + return $this->encodeMask($input, -1); + } + + //---------------------------------------------------------------------- + public function encodeString8bit($string, $version, $level) + { + if(string == NULL) { + throw new Exception('empty string!'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = $input->append($input, QR_MODE_8, strlen($string), str_split($string)); + if($ret < 0) { + unset($input); + return NULL; + } + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public function encodeString($string, $version, $level, $hint, $casesensitive) + { + + if($hint != QR_MODE_8 && $hint != QR_MODE_KANJI) { + throw new Exception('bad hint'); + return NULL; + } + + $input = new QRinput($version, $level); + if($input == NULL) return NULL; + + $ret = QRsplit::splitStringToQRinput($string, $input, $hint, $casesensitive); + if($ret < 0) { + return NULL; + } + + return $this->encodeInput($input); + } + + //---------------------------------------------------------------------- + public static function png($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4, $saveandprint=false) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodePNG($text, $outfile, $saveandprint=false); + } + + //---------------------------------------------------------------------- + public static function text($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encode($text, $outfile); + } + + //---------------------------------------------------------------------- + public static function raw($text, $outfile = false, $level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = QRencode::factory($level, $size, $margin); + return $enc->encodeRAW($text, $outfile); + } + } + + //########################################################################## + + class FrameFiller { + + public $width; + public $frame; + public $x; + public $y; + public $dir; + public $bit; + + //---------------------------------------------------------------------- + public function __construct($width, &$frame) + { + $this->width = $width; + $this->frame = $frame; + $this->x = $width - 1; + $this->y = $width - 1; + $this->dir = -1; + $this->bit = -1; + } + + //---------------------------------------------------------------------- + public function setFrameAt($at, $val) + { + $this->frame[$at['y']][$at['x']] = chr($val); + } + + //---------------------------------------------------------------------- + public function getFrameAt($at) + { + return ord($this->frame[$at['y']][$at['x']]); + } + + //---------------------------------------------------------------------- + public function next() + { + do { + + if($this->bit == -1) { + $this->bit = 0; + return array('x'=>$this->x, 'y'=>$this->y); + } + + $x = $this->x; + $y = $this->y; + $w = $this->width; + + if($this->bit == 0) { + $x--; + $this->bit++; + } else { + $x++; + $y += $this->dir; + $this->bit--; + } + + if($this->dir < 0) { + if($y < 0) { + $y = 0; + $x -= 2; + $this->dir = 1; + if($x == 6) { + $x--; + $y = 9; + } + } + } else { + if($y == $w) { + $y = $w - 1; + $x -= 2; + $this->dir = -1; + if($x == 6) { + $x--; + $y -= 8; + } + } + } + if($x < 0 || $y < 0) return null; + + $this->x = $x; + $this->y = $y; + + } while(ord($this->frame[$y][$x]) & 0x80); + + return array('x'=>$x, 'y'=>$y); + } + + } ; + + //########################################################################## + + class QRencode { + + public $casesensitive = true; + public $eightbit = false; + + public $version = 0; + public $size = 3; + public $margin = 4; + + public $structured = 0; // not supported yet + + public $level = QR_ECLEVEL_L; + public $hint = QR_MODE_8; + + //---------------------------------------------------------------------- + public static function factory($level = QR_ECLEVEL_L, $size = 3, $margin = 4) + { + $enc = new QRencode(); + $enc->size = $size; + $enc->margin = $margin; + + switch ($level.'') { + case '0': + case '1': + case '2': + case '3': + $enc->level = $level; + break; + case 'l': + case 'L': + $enc->level = QR_ECLEVEL_L; + break; + case 'm': + case 'M': + $enc->level = QR_ECLEVEL_M; + break; + case 'q': + case 'Q': + $enc->level = QR_ECLEVEL_Q; + break; + case 'h': + case 'H': + $enc->level = QR_ECLEVEL_H; + break; + } + + return $enc; + } + + //---------------------------------------------------------------------- + public function encodeRAW($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + return $code->data; + } + + //---------------------------------------------------------------------- + public function encode($intext, $outfile = false) + { + $code = new QRcode(); + + if($this->eightbit) { + $code->encodeString8bit($intext, $this->version, $this->level); + } else { + $code->encodeString($intext, $this->version, $this->level, $this->hint, $this->casesensitive); + } + + QRtools::markTime('after_encode'); + + if ($outfile!== false) { + file_put_contents($outfile, join("\n", QRtools::binarize($code->data))); + } else { + return QRtools::binarize($code->data); + } + } + + //---------------------------------------------------------------------- + public function encodePNG($intext, $outfile = false,$saveandprint=false) + { + try { + + ob_start(); + $tab = $this->encode($intext); + $err = ob_get_contents(); + ob_end_clean(); + + if ($err != '') + QRtools::log($outfile, $err); + + $maxSize = (int)(QR_PNG_MAXIMUM_SIZE / (count($tab)+2*$this->margin)); + + QRimage::png($tab, $outfile, min(max(1, $this->size), $maxSize), $this->margin,$saveandprint); + + } catch (Exception $e) { + + QRtools::log($outfile, $e->getMessage()); + + } + } + } diff --git a/admin/phpqrcode/qrimage.php b/admin/phpqrcode/qrimage.php new file mode 100644 index 0000000..10b0a6e --- /dev/null +++ b/admin/phpqrcode/qrimage.php @@ -0,0 +1,95 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QR_IMAGE', true); + + class QRimage { + + //---------------------------------------------------------------------- + public static function png($frame, $filename = false, $pixelPerPoint = 4, $outerFrame = 4,$saveandprint=FALSE) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/png"); + ImagePng($image); + } else { + if($saveandprint===TRUE){ + ImagePng($image, $filename); + header("Content-type: image/png"); + ImagePng($image); + }else{ + ImagePng($image, $filename); + } + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + public static function jpg($frame, $filename = false, $pixelPerPoint = 8, $outerFrame = 4, $q = 85) + { + $image = self::image($frame, $pixelPerPoint, $outerFrame); + + if ($filename === false) { + Header("Content-type: image/jpeg"); + ImageJpeg($image, null, $q); + } else { + ImageJpeg($image, $filename, $q); + } + + ImageDestroy($image); + } + + //---------------------------------------------------------------------- + private static function image($frame, $pixelPerPoint = 4, $outerFrame = 4) + { + $h = count($frame); + $w = strlen($frame[0]); + + $imgW = $w + 2*$outerFrame; + $imgH = $h + 2*$outerFrame; + + $base_image =ImageCreate($imgW, $imgH); + + $col[0] = ImageColorAllocate($base_image,255,255,255); + $col[1] = ImageColorAllocate($base_image,0,0,0); + + imagefill($base_image, 0, 0, $col[0]); + + for($y=0; $y<$h; $y++) { + for($x=0; $x<$w; $x++) { + if ($frame[$y][$x] == '1') { + ImageSetPixel($base_image,$x+$outerFrame,$y+$outerFrame,$col[1]); + } + } + } + + $target_image =ImageCreate($imgW * $pixelPerPoint, $imgH * $pixelPerPoint); + ImageCopyResized($target_image, $base_image, 0, 0, 0, 0, $imgW * $pixelPerPoint, $imgH * $pixelPerPoint, $imgW, $imgH); + ImageDestroy($base_image); + + return $target_image; + } + } \ No newline at end of file diff --git a/admin/phpqrcode/qrinput.php b/admin/phpqrcode/qrinput.php new file mode 100644 index 0000000..0f6d7f9 --- /dev/null +++ b/admin/phpqrcode/qrinput.php @@ -0,0 +1,729 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('STRUCTURE_HEADER_BITS', 20); + define('MAX_STRUCTURED_SYMBOLS', 16); + + class QRinputItem { + + public $mode; + public $size; + public $data; + public $bstream; + + public function __construct($mode, $size, $data, $bstream = null) + { + $setData = array_slice($data, 0, $size); + + if (count($setData) < $size) { + $setData = array_merge($setData, array_fill(0,$size-count($setData),0)); + } + + if(!QRinput::check($mode, $size, $setData)) { + throw new Exception('Error m:'.$mode.',s:'.$size.',d:'.join(',',$setData)); + return null; + } + + $this->mode = $mode; + $this->size = $size; + $this->data = $setData; + $this->bstream = $bstream; + } + + //---------------------------------------------------------------------- + public function encodeModeNum($version) + { + try { + + $words = (int)($this->size / 3); + $bs = new QRbitstream(); + + $val = 0x1; + $bs->appendNum(4, $val); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_NUM, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (ord($this->data[$i*3 ]) - ord('0')) * 100; + $val += (ord($this->data[$i*3+1]) - ord('0')) * 10; + $val += (ord($this->data[$i*3+2]) - ord('0')); + $bs->appendNum(10, $val); + } + + if($this->size - $words * 3 == 1) { + $val = ord($this->data[$words*3]) - ord('0'); + $bs->appendNum(4, $val); + } else if($this->size - $words * 3 == 2) { + $val = (ord($this->data[$words*3 ]) - ord('0')) * 10; + $val += (ord($this->data[$words*3+1]) - ord('0')); + $bs->appendNum(7, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeAn($version) + { + try { + $words = (int)($this->size / 2); + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x02); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_AN, $version), $this->size); + + for($i=0; $i<$words; $i++) { + $val = (int)QRinput::lookAnTable(ord($this->data[$i*2 ])) * 45; + $val += (int)QRinput::lookAnTable(ord($this->data[$i*2+1])); + + $bs->appendNum(11, $val); + } + + if($this->size & 1) { + $val = QRinput::lookAnTable(ord($this->data[$words * 2])); + $bs->appendNum(6, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeMode8($version) + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x4); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_8, $version), $this->size); + + for($i=0; $i<$this->size; $i++) { + $bs->appendNum(8, ord($this->data[$i])); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeKanji($version) + { + try { + + $bs = new QRbitrtream(); + + $bs->appendNum(4, 0x8); + $bs->appendNum(QRspec::lengthIndicator(QR_MODE_KANJI, $version), (int)($this->size / 2)); + + for($i=0; $i<$this->size; $i+=2) { + $val = (ord($this->data[$i]) << 8) | ord($this->data[$i+1]); + if($val <= 0x9ffc) { + $val -= 0x8140; + } else { + $val -= 0xc140; + } + + $h = ($val >> 8) * 0xc0; + $val = ($val & 0xff) + $h; + + $bs->appendNum(13, $val); + } + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function encodeModeStructure() + { + try { + $bs = new QRbitstream(); + + $bs->appendNum(4, 0x03); + $bs->appendNum(4, ord($this->data[1]) - 1); + $bs->appendNum(4, ord($this->data[0]) - 1); + $bs->appendNum(8, ord($this->data[2])); + + $this->bstream = $bs; + return 0; + + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function estimateBitStreamSizeOfEntry($version) + { + $bits = 0; + + if($version == 0) + $version = 1; + + switch($this->mode) { + case QR_MODE_NUM: $bits = QRinput::estimateBitsModeNum($this->size); break; + case QR_MODE_AN: $bits = QRinput::estimateBitsModeAn($this->size); break; + case QR_MODE_8: $bits = QRinput::estimateBitsMode8($this->size); break; + case QR_MODE_KANJI: $bits = QRinput::estimateBitsModeKanji($this->size);break; + case QR_MODE_STRUCTURE: return STRUCTURE_HEADER_BITS; + default: + return 0; + } + + $l = QRspec::lengthIndicator($this->mode, $version); + $m = 1 << $l; + $num = (int)(($this->size + $m - 1) / $m); + + $bits += $num * (4 + $l); + + return $bits; + } + + //---------------------------------------------------------------------- + public function encodeBitStream($version) + { + try { + + unset($this->bstream); + $words = QRspec::maximumWords($this->mode, $version); + + if($this->size > $words) { + + $st1 = new QRinputItem($this->mode, $words, $this->data); + $st2 = new QRinputItem($this->mode, $this->size - $words, array_slice($this->data, $words)); + + $st1->encodeBitStream($version); + $st2->encodeBitStream($version); + + $this->bstream = new QRbitstream(); + $this->bstream->append($st1->bstream); + $this->bstream->append($st2->bstream); + + unset($st1); + unset($st2); + + } else { + + $ret = 0; + + switch($this->mode) { + case QR_MODE_NUM: $ret = $this->encodeModeNum($version); break; + case QR_MODE_AN: $ret = $this->encodeModeAn($version); break; + case QR_MODE_8: $ret = $this->encodeMode8($version); break; + case QR_MODE_KANJI: $ret = $this->encodeModeKanji($version);break; + case QR_MODE_STRUCTURE: $ret = $this->encodeModeStructure(); break; + + default: + break; + } + + if($ret < 0) + return -1; + } + + return $this->bstream->size(); + + } catch (Exception $e) { + return -1; + } + } + }; + + //########################################################################## + + class QRinput { + + public $items; + + private $version; + private $level; + + //---------------------------------------------------------------------- + public function __construct($version = 0, $level = QR_ECLEVEL_L) + { + if ($version < 0 || $version > QRSPEC_VERSION_MAX || $level > QR_ECLEVEL_H) { + throw new Exception('Invalid version no'); + return NULL; + } + + $this->version = $version; + $this->level = $level; + } + + //---------------------------------------------------------------------- + public function getVersion() + { + return $this->version; + } + + //---------------------------------------------------------------------- + public function setVersion($version) + { + if($version < 0 || $version > QRSPEC_VERSION_MAX) { + throw new Exception('Invalid version no'); + return -1; + } + + $this->version = $version; + + return 0; + } + + //---------------------------------------------------------------------- + public function getErrorCorrectionLevel() + { + return $this->level; + } + + //---------------------------------------------------------------------- + public function setErrorCorrectionLevel($level) + { + if($level > QR_ECLEVEL_H) { + throw new Exception('Invalid ECLEVEL'); + return -1; + } + + $this->level = $level; + + return 0; + } + + //---------------------------------------------------------------------- + public function appendEntry(QRinputItem $entry) + { + $this->items[] = $entry; + } + + //---------------------------------------------------------------------- + public function append($mode, $size, $data) + { + try { + $entry = new QRinputItem($mode, $size, $data); + $this->items[] = $entry; + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + + public function insertStructuredAppendHeader($size, $index, $parity) + { + if( $size > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong size'); + } + + if( $index <= 0 || $index > MAX_STRUCTURED_SYMBOLS ) { + throw new Exception('insertStructuredAppendHeader wrong index'); + } + + $buf = array($size, $index, $parity); + + try { + $entry = new QRinputItem(QR_MODE_STRUCTURE, 3, buf); + array_unshift($this->items, $entry); + return 0; + } catch (Exception $e) { + return -1; + } + } + + //---------------------------------------------------------------------- + public function calcParity() + { + $parity = 0; + + foreach($this->items as $item) { + if($item->mode != QR_MODE_STRUCTURE) { + for($i=$item->size-1; $i>=0; $i--) { + $parity ^= $item->data[$i]; + } + } + } + + return $parity; + } + + //---------------------------------------------------------------------- + public static function checkModeNum($size, $data) + { + for($i=0; $i<$size; $i++) { + if((ord($data[$i]) < ord('0')) || (ord($data[$i]) > ord('9'))){ + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeNum($size) + { + $w = (int)$size / 3; + $bits = $w * 10; + + switch($size - $w * 3) { + case 1: + $bits += 4; + break; + case 2: + $bits += 7; + break; + default: + break; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static $anTable = array( + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + 36, -1, -1, -1, 37, 38, -1, -1, -1, -1, 39, 40, -1, 41, 42, 43, + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 44, -1, -1, -1, -1, -1, + -1, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 + ); + + //---------------------------------------------------------------------- + public static function lookAnTable($c) + { + return (($c > 127)?-1:self::$anTable[$c]); + } + + //---------------------------------------------------------------------- + public static function checkModeAn($size, $data) + { + for($i=0; $i<$size; $i++) { + if (self::lookAnTable(ord($data[$i])) == -1) { + return false; + } + } + + return true; + } + + //---------------------------------------------------------------------- + public static function estimateBitsModeAn($size) + { + $w = (int)($size / 2); + $bits = $w * 11; + + if($size & 1) { + $bits += 6; + } + + return $bits; + } + + //---------------------------------------------------------------------- + public static function estimateBitsMode8($size) + { + return $size * 8; + } + + //---------------------------------------------------------------------- + public function estimateBitsModeKanji($size) + { + return (int)(($size / 2) * 13); + } + + //---------------------------------------------------------------------- + public static function checkModeKanji($size, $data) + { + if($size & 1) + return false; + + for($i=0; $i<$size; $i+=2) { + $val = (ord($data[$i]) << 8) | ord($data[$i+1]); + if( $val < 0x8140 + || ($val > 0x9ffc && $val < 0xe040) + || $val > 0xebbf) { + return false; + } + } + + return true; + } + + /*********************************************************************** + * Validation + **********************************************************************/ + + public static function check($mode, $size, $data) + { + if($size <= 0) + return false; + + switch($mode) { + case QR_MODE_NUM: return self::checkModeNum($size, $data); break; + case QR_MODE_AN: return self::checkModeAn($size, $data); break; + case QR_MODE_KANJI: return self::checkModeKanji($size, $data); break; + case QR_MODE_8: return true; break; + case QR_MODE_STRUCTURE: return true; break; + + default: + break; + } + + return false; + } + + + //---------------------------------------------------------------------- + public function estimateBitStreamSize($version) + { + $bits = 0; + + foreach($this->items as $item) { + $bits += $item->estimateBitStreamSizeOfEntry($version); + } + + return $bits; + } + + //---------------------------------------------------------------------- + public function estimateVersion() + { + $version = 0; + $prev = 0; + do { + $prev = $version; + $bits = $this->estimateBitStreamSize($prev); + $version = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if ($version < 0) { + return -1; + } + } while ($version > $prev); + + return $version; + } + + //---------------------------------------------------------------------- + public static function lengthOfCode($mode, $version, $bits) + { + $payload = $bits - 4 - QRspec::lengthIndicator($mode, $version); + switch($mode) { + case QR_MODE_NUM: + $chunks = (int)($payload / 10); + $remain = $payload - $chunks * 10; + $size = $chunks * 3; + if($remain >= 7) { + $size += 2; + } else if($remain >= 4) { + $size += 1; + } + break; + case QR_MODE_AN: + $chunks = (int)($payload / 11); + $remain = $payload - $chunks * 11; + $size = $chunks * 2; + if($remain >= 6) + $size++; + break; + case QR_MODE_8: + $size = (int)($payload / 8); + break; + case QR_MODE_KANJI: + $size = (int)(($payload / 13) * 2); + break; + case QR_MODE_STRUCTURE: + $size = (int)($payload / 8); + break; + default: + $size = 0; + break; + } + + $maxsize = QRspec::maximumWords($mode, $version); + if($size < 0) $size = 0; + if($size > $maxsize) $size = $maxsize; + + return $size; + } + + //---------------------------------------------------------------------- + public function createBitStream() + { + $total = 0; + + foreach($this->items as $item) { + $bits = $item->encodeBitStream($this->version); + + if($bits < 0) + return -1; + + $total += $bits; + } + + return $total; + } + + //---------------------------------------------------------------------- + public function convertData() + { + $ver = $this->estimateVersion(); + if($ver > $this->getVersion()) { + $this->setVersion($ver); + } + + for(;;) { + $bits = $this->createBitStream(); + + if($bits < 0) + return -1; + + $ver = QRspec::getMinimumVersion((int)(($bits + 7) / 8), $this->level); + if($ver < 0) { + throw new Exception('WRONG VERSION'); + return -1; + } else if($ver > $this->getVersion()) { + $this->setVersion($ver); + } else { + break; + } + } + + return 0; + } + + //---------------------------------------------------------------------- + public function appendPaddingBit(&$bstream) + { + $bits = $bstream->size(); + $maxwords = QRspec::getDataLength($this->version, $this->level); + $maxbits = $maxwords * 8; + + if ($maxbits == $bits) { + return 0; + } + + if ($maxbits - $bits < 5) { + return $bstream->appendNum($maxbits - $bits, 0); + } + + $bits += 4; + $words = (int)(($bits + 7) / 8); + + $padding = new QRbitstream(); + $ret = $padding->appendNum($words * 8 - $bits + 4, 0); + + if($ret < 0) + return $ret; + + $padlen = $maxwords - $words; + + if($padlen > 0) { + + $padbuf = array(); + for($i=0; $i<$padlen; $i++) { + $padbuf[$i] = ($i&1)?0x11:0xec; + } + + $ret = $padding->appendBytes($padlen, $padbuf); + + if($ret < 0) + return $ret; + + } + + $ret = $bstream->append($padding); + + return $ret; + } + + //---------------------------------------------------------------------- + public function mergeBitStream() + { + if($this->convertData() < 0) { + return null; + } + + $bstream = new QRbitstream(); + + foreach($this->items as $item) { + $ret = $bstream->append($item->bstream); + if($ret < 0) { + return null; + } + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getBitStream() + { + + $bstream = $this->mergeBitStream(); + + if($bstream == null) { + return null; + } + + $ret = $this->appendPaddingBit($bstream); + if($ret < 0) { + return null; + } + + return $bstream; + } + + //---------------------------------------------------------------------- + public function getByteStream() + { + $bstream = $this->getBitStream(); + if($bstream == null) { + return null; + } + + return $bstream->toByte(); + } + } + + + \ No newline at end of file diff --git a/admin/phpqrcode/qrlib.php b/admin/phpqrcode/qrlib.php new file mode 100644 index 0000000..d55c4af --- /dev/null +++ b/admin/phpqrcode/qrlib.php @@ -0,0 +1,43 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; + + // Required libs + + include $QR_BASEDIR."qrconst.php"; + include $QR_BASEDIR."qrconfig.php"; + include $QR_BASEDIR."qrtools.php"; + include $QR_BASEDIR."qrspec.php"; + include $QR_BASEDIR."qrimage.php"; + include $QR_BASEDIR."qrinput.php"; + include $QR_BASEDIR."qrbitstream.php"; + include $QR_BASEDIR."qrsplit.php"; + include $QR_BASEDIR."qrrscode.php"; + include $QR_BASEDIR."qrmask.php"; + include $QR_BASEDIR."qrencode.php"; + diff --git a/admin/phpqrcode/qrmask.php b/admin/phpqrcode/qrmask.php new file mode 100644 index 0000000..b14d7ae --- /dev/null +++ b/admin/phpqrcode/qrmask.php @@ -0,0 +1,328 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('N1', 3); + define('N2', 3); + define('N3', 40); + define('N4', 10); + + class QRmask { + + public $runLength = array(); + + //---------------------------------------------------------------------- + public function __construct() + { + $this->runLength = array_fill(0, QRSPEC_WIDTH_MAX + 1, 0); + } + + //---------------------------------------------------------------------- + public function writeFormatInformation($width, &$frame, $mask, $level) + { + $blacks = 0; + $format = QRspec::getFormatInfo($mask, $level); + + for($i=0; $i<8; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[8][$width - 1 - $i] = chr($v); + if($i < 6) { + $frame[$i][8] = chr($v); + } else { + $frame[$i + 1][8] = chr($v); + } + $format = $format >> 1; + } + + for($i=0; $i<7; $i++) { + if($format & 1) { + $blacks += 2; + $v = 0x85; + } else { + $v = 0x84; + } + + $frame[$width - 7 + $i][8] = chr($v); + if($i == 0) { + $frame[8][7] = chr($v); + } else { + $frame[8][6 - $i] = chr($v); + } + + $format = $format >> 1; + } + + return $blacks; + } + + //---------------------------------------------------------------------- + public function mask0($x, $y) { return ($x+$y)&1; } + public function mask1($x, $y) { return ($y&1); } + public function mask2($x, $y) { return ($x%3); } + public function mask3($x, $y) { return ($x+$y)%3; } + public function mask4($x, $y) { return (((int)($y/2))+((int)($x/3)))&1; } + public function mask5($x, $y) { return (($x*$y)&1)+($x*$y)%3; } + public function mask6($x, $y) { return ((($x*$y)&1)+($x*$y)%3)&1; } + public function mask7($x, $y) { return ((($x*$y)%3)+(($x+$y)&1))&1; } + + //---------------------------------------------------------------------- + private function generateMaskNo($maskNo, $width, $frame) + { + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if(ord($frame[$y][$x]) & 0x80) { + $bitMask[$y][$x] = 0; + } else { + $maskFunc = call_user_func(array($this, 'mask'.$maskNo), $x, $y); + $bitMask[$y][$x] = ($maskFunc == 0)?1:0; + } + + } + } + + return $bitMask; + } + + //---------------------------------------------------------------------- + public static function serial($bitFrame) + { + $codeArr = array(); + + foreach ($bitFrame as $line) + $codeArr[] = join('', $line); + + return gzcompress(join("\n", $codeArr), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + $codeArr = array(); + + $codeLines = explode("\n", gzuncompress($code)); + foreach ($codeLines as $line) + $codeArr[] = str_split($line); + + return $codeArr; + } + + //---------------------------------------------------------------------- + public function makeMaskNo($maskNo, $width, $s, &$d, $maskGenOnly = false) + { + $b = 0; + $bitMask = array(); + + $fileName = QR_CACHE_DIR.'mask_'.$maskNo.DIRECTORY_SEPARATOR.'mask_'.$width.'_'.$maskNo.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + $bitMask = self::unserial(file_get_contents($fileName)); + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + if (!file_exists(QR_CACHE_DIR.'mask_'.$maskNo)) + mkdir(QR_CACHE_DIR.'mask_'.$maskNo); + file_put_contents($fileName, self::serial($bitMask)); + } + } else { + $bitMask = $this->generateMaskNo($maskNo, $width, $s, $d); + } + + if ($maskGenOnly) + return; + + $d = $s; + + for($y=0; $y<$width; $y++) { + for($x=0; $x<$width; $x++) { + if($bitMask[$y][$x] == 1) { + $d[$y][$x] = chr(ord($s[$y][$x]) ^ (int)$bitMask[$y][$x]); + } + $b += (int)(ord($d[$y][$x]) & 1); + } + } + + return $b; + } + + //---------------------------------------------------------------------- + public function makeMask($width, $frame, $maskNo, $level) + { + $masked = array_fill(0, $width, str_repeat("\0", $width)); + $this->makeMaskNo($maskNo, $width, $frame, $masked); + $this->writeFormatInformation($width, $masked, $maskNo, $level); + + return $masked; + } + + //---------------------------------------------------------------------- + public function calcN1N3($length) + { + $demerit = 0; + + for($i=0; $i<$length; $i++) { + + if($this->runLength[$i] >= 5) { + $demerit += (N1 + ($this->runLength[$i] - 5)); + } + if($i & 1) { + if(($i >= 3) && ($i < ($length-2)) && ($this->runLength[$i] % 3 == 0)) { + $fact = (int)($this->runLength[$i] / 3); + if(($this->runLength[$i-2] == $fact) && + ($this->runLength[$i-1] == $fact) && + ($this->runLength[$i+1] == $fact) && + ($this->runLength[$i+2] == $fact)) { + if(($this->runLength[$i-3] < 0) || ($this->runLength[$i-3] >= (4 * $fact))) { + $demerit += N3; + } else if((($i+3) >= $length) || ($this->runLength[$i+3] >= (4 * $fact))) { + $demerit += N3; + } + } + } + } + } + return $demerit; + } + + //---------------------------------------------------------------------- + public function evaluateSymbol($width, $frame) + { + $head = 0; + $demerit = 0; + + for($y=0; $y<$width; $y++) { + $head = 0; + $this->runLength[0] = 1; + + $frameY = $frame[$y]; + + if ($y>0) + $frameYM = $frame[$y-1]; + + for($x=0; $x<$width; $x++) { + if(($x > 0) && ($y > 0)) { + $b22 = ord($frameY[$x]) & ord($frameY[$x-1]) & ord($frameYM[$x]) & ord($frameYM[$x-1]); + $w22 = ord($frameY[$x]) | ord($frameY[$x-1]) | ord($frameYM[$x]) | ord($frameYM[$x-1]); + + if(($b22 | ($w22 ^ 1))&1) { + $demerit += N2; + } + } + if(($x == 0) && (ord($frameY[$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($x > 0) { + if((ord($frameY[$x]) ^ ord($frameY[$x-1])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + for($x=0; $x<$width; $x++) { + $head = 0; + $this->runLength[0] = 1; + + for($y=0; $y<$width; $y++) { + if($y == 0 && (ord($frame[$y][$x]) & 1)) { + $this->runLength[0] = -1; + $head = 1; + $this->runLength[$head] = 1; + } else if($y > 0) { + if((ord($frame[$y][$x]) ^ ord($frame[$y-1][$x])) & 1) { + $head++; + $this->runLength[$head] = 1; + } else { + $this->runLength[$head]++; + } + } + } + + $demerit += $this->calcN1N3($head+1); + } + + return $demerit; + } + + + //---------------------------------------------------------------------- + public function mask($width, $frame, $level) + { + $minDemerit = PHP_INT_MAX; + $bestMaskNum = 0; + $bestMask = array(); + + $checked_masks = array(0,1,2,3,4,5,6,7); + + if (QR_FIND_FROM_RANDOM !== false) { + + $howManuOut = 8-(QR_FIND_FROM_RANDOM % 9); + for ($i = 0; $i < $howManuOut; $i++) { + $remPos = rand (0, count($checked_masks)-1); + unset($checked_masks[$remPos]); + $checked_masks = array_values($checked_masks); + } + + } + + $bestMask = $frame; + + foreach($checked_masks as $i) { + $mask = array_fill(0, $width, str_repeat("\0", $width)); + + $demerit = 0; + $blacks = 0; + $blacks = $this->makeMaskNo($i, $width, $frame, $mask); + $blacks += $this->writeFormatInformation($width, $mask, $i, $level); + $blacks = (int)(100 * $blacks / ($width * $width)); + $demerit = (int)((int)(abs($blacks - 50) / 5) * N4); + $demerit += $this->evaluateSymbol($width, $mask); + + if($demerit < $minDemerit) { + $minDemerit = $demerit; + $bestMask = $mask; + $bestMaskNum = $i; + } + } + + return $bestMask; + } + + //---------------------------------------------------------------------- + } diff --git a/admin/phpqrcode/qrrscode.php b/admin/phpqrcode/qrrscode.php new file mode 100644 index 0000000..591129a --- /dev/null +++ b/admin/phpqrcode/qrrscode.php @@ -0,0 +1,210 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRrsItem { + + public $mm; // Bits per symbol + public $nn; // Symbols per block (= (1<= $this->nn) { + $x -= $this->nn; + $x = ($x >> $this->mm) + ($x & $this->nn); + } + + return $x; + } + + //---------------------------------------------------------------------- + public static function init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + // Common code for intializing a Reed-Solomon control block (char or int symbols) + // Copyright 2004 Phil Karn, KA9Q + // May be used under the terms of the GNU Lesser General Public License (LGPL) + + $rs = null; + + // Check parameter ranges + if($symsize < 0 || $symsize > 8) return $rs; + if($fcr < 0 || $fcr >= (1<<$symsize)) return $rs; + if($prim <= 0 || $prim >= (1<<$symsize)) return $rs; + if($nroots < 0 || $nroots >= (1<<$symsize)) return $rs; // Can't have more roots than symbol values! + if($pad < 0 || $pad >= ((1<<$symsize) -1 - $nroots)) return $rs; // Too much padding + + $rs = new QRrsItem(); + $rs->mm = $symsize; + $rs->nn = (1<<$symsize)-1; + $rs->pad = $pad; + + $rs->alpha_to = array_fill(0, $rs->nn+1, 0); + $rs->index_of = array_fill(0, $rs->nn+1, 0); + + // PHP style macro replacement ;) + $NN =& $rs->nn; + $A0 =& $NN; + + // Generate Galois field lookup tables + $rs->index_of[0] = $A0; // log(zero) = -inf + $rs->alpha_to[$A0] = 0; // alpha**-inf = 0 + $sr = 1; + + for($i=0; $i<$rs->nn; $i++) { + $rs->index_of[$sr] = $i; + $rs->alpha_to[$i] = $sr; + $sr <<= 1; + if($sr & (1<<$symsize)) { + $sr ^= $gfpoly; + } + $sr &= $rs->nn; + } + + if($sr != 1){ + // field generator polynomial is not primitive! + $rs = NULL; + return $rs; + } + + /* Form RS code generator polynomial from its roots */ + $rs->genpoly = array_fill(0, $nroots+1, 0); + + $rs->fcr = $fcr; + $rs->prim = $prim; + $rs->nroots = $nroots; + $rs->gfpoly = $gfpoly; + + /* Find prim-th root of 1, used in decoding */ + for($iprim=1;($iprim % $prim) != 0;$iprim += $rs->nn) + ; // intentional empty-body loop! + + $rs->iprim = (int)($iprim / $prim); + $rs->genpoly[0] = 1; + + for ($i = 0,$root=$fcr*$prim; $i < $nroots; $i++, $root += $prim) { + $rs->genpoly[$i+1] = 1; + + // Multiply rs->genpoly[] by @**(root + x) + for ($j = $i; $j > 0; $j--) { + if ($rs->genpoly[$j] != 0) { + $rs->genpoly[$j] = $rs->genpoly[$j-1] ^ $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[$j]] + $root)]; + } else { + $rs->genpoly[$j] = $rs->genpoly[$j-1]; + } + } + // rs->genpoly[0] can never be zero + $rs->genpoly[0] = $rs->alpha_to[$rs->modnn($rs->index_of[$rs->genpoly[0]] + $root)]; + } + + // convert rs->genpoly[] to index form for quicker encoding + for ($i = 0; $i <= $nroots; $i++) + $rs->genpoly[$i] = $rs->index_of[$rs->genpoly[$i]]; + + return $rs; + } + + //---------------------------------------------------------------------- + public function encode_rs_char($data, &$parity) + { + $MM =& $this->mm; + $NN =& $this->nn; + $ALPHA_TO =& $this->alpha_to; + $INDEX_OF =& $this->index_of; + $GENPOLY =& $this->genpoly; + $NROOTS =& $this->nroots; + $FCR =& $this->fcr; + $PRIM =& $this->prim; + $IPRIM =& $this->iprim; + $PAD =& $this->pad; + $A0 =& $NN; + + $parity = array_fill(0, $NROOTS, 0); + + for($i=0; $i< ($NN-$NROOTS-$PAD); $i++) { + + $feedback = $INDEX_OF[$data[$i] ^ $parity[0]]; + if($feedback != $A0) { + // feedback term is non-zero + + // This line is unnecessary when GENPOLY[NROOTS] is unity, as it must + // always be for the polynomials constructed by init_rs() + $feedback = $this->modnn($NN - $GENPOLY[$NROOTS] + $feedback); + + for($j=1;$j<$NROOTS;$j++) { + $parity[$j] ^= $ALPHA_TO[$this->modnn($feedback + $GENPOLY[$NROOTS-$j])]; + } + } + + // Shift + array_shift($parity); + if($feedback != $A0) { + array_push($parity, $ALPHA_TO[$this->modnn($feedback + $GENPOLY[0])]); + } else { + array_push($parity, 0); + } + } + } + } + + //########################################################################## + + class QRrs { + + public static $items = array(); + + //---------------------------------------------------------------------- + public static function init_rs($symsize, $gfpoly, $fcr, $prim, $nroots, $pad) + { + foreach(self::$items as $rs) { + if($rs->pad != $pad) continue; + if($rs->nroots != $nroots) continue; + if($rs->mm != $symsize) continue; + if($rs->gfpoly != $gfpoly) continue; + if($rs->fcr != $fcr) continue; + if($rs->prim != $prim) continue; + + return $rs; + } + + $rs = QRrsItem::init_rs_char($symsize, $gfpoly, $fcr, $prim, $nroots, $pad); + array_unshift(self::$items, $rs); + + return $rs; + } + } \ No newline at end of file diff --git a/admin/phpqrcode/qrspec.php b/admin/phpqrcode/qrspec.php new file mode 100644 index 0000000..92aea0c --- /dev/null +++ b/admin/phpqrcode/qrspec.php @@ -0,0 +1,592 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + define('QRSPEC_VERSION_MAX', 40); + define('QRSPEC_WIDTH_MAX', 177); + + define('QRCAP_WIDTH', 0); + define('QRCAP_WORDS', 1); + define('QRCAP_REMINDER', 2); + define('QRCAP_EC', 3); + + class QRspec { + + public static $capacity = array( + array( 0, 0, 0, array( 0, 0, 0, 0)), + array( 21, 26, 0, array( 7, 10, 13, 17)), // 1 + array( 25, 44, 7, array( 10, 16, 22, 28)), + array( 29, 70, 7, array( 15, 26, 36, 44)), + array( 33, 100, 7, array( 20, 36, 52, 64)), + array( 37, 134, 7, array( 26, 48, 72, 88)), // 5 + array( 41, 172, 7, array( 36, 64, 96, 112)), + array( 45, 196, 0, array( 40, 72, 108, 130)), + array( 49, 242, 0, array( 48, 88, 132, 156)), + array( 53, 292, 0, array( 60, 110, 160, 192)), + array( 57, 346, 0, array( 72, 130, 192, 224)), //10 + array( 61, 404, 0, array( 80, 150, 224, 264)), + array( 65, 466, 0, array( 96, 176, 260, 308)), + array( 69, 532, 0, array( 104, 198, 288, 352)), + array( 73, 581, 3, array( 120, 216, 320, 384)), + array( 77, 655, 3, array( 132, 240, 360, 432)), //15 + array( 81, 733, 3, array( 144, 280, 408, 480)), + array( 85, 815, 3, array( 168, 308, 448, 532)), + array( 89, 901, 3, array( 180, 338, 504, 588)), + array( 93, 991, 3, array( 196, 364, 546, 650)), + array( 97, 1085, 3, array( 224, 416, 600, 700)), //20 + array(101, 1156, 4, array( 224, 442, 644, 750)), + array(105, 1258, 4, array( 252, 476, 690, 816)), + array(109, 1364, 4, array( 270, 504, 750, 900)), + array(113, 1474, 4, array( 300, 560, 810, 960)), + array(117, 1588, 4, array( 312, 588, 870, 1050)), //25 + array(121, 1706, 4, array( 336, 644, 952, 1110)), + array(125, 1828, 4, array( 360, 700, 1020, 1200)), + array(129, 1921, 3, array( 390, 728, 1050, 1260)), + array(133, 2051, 3, array( 420, 784, 1140, 1350)), + array(137, 2185, 3, array( 450, 812, 1200, 1440)), //30 + array(141, 2323, 3, array( 480, 868, 1290, 1530)), + array(145, 2465, 3, array( 510, 924, 1350, 1620)), + array(149, 2611, 3, array( 540, 980, 1440, 1710)), + array(153, 2761, 3, array( 570, 1036, 1530, 1800)), + array(157, 2876, 0, array( 570, 1064, 1590, 1890)), //35 + array(161, 3034, 0, array( 600, 1120, 1680, 1980)), + array(165, 3196, 0, array( 630, 1204, 1770, 2100)), + array(169, 3362, 0, array( 660, 1260, 1860, 2220)), + array(173, 3532, 0, array( 720, 1316, 1950, 2310)), + array(177, 3706, 0, array( 750, 1372, 2040, 2430)) //40 + ); + + //---------------------------------------------------------------------- + public static function getDataLength($version, $level) + { + return self::$capacity[$version][QRCAP_WORDS] - self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getECCLength($version, $level) + { + return self::$capacity[$version][QRCAP_EC][$level]; + } + + //---------------------------------------------------------------------- + public static function getWidth($version) + { + return self::$capacity[$version][QRCAP_WIDTH]; + } + + //---------------------------------------------------------------------- + public static function getRemainder($version) + { + return self::$capacity[$version][QRCAP_REMINDER]; + } + + //---------------------------------------------------------------------- + public static function getMinimumVersion($size, $level) + { + + for($i=1; $i<= QRSPEC_VERSION_MAX; $i++) { + $words = self::$capacity[$i][QRCAP_WORDS] - self::$capacity[$i][QRCAP_EC][$level]; + if($words >= $size) + return $i; + } + + return -1; + } + + //###################################################################### + + public static $lengthTableBits = array( + array(10, 12, 14), + array( 9, 11, 13), + array( 8, 16, 16), + array( 8, 10, 12) + ); + + //---------------------------------------------------------------------- + public static function lengthIndicator($mode, $version) + { + if ($mode == QR_MODE_STRUCTURE) + return 0; + + if ($version <= 9) { + $l = 0; + } else if ($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + return self::$lengthTableBits[$mode][$l]; + } + + //---------------------------------------------------------------------- + public static function maximumWords($mode, $version) + { + if($mode == QR_MODE_STRUCTURE) + return 3; + + if($version <= 9) { + $l = 0; + } else if($version <= 26) { + $l = 1; + } else { + $l = 2; + } + + $bits = self::$lengthTableBits[$mode][$l]; + $words = (1 << $bits) - 1; + + if($mode == QR_MODE_KANJI) { + $words *= 2; // the number of bytes is required + } + + return $words; + } + + // Error correction code ----------------------------------------------- + // Table of the error correction code (Reed-Solomon block) + // See Table 12-16 (pp.30-36), JIS X0510:2004. + + public static $eccTable = array( + array(array( 0, 0), array( 0, 0), array( 0, 0), array( 0, 0)), + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), // 1 + array(array( 1, 0), array( 1, 0), array( 1, 0), array( 1, 0)), + array(array( 1, 0), array( 1, 0), array( 2, 0), array( 2, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 0), array( 4, 0)), + array(array( 1, 0), array( 2, 0), array( 2, 2), array( 2, 2)), // 5 + array(array( 2, 0), array( 4, 0), array( 4, 0), array( 4, 0)), + array(array( 2, 0), array( 4, 0), array( 2, 4), array( 4, 1)), + array(array( 2, 0), array( 2, 2), array( 4, 2), array( 4, 2)), + array(array( 2, 0), array( 3, 2), array( 4, 4), array( 4, 4)), + array(array( 2, 2), array( 4, 1), array( 6, 2), array( 6, 2)), //10 + array(array( 4, 0), array( 1, 4), array( 4, 4), array( 3, 8)), + array(array( 2, 2), array( 6, 2), array( 4, 6), array( 7, 4)), + array(array( 4, 0), array( 8, 1), array( 8, 4), array(12, 4)), + array(array( 3, 1), array( 4, 5), array(11, 5), array(11, 5)), + array(array( 5, 1), array( 5, 5), array( 5, 7), array(11, 7)), //15 + array(array( 5, 1), array( 7, 3), array(15, 2), array( 3, 13)), + array(array( 1, 5), array(10, 1), array( 1, 15), array( 2, 17)), + array(array( 5, 1), array( 9, 4), array(17, 1), array( 2, 19)), + array(array( 3, 4), array( 3, 11), array(17, 4), array( 9, 16)), + array(array( 3, 5), array( 3, 13), array(15, 5), array(15, 10)), //20 + array(array( 4, 4), array(17, 0), array(17, 6), array(19, 6)), + array(array( 2, 7), array(17, 0), array( 7, 16), array(34, 0)), + array(array( 4, 5), array( 4, 14), array(11, 14), array(16, 14)), + array(array( 6, 4), array( 6, 14), array(11, 16), array(30, 2)), + array(array( 8, 4), array( 8, 13), array( 7, 22), array(22, 13)), //25 + array(array(10, 2), array(19, 4), array(28, 6), array(33, 4)), + array(array( 8, 4), array(22, 3), array( 8, 26), array(12, 28)), + array(array( 3, 10), array( 3, 23), array( 4, 31), array(11, 31)), + array(array( 7, 7), array(21, 7), array( 1, 37), array(19, 26)), + array(array( 5, 10), array(19, 10), array(15, 25), array(23, 25)), //30 + array(array(13, 3), array( 2, 29), array(42, 1), array(23, 28)), + array(array(17, 0), array(10, 23), array(10, 35), array(19, 35)), + array(array(17, 1), array(14, 21), array(29, 19), array(11, 46)), + array(array(13, 6), array(14, 23), array(44, 7), array(59, 1)), + array(array(12, 7), array(12, 26), array(39, 14), array(22, 41)), //35 + array(array( 6, 14), array( 6, 34), array(46, 10), array( 2, 64)), + array(array(17, 4), array(29, 14), array(49, 10), array(24, 46)), + array(array( 4, 18), array(13, 32), array(48, 14), array(42, 32)), + array(array(20, 4), array(40, 7), array(43, 22), array(10, 67)), + array(array(19, 6), array(18, 31), array(34, 34), array(20, 61)),//40 + ); + + //---------------------------------------------------------------------- + // CACHEABLE!!! + + public static function getEccSpec($version, $level, array &$spec) + { + if (count($spec) < 5) { + $spec = array(0,0,0,0,0); + } + + $b1 = self::$eccTable[$version][$level][0]; + $b2 = self::$eccTable[$version][$level][1]; + $data = self::getDataLength($version, $level); + $ecc = self::getECCLength($version, $level); + + if($b2 == 0) { + $spec[0] = $b1; + $spec[1] = (int)($data / $b1); + $spec[2] = (int)($ecc / $b1); + $spec[3] = 0; + $spec[4] = 0; + } else { + $spec[0] = $b1; + $spec[1] = (int)($data / ($b1 + $b2)); + $spec[2] = (int)($ecc / ($b1 + $b2)); + $spec[3] = $b2; + $spec[4] = $spec[1] + 1; + } + } + + // Alignment pattern --------------------------------------------------- + + // Positions of alignment patterns. + // This array includes only the second and the third position of the + // alignment patterns. Rest of them can be calculated from the distance + // between them. + + // See Table 1 in Appendix E (pp.71) of JIS X0510:2004. + + public static $alignmentPattern = array( + array( 0, 0), + array( 0, 0), array(18, 0), array(22, 0), array(26, 0), array(30, 0), // 1- 5 + array(34, 0), array(22, 38), array(24, 42), array(26, 46), array(28, 50), // 6-10 + array(30, 54), array(32, 58), array(34, 62), array(26, 46), array(26, 48), //11-15 + array(26, 50), array(30, 54), array(30, 56), array(30, 58), array(34, 62), //16-20 + array(28, 50), array(26, 50), array(30, 54), array(28, 54), array(32, 58), //21-25 + array(30, 58), array(34, 62), array(26, 50), array(30, 54), array(26, 52), //26-30 + array(30, 56), array(34, 60), array(30, 58), array(34, 62), array(30, 54), //31-35 + array(24, 50), array(28, 54), array(32, 58), array(26, 54), array(30, 58), //35-40 + ); + + + /** -------------------------------------------------------------------- + * Put an alignment marker. + * @param frame + * @param width + * @param ox,oy center coordinate of the pattern + */ + public static function putAlignmentMarker(array &$frame, $ox, $oy) + { + $finder = array( + "\xa1\xa1\xa1\xa1\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa0\xa1\xa0\xa1", + "\xa1\xa0\xa0\xa0\xa1", + "\xa1\xa1\xa1\xa1\xa1" + ); + + $yStart = $oy-2; + $xStart = $ox-2; + + for($y=0; $y<5; $y++) { + QRstr::set($frame, $xStart, $yStart+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function putAlignmentPattern($version, &$frame, $width) + { + if($version < 2) + return; + + $d = self::$alignmentPattern[$version][1] - self::$alignmentPattern[$version][0]; + if($d < 0) { + $w = 2; + } else { + $w = (int)(($width - self::$alignmentPattern[$version][0]) / $d + 2); + } + + if($w * $w - 3 == 1) { + $x = self::$alignmentPattern[$version][0]; + $y = self::$alignmentPattern[$version][0]; + self::putAlignmentMarker($frame, $x, $y); + return; + } + + $cx = self::$alignmentPattern[$version][0]; + for($x=1; $x<$w - 1; $x++) { + self::putAlignmentMarker($frame, 6, $cx); + self::putAlignmentMarker($frame, $cx, 6); + $cx += $d; + } + + $cy = self::$alignmentPattern[$version][0]; + for($y=0; $y<$w-1; $y++) { + $cx = self::$alignmentPattern[$version][0]; + for($x=0; $x<$w-1; $x++) { + self::putAlignmentMarker($frame, $cx, $cy); + $cx += $d; + } + $cy += $d; + } + } + + // Version information pattern ----------------------------------------- + + // Version information pattern (BCH coded). + // See Table 1 in Appendix D (pp.68) of JIS X0510:2004. + + // size: [QRSPEC_VERSION_MAX - 6] + + public static $versionPattern = array( + 0x07c94, 0x085bc, 0x09a99, 0x0a4d3, 0x0bbf6, 0x0c762, 0x0d847, 0x0e60d, + 0x0f928, 0x10b78, 0x1145d, 0x12a17, 0x13532, 0x149a6, 0x15683, 0x168c9, + 0x177ec, 0x18ec4, 0x191e1, 0x1afab, 0x1b08e, 0x1cc1a, 0x1d33f, 0x1ed75, + 0x1f250, 0x209d5, 0x216f0, 0x228ba, 0x2379f, 0x24b0b, 0x2542e, 0x26a64, + 0x27541, 0x28c69 + ); + + //---------------------------------------------------------------------- + public static function getVersionPattern($version) + { + if($version < 7 || $version > QRSPEC_VERSION_MAX) + return 0; + + return self::$versionPattern[$version -7]; + } + + // Format information -------------------------------------------------- + // See calcFormatInfo in tests/test_qrspec.c (orginal qrencode c lib) + + public static $formatInfo = array( + array(0x77c4, 0x72f3, 0x7daa, 0x789d, 0x662f, 0x6318, 0x6c41, 0x6976), + array(0x5412, 0x5125, 0x5e7c, 0x5b4b, 0x45f9, 0x40ce, 0x4f97, 0x4aa0), + array(0x355f, 0x3068, 0x3f31, 0x3a06, 0x24b4, 0x2183, 0x2eda, 0x2bed), + array(0x1689, 0x13be, 0x1ce7, 0x19d0, 0x0762, 0x0255, 0x0d0c, 0x083b) + ); + + public static function getFormatInfo($mask, $level) + { + if($mask < 0 || $mask > 7) + return 0; + + if($level < 0 || $level > 3) + return 0; + + return self::$formatInfo[$level][$mask]; + } + + // Frame --------------------------------------------------------------- + // Cache of initial frames. + + public static $frames = array(); + + /** -------------------------------------------------------------------- + * Put a finder pattern. + * @param frame + * @param width + * @param ox,oy upper-left coordinate of the pattern + */ + public static function putFinderPattern(&$frame, $ox, $oy) + { + $finder = array( + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc1\xc1\xc1\xc0\xc1", + "\xc1\xc0\xc0\xc0\xc0\xc0\xc1", + "\xc1\xc1\xc1\xc1\xc1\xc1\xc1" + ); + + for($y=0; $y<7; $y++) { + QRstr::set($frame, $ox, $oy+$y, $finder[$y]); + } + } + + //---------------------------------------------------------------------- + public static function createFrame($version) + { + $width = self::$capacity[$version][QRCAP_WIDTH]; + $frameLine = str_repeat ("\0", $width); + $frame = array_fill(0, $width, $frameLine); + + // Finder pattern + self::putFinderPattern($frame, 0, 0); + self::putFinderPattern($frame, $width - 7, 0); + self::putFinderPattern($frame, 0, $width - 7); + + // Separator + $yOffset = $width - 7; + + for($y=0; $y<7; $y++) { + $frame[$y][7] = "\xc0"; + $frame[$y][$width - 8] = "\xc0"; + $frame[$yOffset][7] = "\xc0"; + $yOffset++; + } + + $setPattern = str_repeat("\xc0", 8); + + QRstr::set($frame, 0, 7, $setPattern); + QRstr::set($frame, $width-8, 7, $setPattern); + QRstr::set($frame, 0, $width - 8, $setPattern); + + // Format info + $setPattern = str_repeat("\x84", 9); + QRstr::set($frame, 0, 8, $setPattern); + QRstr::set($frame, $width - 8, 8, $setPattern, 8); + + $yOffset = $width - 8; + + for($y=0; $y<8; $y++,$yOffset++) { + $frame[$y][8] = "\x84"; + $frame[$yOffset][8] = "\x84"; + } + + // Timing pattern + + for($i=1; $i<$width-15; $i++) { + $frame[6][7+$i] = chr(0x90 | ($i & 1)); + $frame[7+$i][6] = chr(0x90 | ($i & 1)); + } + + // Alignment pattern + self::putAlignmentPattern($version, $frame, $width); + + // Version information + if($version >= 7) { + $vinf = self::getVersionPattern($version); + + $v = $vinf; + + for($x=0; $x<6; $x++) { + for($y=0; $y<3; $y++) { + $frame[($width - 11)+$y][$x] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + + $v = $vinf; + for($y=0; $y<6; $y++) { + for($x=0; $x<3; $x++) { + $frame[$y][$x+($width - 11)] = chr(0x88 | ($v & 1)); + $v = $v >> 1; + } + } + } + + // and a little bit... + $frame[$width - 8][8] = "\x81"; + + return $frame; + } + + //---------------------------------------------------------------------- + public static function debug($frame, $binary_mode = false) + { + if ($binary_mode) { + + foreach ($frame as &$frameLine) { + $frameLine = join('  ', explode('0', $frameLine)); + $frameLine = join('██', explode('1', $frameLine)); + } + + ?> + +


        '; + echo join("
        ", $frame); + echo '






'; + + } else { + + foreach ($frame as &$frameLine) { + $frameLine = join(' ', explode("\xc0", $frameLine)); + $frameLine = join('', explode("\xc1", $frameLine)); + $frameLine = join(' ', explode("\xa0", $frameLine)); + $frameLine = join('', explode("\xa1", $frameLine)); + $frameLine = join('', explode("\x84", $frameLine)); //format 0 + $frameLine = join('', explode("\x85", $frameLine)); //format 1 + $frameLine = join('', explode("\x81", $frameLine)); //special bit + $frameLine = join(' ', explode("\x90", $frameLine)); //clock 0 + $frameLine = join('', explode("\x91", $frameLine)); //clock 1 + $frameLine = join(' ', explode("\x88", $frameLine)); //version + $frameLine = join('', explode("\x89", $frameLine)); //version + $frameLine = join('♦', explode("\x01", $frameLine)); + $frameLine = join('⋅', explode("\0", $frameLine)); + } + + ?> + + "; + echo join("
", $frame); + echo "
"; + + } + } + + //---------------------------------------------------------------------- + public static function serial($frame) + { + return gzcompress(join("\n", $frame), 9); + } + + //---------------------------------------------------------------------- + public static function unserial($code) + { + return explode("\n", gzuncompress($code)); + } + + //---------------------------------------------------------------------- + public static function newFrame($version) + { + if($version < 1 || $version > QRSPEC_VERSION_MAX) + return null; + + if(!isset(self::$frames[$version])) { + + $fileName = QR_CACHE_DIR.'frame_'.$version.'.dat'; + + if (QR_CACHEABLE) { + if (file_exists($fileName)) { + self::$frames[$version] = self::unserial(file_get_contents($fileName)); + } else { + self::$frames[$version] = self::createFrame($version); + file_put_contents($fileName, self::serial(self::$frames[$version])); + } + } else { + self::$frames[$version] = self::createFrame($version); + } + } + + if(is_null(self::$frames[$version])) + return null; + + return self::$frames[$version]; + } + + //---------------------------------------------------------------------- + public static function rsBlockNum($spec) { return $spec[0] + $spec[3]; } + public static function rsBlockNum1($spec) { return $spec[0]; } + public static function rsDataCodes1($spec) { return $spec[1]; } + public static function rsEccCodes1($spec) { return $spec[2]; } + public static function rsBlockNum2($spec) { return $spec[3]; } + public static function rsDataCodes2($spec) { return $spec[4]; } + public static function rsEccCodes2($spec) { return $spec[2]; } + public static function rsDataLength($spec) { return ($spec[0] * $spec[1]) + ($spec[3] * $spec[4]); } + public static function rsEccLength($spec) { return ($spec[0] + $spec[3]) * $spec[2]; } + + } \ No newline at end of file diff --git a/admin/phpqrcode/qrsplit.php b/admin/phpqrcode/qrsplit.php new file mode 100644 index 0000000..d75b827 --- /dev/null +++ b/admin/phpqrcode/qrsplit.php @@ -0,0 +1,311 @@ + + * + * PHP QR Code is distributed under LGPL 3 + * Copyright (C) 2010 Dominik Dzienia + * + * The following data / specifications are taken from + * "Two dimensional symbol -- QR-code -- Basic Specification" (JIS X0510:2004) + * or + * "Automatic identification and data capture techniques -- + * QR Code 2005 bar code symbology specification" (ISO/IEC 18004:2006) + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + class QRsplit { + + public $dataStr = ''; + public $input; + public $modeHint; + + //---------------------------------------------------------------------- + public function __construct($dataStr, $input, $modeHint) + { + $this->dataStr = $dataStr; + $this->input = $input; + $this->modeHint = $modeHint; + } + + //---------------------------------------------------------------------- + public static function isdigitat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return ((ord($str[$pos]) >= ord('0'))&&(ord($str[$pos]) <= ord('9'))); + } + + //---------------------------------------------------------------------- + public static function isalnumat($str, $pos) + { + if ($pos >= strlen($str)) + return false; + + return (QRinput::lookAnTable(ord($str[$pos])) >= 0); + } + + //---------------------------------------------------------------------- + public function identifyMode($pos) + { + if ($pos >= strlen($this->dataStr)) + return QR_MODE_NUL; + + $c = $this->dataStr[$pos]; + + if(self::isdigitat($this->dataStr, $pos)) { + return QR_MODE_NUM; + } else if(self::isalnumat($this->dataStr, $pos)) { + return QR_MODE_AN; + } else if($this->modeHint == QR_MODE_KANJI) { + + if ($pos+1 < strlen($this->dataStr)) + { + $d = $this->dataStr[$pos+1]; + $word = (ord($c) << 8) | ord($d); + if(($word >= 0x8140 && $word <= 0x9ffc) || ($word >= 0xe040 && $word <= 0xebbf)) { + return QR_MODE_KANJI; + } + } + } + + return QR_MODE_8; + } + + //---------------------------------------------------------------------- + public function eatNum() + { + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + while(self::isdigitat($this->dataStr, $p)) { + $p++; + } + + $run = $p; + $mode = $this->identifyMode($p); + + if($mode == QR_MODE_8) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + if($mode == QR_MODE_AN) { + $dif = QRinput::estimateBitsModeNum($run) + 4 + $ln + + QRinput::estimateBitsModeAn(1) // + 4 + la + - QRinput::estimateBitsModeAn($run + 1);// - 4 - la + if($dif > 0) { + return $this->eatAn(); + } + } + + $ret = $this->input->append(QR_MODE_NUM, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatAn() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 0; + + while(self::isalnumat($this->dataStr, $p)) { + if(self::isdigitat($this->dataStr, $p)) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + + $dif = QRinput::estimateBitsModeAn($p) // + 4 + la + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsModeAn($q); // - 4 - la + + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + + if(!self::isalnumat($this->dataStr, $p)) { + $dif = QRinput::estimateBitsModeAn($run) + 4 + $la + + QRinput::estimateBitsMode8(1) // + 4 + l8 + - QRinput::estimateBitsMode8($run + 1); // - 4 - l8 + if($dif > 0) { + return $this->eat8(); + } + } + + $ret = $this->input->append(QR_MODE_AN, $run, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eatKanji() + { + $p = 0; + + while($this->identifyMode($p) == QR_MODE_KANJI) { + $p += 2; + } + + $ret = $this->input->append(QR_MODE_KANJI, $p, str_split($this->dataStr)); + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function eat8() + { + $la = QRspec::lengthIndicator(QR_MODE_AN, $this->input->getVersion()); + $ln = QRspec::lengthIndicator(QR_MODE_NUM, $this->input->getVersion()); + + $p = 1; + $dataStrLen = strlen($this->dataStr); + + while($p < $dataStrLen) { + + $mode = $this->identifyMode($p); + if($mode == QR_MODE_KANJI) { + break; + } + if($mode == QR_MODE_NUM) { + $q = $p; + while(self::isdigitat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeNum($q - $p) + 4 + $ln + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else if($mode == QR_MODE_AN) { + $q = $p; + while(self::isalnumat($this->dataStr, $q)) { + $q++; + } + $dif = QRinput::estimateBitsMode8($p) // + 4 + l8 + + QRinput::estimateBitsModeAn($q - $p) + 4 + $la + - QRinput::estimateBitsMode8($q); // - 4 - l8 + if($dif < 0) { + break; + } else { + $p = $q; + } + } else { + $p++; + } + } + + $run = $p; + $ret = $this->input->append(QR_MODE_8, $run, str_split($this->dataStr)); + + if($ret < 0) + return -1; + + return $run; + } + + //---------------------------------------------------------------------- + public function splitString() + { + while (strlen($this->dataStr) > 0) + { + if($this->dataStr == '') + return 0; + + $mode = $this->identifyMode(0); + + switch ($mode) { + case QR_MODE_NUM: $length = $this->eatNum(); break; + case QR_MODE_AN: $length = $this->eatAn(); break; + case QR_MODE_KANJI: + if ($hint == QR_MODE_KANJI) + $length = $this->eatKanji(); + else $length = $this->eat8(); + break; + default: $length = $this->eat8(); break; + + } + + if($length == 0) return 0; + if($length < 0) return -1; + + $this->dataStr = substr($this->dataStr, $length); + } + } + + //---------------------------------------------------------------------- + public function toUpper() + { + $stringLen = strlen($this->dataStr); + $p = 0; + + while ($p<$stringLen) { + $mode = self::identifyMode(substr($this->dataStr, $p), $this->modeHint); + if($mode == QR_MODE_KANJI) { + $p += 2; + } else { + if (ord($this->dataStr[$p]) >= ord('a') && ord($this->dataStr[$p]) <= ord('z')) { + $this->dataStr[$p] = chr(ord($this->dataStr[$p]) - 32); + } + $p++; + } + } + + return $this->dataStr; + } + + //---------------------------------------------------------------------- + public static function splitStringToQRinput($string, QRinput $input, $modeHint, $casesensitive = true) + { + if(is_null($string) || $string == '\0' || $string == '') { + throw new Exception('empty string!!!'); + } + + $split = new QRsplit($string, $input, $modeHint); + + if(!$casesensitive) + $split->toUpper(); + + return $split->splitString(); + } + } \ No newline at end of file diff --git a/admin/phpqrcode/qrtools.php b/admin/phpqrcode/qrtools.php new file mode 100644 index 0000000..3012db4 --- /dev/null +++ b/admin/phpqrcode/qrtools.php @@ -0,0 +1,172 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + class QRtools { + + //---------------------------------------------------------------------- + public static function binarize($frame) + { + $len = count($frame); + foreach ($frame as &$frameLine) { + + for($i=0; $i<$len; $i++) { + $frameLine[$i] = (ord($frameLine[$i])&1)?'1':'0'; + } + } + + return $frame; + } + + //---------------------------------------------------------------------- + public static function tcpdfBarcodeArray($code, $mode = 'QR,L', $tcPdfVersion = '4.5.037') + { + $barcode_array = array(); + + if (!is_array($mode)) + $mode = explode(',', $mode); + + $eccLevel = 'L'; + + if (count($mode) > 1) { + $eccLevel = $mode[1]; + } + + $qrTab = QRcode::text($code, false, $eccLevel); + $size = count($qrTab); + + $barcode_array['num_rows'] = $size; + $barcode_array['num_cols'] = $size; + $barcode_array['bcode'] = array(); + + foreach ($qrTab as $line) { + $arrAdd = array(); + foreach(str_split($line) as $char) + $arrAdd[] = ($char=='1')?1:0; + $barcode_array['bcode'][] = $arrAdd; + } + + return $barcode_array; + } + + //---------------------------------------------------------------------- + public static function clearCache() + { + self::$frames = array(); + } + + //---------------------------------------------------------------------- + public static function buildCache() + { + QRtools::markTime('before_build_cache'); + + $mask = new QRmask(); + for ($a=1; $a <= QRSPEC_VERSION_MAX; $a++) { + $frame = QRspec::newFrame($a); + if (QR_IMAGE) { + $fileName = QR_CACHE_DIR.'frame_'.$a.'.png'; + QRimage::png(self::binarize($frame), $fileName, 1, 0); + } + + $width = count($frame); + $bitMask = array_fill(0, $width, array_fill(0, $width, 0)); + for ($maskNo=0; $maskNo<8; $maskNo++) + $mask->makeMaskNo($maskNo, $width, $frame, $bitMask, true); + } + + QRtools::markTime('after_build_cache'); + } + + //---------------------------------------------------------------------- + public static function log($outfile, $err) + { + if (QR_LOG_DIR !== false) { + if ($err != '') { + if ($outfile !== false) { + file_put_contents(QR_LOG_DIR.basename($outfile).'-errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } else { + file_put_contents(QR_LOG_DIR.'errors.txt', date('Y-m-d H:i:s').': '.$err, FILE_APPEND); + } + } + } + } + + //---------------------------------------------------------------------- + public static function dumpMask($frame) + { + $width = count($frame); + for($y=0;$y<$width;$y++) { + for($x=0;$x<$width;$x++) { + echo ord($frame[$y][$x]).','; + } + } + } + + //---------------------------------------------------------------------- + public static function markTime($markerId) + { + list($usec, $sec) = explode(" ", microtime()); + $time = ((float)$usec + (float)$sec); + + if (!isset($GLOBALS['qr_time_bench'])) + $GLOBALS['qr_time_bench'] = array(); + + $GLOBALS['qr_time_bench'][$markerId] = $time; + } + + //---------------------------------------------------------------------- + public static function timeBenchmark() + { + self::markTime('finish'); + + $lastTime = 0; + $startTime = 0; + $p = 0; + + echo ' + + '; + + foreach($GLOBALS['qr_time_bench'] as $markerId=>$thisTime) { + if ($p > 0) { + echo ''; + } else { + $startTime = $thisTime; + } + + $p++; + $lastTime = $thisTime; + } + + echo ' + + +
BENCHMARK
till '.$markerId.': '.number_format($thisTime-$lastTime, 6).'s
TOTAL: '.number_format($lastTime-$startTime, 6).'s
'; + } + + } + + //########################################################################## + + QRtools::markTime('start'); + \ No newline at end of file diff --git a/admin/phpqrcode/temp/415.png b/admin/phpqrcode/temp/415.png new file mode 100644 index 0000000..96a4466 Binary files /dev/null and b/admin/phpqrcode/temp/415.png differ diff --git a/admin/phpqrcode/temp/416.png b/admin/phpqrcode/temp/416.png new file mode 100644 index 0000000..eb94519 Binary files /dev/null and b/admin/phpqrcode/temp/416.png differ diff --git a/admin/phpqrcode/temp/417.png b/admin/phpqrcode/temp/417.png new file mode 100644 index 0000000..007167e Binary files /dev/null and b/admin/phpqrcode/temp/417.png differ diff --git a/admin/phpqrcode/temp/418.png b/admin/phpqrcode/temp/418.png new file mode 100644 index 0000000..66f08b7 Binary files /dev/null and b/admin/phpqrcode/temp/418.png differ diff --git a/admin/phpqrcode/temp/420.png b/admin/phpqrcode/temp/420.png new file mode 100644 index 0000000..f96b852 Binary files /dev/null and b/admin/phpqrcode/temp/420.png differ diff --git a/admin/phpqrcode/temp/421.png b/admin/phpqrcode/temp/421.png new file mode 100644 index 0000000..567d989 Binary files /dev/null and b/admin/phpqrcode/temp/421.png differ diff --git a/admin/phpqrcode/temp/433.png b/admin/phpqrcode/temp/433.png new file mode 100644 index 0000000..c164f96 Binary files /dev/null and b/admin/phpqrcode/temp/433.png differ diff --git a/admin/phpqrcode/temp/434.png b/admin/phpqrcode/temp/434.png new file mode 100644 index 0000000..bcd2ce8 Binary files /dev/null and b/admin/phpqrcode/temp/434.png differ diff --git a/admin/phpqrcode/temp/435.png b/admin/phpqrcode/temp/435.png new file mode 100644 index 0000000..61d6286 Binary files /dev/null and b/admin/phpqrcode/temp/435.png differ diff --git a/admin/phpqrcode/temp/436.png b/admin/phpqrcode/temp/436.png new file mode 100644 index 0000000..14c3365 Binary files /dev/null and b/admin/phpqrcode/temp/436.png differ diff --git a/admin/phpqrcode/temp/465.png b/admin/phpqrcode/temp/465.png new file mode 100644 index 0000000..69d7d8c Binary files /dev/null and b/admin/phpqrcode/temp/465.png differ diff --git a/admin/phpqrcode/temp/466.png b/admin/phpqrcode/temp/466.png new file mode 100644 index 0000000..2eba5b0 Binary files /dev/null and b/admin/phpqrcode/temp/466.png differ diff --git a/admin/phpqrcode/temp/468.png b/admin/phpqrcode/temp/468.png new file mode 100644 index 0000000..d51cc19 Binary files /dev/null and b/admin/phpqrcode/temp/468.png differ diff --git a/admin/phpqrcode/temp/469.png b/admin/phpqrcode/temp/469.png new file mode 100644 index 0000000..935ee38 Binary files /dev/null and b/admin/phpqrcode/temp/469.png differ diff --git a/admin/phpqrcode/temp/471.png b/admin/phpqrcode/temp/471.png new file mode 100644 index 0000000..025e1a2 Binary files /dev/null and b/admin/phpqrcode/temp/471.png differ diff --git a/admin/phpqrcode/temp/472.png b/admin/phpqrcode/temp/472.png new file mode 100644 index 0000000..0fc5926 Binary files /dev/null and b/admin/phpqrcode/temp/472.png differ diff --git a/admin/phpqrcode/temp/473.png b/admin/phpqrcode/temp/473.png new file mode 100644 index 0000000..7459463 Binary files /dev/null and b/admin/phpqrcode/temp/473.png differ diff --git a/admin/phpqrcode/temp/501.png b/admin/phpqrcode/temp/501.png new file mode 100644 index 0000000..b0d3777 Binary files /dev/null and b/admin/phpqrcode/temp/501.png differ diff --git a/admin/phpqrcode/temp/502.png b/admin/phpqrcode/temp/502.png new file mode 100644 index 0000000..ffa95d4 Binary files /dev/null and b/admin/phpqrcode/temp/502.png differ diff --git a/admin/phpqrcode/temp/505.png b/admin/phpqrcode/temp/505.png new file mode 100644 index 0000000..0f8e0b3 Binary files /dev/null and b/admin/phpqrcode/temp/505.png differ diff --git a/admin/phpqrcode/temp/512.png b/admin/phpqrcode/temp/512.png new file mode 100644 index 0000000..433e944 Binary files /dev/null and b/admin/phpqrcode/temp/512.png differ diff --git a/admin/phpqrcode/temp/513.png b/admin/phpqrcode/temp/513.png new file mode 100644 index 0000000..67793a4 Binary files /dev/null and b/admin/phpqrcode/temp/513.png differ diff --git a/admin/phpqrcode/temp/514.png b/admin/phpqrcode/temp/514.png new file mode 100644 index 0000000..3945708 Binary files /dev/null and b/admin/phpqrcode/temp/514.png differ diff --git a/admin/phpqrcode/temp/515.png b/admin/phpqrcode/temp/515.png new file mode 100644 index 0000000..657fa6f Binary files /dev/null and b/admin/phpqrcode/temp/515.png differ diff --git a/admin/phpqrcode/temp/519.png b/admin/phpqrcode/temp/519.png new file mode 100644 index 0000000..214f13f Binary files /dev/null and b/admin/phpqrcode/temp/519.png differ diff --git a/admin/phpqrcode/temp/520.png b/admin/phpqrcode/temp/520.png new file mode 100644 index 0000000..08e710c Binary files /dev/null and b/admin/phpqrcode/temp/520.png differ diff --git a/admin/phpqrcode/temp/521.png b/admin/phpqrcode/temp/521.png new file mode 100644 index 0000000..e491eab Binary files /dev/null and b/admin/phpqrcode/temp/521.png differ diff --git a/admin/phpqrcode/temp/522.png b/admin/phpqrcode/temp/522.png new file mode 100644 index 0000000..9c5d782 Binary files /dev/null and b/admin/phpqrcode/temp/522.png differ diff --git a/admin/phpqrcode/temp/523.png b/admin/phpqrcode/temp/523.png new file mode 100644 index 0000000..11ff902 Binary files /dev/null and b/admin/phpqrcode/temp/523.png differ diff --git a/admin/phpqrcode/temp/524.png b/admin/phpqrcode/temp/524.png new file mode 100644 index 0000000..dc2d910 Binary files /dev/null and b/admin/phpqrcode/temp/524.png differ diff --git a/admin/phpqrcode/temp/525.png b/admin/phpqrcode/temp/525.png new file mode 100644 index 0000000..e28dcf0 Binary files /dev/null and b/admin/phpqrcode/temp/525.png differ diff --git a/admin/phpqrcode/temp/526.png b/admin/phpqrcode/temp/526.png new file mode 100644 index 0000000..e8d1ed2 Binary files /dev/null and b/admin/phpqrcode/temp/526.png differ diff --git a/admin/phpqrcode/temp/527.png b/admin/phpqrcode/temp/527.png new file mode 100644 index 0000000..25dcfd5 Binary files /dev/null and b/admin/phpqrcode/temp/527.png differ diff --git a/admin/phpqrcode/temp/528.png b/admin/phpqrcode/temp/528.png new file mode 100644 index 0000000..219a1f8 Binary files /dev/null and b/admin/phpqrcode/temp/528.png differ diff --git a/admin/phpqrcode/temp/547.png b/admin/phpqrcode/temp/547.png new file mode 100644 index 0000000..5c6419c Binary files /dev/null and b/admin/phpqrcode/temp/547.png differ diff --git a/admin/phpqrcode/temp/548.png b/admin/phpqrcode/temp/548.png new file mode 100644 index 0000000..c683cd5 Binary files /dev/null and b/admin/phpqrcode/temp/548.png differ diff --git a/admin/phpqrcode/temp/549.png b/admin/phpqrcode/temp/549.png new file mode 100644 index 0000000..9449c03 Binary files /dev/null and b/admin/phpqrcode/temp/549.png differ diff --git a/admin/phpqrcode/temp/550.png b/admin/phpqrcode/temp/550.png new file mode 100644 index 0000000..bb1a77a Binary files /dev/null and b/admin/phpqrcode/temp/550.png differ diff --git a/admin/phpqrcode/temp/551.png b/admin/phpqrcode/temp/551.png new file mode 100644 index 0000000..53ca975 Binary files /dev/null and b/admin/phpqrcode/temp/551.png differ diff --git a/admin/phpqrcode/temp/552.png b/admin/phpqrcode/temp/552.png new file mode 100644 index 0000000..2d8b0e9 Binary files /dev/null and b/admin/phpqrcode/temp/552.png differ diff --git a/admin/phpqrcode/temp/553.png b/admin/phpqrcode/temp/553.png new file mode 100644 index 0000000..21e46b9 Binary files /dev/null and b/admin/phpqrcode/temp/553.png differ diff --git a/admin/phpqrcode/temp/554.png b/admin/phpqrcode/temp/554.png new file mode 100644 index 0000000..7cda37d Binary files /dev/null and b/admin/phpqrcode/temp/554.png differ diff --git a/admin/phpqrcode/temp/555.png b/admin/phpqrcode/temp/555.png new file mode 100644 index 0000000..3a87fb2 Binary files /dev/null and b/admin/phpqrcode/temp/555.png differ diff --git a/admin/phpqrcode/temp/560.png b/admin/phpqrcode/temp/560.png new file mode 100644 index 0000000..8ccaece Binary files /dev/null and b/admin/phpqrcode/temp/560.png differ diff --git a/admin/phpqrcode/temp/561.png b/admin/phpqrcode/temp/561.png new file mode 100644 index 0000000..c8fa0a3 Binary files /dev/null and b/admin/phpqrcode/temp/561.png differ diff --git a/admin/phpqrcode/temp/562.png b/admin/phpqrcode/temp/562.png new file mode 100644 index 0000000..93a14f1 Binary files /dev/null and b/admin/phpqrcode/temp/562.png differ diff --git a/admin/phpqrcode/temp/565.png b/admin/phpqrcode/temp/565.png new file mode 100644 index 0000000..5afe339 Binary files /dev/null and b/admin/phpqrcode/temp/565.png differ diff --git a/admin/phpqrcode/temp/566.png b/admin/phpqrcode/temp/566.png new file mode 100644 index 0000000..3c02f29 Binary files /dev/null and b/admin/phpqrcode/temp/566.png differ diff --git a/admin/phpqrcode/temp/567.png b/admin/phpqrcode/temp/567.png new file mode 100644 index 0000000..69b46f6 Binary files /dev/null and b/admin/phpqrcode/temp/567.png differ diff --git a/admin/phpqrcode/temp/568.png b/admin/phpqrcode/temp/568.png new file mode 100644 index 0000000..72a3c95 Binary files /dev/null and b/admin/phpqrcode/temp/568.png differ diff --git a/admin/phpqrcode/temp/569.png b/admin/phpqrcode/temp/569.png new file mode 100644 index 0000000..79d9726 Binary files /dev/null and b/admin/phpqrcode/temp/569.png differ diff --git a/admin/phpqrcode/temp/570.png b/admin/phpqrcode/temp/570.png new file mode 100644 index 0000000..e5d80eb Binary files /dev/null and b/admin/phpqrcode/temp/570.png differ diff --git a/admin/phpqrcode/temp/571.png b/admin/phpqrcode/temp/571.png new file mode 100644 index 0000000..a5053af Binary files /dev/null and b/admin/phpqrcode/temp/571.png differ diff --git a/admin/phpqrcode/temp/572.png b/admin/phpqrcode/temp/572.png new file mode 100644 index 0000000..8352e3c Binary files /dev/null and b/admin/phpqrcode/temp/572.png differ diff --git a/admin/phpqrcode/temp/573.png b/admin/phpqrcode/temp/573.png new file mode 100644 index 0000000..90df043 Binary files /dev/null and b/admin/phpqrcode/temp/573.png differ diff --git a/admin/phpqrcode/temp/579.png b/admin/phpqrcode/temp/579.png new file mode 100644 index 0000000..4515641 Binary files /dev/null and b/admin/phpqrcode/temp/579.png differ diff --git a/admin/phpqrcode/temp/580.png b/admin/phpqrcode/temp/580.png new file mode 100644 index 0000000..27994d8 Binary files /dev/null and b/admin/phpqrcode/temp/580.png differ diff --git a/admin/phpqrcode/temp/581.png b/admin/phpqrcode/temp/581.png new file mode 100644 index 0000000..b08de90 Binary files /dev/null and b/admin/phpqrcode/temp/581.png differ diff --git a/admin/phpqrcode/temp/582.png b/admin/phpqrcode/temp/582.png new file mode 100644 index 0000000..cd4b13c Binary files /dev/null and b/admin/phpqrcode/temp/582.png differ diff --git a/admin/phpqrcode/temp/584.png b/admin/phpqrcode/temp/584.png new file mode 100644 index 0000000..42a7885 Binary files /dev/null and b/admin/phpqrcode/temp/584.png differ diff --git a/admin/phpqrcode/temp/6038.png b/admin/phpqrcode/temp/6038.png new file mode 100644 index 0000000..36f41ed Binary files /dev/null and b/admin/phpqrcode/temp/6038.png differ diff --git a/admin/phpqrcode/temp/614.png b/admin/phpqrcode/temp/614.png new file mode 100644 index 0000000..33a7d96 Binary files /dev/null and b/admin/phpqrcode/temp/614.png differ diff --git a/admin/phpqrcode/temp/615.png b/admin/phpqrcode/temp/615.png new file mode 100644 index 0000000..26bf85e Binary files /dev/null and b/admin/phpqrcode/temp/615.png differ diff --git a/admin/phpqrcode/temp/6174.png b/admin/phpqrcode/temp/6174.png new file mode 100644 index 0000000..01a4db6 Binary files /dev/null and b/admin/phpqrcode/temp/6174.png differ diff --git a/admin/phpqrcode/temp/6175.png b/admin/phpqrcode/temp/6175.png new file mode 100644 index 0000000..edc4f9e Binary files /dev/null and b/admin/phpqrcode/temp/6175.png differ diff --git a/admin/phpqrcode/temp/6176.png b/admin/phpqrcode/temp/6176.png new file mode 100644 index 0000000..33bd8ba Binary files /dev/null and b/admin/phpqrcode/temp/6176.png differ diff --git a/admin/phpqrcode/temp/6177.png b/admin/phpqrcode/temp/6177.png new file mode 100644 index 0000000..2a6de15 Binary files /dev/null and b/admin/phpqrcode/temp/6177.png differ diff --git a/admin/phpqrcode/temp/6178.png b/admin/phpqrcode/temp/6178.png new file mode 100644 index 0000000..8c1409e Binary files /dev/null and b/admin/phpqrcode/temp/6178.png differ diff --git a/admin/phpqrcode/temp/6179.png b/admin/phpqrcode/temp/6179.png new file mode 100644 index 0000000..b607620 Binary files /dev/null and b/admin/phpqrcode/temp/6179.png differ diff --git a/admin/phpqrcode/temp/6180.png b/admin/phpqrcode/temp/6180.png new file mode 100644 index 0000000..632076d Binary files /dev/null and b/admin/phpqrcode/temp/6180.png differ diff --git a/admin/phpqrcode/temp/6181.png b/admin/phpqrcode/temp/6181.png new file mode 100644 index 0000000..b2661df Binary files /dev/null and b/admin/phpqrcode/temp/6181.png differ diff --git a/admin/phpqrcode/temp/6182.png b/admin/phpqrcode/temp/6182.png new file mode 100644 index 0000000..eb255f6 Binary files /dev/null and b/admin/phpqrcode/temp/6182.png differ diff --git a/admin/phpqrcode/temp/619.png b/admin/phpqrcode/temp/619.png new file mode 100644 index 0000000..7dfe088 Binary files /dev/null and b/admin/phpqrcode/temp/619.png differ diff --git a/admin/phpqrcode/temp/620.png b/admin/phpqrcode/temp/620.png new file mode 100644 index 0000000..b7e1367 Binary files /dev/null and b/admin/phpqrcode/temp/620.png differ diff --git a/admin/phpqrcode/temp/6232.png b/admin/phpqrcode/temp/6232.png new file mode 100644 index 0000000..cc8ba8a Binary files /dev/null and b/admin/phpqrcode/temp/6232.png differ diff --git a/admin/phpqrcode/temp/927.png b/admin/phpqrcode/temp/927.png new file mode 100644 index 0000000..13f361c Binary files /dev/null and b/admin/phpqrcode/temp/927.png differ diff --git a/admin/phpqrcode/temp/928.png b/admin/phpqrcode/temp/928.png new file mode 100644 index 0000000..007db4c Binary files /dev/null and b/admin/phpqrcode/temp/928.png differ diff --git a/admin/phpqrcode/temp/929.png b/admin/phpqrcode/temp/929.png new file mode 100644 index 0000000..e62a09d Binary files /dev/null and b/admin/phpqrcode/temp/929.png differ diff --git a/admin/phpqrcode/temp/930.png b/admin/phpqrcode/temp/930.png new file mode 100644 index 0000000..94d9110 Binary files /dev/null and b/admin/phpqrcode/temp/930.png differ diff --git a/admin/phpqrcode/temp/931.png b/admin/phpqrcode/temp/931.png new file mode 100644 index 0000000..298f1cf Binary files /dev/null and b/admin/phpqrcode/temp/931.png differ diff --git a/admin/phpqrcode/temp/932.png b/admin/phpqrcode/temp/932.png new file mode 100644 index 0000000..fec8b35 Binary files /dev/null and b/admin/phpqrcode/temp/932.png differ diff --git a/admin/phpqrcode/temp/933.png b/admin/phpqrcode/temp/933.png new file mode 100644 index 0000000..992d592 Binary files /dev/null and b/admin/phpqrcode/temp/933.png differ diff --git a/admin/phpqrcode/temp/934.png b/admin/phpqrcode/temp/934.png new file mode 100644 index 0000000..c7cf1ee Binary files /dev/null and b/admin/phpqrcode/temp/934.png differ diff --git a/admin/phpqrcode/temp/935.png b/admin/phpqrcode/temp/935.png new file mode 100644 index 0000000..8bb75fb Binary files /dev/null and b/admin/phpqrcode/temp/935.png differ diff --git a/admin/phpqrcode/temp/936.png b/admin/phpqrcode/temp/936.png new file mode 100644 index 0000000..a9de8d1 Binary files /dev/null and b/admin/phpqrcode/temp/936.png differ diff --git a/admin/phpqrcode/temp/937.png b/admin/phpqrcode/temp/937.png new file mode 100644 index 0000000..659c9f5 Binary files /dev/null and b/admin/phpqrcode/temp/937.png differ diff --git a/admin/phpqrcode/temp/938.png b/admin/phpqrcode/temp/938.png new file mode 100644 index 0000000..30acf28 Binary files /dev/null and b/admin/phpqrcode/temp/938.png differ diff --git a/admin/phpqrcode/temp/939.png b/admin/phpqrcode/temp/939.png new file mode 100644 index 0000000..d0a3477 Binary files /dev/null and b/admin/phpqrcode/temp/939.png differ diff --git a/admin/phpqrcode/temp/940.png b/admin/phpqrcode/temp/940.png new file mode 100644 index 0000000..9fc8638 Binary files /dev/null and b/admin/phpqrcode/temp/940.png differ diff --git a/admin/phpqrcode/temp/941.png b/admin/phpqrcode/temp/941.png new file mode 100644 index 0000000..b405ccb Binary files /dev/null and b/admin/phpqrcode/temp/941.png differ diff --git a/admin/phpqrcode/temp/942.png b/admin/phpqrcode/temp/942.png new file mode 100644 index 0000000..7fde3ad Binary files /dev/null and b/admin/phpqrcode/temp/942.png differ diff --git a/admin/phpqrcode/temp/943.png b/admin/phpqrcode/temp/943.png new file mode 100644 index 0000000..16fa74a Binary files /dev/null and b/admin/phpqrcode/temp/943.png differ diff --git a/admin/phpqrcode/temp/944.png b/admin/phpqrcode/temp/944.png new file mode 100644 index 0000000..784d8a9 Binary files /dev/null and b/admin/phpqrcode/temp/944.png differ diff --git a/admin/phpqrcode/temp/945.png b/admin/phpqrcode/temp/945.png new file mode 100644 index 0000000..70e7b43 Binary files /dev/null and b/admin/phpqrcode/temp/945.png differ diff --git a/admin/phpqrcode/temp/946.png b/admin/phpqrcode/temp/946.png new file mode 100644 index 0000000..9525463 Binary files /dev/null and b/admin/phpqrcode/temp/946.png differ diff --git a/admin/phpqrcode/temp/947.png b/admin/phpqrcode/temp/947.png new file mode 100644 index 0000000..db74a7d Binary files /dev/null and b/admin/phpqrcode/temp/947.png differ diff --git a/admin/phpqrcode/temp/948.png b/admin/phpqrcode/temp/948.png new file mode 100644 index 0000000..5aa58cb Binary files /dev/null and b/admin/phpqrcode/temp/948.png differ diff --git a/admin/phpqrcode/temp/949.png b/admin/phpqrcode/temp/949.png new file mode 100644 index 0000000..ef69703 Binary files /dev/null and b/admin/phpqrcode/temp/949.png differ diff --git a/admin/phpqrcode/temp/950.png b/admin/phpqrcode/temp/950.png new file mode 100644 index 0000000..3d7322f Binary files /dev/null and b/admin/phpqrcode/temp/950.png differ diff --git a/admin/phpqrcode/temp/951.png b/admin/phpqrcode/temp/951.png new file mode 100644 index 0000000..3ee5c3e Binary files /dev/null and b/admin/phpqrcode/temp/951.png differ diff --git a/admin/phpqrcode/temp/952.png b/admin/phpqrcode/temp/952.png new file mode 100644 index 0000000..660c28c Binary files /dev/null and b/admin/phpqrcode/temp/952.png differ diff --git a/admin/phpqrcode/temp/953.png b/admin/phpqrcode/temp/953.png new file mode 100644 index 0000000..a995938 Binary files /dev/null and b/admin/phpqrcode/temp/953.png differ diff --git a/admin/phpqrcode/temp/954.png b/admin/phpqrcode/temp/954.png new file mode 100644 index 0000000..dac8be8 Binary files /dev/null and b/admin/phpqrcode/temp/954.png differ diff --git a/admin/phpqrcode/temp/955.png b/admin/phpqrcode/temp/955.png new file mode 100644 index 0000000..fb18c63 Binary files /dev/null and b/admin/phpqrcode/temp/955.png differ diff --git a/admin/phpqrcode/temp/956.png b/admin/phpqrcode/temp/956.png new file mode 100644 index 0000000..d03abe7 Binary files /dev/null and b/admin/phpqrcode/temp/956.png differ diff --git a/admin/phpqrcode/temp/957.png b/admin/phpqrcode/temp/957.png new file mode 100644 index 0000000..95eb686 Binary files /dev/null and b/admin/phpqrcode/temp/957.png differ diff --git a/admin/phpqrcode/temp/958.png b/admin/phpqrcode/temp/958.png new file mode 100644 index 0000000..9ec179f Binary files /dev/null and b/admin/phpqrcode/temp/958.png differ diff --git a/admin/phpqrcode/temp/959.png b/admin/phpqrcode/temp/959.png new file mode 100644 index 0000000..c1b5e67 Binary files /dev/null and b/admin/phpqrcode/temp/959.png differ diff --git a/admin/phpqrcode/temp/960.png b/admin/phpqrcode/temp/960.png new file mode 100644 index 0000000..cee8715 Binary files /dev/null and b/admin/phpqrcode/temp/960.png differ diff --git a/admin/phpqrcode/tools/merge.bat b/admin/phpqrcode/tools/merge.bat new file mode 100644 index 0000000..b60a485 --- /dev/null +++ b/admin/phpqrcode/tools/merge.bat @@ -0,0 +1,2 @@ +php ./merge.php +pause \ No newline at end of file diff --git a/admin/phpqrcode/tools/merge.php b/admin/phpqrcode/tools/merge.php new file mode 100644 index 0000000..19d338b --- /dev/null +++ b/admin/phpqrcode/tools/merge.php @@ -0,0 +1,70 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + $QR_BASEDIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'..'.DIRECTORY_SEPARATOR; + $QR_TOOLSDIR = dirname(__FILE__).DIRECTORY_SEPARATOR; + + $outputFile = $QR_BASEDIR.'phpqrcode.php'; + + // Required libs + + $fileList = array( + $QR_BASEDIR.'qrconst.php', + $QR_TOOLSDIR.'merged_config.php', + $QR_BASEDIR.'qrtools.php', + $QR_BASEDIR.'qrspec.php', + $QR_BASEDIR.'qrimage.php', + $QR_BASEDIR.'qrinput.php', + $QR_BASEDIR.'qrbitstream.php', + $QR_BASEDIR.'qrsplit.php', + $QR_BASEDIR.'qrrscode.php', + $QR_BASEDIR.'qrmask.php', + $QR_BASEDIR.'qrencode.php' + ); + + $headerFile = $QR_TOOLSDIR.'merged_header.php'; + $versionFile = $QR_BASEDIR.'VERSION'; + + $outputCode = ''; + + foreach($fileList as $fileName) { + $outputCode .= "\n\n".'//---- '.basename($fileName).' -----------------------------'."\n\n"; + $anotherCode = file_get_contents($fileName); + $anotherCode = preg_replace ('/^<\?php/', '', $anotherCode); + $anotherCode = preg_replace ('/\?>\*$/', '', $anotherCode); + $outputCode .= "\n\n".$anotherCode."\n\n"; + } + + $versionDataEx = explode("\n", file_get_contents($versionFile)); + + $outputContents = file_get_contents($headerFile); + $outputContents .= "\n\n/*\n * Version: ".trim($versionDataEx[0])."\n * Build: ".trim($versionDataEx[1])."\n */\n\n"; + $outputContents .= $outputCode; + + file_put_contents($outputFile, $outputContents); + + \ No newline at end of file diff --git a/admin/phpqrcode/tools/merge.sh b/admin/phpqrcode/tools/merge.sh new file mode 100644 index 0000000..e4c2fbc --- /dev/null +++ b/admin/phpqrcode/tools/merge.sh @@ -0,0 +1,2 @@ +#!/bin/sh +php ./merge.php \ No newline at end of file diff --git a/admin/phpqrcode/tools/merged_config.php b/admin/phpqrcode/tools/merged_config.php new file mode 100644 index 0000000..55ddb45 --- /dev/null +++ b/admin/phpqrcode/tools/merged_config.php @@ -0,0 +1,17 @@ + + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 3 of the License, or any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + */ + + \ No newline at end of file diff --git a/admin/qr_code.php b/admin/qr_code.php new file mode 100644 index 0000000..9ebeacf --- /dev/null +++ b/admin/qr_code.php @@ -0,0 +1,317 @@ +assign('qrcode_error', 1); + + $smarty->assign('qrcode_value_vorname', $_SESSION["qrcode_value_vorname"]); + $smarty->assign('qrcode_value_nachname', $_SESSION["qrcode_value_nachname"]); + $smarty->assign('qrcode_value_qrcode', $_SESSION["qrcode_value_qrcode"]); + $smarty->assign('qrcode_value_mail', $_SESSION["qrcode_value_mail"]); + + if ($errorno == 3) { + # ungültiges Datum + $smarty->assign('qrcode_error_text', "Das eingegebene Datum ist nicht korrekt. Bitte korrigieren Sie das Datum!"); + } + } + + # --- Wenn Werte editiert werden ------------ + if ($_SESSION["qrcode_status"] == 'edit') { + + $result_edit = $db->query("SELECT id, nachname, vorname, qr, mail + FROM jumi_qr_fellbach + WHERE id = $id"); + $row_edit = $result_edit->fetch_array(); + $smarty->assign('qrcode_value_vorname', "$row_edit[vorname]"); + $smarty->assign('qrcode_value_nachname', "$row_edit[nachname]"); + $smarty->assign('qrcode_value_qrcode', "$row_edit[qr]"); + $smarty->assign('qrcode_value_mail', "$row_edit[mail]"); + + } + # --- Wenn Werte editiert werden Ende ------- + + if ($_GET['editende'] == 1) { + # Editieren ist beendet, als ein update auf einen Datensatz. Dann ist der status wieder Neu, damit wird wieder ein Insert durchgeführt + $_SESSION["qrcode_status"] = 'neu'; + } + + + # Gespeicherte Werte + $query1 = "SELECT id, nachname,vorname, qr, mail + FROM jumi_qr_fellbach + ORDER BY nachname ASC, vorname ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1a"); + + while ($row1 = $result1->fetch_array()) { + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + + +if ($action == 'save') { + + $vorname = $_POST['vorname']; + $nachname = $_POST['nachname']; + $qr = $_POST['qrcode']; + $mail = trim($_POST['mail']); + + + $_SESSION["qrcode_value_vorname"] = $vorname; + $_SESSION["qrcode_value_nachname"] = $nachname; + $_SESSION["qrcode_value_qrcode"] = $qr; + $_SESSION["qrcode_value_mail"] = $mail; + + + #$datum = date("Y-m-d H:i:s"); + if ($_SESSION["qrcode_status"] == 'neu') { + $sql1 = $db->query("INSERT INTO jumi_qr_fellbach ( nachname + , vorname + , qr + , mail + ) + VALUES + ( '$nachname' + , '$vorname' + , '$qr' + , '$mail' + ) + "); + $termin = $db->insert_id; + +/* Daueranmelder wird es nicht geben. + + $query1 = "SELECT DISTINCT lfd_haushalt FROM jumi_daueranmeldung"; + $result1 = $db->query($query1) or die("Cannot execute query1"); + while ($row1 = $result1->fetch_array()) { + $lfd_haushalt = get_lfd_haushalt($termin); + $datum = date("Y-m-d H:i:s"); + + $query2 = "SELECT mail + FROM jumi_daueranmeldung + WHERE lfd_haushalt = $row1[lfd_haushalt] + GROUP BY lfd_haushalt, mail + "; + $result2 = $db->query($query2) or die("Cannot execute query2"); + while ($row2 = $result2->fetch_array()) { + + $query3 = "SELECT vorname, nachname + FROM jumi_daueranmeldung + WHERE mail= '$row2[mail]' + AND lfd_haushalt = $row1[lfd_haushalt] + "; + #echo $query3; + $result3 = $db->query($query3) or die("Cannot execute query3"); + $nr = 0; + while ($row3 = $result3->fetch_array()) { + $data['vorname'][$nr] = $row3['vorname']; + $data['nachname'][$nr] = $row3['nachname']; + $data['sitzplatz'][$nr] = get_sitzplatz($data['nachname'][$nr], $data['vorname'][$nr]); + $data['split'][$nr] = explode("|", $data['sitzplatz'][$nr]); + $data['reihe'][$nr] = $data['split'][$nr][0]; + $data['platz'][$nr] = $data['split'][$nr][1]; + $sql1 = $db->query("insert into jumi_buchung (id, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '" . $data['nachname'][$nr] . "', '" . $data['vorname'][$nr] . "', '" . $data['reihe'][$nr] . "', '" . $data['platz'][$nr] . "', '$row2[mail]', '$lfd_haushalt', '$datum')"); + #echo "
";
+          #echo "
"; + #echo "insert into jumi_buchung (id, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '".$data['nachname'][$nr]."', '".$data['vorname'][$nr]."', '".$data['reihe'][$nr]."', '".$data[platz][$nr]."', '$row2[mail]', '$lfd_haushalt', '$datum')
"; + $data['bid'][$nr] = $db->insert_id; + $data['crypt'][$nr] = cryption($data['bid'][$nr] . "|" . $data['nachname'][$nr] . "|$termin", 'e'); + $nr++; + } + + #print_r($data); + #echo "
"; + #echo "
"; + + + + + + + + + + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, url + FROM jumi_qr_fellbach + WHERE id = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + + + $empfaenger = "$row2[mail]"; + $betreff = "Registrierung zum Gottesdienst am $row_termin[beginn] Uhr"; + $text = " + + + Registrierung zum Gottesdienst + + + + Guten Tag!

+ Sie haben sich zum Gottesdienst in der neuapostolischen Kirche Weinstadt-Beutelsbach registriert.
+ Nachfolgend finden Sie die hinterlegten Daten: +
+
+ + + + + + + + + + + "; + $person = 1; + $vorname = ""; + $nachname = ""; + $crypt = ""; + for ($i = 0; $i < count($data['nachname']); $i++) { + $vorname = $data['vorname'][$i]; + $nachname = $data['nachname'][$i]; + $crypt = $data['crypt'][$i]; + $text .= " + + + + + "; + $person++; + } + + $text .= " +
+ + Datum: + + + + $row_termin[beginn]"; + if ($row_termin['url'] != '') { + $text .= " ($row_termin[url])"; + } + $text .= " + +
+   + +   + +   +
+ + Person $person: + + + + $nachname, $vorname + + + Abmeldung +
+
+ Sie wurden aufgrund Ihrer Dauerbuchung zu den Gottesdiensten benachrichtigt. +

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + + + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: Gottesdienstregistrierung \n"; + + $return = @mail($empfaenger, $betreff, $text, $headers); + + + #echo " + #


+ #$empfaenger
+ #$betreff
+ #$text
+ #
"; + + + } + } + */ + } + if ($_SESSION["qrcode_status"] == 'edit') { + $id = $_SESSION["qr_id"]; + + $result = $db->query("UPDATE jumi_qr_fellbach + SET nachname = '$nachname' + , vorname = '$vorname' + , qr = '$qr' + , mail = '$mail' + WHERE id = $id + "); + + unset($_SESSION['qr_id']); + + + } + # Dann bekommts beim refresh den status neu, also es wird beim Abschicken ein Insert gemacht + $editende = 1; + echo ""; + + +} +if ($action == 'del') { + $id = $_GET['id']; + + $del1 = $db->query("DELETE FROM jumi_qr_fellbach WHERE id = $id"); + + echo ""; +} + + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/qr_frame.php b/admin/qr_frame.php new file mode 100644 index 0000000..cdef2f1 --- /dev/null +++ b/admin/qr_frame.php @@ -0,0 +1,6 @@ +display("$template/admin/$templatename"); ?> \ No newline at end of file diff --git a/admin/save_platz.php b/admin/save_platz.php new file mode 100644 index 0000000..e727d87 --- /dev/null +++ b/admin/save_platz.php @@ -0,0 +1,34 @@ +query("UPDATE jumi_buchung + SET reihe = '$reihe' + ,platz = '$platz' + WHERE tid = $termin + AND lfd_haushalt = '$lfd_haushalt' + AND reihe = '' + "); +echo "$reihe$platz"; + exit; + +?> + diff --git a/admin/sitz_koord.php b/admin/sitz_koord.php new file mode 100644 index 0000000..20c91a2 --- /dev/null +++ b/admin/sitz_koord.php @@ -0,0 +1,111 @@ +query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT bid, vorname, nachname + FROM jumi_buchung + WHERE reihe = '$reihe' + AND platz = '$platz' + AND tid = $tid + ORDER BY nachname, vorname ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row_tn = $result1->fetch_array()) { + + $query_fav = $db->query("SELECT count(*) Anz + FROM jumi_standardsitzplatz + WHERE nachname = '$row_tn[nachname]' + AND vorname = '$row_tn[vorname]' + AND reihe = '$reihe' + AND platz = '$platz' + "); + $row_fav = $query_fav->fetch_array(); + if($row_fav['Anz'] > 0){ + # Favorit vorhanden, kann gelscht werden + $favorit = 0; + }else{ + # Favorit NICHT vorhanden, kann gesetzt werden + $favorit = 1; + } + + $row_tn['favorit'] = $favorit; + $table_data1[] = $row_tn; + } + $smarty->assign('table_data1', $table_data1); + $smarty->assign('koord_reihe', $reihe); + $smarty->assign('koord_platz', $platz); + $smarty->assign('koord_tid', $tid); + +} + +if ($action == 'del') { + $bid = $_GET['bid']; + $reihe = $_GET['reihe']; + $platz = $_GET['platz']; + $tid = $_GET['tid']; + + $del1 = $db->query("UPDATE jumi_buchung SET reihe='', platz='' WHERE bid = $bid"); + + echo ""; +} + +if ($action == 'fav') { + $status = $_GET['status']; + $vorname = $_GET['vorname']; + $nachname = $_GET['nachname']; + $tid = $_GET['tid']; + if (isset($_GET['reihe'])) { + $reihe = $_GET['reihe']; + } else { + $reihe = ''; + } + if (isset($_GET['platz'])) { + $platz = $_GET['platz']; + } else { + $platz = ''; + } + + $del1 = $db->query("DELETE FROM jumi_standardsitzplatz WHERE vorname='$vorname' AND nachname='$nachname'"); + if($status == 1){ + $ins1 = $db->query("INSERT INTO jumi_standardsitzplatz (nachname, vorname, reihe, platz) VALUES ('$nachname', '$vorname', '$reihe', '$platz')"); + } + echo $tid; + echo ""; +} + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/sitzplatz.php b/admin/sitzplatz.php new file mode 100644 index 0000000..9e5626f --- /dev/null +++ b/admin/sitzplatz.php @@ -0,0 +1,67 @@ +query("SET lc_time_names = 'de_DE';"); + + $query1 = "SELECT a.tid, date_format(datum, '%a, %d.%m.%Y - %H:%i Uhr')datum_form + FROM jumi_termine a + WHERE a.datum > ADDDATE(now(), -7) + GROUP BY a.tid, datum_form + ORDER BY datum ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + $termin = $row1['tid']; + $result2 = $db->query("SELECT COUNT(*) Anz + FROM jumi_buchung + WHERE tid=$termin"); + $row2 = $result2->fetch_array(); + + $result3 = $db->query("SELECT COUNT(distinct lfd_haushalt) Anz + FROM jumi_buchung + WHERE tid=$termin"); + $row3 = $result3->fetch_array(); + + $row1['anz_ges'] = $row2['Anz']; + $row1['anz_fam'] = $row3['Anz']; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} + +if ($action == 'edit') { + if(isset($_POST["testtermin"])){ + $termin = $_POST["testtermin"]; + }else{ + $termin = $_GET["tid"]; + } + $german = $db->query("SET lc_time_names = 'de_DE';"); + $query_termin = $db->query("SELECT date_format(datum, '%a, %d.%m.%Y - %H:%i Uhr')datum_form + FROM jumi_termine + WHERE tid = $termin"); + $row_get_termin = $query_termin->fetch_array(); + $smarty->assign('edit_value_datum', $row_get_termin['datum_form']); + $smarty->assign('edit_value_tid', $termin); + + +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/survey_erfassen.php b/admin/survey_erfassen.php new file mode 100644 index 0000000..9805ceb --- /dev/null +++ b/admin/survey_erfassen.php @@ -0,0 +1,260 @@ +assign('umfrageerf_error', 1); + + $smarty->assign('umfrageerf_value_datumvon', $_SESSION["umfrageerf_value_datumvon"]); + $smarty->assign('umfrageerf_value_zeitvon', $_SESSION["umfrageerf_value_zeitvon"]); + $smarty->assign('umfrageerf_value_datumbis', $_SESSION["umfrageerf_value_datumbis"]); + $smarty->assign('umfrageerf_value_zeitbis', $_SESSION["umfrageerf_value_zeitbis"]); + $smarty->assign('umfrageerf_value_headline', $_SESSION["umfrageerf_value_headline"]); + + if ($errorno == 1) { + # Pflichtfelder + $smarty->assign('umfrageerf_error_text', "Bitte füllen Sie alle Felder aus"); + } + if ($errorno == 2) { + # Datumsformat + $smarty->assign('umfrageerf_error_text', "Ein Datumsformat ist falsch"); + } + }else{ + unset($_SESSION["umfrageerf_value_datumvon"]); + unset($_SESSION["umfrageerf_value_zeitvon"]); + unset($_SESSION["umfrageerf_value_datumbis"]); + unset($_SESSION["umfrageerf_value_zeitbis"]); + unset($_SESSION["umfrageerf_value_headline"]); + unset($_SESSION["umfrageerf_umid"]); + unset($_SESSION["umfrageerf_value_frage"]); + unset($_SESSION["umfrageerf_ufid"]); + unset($_SESSION["umfrageerf_uaid"]); + } +# +# # --- Wenn Werte editiert werden ------------ +# if ($_SESSION["umfrageerf_status"] == 'edit') { +# $result_edit = $db->query("SELECT yid, date_format(datum, '%d.%m.%Y') datum, date_format(datum, '%H:%i') zeit, url +# FROM jumi_youtube_termine +# WHERE yid = $yid"); +# $row_edit = $result_edit->fetch_array(); +# $smarty->assign('umfrageerf_value_datum', "$row_edit[datum]"); +# $smarty->assign('umfrageerf_value_zeit', "$row_edit[zeit]"); +# $smarty->assign('umfrageerf_value_url', "$row_edit[url]"); +# +# } +# # --- Wenn Werte editiert werden Ende ------- +# +# if ($_GET['editende'] == 1) { +# # Editieren ist beendet, als ein update auf einen Datensatz. Dann ist der status wieder Neu, damit wird wieder ein Insert durchgeführt +# $_SESSION["umfrageerf_status"] = 'neu'; +# } +# +# +# # Gespeicherte Werte +# $query1 = "SELECT yid, date_format(datum, '%d.%m.%Y') datum_form, date_format(datum, '%H:%i') zeit, url +# FROM jumi_youtube_termine +# WHERE datum > DATE_SUB( NOW() , INTERVAL 14 DAY ) +# ORDER BY datum desc, zeit ASC"; +# +# $result1 = $db->query($query1) or die("Cannot execute query1a"); +# +# while ($row1 = $result1->fetch_array()) { +# $table_data1[] = $row1; +# } +# $smarty->assign('table_data1', $table_data1); + +} + + +if ($action == 'fragen') { + + + + if(isset($_POST['datumvon']) and $_POST['datumvon'] != ''){ + $datumvon = $_POST['datumvon']; + $_SESSION["umfrageerf_value_datumvon"] = $datumvon; + }else{ + if($_SESSION["umfrageerf_value_datumvon"] == ''){ + echo ""; + } + } + + if(isset($_POST['zeitvon']) and $_POST['zeitvon'] != ''){ + $zeitvon = $_POST['zeitvon']; + $_SESSION["umfrageerf_value_zeitvon"] = $zeitvon; + }else{ + if($_SESSION["umfrageerf_value_zeitvon"] == ''){ + echo ""; + } + } + + if(isset($_POST['datumbis']) and $_POST['datumbis'] != ''){ + $datumbis = $_POST['datumbis']; + $_SESSION["umfrageerf_value_datumbis"] = $datumbis; + }else{ + if($_SESSION["umfrageerf_value_datumbis"] == ''){ + echo ""; + } + } + + if(isset($_POST['zeitbis']) and $_POST['zeitbis'] != ''){ + $zeitbis = $_POST['zeitbis']; + $_SESSION["umfrageerf_value_zeitbis"] = $zeitbis; + }else{ + if($_SESSION["umfrageerf_value_zeitbis"] == ''){ + echo ""; + } + } + + if(isset($_POST['headline']) and trim($_POST['headline']) != ''){ + $headline = trim($_POST['headline']); + $_SESSION["umfrageerf_value_headline"] = $headline; + }else{ + if($_SESSION["umfrageerf_value_headline"] == ''){ + echo ""; + } + } + + + + $umid = $_SESSION["umfrageerf_umid"]; + + if($umid == ''){ + $datumvon_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $datumvon); + $datumbis_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $datumbis); + $datum_von = $datumvon_form . " " . $zeitvon . ":00"; + $datum_bis = $datumbis_form . " " . $zeitbis . ":00"; + + + function validateDate($date, $format = 'Y-m-d') + { + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; + } + + if (!validateDate($datumvon_form)) { + echo ""; + exit; + } + + if (!validateDate($datumbis_form)) { + echo ""; + exit; + } + + # Prüfen, ob schon eine Umfrage an diesem Tag ist + } + + + + if ( $umid == ''){ + + $sql1 = $db->query("INSERT INTO jumi_umfragen ( datum_von + , datum_bis + , headline + , uid + , datum_erfasst + ) + VALUES + ( '$datum_von' + , '$datum_bis' + , '$headline' + , '$uid' + , '$datum' + ) + "); + $umid = $db->insert_id; + $_SESSION["umfrageerf_umid"] = $umid; + } + + $ufid = $_SESSION["umfrageerf_ufid"]; + if ( $ufid != ''){ + # Ausgabe wenn die Frage + $smarty->assign('umfrageerf_value_frage', htmlspecialchars($_SESSION["umfrageerf_value_frage"])); + } +} + +if ($action == 'save') { + $umid = $_SESSION["umfrageerf_umid"]; + + if(isset($_POST['frage'])){ + $frage = $_POST['frage']; + $_SESSION["umfrageerf_value_frage"] = $frage; + } + if(isset($_POST['antwort'])){ + $antwort = $_POST['antwort']; + } + + # Gibt es die Frage schon + $result = $db->query("SELECT count(*) Anz FROM jumi_umfragen_fragen WHERE umid='$umid' and frage='$frage'"); + $row = $result->fetch_array(); + if($row['Anz'] == '0'){ + $sql1 = $db->query("INSERT INTO jumi_umfragen_fragen ( umid + , frage + ) + VALUES + ( '$umid' + , '$frage' + ) + "); + $ufid = $db->insert_id; + $_SESSION["umfrageerf_ufid"] = $ufid; + } + $ufid = $_SESSION["umfrageerf_ufid"]; + + # Gibt es diese Antwort schon + $result2 = $db->query("SELECT count(*) Anz FROM jumi_umfragen_antworten WHERE ufid='$ufid' and antwort='$antwort'"); + $row2 = $result2->fetch_array(); + if($row2['Anz'] == '0'){ + $sql1 = $db->query("INSERT INTO jumi_umfragen_antworten ( ufid + , antwort + ) + VALUES + ( '$ufid' + , '$antwort' + ) + "); + $uaid = $db->insert_id; + $_SESSION["umfrageerf_uaid"] = $uaid; + } + echo ""; + + +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/survey_frame.php b/admin/survey_frame.php new file mode 100644 index 0000000..d3702f2 --- /dev/null +++ b/admin/survey_frame.php @@ -0,0 +1,8 @@ +display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/termine.php b/admin/termine.php new file mode 100644 index 0000000..d01f68f --- /dev/null +++ b/admin/termine.php @@ -0,0 +1,361 @@ +assign('termine_error', 1); + + $smarty->assign('termine_value_datum', $_SESSION["termine_value_datum"]); + $smarty->assign('termine_value_zeit', $_SESSION["termine_value_tm_zeit"]); + $smarty->assign('termine_value_tm_standort', $_SESSION["termine_value_tm_standort"]); + $smarty->assign('termine_value_tm_plaetze', $_SESSION["termine_value_tm_plaetze"]); + $smarty->assign('termine_value_tm_raum', $_SESSION["termine_value_tm_raum"]); + $smarty->assign('termine_value_hinweis', $_SESSION["termine_value_hinweis"]); + $smarty->assign('termine_value_fellbach_gd', $_SESSION["termine_value_fellbach_gd"]); + + if ($errorno == 3) { + # ungültiges Datum + $smarty->assign('termine_error_text', "Das eingegebene Datum ist nicht korrekt. Bitte korrigieren Sie das Datum!"); + } + } + + # --- Wenn Werte editiert werden ------------ + if ($_SESSION["termine_status"] == 'edit') { + $result_edit = $db->query("SELECT tid, date_format(datum, '%d.%m.%Y') datum, date_format(datum, '%H:%i') zeit, hinweis, fellbach_gd + FROM jumi_termine + WHERE tid = $tid"); + $row_edit = $result_edit->fetch_array(); + $smarty->assign('termine_value_datum', "$row_edit[datum]"); + $smarty->assign('termine_value_zeit', "$row_edit[zeit]"); + $smarty->assign('termine_value_tm_standort', "$row_edit[tm_standort]"); + $smarty->assign('termine_value_tm_plaetze', "$row_edit[tm_plaetze]"); + $smarty->assign('termine_value_tm_raum', "$row_edit[tm_raum]"); + $smarty->assign('termine_value_hinweis', "$row_edit[hinweis]"); + $smarty->assign('termine_value_fellbach_gd', "$row_edit[fellbach_gd]"); + + } + # --- Wenn Werte editiert werden Ende ------- + + if ($_GET['editende'] == 1) { + # Editieren ist beendet, als ein update auf einen Datensatz. Dann ist der status wieder Neu, damit wird wieder ein Insert durchgeführt + $_SESSION["termine_status"] = 'neu'; + } + + + # Gespeicherte Werte + $query1 = "SELECT tid, date_format(datum, '%d.%m.%Y') datum_form, date_format(datum, '%H:%i') zeit, hinweis, fellbach_gd + FROM jumi_termine + WHERE datum > DATE_SUB( NOW() , INTERVAL 14 DAY ) + ORDER BY datum desc, zeit ASC"; + + $result1 = $db->query($query1) or die("Cannot execute query1a"); + + while ($row1 = $result1->fetch_array()) { + + $result_dis = $db->query("SELECT count(*) Anz + FROM jumi_buchung + WHERE tid = $row1[tid]"); + $row_dis = $result_dis->fetch_array(); + if ($row_dis['Anz'] > 0) { + $disable = 0; + } else { + $disable = 1; + } + + $result2 = $db->query("SELECT COUNT(*) Anz + FROM jumi_buchung + WHERE tid=$row1[tid]"); + $row2 = $result2->fetch_array(); + + $result3 = $db->query("SELECT COUNT(distinct lfd_haushalt) Anz + FROM jumi_buchung + WHERE tid=$row1[tid]"); + $row3 = $result3->fetch_array(); + + $row1['anz_ges'] = $row2['Anz']; + $row1['anz_fam'] = $row3['Anz']; + + $row1['tm_disable'] = $disable; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + +} + + +if ($action == 'save') { + + $datum = $_POST['datum']; + $tm_zeit = $_POST['tm_zeit']; + $hinweis = trim($_POST['hinweis']); + $fellbach_gd = trim($_POST['fellbach_gd']); + + + $_SESSION["termine_value_datum"] = $datum; + $_SESSION["termine_value_tm_zeit"] = $tm_zeit; + $_SESSION["termine_value_hinweis"] = $hinweis; + $_SESSION["termine_value_fellbach_gd"] = $fellbach_gd; + + $datum_form = preg_replace('/^(\\d{2})\\.(\\d{2})\\.(\\d{4})$/', '$3-$2-$1', $datum); + $gddatum = $datum_form . " " . $tm_zeit . ":00"; + $_SESSION["termine_value_tm_gddatum"] = $gddatum; + function validateDate($date, $format = 'Y-m-d') + { + $d = DateTime::createFromFormat($format, $date); + return $d && $d->format($format) == $date; + } + + if (!validateDate($datum_form)) { + echo ""; + exit; + } + + + #$datum = date("Y-m-d H:i:s"); + if ($_SESSION["termine_status"] == 'neu') { + $sql1 = $db->query("INSERT INTO jumi_termine ( datum + , hinweis + , fellbach_gd + ) + VALUES + ( '$gddatum' + , '$hinweis' + , '$fellbach_gd' + ) + "); + $termin = $db->insert_id; + +/* Daueranmelder wird es nicht geben. + + $query1 = "SELECT DISTINCT lfd_haushalt FROM jumi_daueranmeldung"; + $result1 = $db->query($query1) or die("Cannot execute query1"); + while ($row1 = $result1->fetch_array()) { + $lfd_haushalt = get_lfd_haushalt($termin); + $datum = date("Y-m-d H:i:s"); + + $query2 = "SELECT mail + FROM jumi_daueranmeldung + WHERE lfd_haushalt = $row1[lfd_haushalt] + GROUP BY lfd_haushalt, mail + "; + $result2 = $db->query($query2) or die("Cannot execute query2"); + while ($row2 = $result2->fetch_array()) { + + $query3 = "SELECT vorname, nachname + FROM jumi_daueranmeldung + WHERE mail= '$row2[mail]' + AND lfd_haushalt = $row1[lfd_haushalt] + "; + #echo $query3; + $result3 = $db->query($query3) or die("Cannot execute query3"); + $nr = 0; + while ($row3 = $result3->fetch_array()) { + $data['vorname'][$nr] = $row3['vorname']; + $data['nachname'][$nr] = $row3['nachname']; + $data['sitzplatz'][$nr] = get_sitzplatz($data['nachname'][$nr], $data['vorname'][$nr]); + $data['split'][$nr] = explode("|", $data['sitzplatz'][$nr]); + $data['reihe'][$nr] = $data['split'][$nr][0]; + $data['platz'][$nr] = $data['split'][$nr][1]; + $sql1 = $db->query("insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '" . $data['nachname'][$nr] . "', '" . $data['vorname'][$nr] . "', '" . $data['reihe'][$nr] . "', '" . $data['platz'][$nr] . "', '$row2[mail]', '$lfd_haushalt', '$datum')"); + #echo "
";
+          #echo "
"; + #echo "insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '".$data['nachname'][$nr]."', '".$data['vorname'][$nr]."', '".$data['reihe'][$nr]."', '".$data[platz][$nr]."', '$row2[mail]', '$lfd_haushalt', '$datum')
"; + $data['bid'][$nr] = $db->insert_id; + $data['crypt'][$nr] = cryption($data['bid'][$nr] . "|" . $data['nachname'][$nr] . "|$termin", 'e'); + $nr++; + } + + #print_r($data); + #echo "
"; + #echo "
"; + + + + + + + + + + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + + + $empfaenger = "$row2[mail]"; + $betreff = "Registrierung zum Gottesdienst am $row_termin[beginn] Uhr"; + $text = " + + + Registrierung zum Gottesdienst + + + + Guten Tag!

+ Sie haben sich zum Gottesdienst in der neuapostolischen Kirche Weinstadt-Beutelsbach registriert.
+ Nachfolgend finden Sie die hinterlegten Daten: +
+
+ + + + + + + + + + + "; + $person = 1; + $vorname = ""; + $nachname = ""; + $crypt = ""; + for ($i = 0; $i < count($data['nachname']); $i++) { + $vorname = $data['vorname'][$i]; + $nachname = $data['nachname'][$i]; + $crypt = $data['crypt'][$i]; + $text .= " + + + + + "; + $person++; + } + + $text .= " +
+ + Datum: + + + + $row_termin[beginn]"; + if ($row_termin['hinweis'] != '') { + $text .= " ($row_termin[hinweis])"; + } + $text .= " + +
+   + +   + +   +
+ + Person $person: + + + + $nachname, $vorname + + + Abmeldung +
+
+ Sie wurden aufgrund Ihrer Dauerbuchung zu den Gottesdiensten benachrichtigt. +

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + + + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: Gottesdienstregistrierung \n"; + + $return = @mail($empfaenger, $betreff, $text, $headers); + + + #echo " + #


+ #$empfaenger
+ #$betreff
+ #$text
+ #
"; + + + } + } + */ + } + if ($_SESSION["termine_status"] == 'edit') { + $tid = $_SESSION["termine_tid"]; + + + + $result = $db->query("UPDATE jumi_termine + SET datum = '$gddatum' + , hinweis = '$hinweis' + , fellbach_gd = '$fellbach_gd' + WHERE tid = $tid + "); + + unset($_SESSION['termine_tid']); + + + } + # Dann bekommts beim refresh den status neu, also es wird beim Abschicken ein Insert gemacht + $editende = 1; + echo ""; + + +} +if ($action == 'del') { + $tid = $_GET['tid']; + + $del1 = $db->query("DELETE FROM jumi_termine WHERE tid = $tid"); + + echo ""; +} + + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> \ No newline at end of file diff --git a/admin/titel.php b/admin/titel.php new file mode 100644 index 0000000..abfaa74 --- /dev/null +++ b/admin/titel.php @@ -0,0 +1,51 @@ +window.top.location.href = \"index.php\";"; +} + +/* +$db = dbconnect(); + +#Hat User ein Adminrecht + +$result_admin = $db->query("SELECT count(*) Anz FROM dep_rollen_user_zuord WHERE imtuid = '$uid' AND roid='1'"); +#echo "SELECT count(*) Anz FROM dep_rollen_user_zuord WHERE imtuid = '$uid' AND roid='1'
"; +$row_admin = $result_admin->fetch_array(); + +if($row_admin[Anz] > 0){ + $smarty->assign('titel_admin', "1"); +} + + +$result_ausschuss = $db->query("SELECT count(*) Anz FROM dep_rollen_user_zuord WHERE imtuid = '$uid' AND roid in (4,5)"); +$row_ausschuss = $result_ausschuss->fetch_array(); + +if($row_ausschuss[Anz] > 0){ + $smarty->assign('titel_ausschuss', "1"); +} + + +$result_beteiligte = $db->query("SELECT count(*) Anz FROM dep_rollen_user_zuord WHERE imtuid = '$uid' AND roid='3'"); +$row_beteiligte = $result_beteiligte->fetch_array(); + +if($row_beteiligte[Anz] > 0){ + $smarty->assign('titel_beteiligte', "1"); +} + + +$result_gutachter = $db->query("SELECT count(*) Anz FROM dep_rollen_user_zuord WHERE imtuid = '$uid' AND roid='2'"); +$row_gutachter = $result_gutachter->fetch_array(); + +if($row_gutachter[Anz] > 0){ + $smarty->assign('titel_gutachter', "1"); +} + +*/ +$smarty->display("$template/admin/$templatename"); +?> \ No newline at end of file diff --git a/admin/unzugeordnet.php b/admin/unzugeordnet.php new file mode 100644 index 0000000..63704a1 --- /dev/null +++ b/admin/unzugeordnet.php @@ -0,0 +1,80 @@ +query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + $value2 = ''; + $mehrfachbelegung = trim(get_parameter(6)); + if($mehrfachbelegung == 0){ + $query2 = "SELECT reihe, platz + FROM jumi_verfplaetze + WHERE concat(reihe,platz) not in (select concat(reihe,platz) from jumi_buchung where tid=$termin and lfd_haushalt!=$row1[lfd_haushalt]) + AND reihe not in ('Sonntagschule', 'Vorsonntagschule') + order by reihe, platz + "; + }else{ + $query2 = "SELECT reihe, platz + FROM jumi_verfplaetze + WHERE reihe not in ('Sonntagschule', 'Vorsonntagschule') + order by reihe, platz + "; + } + $result2 = $db->query( $query2) + or die ("Cannot execute query2"); + + + + $ln2 = 0; + while ($row2 = $result2->fetch_array()){ + $inner1[$ln2]['reihe'] = $row2['reihe']; + $inner1[$ln2]['platz'] = $row2['platz']; + $value2 = $inner1; + $ln2++; + } + + $query_name = $db->query("SELECT bid, vorname, nachname + FROM jumi_buchung + WHERE reihe = '' + AND lfd_haushalt= $row1[lfd_haushalt] + AND tid = $termin + AND warteliste='N' + ORDER BY bid + LIMIT 1"); + $row_name = $query_name->fetch_array(); + + $row1['inner'] = $value2; + $row1['tid'] = $termin; + $row1['vorname'] = $row_name['vorname']; + $row1['nachname'] = $row_name['nachname']; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); +} +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> diff --git a/admin/verwaltung_frame.php b/admin/verwaltung_frame.php new file mode 100644 index 0000000..cdef2f1 --- /dev/null +++ b/admin/verwaltung_frame.php @@ -0,0 +1,6 @@ +display("$template/admin/$templatename"); ?> \ No newline at end of file diff --git a/admin/warteliste.php b/admin/warteliste.php new file mode 100644 index 0000000..b77aa10 --- /dev/null +++ b/admin/warteliste.php @@ -0,0 +1,154 @@ +query($query1) or die("Cannot execute query1"); + + + while ($row1 = $result1->fetch_array()) { + $value2 = ''; + $mehrfachbelegung = trim(get_parameter(6)); + if($mehrfachbelegung == 0){ + $query2 = "SELECT reihe, platz + FROM jumi_verfplaetze + WHERE concat(reihe,platz) not in (select concat(reihe,platz) from jumi_buchung where tid=$termin and lfd_haushalt!=$row1[lfd_haushalt]) + AND reihe not in ('Sonntagschule', 'Vorsonntagschule') + order by reihe, platz + "; + }else{ + $query2 = "SELECT reihe, platz + FROM jumi_verfplaetze + WHERE reihe not in ('Sonntagschule', 'Vorsonntagschule') + order by reihe, platz + "; + } + $result2 = $db->query( $query2) + or die ("Cannot execute query2"); + + + + $ln2 = 0; + while ($row2 = $result2->fetch_array()){ + $inner1[$ln2]['reihe'] = $row2['reihe']; + $inner1[$ln2]['platz'] = $row2['platz']; + $value2 = $inner1; + $ln2++; + } + + $query_name = $db->query("SELECT bid, vorname, nachname, date_format(save_date, '%d.%m.%Y - %H:%i') save_date, date_format(warteliste_confirm, '%d.%m.%Y - %H:%i') warteliste_confirm, warteliste_grund + FROM jumi_buchung + WHERE reihe = '' + AND lfd_haushalt= $row1[lfd_haushalt] + AND tid = $termin + AND warteliste='Y' + ORDER BY bid + LIMIT 1"); + $row_name = $query_name->fetch_array(); + + $row1['inner'] = $value2; + $row1['tid'] = $termin; + $row1['warteliste_grund'] = $row_name['warteliste_grund']; + $row1['vorname'] = $row_name['vorname']; + $row1['nachname'] = $row_name['nachname']; + $row1['warteliste_confirm'] = $row_name['warteliste_confirm']; + $row1['save_date'] = $row_name['save_date']; + $table_data1[] = $row1; + } + $smarty->assign('table_data1', $table_data1); + + $query2 = "SELECT tid, lfd_haushalt, vorname, nachname, date_format(save_date, '%d.%m.%Y - %H:%i') save_date, date_format(warteliste_confirm, '%d.%m.%Y - %H:%i') warteliste_confirm, mail, warteliste_grund, reihe, platz + FROM jumi_buchung + WHERE reihe != '' + AND tid = $termin + AND warteliste = 'Y' + ORDER BY save_date ASC"; + + $result2 = $db->query($query2) or die("Cannot execute query2"); + + + while ($row2 = $result2->fetch_array()) { + $table_data2[] = $row2; + } + $smarty->assign('table_data2', $table_data2); +} + + +if ($action == 'mail') { + $lfd_haushalt = $_GET['lfd_haushalt']; + $termin = $_GET['tid']; + + $query_mail = $db->query("SELECT mail, date_format(b.datum, '%d.%m.%Y') datum_form + FROM jumi_buchung a, jumi_termine b + WHERE a.tid=b.tid + AND lfd_haushalt = '$lfd_haushalt' + AND a.tid = $termin + AND warteliste='Y' + GROUP BY mail, datum + LIMIT 1"); + $row_mail = $query_mail->fetch_array(); + + + $to = $row_mail['mail']; // addresses to email pdf to + $from = "NAK Beutelsbach "; // address message is sent from + $subject = "Zusage zum Gottesdienst am ".$row_mail['datum_form']; // email subject + $body = " + + Zusage zum Gottesdienst + + + + Guten Tag!

+ Sie sind verbindlich zum Gottesdienst am $row_mail[datum_form] angemeldet. +
+ Sollten Sie nicht kommen können melden Sie sich mit dem Abmeldelink aus der Registrierungsmail ab! +
+
+

+ Diese Mail wurde automatisch generiert!
+ Antworten Sie daher nicht auf diese Mail
+
+ Vielen Dank + + "; + + $headers = "MIME-Version: 1.0\r\n"; + $headers .= "Content-type: text/html; charset=utf-8\r\n"; + $headers .= "From: $from\r\n"; + $return = @mail($to, $subject, $body, $headers); + + if($return){ + $datum_db = date("Y-m-d H:i:s"); + $sql2 = $db->query("UPDATE jumi_buchung SET warteliste_confirm = '$datum_db' WHERE tid='$termin' AND lfd_haushalt='$lfd_haushalt'"); + } + echo ""; + +} + + +$smarty->assign('action', "$action"); +$smarty->display("$template/admin/$templatename"); + +?> + diff --git a/admin/youtube_frame.php b/admin/youtube_frame.php new file mode 100644 index 0000000..cdef2f1 --- /dev/null +++ b/admin/youtube_frame.php @@ -0,0 +1,6 @@ +display("$template/admin/$templatename"); ?> \ No newline at end of file diff --git a/bootstrap/dist/scrollable-tabs.css b/bootstrap/dist/scrollable-tabs.css new file mode 100644 index 0000000..9e454ce --- /dev/null +++ b/bootstrap/dist/scrollable-tabs.css @@ -0,0 +1,38 @@ + +.wrapper-nav { + position:relative; + margin:0 auto; + overflow:hidden; + padding:5px; + height:50px; +} + +.list { + position:absolute; + left:0px; + top:0px; + min-width:3500px; + margin-top:0px; +} + +.list li{ + display:table-cell; + position:relative; + text-align:center; + cursor:grab; + cursor:-webkit-grab; + color:#efefef; + vertical-align:middle; +} + +.scroller { + text-align:center; + cursor:pointer; + display:none; + padding:7px; + white-space:no-wrap; + vertical-align:middle; + background-color:#fff; +} + +.pointer {cursor: pointer;} diff --git a/bootstrap/dist/scrollable-tabs.js b/bootstrap/dist/scrollable-tabs.js new file mode 100644 index 0000000..4c1cff3 --- /dev/null +++ b/bootstrap/dist/scrollable-tabs.js @@ -0,0 +1,137 @@ +//let move = require('move'); + +const scrollBarWidths = 40; +const wrapper = document.getElementsByClassName("wrapper-nav")[0]; +const navLink = document.getElementsByClassName("nav-item nav-link"); +const lastNavLink = navLink[navLink.length - 1]; + +const scrollerRight = document.getElementsByClassName("scroller-right")[0]; +const scrollerLeft = document.getElementsByClassName("scroller-left")[0]; + +const list = document.querySelectorAll(".list"); + +let btnTriggered = false; + +let widthOfList = function() { + let itemsWidth = 0; + + const listLinks = document.querySelectorAll(".list a"); + + listLinks.forEach((el) => { + let itemWidth = getOuterWidth(el); + itemsWidth += itemWidth; + }); + + return itemsWidth; +}; + +let widthOfHidden = function(w) { + const wrapperh = document.getElementsByClassName("wrapper-nav")[0]; + + w = (!w) ? 0 : w; + + oW = getOuterWidth(wrapperh) - w; + + let ww = parseFloat((0 - oW).toFixed(3)); + + let hw = (oW - widthOfList() - getLeftPosi()) - scrollBarWidths; + + let rp = document.body.clientWidth - (getOuterLeft(lastNavLink) + getOuterWidth(lastNavLink)) - w; + + if (ww > hw) { + //return ww; + return (rp > ww ? rp : ww); + } + else { + //return hw; + return (rp > hw ? rp : hw); + } +}; + +let getLeftPosi = function() { + let ww = 0 - getOuterWidth(wrapper); + let lp = getOuterLeft(list[0]); + + if (ww > lp) { + return ww; + } + else { + return lp; + } +}; + +let reAdjust = function() { + let rp = document.body.clientWidth - (getOuterLeft(lastNavLink) + getOuterWidth(lastNavLink)); + + if (getOuterWidth(wrapper) < widthOfList() && (rp < 0)) { + scrollerRight.style.cssText = 'display: flex'; + } + else { + scrollerRight.style.display = 'none'; + } + + if (getLeftPosi() < 0) { + scrollerLeft.style.cssText = 'display: flex'; + } + else { + scrollerLeft.style.display = 'none'; + } + + btnTriggered = false; +} + +window.addEventListener('resize', function(event) { + reAdjust(); +}, true); + +scrollerRight.addEventListener("click", function() { + if (btnTriggered) return; + + btnTriggered = true; + + fade(scrollerLeft); + unfade(scrollerRight); + + let wR = getOuterWidth(scrollerRight); + + move(document.querySelectorAll(".list")[0]).add("left", +widthOfHidden(wR), 200).end().then(x=> { + reAdjust(); + }); +}); + +scrollerLeft.addEventListener("click", function() { + if (btnTriggered) return; + + btnTriggered = true; + + fade(scrollerRight); + unfade(scrollerLeft); + + let wL = getOuterWidth(scrollerLeft); + + move(document.querySelectorAll(".list")[0]).add("left", -getLeftPosi() + wL, 200).end().then(()=> { + reAdjust(); + }); +}); + +let getOuterLeft = function(elem) { + return elem.getBoundingClientRect().left; +} + +let getOuterWidth = function(elem) { + return parseFloat(window.getComputedStyle(elem).width); +} + +function fade(elem) { + elem.style.display = "none"; + elem.style.transition="opacity 0.6s"; + elem.style.opacity=0; +} + +function unfade(elem) { + elem.style.display = "block"; + elem.style.transition="opacity 0.6s"; + elem.style.opacity=1; +} + +reAdjust(); \ No newline at end of file diff --git a/bootstrap/dist/scrollable-tabs.min.css b/bootstrap/dist/scrollable-tabs.min.css new file mode 100644 index 0000000..9556d95 --- /dev/null +++ b/bootstrap/dist/scrollable-tabs.min.css @@ -0,0 +1 @@ +.wrapper-nav{position:relative;margin:0 auto;overflow:hidden;padding:5px;height:50px}.list{position:absolute;left:0;top:0;min-width:3500px;margin-top:0}.list li{display:table-cell;position:relative;text-align:center;cursor:grab;cursor:-webkit-grab;color:#efefef;vertical-align:middle}.scroller{text-align:center;cursor:pointer;display:none;padding:7px;white-space:no-wrap;vertical-align:middle;background-color:#fff}.pointer{cursor:pointer} \ No newline at end of file diff --git a/bootstrap/dist/scrollable-tabs.min.js b/bootstrap/dist/scrollable-tabs.min.js new file mode 100644 index 0000000..1d8a208 --- /dev/null +++ b/bootstrap/dist/scrollable-tabs.min.js @@ -0,0 +1 @@ +const scrollBarWidths=40,wrapper=document.getElementsByClassName("wrapper-nav")[0],navLink=document.getElementsByClassName("nav-item nav-link"),lastNavLink=navLink[navLink.length-1],scrollerRight=document.getElementsByClassName("scroller-right")[0],scrollerLeft=document.getElementsByClassName("scroller-left")[0],list=document.querySelectorAll(".list");let btnTriggered=!1,widthOfList=function(){let e=0;return document.querySelectorAll(".list a").forEach(t=>{let l=getOuterWidth(t);e+=l}),e},widthOfHidden=function(e){const t=document.getElementsByClassName("wrapper-nav")[0];e=e||0,oW=getOuterWidth(t)-e;let l=parseFloat((0-oW).toFixed(3)),r=oW-widthOfList()-getLeftPosi()-40,n=document.body.clientWidth-(getOuterLeft(lastNavLink)+getOuterWidth(lastNavLink))-e;return l>r?n>l?n:l:n>r?n:r},getLeftPosi=function(){let e=0-getOuterWidth(wrapper),t=getOuterLeft(list[0]);return e>t?e:t},reAdjust=function(){let e=document.body.clientWidth-(getOuterLeft(lastNavLink)+getOuterWidth(lastNavLink));getOuterWidth(wrapper){reAdjust()})}),scrollerLeft.addEventListener("click",function(){if(btnTriggered)return;btnTriggered=!0,fade(scrollerRight),unfade(scrollerLeft);let e=getOuterWidth(scrollerLeft);move(document.querySelectorAll(".list")[0]).add("left",-getLeftPosi()+e,200).end().then(()=>{reAdjust()})});let getOuterLeft=function(e){return e.getBoundingClientRect().left},getOuterWidth=function(e){return parseFloat(window.getComputedStyle(e).width)};function fade(e){e.style.display="none",e.style.transition="opacity 0.6s",e.style.opacity=0}function unfade(e){e.style.display="block",e.style.transition="opacity 0.6s",e.style.opacity=1}reAdjust(); \ No newline at end of file diff --git a/bootstrap/node_modules/.package-lock.json b/bootstrap/node_modules/.package-lock.json new file mode 100644 index 0000000..4ae4763 --- /dev/null +++ b/bootstrap/node_modules/.package-lock.json @@ -0,0 +1,117 @@ +{ + "name": "test", + "lockfileVersion": 2, + "requires": true, + "packages": { + "node_modules/@popperjs/core": { + "version": "2.11.6", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", + "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, + "node_modules/after-transition": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/after-transition/-/after-transition-0.0.4.tgz", + "integrity": "sha512-ICK8lEx+rixC3kB3GCZGN54Ag8FP6S38w5NRab8U1FIoShsj+VAZLQSmL++gNaMkYxOpySzQdYocuR9ZUiZT1g==", + "dependencies": { + "css-emitter-component": "~0.1.1", + "has-transitions": "~0.3.0" + } + }, + "node_modules/bootstrap": { + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz", + "integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/twbs" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/bootstrap" + } + ], + "peerDependencies": { + "@popperjs/core": "^2.11.6" + } + }, + "node_modules/bootstrap-icons": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/bootstrap-icons/-/bootstrap-icons-1.10.3.tgz", + "integrity": "sha512-7Qvj0j0idEm/DdX9Q0CpxAnJYqBCFCiUI6qzSPYfERMcokVuV9Mdm/AJiVZI8+Gawe4h/l6zFcOzvV7oXCZArw==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/component-query": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-query/-/component-query-0.0.3.tgz", + "integrity": "sha512-VgebQseT1hz1Ps7vVp2uaSg+N/gsI5ts3AZUSnN6GMA2M82JH7o+qYifWhmVE/e8w/H48SJuA3nA9uX8zRe95Q==" + }, + "node_modules/css-ease": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/css-ease/-/css-ease-0.0.1.tgz", + "integrity": "sha512-1KnM/VfaSdKsJuImUJyPN8kFNuD6SFEOMRgstHplf2Ym82pz9RuvTemVmml54SUSqatRhGa7dPDY5+mCn9AoIA==" + }, + "node_modules/css-emitter-component": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/css-emitter-component/-/css-emitter-component-0.1.1.tgz", + "integrity": "sha512-Uv3ugVw9XJ1u2Ubugsg2l8y1ClzYmTipaZnYZmg4k8gjFaq9HjFECaMbSbNlvMqTKlzP/HGdHXSdFitRGncrTA==", + "dependencies": { + "event-component": "~0.1.0" + } + }, + "node_modules/event-component": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/event-component/-/event-component-0.1.0.tgz", + "integrity": "sha512-nDko83zL1Sfl4gbYJAsFnyla0Ok+llczIyZ9X+lkCIm5yW/hggS9gbYPxhZW1JD8K5VKaFmgeIZvnGE/DQnh2w==" + }, + "node_modules/has-transitions": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/has-transitions/-/has-transitions-0.3.0.tgz", + "integrity": "sha512-Lxop4v+IBCtFinWJ9P0Q1no8WyoBxWAsVp9ZO4Kdb0DJqrPFywsaAqCLhTpGQs/0VD62BEMpRtQzoFHh1CzwwA==" + }, + "node_modules/has-translate3d": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/has-translate3d/-/has-translate3d-0.0.3.tgz", + "integrity": "sha512-8tA0Rt/VtJaiDxri1oZEIbkmFqJu9GK5pLcL+f6B91MkBgkrRD3IaDSHMu8IOAEn60OUDC2oICcw3Mo1QQk8hw==", + "dependencies": { + "transform-property": "0.0.1" + } + }, + "node_modules/move-js": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/move-js/-/move-js-0.5.0.tgz", + "integrity": "sha512-pK3nAQ6gpYzq5Q9zsWpt3XinlKmLyEOjJervpFy7xtb7l2g/W3HxietI2a+oJb6Ar2IG2DpoKY9DR46rYCQgYA==", + "dependencies": { + "after-transition": "0.0.4", + "component-emitter": "^1.2.0", + "component-query": "0.0.3", + "css-ease": "0.0.1", + "has-translate3d": "0.0.3" + } + }, + "node_modules/scrolling-tabs-bootstrap-5": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/scrolling-tabs-bootstrap-5/-/scrolling-tabs-bootstrap-5-1.0.7.tgz", + "integrity": "sha512-KWZHwSA/5MZDSRWDEG1CZeaRHTo0BPooCNvggftCHXIsuPTwqtMDOpMBy/v2r2ofj6VGhHyODPhYFh4XG47PFg==", + "dependencies": { + "bootstrap": "^5.1.3", + "bootstrap-icons": "^1.7.2", + "move-js": "^0.5.0" + } + }, + "node_modules/transform-property": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/transform-property/-/transform-property-0.0.1.tgz", + "integrity": "sha512-L0nMJCwu3/Lpd5t/pRQl+JoYU5V0sYubcn30yWZnHG0HjC6Gdr/Eg/bun1OixYPmsEZdA7Khbq2jiSIjzlEv6Q==" + } + } +} diff --git a/bootstrap/node_modules/@popperjs/core/LICENSE.md b/bootstrap/node_modules/@popperjs/core/LICENSE.md new file mode 100644 index 0000000..0370c45 --- /dev/null +++ b/bootstrap/node_modules/@popperjs/core/LICENSE.md @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2019 Federico Zivolo + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bootstrap/node_modules/@popperjs/core/README.md b/bootstrap/node_modules/@popperjs/core/README.md new file mode 100644 index 0000000..53be7b9 --- /dev/null +++ b/bootstrap/node_modules/@popperjs/core/README.md @@ -0,0 +1,376 @@ + +

+ Popper +

+ +
+

Tooltip & Popover Positioning Engine

+
+ +

+ + npm version + + + npm downloads per month (popper.js + @popperjs/core) + + + Rolling Versions + +

+ +
+ + +**Positioning tooltips and popovers is difficult. Popper is here to help!** + +Given an element, such as a button, and a tooltip element describing it, Popper +will automatically put the tooltip in the right place near the button. + +It will position _any_ UI element that "pops out" from the flow of your document +and floats near a target element. The most common example is a tooltip, but it +also includes popovers, drop-downs, and more. All of these can be generically +described as a "popper" element. + +## Demo + +[![Popper visualized](https://i.imgur.com/F7qWsmV.jpg)](https://popper.js.org) + +## Docs + +- [v2.x (latest)](https://popper.js.org/docs/v2/) +- [v1.x](https://popper.js.org/docs/v1/) + +We've created a +[Migration Guide](https://popper.js.org/docs/v2/migration-guide/) to help you +migrate from Popper 1 to Popper 2. + +To contribute to the Popper website and documentation, please visit the +[dedicated repository](https://github.com/popperjs/website). + +## Why not use pure CSS? + +- **Clipping and overflow issues**: Pure CSS poppers will not be prevented from + overflowing clipping boundaries, such as the viewport. It will get partially + cut off or overflows if it's near the edge since there is no dynamic + positioning logic. When using Popper, your popper will always be positioned in + the right place without needing manual adjustments. +- **No flipping**: CSS poppers will not flip to a different placement to fit + better in view if necessary. While you can manually adjust for the main axis + overflow, this feature cannot be achieved via CSS alone. Popper automatically + flips the tooltip to make it fit in view as best as possible for the user. +- **No virtual positioning**: CSS poppers cannot follow the mouse cursor or be + used as a context menu. Popper allows you to position your tooltip relative to + any coordinates you desire. +- **Slower development cycle**: When pure CSS is used to position popper + elements, the lack of dynamic positioning means they must be carefully placed + to consider overflow on all screen sizes. In reusable component libraries, + this means a developer can't just add the component anywhere on the page, + because these issues need to be considered and adjusted for every time. With + Popper, you can place your elements anywhere and they will be positioned + correctly, without needing to consider different screen sizes, layouts, etc. + This massively speeds up development time because this work is automatically + offloaded to Popper. +- **Lack of extensibility**: CSS poppers cannot be easily extended to fit any + arbitrary use case you may need to adjust for. Popper is built with + extensibility in mind. + +## Why Popper? + +With the CSS drawbacks out of the way, we now move on to Popper in the +JavaScript space itself. + +Naive JavaScript tooltip implementations usually have the following problems: + +- **Scrolling containers**: They don't ensure the tooltip stays with the + reference element while scrolling when inside any number of scrolling + containers. +- **DOM context**: They often require the tooltip move outside of its original + DOM context because they don't handle `offsetParent` contexts. +- **Compatibility**: Popper handles an incredible number of edge cases regarding + different browsers and environments (mobile viewports, RTL, scrollbars enabled + or disabled, etc.). Popper is a popular and well-maintained library, so you + can be confident positioning will work for your users on any device. +- **Configurability**: They often lack advanced configurability to suit any + possible use case. +- **Size**: They are usually relatively large in size, or require an ancient + jQuery dependency. +- **Performance**: They often have runtime performance issues and update the + tooltip position too slowly. + +**Popper solves all of these key problems in an elegant, performant manner.** It +is a lightweight ~3 kB library that aims to provide a reliable and extensible +positioning engine you can use to ensure all your popper elements are positioned +in the right place. + +When you start writing your own popper implementation, you'll quickly run into +all of the problems mentioned above. These widgets are incredibly common in our +UIs; we've done the hard work figuring this out so you don't need to spend hours +fixing and handling numerous edge cases that we already ran into while building +the library! + +Popper is used in popular libraries like Bootstrap, Foundation, Material UI, and +more. It's likely you've already used popper elements on the web positioned by +Popper at some point in the past few years. + +Since we write UIs using powerful abstraction libraries such as React or Angular +nowadays, you'll also be glad to know Popper can fully integrate with them and +be a good citizen together with your other components. Check out `react-popper` +for the official Popper wrapper for React. + +## Installation + +### 1. Package Manager + +```bash +# With npm +npm i @popperjs/core + +# With Yarn +yarn add @popperjs/core +``` + +### 2. CDN + +```html + + + + + +``` + +### 3. Direct Download? + +Managing dependencies by "directly downloading" them and placing them into your +source code is not recommended for a variety of reasons, including missing out +on feat/fix updates easily. Please use a versioning management system like a CDN +or npm/Yarn. + +## Usage + +The most straightforward way to get started is to import Popper from the `unpkg` +CDN, which includes all of its features. You can call the `Popper.createPopper` +constructor to create new popper instances. + +Here is a complete example: + +```html + +Popper example + + + + + + + + +``` + +Visit the [tutorial](https://popper.js.org/docs/v2/tutorial/) for an example of +how to build your own tooltip from scratch using Popper. + +### Module bundlers + +You can import the `createPopper` constructor from the fully-featured file: + +```js +import { createPopper } from '@popperjs/core'; + +const button = document.querySelector('#button'); +const tooltip = document.querySelector('#tooltip'); + +// Pass the button, the tooltip, and some options, and Popper will do the +// magic positioning for you: +createPopper(button, tooltip, { + placement: 'right', +}); +``` + +All the modifiers listed in the docs menu will be enabled and "just work", so +you don't need to think about setting Popper up. The size of Popper including +all of its features is about 5 kB minzipped, but it may grow a bit in the +future. + +#### Popper Lite (tree-shaking) + +If bundle size is important, you'll want to take advantage of tree-shaking. The +library is built in a modular way to allow to import only the parts you really +need. + +```js +import { createPopperLite as createPopper } from '@popperjs/core'; +``` + +The Lite version includes the most necessary modifiers that will compute the +offsets of the popper, compute and add the positioning styles, and add event +listeners. This is close in bundle size to pure CSS tooltip libraries, and +behaves somewhat similarly. + +However, this does not include the features that makes Popper truly useful. + +The two most useful modifiers not included in Lite are `preventOverflow` and +`flip`: + +```js +import { + createPopperLite as createPopper, + preventOverflow, + flip, +} from '@popperjs/core'; + +const button = document.querySelector('#button'); +const tooltip = document.querySelector('#tooltip'); + +createPopper(button, tooltip, { + modifiers: [preventOverflow, flip], +}); +``` + +As you make more poppers, you may be finding yourself needing other modifiers +provided by the library. + +See [tree-shaking](https://popper.js.org/docs/v2/performance/#tree-shaking) for more +information. + +## Distribution targets + +Popper is distributed in 3 different versions, in 3 different file formats. + +The 3 file formats are: + +- `esm` (works with `import` syntax — **recommended**) +- `umd` (works with ` + + + diff --git a/bootstrap/node_modules/component-query/index.js b/bootstrap/node_modules/component-query/index.js new file mode 100644 index 0000000..cd2cf3a --- /dev/null +++ b/bootstrap/node_modules/component-query/index.js @@ -0,0 +1,21 @@ +function one(selector, el) { + return el.querySelector(selector); +} + +exports = module.exports = function(selector, el){ + el = el || document; + return one(selector, el); +}; + +exports.all = function(selector, el){ + el = el || document; + return el.querySelectorAll(selector); +}; + +exports.engine = function(obj){ + if (!obj.one) throw new Error('.one callback required'); + if (!obj.all) throw new Error('.all callback required'); + one = obj.one; + exports.all = obj.all; + return exports; +}; diff --git a/bootstrap/node_modules/component-query/package.json b/bootstrap/node_modules/component-query/package.json new file mode 100644 index 0000000..b9c0a48 --- /dev/null +++ b/bootstrap/node_modules/component-query/package.json @@ -0,0 +1,24 @@ +{ + "name": "component-query", + "description": "Query the DOM with selector engine fallback support", + "version": "0.0.3", + "keywords": [ + "query", + "selector", + "engine", + "dom", + "elements" + ], + "dependencies": {}, + "license": "MIT", + "main": "index.js", + "repository": { + "type": "git", + "url": "https://github.com/component/query.git" + }, + "component": { + "scripts": { + "query/index.js": "index.js" + } + } +} diff --git a/bootstrap/node_modules/css-ease/.npmignore b/bootstrap/node_modules/css-ease/.npmignore new file mode 100644 index 0000000..48a2e24 --- /dev/null +++ b/bootstrap/node_modules/css-ease/.npmignore @@ -0,0 +1,2 @@ +components +build diff --git a/bootstrap/node_modules/css-ease/History.md b/bootstrap/node_modules/css-ease/History.md new file mode 100644 index 0000000..82379e8 --- /dev/null +++ b/bootstrap/node_modules/css-ease/History.md @@ -0,0 +1,5 @@ + +0.0.1 / 2013-09-28 +================== + + * Initial commit diff --git a/bootstrap/node_modules/css-ease/Makefile b/bootstrap/node_modules/css-ease/Makefile new file mode 100644 index 0000000..0f14dac --- /dev/null +++ b/bootstrap/node_modules/css-ease/Makefile @@ -0,0 +1,11 @@ + +build: components index.js + @component build --dev + +components: component.json + @component install --dev + +clean: + rm -fr build components template.js + +.PHONY: clean diff --git a/bootstrap/node_modules/css-ease/Readme.md b/bootstrap/node_modules/css-ease/Readme.md new file mode 100644 index 0000000..94e9ac0 --- /dev/null +++ b/bootstrap/node_modules/css-ease/Readme.md @@ -0,0 +1,56 @@ + +# css-ease + + css easing functions, taken from [visionmedia/move.js](/visionmedia/move.js). + +## Installation + + Install with [component(1)](http://component.io): + + $ component install yields/css-ease + + or via [npm](https://www.npmjs.com): + + $ npm install css-ease + +## Example + +```js +ease.snap; // => "cubic-bezier(0,1,.5,1)" +``` + +```js +'in': 'ease-in' +'out': 'ease-out' +'in-out': 'ease-in-out' +'snap': 'cubic-bezier(0,1,.5,1)' +'linear': 'cubic-bezier(0.250, 0.250, 0.750, 0.750)' +'ease-in-quad': 'cubic-bezier(0.550, 0.085, 0.680, 0.530)' +'ease-in-cubic': 'cubic-bezier(0.550, 0.055, 0.675, 0.190)' +'ease-in-quart': 'cubic-bezier(0.895, 0.030, 0.685, 0.220)' +'ease-in-quint': 'cubic-bezier(0.755, 0.050, 0.855, 0.060)' +'ease-in-sine': 'cubic-bezier(0.470, 0.000, 0.745, 0.715)' +'ease-in-expo': 'cubic-bezier(0.950, 0.050, 0.795, 0.035)' +'ease-in-circ': 'cubic-bezier(0.600, 0.040, 0.980, 0.335)' +'ease-in-back': 'cubic-bezier(0.600, -0.280, 0.735, 0.045)' +'ease-out-quad': 'cubic-bezier(0.250, 0.460, 0.450, 0.940)' +'ease-out-cubic': 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' +'ease-out-quart': 'cubic-bezier(0.165, 0.840, 0.440, 1.000)' +'ease-out-quint': 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' +'ease-out-sine': 'cubic-bezier(0.390, 0.575, 0.565, 1.000)' +'ease-out-expo': 'cubic-bezier(0.190, 1.000, 0.220, 1.000)' +'ease-out-circ': 'cubic-bezier(0.075, 0.820, 0.165, 1.000)' +'ease-out-back': 'cubic-bezier(0.175, 0.885, 0.320, 1.275)' +'ease-out-quad': 'cubic-bezier(0.455, 0.030, 0.515, 0.955)' +'ease-out-cubic': 'cubic-bezier(0.645, 0.045, 0.355, 1.000)' +'ease-in-out-quart': 'cubic-bezier(0.770, 0.000, 0.175, 1.000)' +'ease-in-out-quint': 'cubic-bezier(0.860, 0.000, 0.070, 1.000)' +'ease-in-out-sine': 'cubic-bezier(0.445, 0.050, 0.550, 0.950)' +'ease-in-out-expo': 'cubic-bezier(1.000, 0.000, 0.000, 1.000)' +'ease-in-out-circ': 'cubic-bezier(0.785, 0.135, 0.150, 0.860)' +'ease-in-out-back': 'cubic-bezier(0.680, -0.550, 0.265, 1.550)' +``` + +## License + + MIT diff --git a/bootstrap/node_modules/css-ease/component.json b/bootstrap/node_modules/css-ease/component.json new file mode 100644 index 0000000..952b086 --- /dev/null +++ b/bootstrap/node_modules/css-ease/component.json @@ -0,0 +1,14 @@ +{ + "name": "css-ease", + "repo": "yields/css-ease", + "description": "css easing functions.", + "version": "0.0.1", + "keywords": [], + "dependencies": {}, + "development": {}, + "license": "MIT", + "main": "index.js", + "scripts": [ + "index.js" + ] +} \ No newline at end of file diff --git a/bootstrap/node_modules/css-ease/index.js b/bootstrap/node_modules/css-ease/index.js new file mode 100644 index 0000000..8e66c4b --- /dev/null +++ b/bootstrap/node_modules/css-ease/index.js @@ -0,0 +1,36 @@ + +/** + * CSS Easing functions + */ + +module.exports = { + 'in': 'ease-in' + , 'out': 'ease-out' + , 'in-out': 'ease-in-out' + , 'snap': 'cubic-bezier(0,1,.5,1)' + , 'linear': 'cubic-bezier(0.250, 0.250, 0.750, 0.750)' + , 'ease-in-quad': 'cubic-bezier(0.550, 0.085, 0.680, 0.530)' + , 'ease-in-cubic': 'cubic-bezier(0.550, 0.055, 0.675, 0.190)' + , 'ease-in-quart': 'cubic-bezier(0.895, 0.030, 0.685, 0.220)' + , 'ease-in-quint': 'cubic-bezier(0.755, 0.050, 0.855, 0.060)' + , 'ease-in-sine': 'cubic-bezier(0.470, 0.000, 0.745, 0.715)' + , 'ease-in-expo': 'cubic-bezier(0.950, 0.050, 0.795, 0.035)' + , 'ease-in-circ': 'cubic-bezier(0.600, 0.040, 0.980, 0.335)' + , 'ease-in-back': 'cubic-bezier(0.600, -0.280, 0.735, 0.045)' + , 'ease-out-quad': 'cubic-bezier(0.250, 0.460, 0.450, 0.940)' + , 'ease-out-cubic': 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' + , 'ease-out-quart': 'cubic-bezier(0.165, 0.840, 0.440, 1.000)' + , 'ease-out-quint': 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' + , 'ease-out-sine': 'cubic-bezier(0.390, 0.575, 0.565, 1.000)' + , 'ease-out-expo': 'cubic-bezier(0.190, 1.000, 0.220, 1.000)' + , 'ease-out-circ': 'cubic-bezier(0.075, 0.820, 0.165, 1.000)' + , 'ease-out-back': 'cubic-bezier(0.175, 0.885, 0.320, 1.275)' + , 'ease-out-quad': 'cubic-bezier(0.455, 0.030, 0.515, 0.955)' + , 'ease-out-cubic': 'cubic-bezier(0.645, 0.045, 0.355, 1.000)' + , 'ease-in-out-quart': 'cubic-bezier(0.770, 0.000, 0.175, 1.000)' + , 'ease-in-out-quint': 'cubic-bezier(0.860, 0.000, 0.070, 1.000)' + , 'ease-in-out-sine': 'cubic-bezier(0.445, 0.050, 0.550, 0.950)' + , 'ease-in-out-expo': 'cubic-bezier(1.000, 0.000, 0.000, 1.000)' + , 'ease-in-out-circ': 'cubic-bezier(0.785, 0.135, 0.150, 0.860)' + , 'ease-in-out-back': 'cubic-bezier(0.680, -0.550, 0.265, 1.550)' +}; diff --git a/bootstrap/node_modules/css-ease/package.json b/bootstrap/node_modules/css-ease/package.json new file mode 100644 index 0000000..f681c63 --- /dev/null +++ b/bootstrap/node_modules/css-ease/package.json @@ -0,0 +1,15 @@ +{ + "name": "css-ease", + "homepage": "https://github.com/yields/css-ease", + "repository": { + "type": "git", + "url": "git://github.com/yields/css-ease.git" + }, + "description": "css easing functions.", + "version": "0.0.1", + "keywords": ["easing"], + "dependencies": {}, + "devDependencies": {}, + "license": "MIT", + "main": "index.js" +} diff --git a/bootstrap/node_modules/css-emitter-component/.npmignore b/bootstrap/node_modules/css-emitter-component/.npmignore new file mode 100644 index 0000000..4d78832 --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/.npmignore @@ -0,0 +1,3 @@ +node_modules +components +build diff --git a/bootstrap/node_modules/css-emitter-component/History.md b/bootstrap/node_modules/css-emitter-component/History.md new file mode 100644 index 0000000..e69de29 diff --git a/bootstrap/node_modules/css-emitter-component/Makefile b/bootstrap/node_modules/css-emitter-component/Makefile new file mode 100644 index 0000000..0f14dac --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/Makefile @@ -0,0 +1,11 @@ + +build: components index.js + @component build --dev + +components: component.json + @component install --dev + +clean: + rm -fr build components template.js + +.PHONY: clean diff --git a/bootstrap/node_modules/css-emitter-component/Readme.md b/bootstrap/node_modules/css-emitter-component/Readme.md new file mode 100644 index 0000000..9fa2f21 --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/Readme.md @@ -0,0 +1,65 @@ +# css-emitter + + Bind functions to `transition` and `animation` events. + +## Installation + + $ component install ecarter/css-emitter + +## Example + + var css = require('css-emitter'); + var el = document.querySelector('#box'); + + var animate = css(el); + + // Bind + animate.bind(function(e){ + console.log('%s property changed on %s event', e.propertyName, e.type); + }); + + // Change height and width + setTimeout(function(){ + el.className = 'in'; + }, 1000); + +### Example CSS + + #box { + width: 100px; + height: 100px; + transition: all 1s ease; + -webkit-transition: all 1s ease; + -moz-transition: all 1s ease; + -o-transition: all 1s ease; + background: black; + display: block; + } + + #box.in { + width: 200px; + height: 200px; + } + +## API + +### CssEmitter(target:Element) + +Initialize an `CssEmitter` with given `target` element. + +### CssEmitter.bind(fn:Function) + +Register bind function. + +### CssEmitter.unbind([fn]:Function) + +Unregister bind function. + +### CssEmitter.once(fn:Function) + +Register a function that will fire once then unbind automatically + +## License + + MIT + diff --git a/bootstrap/node_modules/css-emitter-component/component.json b/bootstrap/node_modules/css-emitter-component/component.json new file mode 100644 index 0000000..7c6a320 --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/component.json @@ -0,0 +1,15 @@ +{ + "name": "css-emitter", + "repo": "anthonyshort/css-emitter", + "description": "fire events on css transition and animation completion", + "version": "0.1.1", + "keywords": ["css", "emitter", "events", "transition", "animation"], + "dependencies": { + "component/emitter": "*", + "component/event": "*" + }, + "license": "MIT", + "scripts": [ + "index.js" + ] +} diff --git a/bootstrap/node_modules/css-emitter-component/index.js b/bootstrap/node_modules/css-emitter-component/index.js new file mode 100644 index 0000000..1874623 --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/index.js @@ -0,0 +1,77 @@ +/** + * Module Dependencies + */ + +var events = require('event'); + +// CSS events + +var watch = [ + 'transitionend' +, 'webkitTransitionEnd' +, 'oTransitionEnd' +, 'MSTransitionEnd' +, 'animationend' +, 'webkitAnimationEnd' +, 'oAnimationEnd' +, 'MSAnimationEnd' +]; + +/** + * Expose `CSSnext` + */ + +module.exports = CssEmitter; + +/** + * Initialize a new `CssEmitter` + * + */ + +function CssEmitter(element){ + if (!(this instanceof CssEmitter)) return new CssEmitter(element); + this.el = element; +} + +/** + * Bind CSS events. + * + * @api public + */ + +CssEmitter.prototype.bind = function(fn){ + for (var i=0; i < watch.length; i++) { + events.bind(this.el, watch[i], fn); + } + return this; +}; + +/** + * Unbind CSS events + * + * @api public + */ + +CssEmitter.prototype.unbind = function(fn){ + for (var i=0; i < watch.length; i++) { + events.unbind(this.el, watch[i], fn); + } + return this; +}; + +/** + * Fire callback only once + * + * @api public + */ + +CssEmitter.prototype.once = function(fn){ + var self = this; + function on(){ + self.unbind(on); + fn.apply(self.el, arguments); + } + self.bind(on); + return this; +}; + diff --git a/bootstrap/node_modules/css-emitter-component/package.json b/bootstrap/node_modules/css-emitter-component/package.json new file mode 100644 index 0000000..a049d9b --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/package.json @@ -0,0 +1,31 @@ +{ + "name": "css-emitter-component", + "version": "0.1.1", + "description": "fire events on css transition and animation completion", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "mocha test" + }, + "repository": { + "type": "git", + "url": "https://github.com/anthonyshort/css-emitter.git" + }, + "keywords": [ + "component", + "css", + "browserify" + ], + "author": "Anthony Short", + "license": "BSD", + "readmeFilename": "Readme.md", + "gitHead": "46dd02ee19f68e027d48952f161e1035fbe3ae50", + "browser": { + "event": "event-component" + }, + "dependencies": { + "event-component": "~0.1.0" + } +} diff --git a/bootstrap/node_modules/css-emitter-component/test/index.html b/bootstrap/node_modules/css-emitter-component/test/index.html new file mode 100644 index 0000000..4ff739d --- /dev/null +++ b/bootstrap/node_modules/css-emitter-component/test/index.html @@ -0,0 +1,41 @@ + + + + CSS Emitter + + + + +
+ + + + diff --git a/bootstrap/node_modules/event-component/.npmignore b/bootstrap/node_modules/event-component/.npmignore new file mode 100644 index 0000000..48a2e24 --- /dev/null +++ b/bootstrap/node_modules/event-component/.npmignore @@ -0,0 +1,2 @@ +components +build diff --git a/bootstrap/node_modules/event-component/History.md b/bootstrap/node_modules/event-component/History.md new file mode 100644 index 0000000..464f264 --- /dev/null +++ b/bootstrap/node_modules/event-component/History.md @@ -0,0 +1,5 @@ + +0.1.0 / 2012-12-18 +================== + + * add returning of the callback function diff --git a/bootstrap/node_modules/event-component/Makefile b/bootstrap/node_modules/event-component/Makefile new file mode 100644 index 0000000..b3770fb --- /dev/null +++ b/bootstrap/node_modules/event-component/Makefile @@ -0,0 +1,11 @@ + +build: components index.js + @component build + +components: component.json + @component install --dev + +clean: + rm -fr build components + +.PHONY: clean diff --git a/bootstrap/node_modules/event-component/Readme.md b/bootstrap/node_modules/event-component/Readme.md new file mode 100644 index 0000000..7a22983 --- /dev/null +++ b/bootstrap/node_modules/event-component/Readme.md @@ -0,0 +1,39 @@ + +# event + + Element event binding component. + +## Installation + + $ component install component/event + +## Example + +```js +var events = require('event'); +var a = document.querySelector('a'); + +function onclick(e) { + e.preventDefault(); + console.log(e.target); + events.unbind(a, 'click', onclick); +} + +events.bind(a, 'click', onclick); +``` + +## API + +### .bind(el, type, callback, [capture]) + + Bind to `el`'s event `type` with `callback`, + returns the `callback` passed. + +### .unbind(el, type, callback, [capture]) + + Unbind `el`'s event `type` `callback`, + returns the `callback` passed. + +## License + + MIT diff --git a/bootstrap/node_modules/event-component/component.json b/bootstrap/node_modules/event-component/component.json new file mode 100644 index 0000000..f12d22c --- /dev/null +++ b/bootstrap/node_modules/event-component/component.json @@ -0,0 +1,10 @@ +{ + "name": "event", + "repo": "component/event", + "description": "Event binding component", + "version": "0.1.0", + "keywords": ["event", "events"], + "scripts": [ + "index.js" + ] +} diff --git a/bootstrap/node_modules/event-component/index.js b/bootstrap/node_modules/event-component/index.js new file mode 100644 index 0000000..f111b17 --- /dev/null +++ b/bootstrap/node_modules/event-component/index.js @@ -0,0 +1,40 @@ + +/** + * Bind `el` event `type` to `fn`. + * + * @param {Element} el + * @param {String} type + * @param {Function} fn + * @param {Boolean} capture + * @return {Function} + * @api public + */ + +exports.bind = function(el, type, fn, capture){ + if (el.addEventListener) { + el.addEventListener(type, fn, capture); + } else { + el.attachEvent('on' + type, fn); + } + return fn; +}; + +/** + * Unbind `el` event `type`'s callback `fn`. + * + * @param {Element} el + * @param {String} type + * @param {Function} fn + * @param {Boolean} capture + * @return {Function} + * @api public + */ + +exports.unbind = function(el, type, fn, capture){ + if (el.removeEventListener) { + el.removeEventListener(type, fn, capture); + } else { + el.detachEvent('on' + type, fn); + } + return fn; +}; diff --git a/bootstrap/node_modules/event-component/package.json b/bootstrap/node_modules/event-component/package.json new file mode 100644 index 0000000..e804888 --- /dev/null +++ b/bootstrap/node_modules/event-component/package.json @@ -0,0 +1,12 @@ +{ + "name": "event-component", + "repo": "component/event", + "description": "Event binding component", + "version": "0.1.0", + "keywords": ["event", "events"], + "component": { + "scripts": { + "event/index.js": "index.js" + } + } +} diff --git a/bootstrap/node_modules/event-component/test/index.html b/bootstrap/node_modules/event-component/test/index.html new file mode 100644 index 0000000..24fefd4 --- /dev/null +++ b/bootstrap/node_modules/event-component/test/index.html @@ -0,0 +1,24 @@ + + + Event + + + + link + + + + + + diff --git a/bootstrap/node_modules/has-transitions/.npmignore b/bootstrap/node_modules/has-transitions/.npmignore new file mode 100644 index 0000000..aa6fd7c --- /dev/null +++ b/bootstrap/node_modules/has-transitions/.npmignore @@ -0,0 +1,3 @@ +components +build +node_modules \ No newline at end of file diff --git a/bootstrap/node_modules/has-transitions/History.md b/bootstrap/node_modules/has-transitions/History.md new file mode 100644 index 0000000..0256e28 --- /dev/null +++ b/bootstrap/node_modules/has-transitions/History.md @@ -0,0 +1,8 @@ + +0.0.1 / 2013-05-20 +================== +Initial release + +0.1.0 / 2013-05-22 +================== +Is now a function that takes an element diff --git a/bootstrap/node_modules/has-transitions/Makefile b/bootstrap/node_modules/has-transitions/Makefile new file mode 100644 index 0000000..0f14dac --- /dev/null +++ b/bootstrap/node_modules/has-transitions/Makefile @@ -0,0 +1,11 @@ + +build: components index.js + @component build --dev + +components: component.json + @component install --dev + +clean: + rm -fr build components template.js + +.PHONY: clean diff --git a/bootstrap/node_modules/has-transitions/Readme.md b/bootstrap/node_modules/has-transitions/Readme.md new file mode 100644 index 0000000..4f20769 --- /dev/null +++ b/bootstrap/node_modules/has-transitions/Readme.md @@ -0,0 +1,41 @@ + +# has-transitions + + Determine if an element has transitions + +## Installation + + $ component install anthonyshort/has-transitions + +## API + + var hasTransitions = require('has-transitions'); + var cssEmitter = require('css-emitter'); + + if(hasTransitions(el)) { + cssEmitter(el).bind(onTransitionEnd); + } + else { + onTransitionEvent(); + } + +## Methods + +### hasTransitions([el]) + +Determine if an element has any transition properties. If the browser doesn't +support transitions this will always return false. `el` defaults to `document.body`. + +## Properties + +### hasTransitions.support + +Boolean for whether the browser supports transitions at all + +### hasTransitions.property + +Get the prefixed property name to use for transitions + +## License + + MIT diff --git a/bootstrap/node_modules/has-transitions/component.json b/bootstrap/node_modules/has-transitions/component.json new file mode 100644 index 0000000..77dda3e --- /dev/null +++ b/bootstrap/node_modules/has-transitions/component.json @@ -0,0 +1,16 @@ +{ + "name": "has-transitions", + "repo": "anthonyshort/has-transitions", + "description": "Determine if an element has transitions", + "version": "0.3.0", + "keywords": [], + "dependencies": {}, + "development": { + "component/assert": "*" + }, + "license": "MIT", + "main": "index.js", + "scripts": [ + "index.js" + ] +} \ No newline at end of file diff --git a/bootstrap/node_modules/has-transitions/index.js b/bootstrap/node_modules/has-transitions/index.js new file mode 100644 index 0000000..bf83066 --- /dev/null +++ b/bootstrap/node_modules/has-transitions/index.js @@ -0,0 +1,48 @@ +/** + * This will store the property that the current + * browser uses for transitionDuration + */ +var property; + +/** + * The properties we'll check on an element + * to determine if it actually has transitions + * We use duration as this is the only property + * needed to technically have transitions + * @type {Array} + */ +var types = [ + "transitionDuration", + "MozTransitionDuration", + "webkitTransitionDuration" +]; + +/** + * Determine the correct property for this browser + * just once so we done need to check every time + */ +while(types.length) { + var type = types.shift(); + if(type in document.body.style) { + property = type; + } +} + +/** + * Determine if the browser supports transitions or + * if an element has transitions at all. + * @param {Element} el Optional. Returns browser support if not included + * @return {Boolean} + */ +function hasTransitions(el){ + if(!property) { + return false; // No browser support for transitions + } + if(!el) { + return property != null; // We just want to know if browsers support it + } + var duration = getComputedStyle(el)[property]; + return duration !== "" && parseFloat(duration) !== 0; // Does this element have transitions? +} + +module.exports = hasTransitions; \ No newline at end of file diff --git a/bootstrap/node_modules/has-transitions/package.json b/bootstrap/node_modules/has-transitions/package.json new file mode 100644 index 0000000..b4bba9c --- /dev/null +++ b/bootstrap/node_modules/has-transitions/package.json @@ -0,0 +1,26 @@ +{ + "name": "has-transitions", + "version": "0.3.0", + "description": "Check for transition support", + "main": "index.js", + "directories": { + "test": "test" + }, + "scripts": { + "test": "open test/index.html" + }, + "repository": { + "type": "git", + "url": "https://github.com/anthonyshort/has-transitions.git" + }, + "keywords": [ + "component", + "browserify", + "css", + "transitions" + ], + "author": "Anthony Short", + "license": "BSD", + "readmeFilename": "Readme.md", + "gitHead": "27050348e9fdac520bbb66a9fc6bd0d449da26eb" +} diff --git a/bootstrap/node_modules/has-transitions/test/index.html b/bootstrap/node_modules/has-transitions/test/index.html new file mode 100644 index 0000000..57bca65 --- /dev/null +++ b/bootstrap/node_modules/has-transitions/test/index.html @@ -0,0 +1,26 @@ + + + + Mocha + + + + + + +
+ + + + + + + diff --git a/bootstrap/node_modules/has-transitions/test/mocha.css b/bootstrap/node_modules/has-transitions/test/mocha.css new file mode 100644 index 0000000..1d74784 --- /dev/null +++ b/bootstrap/node_modules/has-transitions/test/mocha.css @@ -0,0 +1,251 @@ +@charset "utf-8"; + +body { + margin:0; +} + +#mocha { + font: 20px/1.5 "Helvetica Neue", Helvetica, Arial, sans-serif; + margin: 60px 50px; +} + +#mocha ul, #mocha li { + margin: 0; + padding: 0; +} + +#mocha ul { + list-style: none; +} + +#mocha h1, #mocha h2 { + margin: 0; +} + +#mocha h1 { + margin-top: 15px; + font-size: 1em; + font-weight: 200; +} + +#mocha h1 a { + text-decoration: none; + color: inherit; +} + +#mocha h1 a:hover { + text-decoration: underline; +} + +#mocha .suite .suite h1 { + margin-top: 0; + font-size: .8em; +} + +#mocha .hidden { + display: none; +} + +#mocha h2 { + font-size: 12px; + font-weight: normal; + cursor: pointer; +} + +#mocha .suite { + margin-left: 15px; +} + +#mocha .test { + margin-left: 15px; + overflow: hidden; +} + +#mocha .test.pending:hover h2::after { + content: '(pending)'; + font-family: arial, sans-serif; +} + +#mocha .test.pass.medium .duration { + background: #C09853; +} + +#mocha .test.pass.slow .duration { + background: #B94A48; +} + +#mocha .test.pass::before { + content: '✓'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #00d6b2; +} + +#mocha .test.pass .duration { + font-size: 9px; + margin-left: 5px; + padding: 2px 5px; + color: white; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + box-shadow: inset 0 1px 1px rgba(0,0,0,.2); + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + -ms-border-radius: 5px; + -o-border-radius: 5px; + border-radius: 5px; +} + +#mocha .test.pass.fast .duration { + display: none; +} + +#mocha .test.pending { + color: #0b97c4; +} + +#mocha .test.pending::before { + content: '◦'; + color: #0b97c4; +} + +#mocha .test.fail { + color: #c00; +} + +#mocha .test.fail pre { + color: black; +} + +#mocha .test.fail::before { + content: '✖'; + font-size: 12px; + display: block; + float: left; + margin-right: 5px; + color: #c00; +} + +#mocha .test pre.error { + color: #c00; + max-height: 300px; + overflow: auto; +} + +#mocha .test pre { + display: block; + float: left; + clear: left; + font: 12px/1.5 monaco, monospace; + margin: 5px; + padding: 15px; + border: 1px solid #eee; + border-bottom-color: #ddd; + -webkit-border-radius: 3px; + -webkit-box-shadow: 0 1px 3px #eee; + -moz-border-radius: 3px; + -moz-box-shadow: 0 1px 3px #eee; +} + +#mocha .test h2 { + position: relative; +} + +#mocha .test a.replay { + position: absolute; + top: 3px; + right: 0; + text-decoration: none; + vertical-align: middle; + display: block; + width: 15px; + height: 15px; + line-height: 15px; + text-align: center; + background: #eee; + font-size: 15px; + -moz-border-radius: 15px; + border-radius: 15px; + -webkit-transition: opacity 200ms; + -moz-transition: opacity 200ms; + transition: opacity 200ms; + opacity: 0.3; + color: #888; +} + +#mocha .test:hover a.replay { + opacity: 1; +} + +#mocha-report.pass .test.fail { + display: none; +} + +#mocha-report.fail .test.pass { + display: none; +} + +#mocha-error { + color: #c00; + font-size: 1.5em; + font-weight: 100; + letter-spacing: 1px; +} + +#mocha-stats { + position: fixed; + top: 15px; + right: 10px; + font-size: 12px; + margin: 0; + color: #888; + z-index: 1; +} + +#mocha-stats .progress { + float: right; + padding-top: 0; +} + +#mocha-stats em { + color: black; +} + +#mocha-stats a { + text-decoration: none; + color: inherit; +} + +#mocha-stats a:hover { + border-bottom: 1px solid #eee; +} + +#mocha-stats li { + display: inline-block; + margin: 0 5px; + list-style: none; + padding-top: 11px; +} + +#mocha-stats canvas { + width: 40px; + height: 40px; +} + +#mocha code .comment { color: #ddd } +#mocha code .init { color: #2F6FAD } +#mocha code .string { color: #5890AD } +#mocha code .keyword { color: #8A6343 } +#mocha code .number { color: #2F6FAD } + +@media screen and (max-device-width: 480px) { + #mocha { + margin: 60px 0px; + } + + #mocha #stats { + position: absolute; + } +} diff --git a/bootstrap/node_modules/has-transitions/test/mocha.js b/bootstrap/node_modules/has-transitions/test/mocha.js new file mode 100644 index 0000000..a55115a --- /dev/null +++ b/bootstrap/node_modules/has-transitions/test/mocha.js @@ -0,0 +1,5428 @@ +;(function(){ + +// CommonJS require() + +function require(p){ + var path = require.resolve(p) + , mod = require.modules[path]; + if (!mod) throw new Error('failed to require "' + p + '"'); + if (!mod.exports) { + mod.exports = {}; + mod.call(mod.exports, mod, mod.exports, require.relative(path)); + } + return mod.exports; + } + +require.modules = {}; + +require.resolve = function (path){ + var orig = path + , reg = path + '.js' + , index = path + '/index.js'; + return require.modules[reg] && reg + || require.modules[index] && index + || orig; + }; + +require.register = function (path, fn){ + require.modules[path] = fn; + }; + +require.relative = function (parent) { + return function(p){ + if ('.' != p.charAt(0)) return require(p); + + var path = parent.split('/') + , segs = p.split('/'); + path.pop(); + + for (var i = 0; i < segs.length; i++) { + var seg = segs[i]; + if ('..' == seg) path.pop(); + else if ('.' != seg) path.push(seg); + } + + return require(path.join('/')); + }; + }; + + +require.register("browser/debug.js", function(module, exports, require){ + +module.exports = function(type){ + return function(){ + } +}; + +}); // module: browser/debug.js + +require.register("browser/diff.js", function(module, exports, require){ +/* See license.txt for terms of usage */ + +/* + * Text diff implementation. + * + * This library supports the following APIS: + * JsDiff.diffChars: Character by character diff + * JsDiff.diffWords: Word (as defined by \b regex) diff which ignores whitespace + * JsDiff.diffLines: Line based diff + * + * JsDiff.diffCss: Diff targeted at CSS content + * + * These methods are based on the implementation proposed in + * "An O(ND) Difference Algorithm and its Variations" (Myers, 1986). + * http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.4.6927 + */ +var JsDiff = (function() { + function clonePath(path) { + return { newPos: path.newPos, components: path.components.slice(0) }; + } + function removeEmpty(array) { + var ret = []; + for (var i = 0; i < array.length; i++) { + if (array[i]) { + ret.push(array[i]); + } + } + return ret; + } + function escapeHTML(s) { + var n = s; + n = n.replace(/&/g, "&"); + n = n.replace(//g, ">"); + n = n.replace(/"/g, """); + + return n; + } + + + var fbDiff = function(ignoreWhitespace) { + this.ignoreWhitespace = ignoreWhitespace; + }; + fbDiff.prototype = { + diff: function(oldString, newString) { + // Handle the identity case (this is due to unrolling editLength == 0 + if (newString == oldString) { + return [{ value: newString }]; + } + if (!newString) { + return [{ value: oldString, removed: true }]; + } + if (!oldString) { + return [{ value: newString, added: true }]; + } + + newString = this.tokenize(newString); + oldString = this.tokenize(oldString); + + var newLen = newString.length, oldLen = oldString.length; + var maxEditLength = newLen + oldLen; + var bestPath = [{ newPos: -1, components: [] }]; + + // Seed editLength = 0 + var oldPos = this.extractCommon(bestPath[0], newString, oldString, 0); + if (bestPath[0].newPos+1 >= newLen && oldPos+1 >= oldLen) { + return bestPath[0].components; + } + + for (var editLength = 1; editLength <= maxEditLength; editLength++) { + for (var diagonalPath = -1*editLength; diagonalPath <= editLength; diagonalPath+=2) { + var basePath; + var addPath = bestPath[diagonalPath-1], + removePath = bestPath[diagonalPath+1]; + oldPos = (removePath ? removePath.newPos : 0) - diagonalPath; + if (addPath) { + // No one else is going to attempt to use this value, clear it + bestPath[diagonalPath-1] = undefined; + } + + var canAdd = addPath && addPath.newPos+1 < newLen; + var canRemove = removePath && 0 <= oldPos && oldPos < oldLen; + if (!canAdd && !canRemove) { + bestPath[diagonalPath] = undefined; + continue; + } + + // Select the diagonal that we want to branch from. We select the prior + // path whose position in the new string is the farthest from the origin + // and does not pass the bounds of the diff graph + if (!canAdd || (canRemove && addPath.newPos < removePath.newPos)) { + basePath = clonePath(removePath); + this.pushComponent(basePath.components, oldString[oldPos], undefined, true); + } else { + basePath = clonePath(addPath); + basePath.newPos++; + this.pushComponent(basePath.components, newString[basePath.newPos], true, undefined); + } + + var oldPos = this.extractCommon(basePath, newString, oldString, diagonalPath); + + if (basePath.newPos+1 >= newLen && oldPos+1 >= oldLen) { + return basePath.components; + } else { + bestPath[diagonalPath] = basePath; + } + } + } + }, + + pushComponent: function(components, value, added, removed) { + var last = components[components.length-1]; + if (last && last.added === added && last.removed === removed) { + // We need to clone here as the component clone operation is just + // as shallow array clone + components[components.length-1] = + {value: this.join(last.value, value), added: added, removed: removed }; + } else { + components.push({value: value, added: added, removed: removed }); + } + }, + extractCommon: function(basePath, newString, oldString, diagonalPath) { + var newLen = newString.length, + oldLen = oldString.length, + newPos = basePath.newPos, + oldPos = newPos - diagonalPath; + while (newPos+1 < newLen && oldPos+1 < oldLen && this.equals(newString[newPos+1], oldString[oldPos+1])) { + newPos++; + oldPos++; + + this.pushComponent(basePath.components, newString[newPos], undefined, undefined); + } + basePath.newPos = newPos; + return oldPos; + }, + + equals: function(left, right) { + var reWhitespace = /\S/; + if (this.ignoreWhitespace && !reWhitespace.test(left) && !reWhitespace.test(right)) { + return true; + } else { + return left == right; + } + }, + join: function(left, right) { + return left + right; + }, + tokenize: function(value) { + return value; + } + }; + + var CharDiff = new fbDiff(); + + var WordDiff = new fbDiff(true); + WordDiff.tokenize = function(value) { + return removeEmpty(value.split(/(\s+|\b)/)); + }; + + var CssDiff = new fbDiff(true); + CssDiff.tokenize = function(value) { + return removeEmpty(value.split(/([{}:;,]|\s+)/)); + }; + + var LineDiff = new fbDiff(); + LineDiff.tokenize = function(value) { + return value.split(/^/m); + }; + + return { + diffChars: function(oldStr, newStr) { return CharDiff.diff(oldStr, newStr); }, + diffWords: function(oldStr, newStr) { return WordDiff.diff(oldStr, newStr); }, + diffLines: function(oldStr, newStr) { return LineDiff.diff(oldStr, newStr); }, + + diffCss: function(oldStr, newStr) { return CssDiff.diff(oldStr, newStr); }, + + createPatch: function(fileName, oldStr, newStr, oldHeader, newHeader) { + var ret = []; + + ret.push("Index: " + fileName); + ret.push("==================================================================="); + ret.push("--- " + fileName + (typeof oldHeader === "undefined" ? "" : "\t" + oldHeader)); + ret.push("+++ " + fileName + (typeof newHeader === "undefined" ? "" : "\t" + newHeader)); + + var diff = LineDiff.diff(oldStr, newStr); + if (!diff[diff.length-1].value) { + diff.pop(); // Remove trailing newline add + } + diff.push({value: "", lines: []}); // Append an empty value to make cleanup easier + + function contextLines(lines) { + return lines.map(function(entry) { return ' ' + entry; }); + } + function eofNL(curRange, i, current) { + var last = diff[diff.length-2], + isLast = i === diff.length-2, + isLastOfType = i === diff.length-3 && (current.added === !last.added || current.removed === !last.removed); + + // Figure out if this is the last line for the given file and missing NL + if (!/\n$/.test(current.value) && (isLast || isLastOfType)) { + curRange.push('\\ No newline at end of file'); + } + } + + var oldRangeStart = 0, newRangeStart = 0, curRange = [], + oldLine = 1, newLine = 1; + for (var i = 0; i < diff.length; i++) { + var current = diff[i], + lines = current.lines || current.value.replace(/\n$/, "").split("\n"); + current.lines = lines; + + if (current.added || current.removed) { + if (!oldRangeStart) { + var prev = diff[i-1]; + oldRangeStart = oldLine; + newRangeStart = newLine; + + if (prev) { + curRange = contextLines(prev.lines.slice(-4)); + oldRangeStart -= curRange.length; + newRangeStart -= curRange.length; + } + } + curRange.push.apply(curRange, lines.map(function(entry) { return (current.added?"+":"-") + entry; })); + eofNL(curRange, i, current); + + if (current.added) { + newLine += lines.length; + } else { + oldLine += lines.length; + } + } else { + if (oldRangeStart) { + // Close out any changes that have been output (or join overlapping) + if (lines.length <= 8 && i < diff.length-2) { + // Overlapping + curRange.push.apply(curRange, contextLines(lines)); + } else { + // end the range and output + var contextSize = Math.min(lines.length, 4); + ret.push( + "@@ -" + oldRangeStart + "," + (oldLine-oldRangeStart+contextSize) + + " +" + newRangeStart + "," + (newLine-newRangeStart+contextSize) + + " @@"); + ret.push.apply(ret, curRange); + ret.push.apply(ret, contextLines(lines.slice(0, contextSize))); + if (lines.length <= 4) { + eofNL(ret, i, current); + } + + oldRangeStart = 0; newRangeStart = 0; curRange = []; + } + } + oldLine += lines.length; + newLine += lines.length; + } + } + + return ret.join('\n') + '\n'; + }, + + convertChangesToXML: function(changes){ + var ret = []; + for ( var i = 0; i < changes.length; i++) { + var change = changes[i]; + if (change.added) { + ret.push(""); + } else if (change.removed) { + ret.push(""); + } + + ret.push(escapeHTML(change.value)); + + if (change.added) { + ret.push(""); + } else if (change.removed) { + ret.push(""); + } + } + return ret.join(""); + } + }; +})(); + +if (typeof module !== "undefined") { + module.exports = JsDiff; +} + +}); // module: browser/diff.js + +require.register("browser/events.js", function(module, exports, require){ + +/** + * Module exports. + */ + +exports.EventEmitter = EventEmitter; + +/** + * Check if `obj` is an array. + */ + +function isArray(obj) { + return '[object Array]' == {}.toString.call(obj); +} + +/** + * Event emitter constructor. + * + * @api public + */ + +function EventEmitter(){}; + +/** + * Adds a listener. + * + * @api public + */ + +EventEmitter.prototype.on = function (name, fn) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = fn; + } else if (isArray(this.$events[name])) { + this.$events[name].push(fn); + } else { + this.$events[name] = [this.$events[name], fn]; + } + + return this; +}; + +EventEmitter.prototype.addListener = EventEmitter.prototype.on; + +/** + * Adds a volatile listener. + * + * @api public + */ + +EventEmitter.prototype.once = function (name, fn) { + var self = this; + + function on () { + self.removeListener(name, on); + fn.apply(this, arguments); + }; + + on.listener = fn; + this.on(name, on); + + return this; +}; + +/** + * Removes a listener. + * + * @api public + */ + +EventEmitter.prototype.removeListener = function (name, fn) { + if (this.$events && this.$events[name]) { + var list = this.$events[name]; + + if (isArray(list)) { + var pos = -1; + + for (var i = 0, l = list.length; i < l; i++) { + if (list[i] === fn || (list[i].listener && list[i].listener === fn)) { + pos = i; + break; + } + } + + if (pos < 0) { + return this; + } + + list.splice(pos, 1); + + if (!list.length) { + delete this.$events[name]; + } + } else if (list === fn || (list.listener && list.listener === fn)) { + delete this.$events[name]; + } + } + + return this; +}; + +/** + * Removes all listeners for an event. + * + * @api public + */ + +EventEmitter.prototype.removeAllListeners = function (name) { + if (name === undefined) { + this.$events = {}; + return this; + } + + if (this.$events && this.$events[name]) { + this.$events[name] = null; + } + + return this; +}; + +/** + * Gets all listeners for a certain event. + * + * @api public + */ + +EventEmitter.prototype.listeners = function (name) { + if (!this.$events) { + this.$events = {}; + } + + if (!this.$events[name]) { + this.$events[name] = []; + } + + if (!isArray(this.$events[name])) { + this.$events[name] = [this.$events[name]]; + } + + return this.$events[name]; +}; + +/** + * Emits an event. + * + * @api public + */ + +EventEmitter.prototype.emit = function (name) { + if (!this.$events) { + return false; + } + + var handler = this.$events[name]; + + if (!handler) { + return false; + } + + var args = [].slice.call(arguments, 1); + + if ('function' == typeof handler) { + handler.apply(this, args); + } else if (isArray(handler)) { + var listeners = handler.slice(); + + for (var i = 0, l = listeners.length; i < l; i++) { + listeners[i].apply(this, args); + } + } else { + return false; + } + + return true; +}; +}); // module: browser/events.js + +require.register("browser/fs.js", function(module, exports, require){ + +}); // module: browser/fs.js + +require.register("browser/path.js", function(module, exports, require){ + +}); // module: browser/path.js + +require.register("browser/progress.js", function(module, exports, require){ + +/** + * Expose `Progress`. + */ + +module.exports = Progress; + +/** + * Initialize a new `Progress` indicator. + */ + +function Progress() { + this.percent = 0; + this.size(0); + this.fontSize(11); + this.font('helvetica, arial, sans-serif'); +} + +/** + * Set progress size to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.size = function(n){ + this._size = n; + return this; +}; + +/** + * Set text to `str`. + * + * @param {String} str + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.text = function(str){ + this._text = str; + return this; +}; + +/** + * Set font size to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + * @api public + */ + +Progress.prototype.fontSize = function(n){ + this._fontSize = n; + return this; +}; + +/** + * Set font `family`. + * + * @param {String} family + * @return {Progress} for chaining + */ + +Progress.prototype.font = function(family){ + this._font = family; + return this; +}; + +/** + * Update percentage to `n`. + * + * @param {Number} n + * @return {Progress} for chaining + */ + +Progress.prototype.update = function(n){ + this.percent = n; + return this; +}; + +/** + * Draw on `ctx`. + * + * @param {CanvasRenderingContext2d} ctx + * @return {Progress} for chaining + */ + +Progress.prototype.draw = function(ctx){ + var percent = Math.min(this.percent, 100) + , size = this._size + , half = size / 2 + , x = half + , y = half + , rad = half - 1 + , fontSize = this._fontSize; + + ctx.font = fontSize + 'px ' + this._font; + + var angle = Math.PI * 2 * (percent / 100); + ctx.clearRect(0, 0, size, size); + + // outer circle + ctx.strokeStyle = '#9f9f9f'; + ctx.beginPath(); + ctx.arc(x, y, rad, 0, angle, false); + ctx.stroke(); + + // inner circle + ctx.strokeStyle = '#eee'; + ctx.beginPath(); + ctx.arc(x, y, rad - 1, 0, angle, true); + ctx.stroke(); + + // text + var text = this._text || (percent | 0) + '%' + , w = ctx.measureText(text).width; + + ctx.fillText( + text + , x - w / 2 + 1 + , y + fontSize / 2 - 1); + + return this; +}; + +}); // module: browser/progress.js + +require.register("browser/tty.js", function(module, exports, require){ + +exports.isatty = function(){ + return true; +}; + +exports.getWindowSize = function(){ + if ('innerHeight' in global) { + return [global.innerHeight, global.innerWidth]; + } else { + // In a Web Worker, the DOM Window is not available. + return [640, 480]; + } +}; + +}); // module: browser/tty.js + +require.register("context.js", function(module, exports, require){ + +/** + * Expose `Context`. + */ + +module.exports = Context; + +/** + * Initialize a new `Context`. + * + * @api private + */ + +function Context(){} + +/** + * Set or get the context `Runnable` to `runnable`. + * + * @param {Runnable} runnable + * @return {Context} + * @api private + */ + +Context.prototype.runnable = function(runnable){ + if (0 == arguments.length) return this._runnable; + this.test = this._runnable = runnable; + return this; +}; + +/** + * Set test timeout `ms`. + * + * @param {Number} ms + * @return {Context} self + * @api private + */ + +Context.prototype.timeout = function(ms){ + this.runnable().timeout(ms); + return this; +}; + +/** + * Set test slowness threshold `ms`. + * + * @param {Number} ms + * @return {Context} self + * @api private + */ + +Context.prototype.slow = function(ms){ + this.runnable().slow(ms); + return this; +}; + +/** + * Inspect the context void of `._runnable`. + * + * @return {String} + * @api private + */ + +Context.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_runnable' == key) return; + if ('test' == key) return; + return val; + }, 2); +}; + +}); // module: context.js + +require.register("hook.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Hook`. + */ + +module.exports = Hook; + +/** + * Initialize a new `Hook` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Hook(title, fn) { + Runnable.call(this, title, fn); + this.type = 'hook'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Hook.prototype = new F; +Hook.prototype.constructor = Hook; + + +/** + * Get or set the test `err`. + * + * @param {Error} err + * @return {Error} + * @api public + */ + +Hook.prototype.error = function(err){ + if (0 == arguments.length) { + var err = this._error; + this._error = null; + return err; + } + + this._error = err; +}; + +}); // module: hook.js + +require.register("interfaces/bdd.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test'); + +/** + * BDD-style interface: + * + * describe('Array', function(){ + * describe('#indexOf()', function(){ + * it('should return -1 when not present', function(){ + * + * }); + * + * it('should return the index when present', function(){ + * + * }); + * }); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before running tests. + */ + + context.before = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after running tests. + */ + + context.after = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Execute before each test case. + */ + + context.beforeEach = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.afterEach = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.describe = context.context = function(title, fn){ + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + fn.call(suite); + suites.shift(); + return suite; + }; + + /** + * Pending describe. + */ + + context.xdescribe = + context.xcontext = + context.describe.skip = function(title, fn){ + var suite = Suite.create(suites[0], title); + suite.pending = true; + suites.unshift(suite); + fn.call(suite); + suites.shift(); + }; + + /** + * Exclusive suite. + */ + + context.describe.only = function(title, fn){ + var suite = context.describe(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.it = context.specify = function(title, fn){ + var suite = suites[0]; + if (suite.pending) var fn = null; + var test = new Test(title, fn); + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.it.only = function(title, fn){ + var test = context.it(title, fn); + mocha.grep(test.fullTitle()); + }; + + /** + * Pending test case. + */ + + context.xit = + context.xspecify = + context.it.skip = function(title){ + context.it(title); + }; + }); +}; + +}); // module: interfaces/bdd.js + +require.register("interfaces/exports.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test'); + +/** + * TDD-style interface: + * + * exports.Array = { + * '#indexOf()': { + * 'should return -1 when the value is not present': function(){ + * + * }, + * + * 'should return the correct index when the value is present': function(){ + * + * } + * } + * }; + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('require', visit); + + function visit(obj) { + var suite; + for (var key in obj) { + if ('function' == typeof obj[key]) { + var fn = obj[key]; + switch (key) { + case 'before': + suites[0].beforeAll(fn); + break; + case 'after': + suites[0].afterAll(fn); + break; + case 'beforeEach': + suites[0].beforeEach(fn); + break; + case 'afterEach': + suites[0].afterEach(fn); + break; + default: + suites[0].addTest(new Test(key, fn)); + } + } else { + var suite = Suite.create(suites[0], key); + suites.unshift(suite); + visit(obj[key]); + suites.shift(); + } + } + } +}; + +}); // module: interfaces/exports.js + +require.register("interfaces/index.js", function(module, exports, require){ + +exports.bdd = require('./bdd'); +exports.tdd = require('./tdd'); +exports.qunit = require('./qunit'); +exports.exports = require('./exports'); + +}); // module: interfaces/index.js + +require.register("interfaces/qunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test'); + +/** + * QUnit-style interface: + * + * suite('Array'); + * + * test('#length', function(){ + * var arr = [1,2,3]; + * ok(arr.length == 3); + * }); + * + * test('#indexOf()', function(){ + * var arr = [1,2,3]; + * ok(arr.indexOf(1) == 0); + * ok(arr.indexOf(2) == 1); + * ok(arr.indexOf(3) == 2); + * }); + * + * suite('String'); + * + * test('#length', function(){ + * ok('foo'.length == 3); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before running tests. + */ + + context.before = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after running tests. + */ + + context.after = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Execute before each test case. + */ + + context.beforeEach = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.afterEach = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Describe a "suite" with the given `title`. + */ + + context.suite = function(title){ + if (suites.length > 1) suites.shift(); + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + return suite; + }; + + /** + * Exclusive test-case. + */ + + context.suite.only = function(title, fn){ + var suite = context.suite(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn){ + var test = new Test(title, fn); + suites[0].addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn){ + var test = context.test(title, fn); + mocha.grep(test.fullTitle()); + }; + + /** + * Pending test case. + */ + + context.test.skip = function(title){ + context.test(title); + }; + }); +}; + +}); // module: interfaces/qunit.js + +require.register("interfaces/tdd.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Suite = require('../suite') + , Test = require('../test'); + +/** + * TDD-style interface: + * + * suite('Array', function(){ + * suite('#indexOf()', function(){ + * suiteSetup(function(){ + * + * }); + * + * test('should return -1 when not present', function(){ + * + * }); + * + * test('should return the index when present', function(){ + * + * }); + * + * suiteTeardown(function(){ + * + * }); + * }); + * }); + * + */ + +module.exports = function(suite){ + var suites = [suite]; + + suite.on('pre-require', function(context, file, mocha){ + + /** + * Execute before each test case. + */ + + context.setup = function(fn){ + suites[0].beforeEach(fn); + }; + + /** + * Execute after each test case. + */ + + context.teardown = function(fn){ + suites[0].afterEach(fn); + }; + + /** + * Execute before the suite. + */ + + context.suiteSetup = function(fn){ + suites[0].beforeAll(fn); + }; + + /** + * Execute after the suite. + */ + + context.suiteTeardown = function(fn){ + suites[0].afterAll(fn); + }; + + /** + * Describe a "suite" with the given `title` + * and callback `fn` containing nested suites + * and/or tests. + */ + + context.suite = function(title, fn){ + var suite = Suite.create(suites[0], title); + suites.unshift(suite); + fn.call(suite); + suites.shift(); + return suite; + }; + + /** + * Pending suite. + */ + context.suite.skip = function(title, fn) { + var suite = Suite.create(suites[0], title); + suite.pending = true; + suites.unshift(suite); + fn.call(suite); + suites.shift(); + }; + + /** + * Exclusive test-case. + */ + + context.suite.only = function(title, fn){ + var suite = context.suite(title, fn); + mocha.grep(suite.fullTitle()); + }; + + /** + * Describe a specification or test-case + * with the given `title` and callback `fn` + * acting as a thunk. + */ + + context.test = function(title, fn){ + var suite = suites[0]; + if (suite.pending) var fn = null; + var test = new Test(title, fn); + suite.addTest(test); + return test; + }; + + /** + * Exclusive test-case. + */ + + context.test.only = function(title, fn){ + var test = context.test(title, fn); + mocha.grep(test.fullTitle()); + }; + + /** + * Pending test case. + */ + + context.test.skip = function(title){ + context.test(title); + }; + }); +}; + +}); // module: interfaces/tdd.js + +require.register("mocha.js", function(module, exports, require){ +/*! + * mocha + * Copyright(c) 2011 TJ Holowaychuk + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var path = require('browser/path') + , utils = require('./utils'); + +/** + * Expose `Mocha`. + */ + +exports = module.exports = Mocha; + +/** + * Expose internals. + */ + +exports.utils = utils; +exports.interfaces = require('./interfaces'); +exports.reporters = require('./reporters'); +exports.Runnable = require('./runnable'); +exports.Context = require('./context'); +exports.Runner = require('./runner'); +exports.Suite = require('./suite'); +exports.Hook = require('./hook'); +exports.Test = require('./test'); + +/** + * Return image `name` path. + * + * @param {String} name + * @return {String} + * @api private + */ + +function image(name) { + return __dirname + '/../images/' + name + '.png'; +} + +/** + * Setup mocha with `options`. + * + * Options: + * + * - `ui` name "bdd", "tdd", "exports" etc + * - `reporter` reporter instance, defaults to `mocha.reporters.Dot` + * - `globals` array of accepted globals + * - `timeout` timeout in milliseconds + * - `bail` bail on the first test failure + * - `slow` milliseconds to wait before considering a test slow + * - `ignoreLeaks` ignore global leaks + * - `grep` string or regexp to filter tests with + * + * @param {Object} options + * @api public + */ + +function Mocha(options) { + options = options || {}; + this.files = []; + this.options = options; + this.grep(options.grep); + this.suite = new exports.Suite('', new exports.Context); + this.ui(options.ui); + this.bail(options.bail); + this.reporter(options.reporter); + if (options.timeout) this.timeout(options.timeout); + if (options.slow) this.slow(options.slow); +} + +/** + * Enable or disable bailing on the first failure. + * + * @param {Boolean} [bail] + * @api public + */ + +Mocha.prototype.bail = function(bail){ + if (0 == arguments.length) bail = true; + this.suite.bail(bail); + return this; +}; + +/** + * Add test `file`. + * + * @param {String} file + * @api public + */ + +Mocha.prototype.addFile = function(file){ + this.files.push(file); + return this; +}; + +/** + * Set reporter to `reporter`, defaults to "dot". + * + * @param {String|Function} reporter name or constructor + * @api public + */ + +Mocha.prototype.reporter = function(reporter){ + if ('function' == typeof reporter) { + this._reporter = reporter; + } else { + reporter = reporter || 'dot'; + try { + this._reporter = require('./reporters/' + reporter); + } catch (err) { + this._reporter = require(reporter); + } + if (!this._reporter) throw new Error('invalid reporter "' + reporter + '"'); + } + return this; +}; + +/** + * Set test UI `name`, defaults to "bdd". + * + * @param {String} bdd + * @api public + */ + +Mocha.prototype.ui = function(name){ + name = name || 'bdd'; + this._ui = exports.interfaces[name]; + if (!this._ui) throw new Error('invalid interface "' + name + '"'); + this._ui = this._ui(this.suite); + return this; +}; + +/** + * Load registered files. + * + * @api private + */ + +Mocha.prototype.loadFiles = function(fn){ + var self = this; + var suite = this.suite; + var pending = this.files.length; + this.files.forEach(function(file){ + file = path.resolve(file); + suite.emit('pre-require', global, file, self); + suite.emit('require', require(file), file, self); + suite.emit('post-require', global, file, self); + --pending || (fn && fn()); + }); +}; + +/** + * Enable growl support. + * + * @api private + */ + +Mocha.prototype._growl = function(runner, reporter) { + var notify = require('growl'); + + runner.on('end', function(){ + var stats = reporter.stats; + if (stats.failures) { + var msg = stats.failures + ' of ' + runner.total + ' tests failed'; + notify(msg, { name: 'mocha', title: 'Failed', image: image('error') }); + } else { + notify(stats.passes + ' tests passed in ' + stats.duration + 'ms', { + name: 'mocha' + , title: 'Passed' + , image: image('ok') + }); + } + }); +}; + +/** + * Add regexp to grep, if `re` is a string it is escaped. + * + * @param {RegExp|String} re + * @return {Mocha} + * @api public + */ + +Mocha.prototype.grep = function(re){ + this.options.grep = 'string' == typeof re + ? new RegExp(utils.escapeRegexp(re)) + : re; + return this; +}; + +/** + * Invert `.grep()` matches. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.invert = function(){ + this.options.invert = true; + return this; +}; + +/** + * Ignore global leaks. + * + * @param {Boolean} ignore + * @return {Mocha} + * @api public + */ + +Mocha.prototype.ignoreLeaks = function(ignore){ + this.options.ignoreLeaks = !!ignore; + return this; +}; + +/** + * Enable global leak checking. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.checkLeaks = function(){ + this.options.ignoreLeaks = false; + return this; +}; + +/** + * Enable growl support. + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.growl = function(){ + this.options.growl = true; + return this; +}; + +/** + * Ignore `globals` array or string. + * + * @param {Array|String} globals + * @return {Mocha} + * @api public + */ + +Mocha.prototype.globals = function(globals){ + this.options.globals = (this.options.globals || []).concat(globals); + return this; +}; + +/** + * Set the timeout in milliseconds. + * + * @param {Number} timeout + * @return {Mocha} + * @api public + */ + +Mocha.prototype.timeout = function(timeout){ + this.suite.timeout(timeout); + return this; +}; + +/** + * Set slowness threshold in milliseconds. + * + * @param {Number} slow + * @return {Mocha} + * @api public + */ + +Mocha.prototype.slow = function(slow){ + this.suite.slow(slow); + return this; +}; + +/** + * Makes all tests async (accepting a callback) + * + * @return {Mocha} + * @api public + */ + +Mocha.prototype.asyncOnly = function(){ + this.options.asyncOnly = true; + return this; +}; + +/** + * Run tests and invoke `fn()` when complete. + * + * @param {Function} fn + * @return {Runner} + * @api public + */ + +Mocha.prototype.run = function(fn){ + if (this.files.length) this.loadFiles(); + var suite = this.suite; + var options = this.options; + var runner = new exports.Runner(suite); + var reporter = new this._reporter(runner); + runner.ignoreLeaks = false !== options.ignoreLeaks; + runner.asyncOnly = options.asyncOnly; + if (options.grep) runner.grep(options.grep, options.invert); + if (options.globals) runner.globals(options.globals); + if (options.growl) this._growl(runner, reporter); + return runner.run(fn); +}; + +}); // module: mocha.js + +require.register("ms.js", function(module, exports, require){ + +/** + * Helpers. + */ + +var s = 1000; +var m = s * 60; +var h = m * 60; +var d = h * 24; + +/** + * Parse or format the given `val`. + * + * @param {String|Number} val + * @return {String|Number} + * @api public + */ + +module.exports = function(val){ + if ('string' == typeof val) return parse(val); + return format(val); +} + +/** + * Parse the given `str` and return milliseconds. + * + * @param {String} str + * @return {Number} + * @api private + */ + +function parse(str) { + var m = /^((?:\d+)?\.?\d+) *(ms|seconds?|s|minutes?|m|hours?|h|days?|d|years?|y)?$/i.exec(str); + if (!m) return; + var n = parseFloat(m[1]); + var type = (m[2] || 'ms').toLowerCase(); + switch (type) { + case 'years': + case 'year': + case 'y': + return n * 31557600000; + case 'days': + case 'day': + case 'd': + return n * 86400000; + case 'hours': + case 'hour': + case 'h': + return n * 3600000; + case 'minutes': + case 'minute': + case 'm': + return n * 60000; + case 'seconds': + case 'second': + case 's': + return n * 1000; + case 'ms': + return n; + } +} + +/** + * Format the given `ms`. + * + * @param {Number} ms + * @return {String} + * @api public + */ + +function format(ms) { + if (ms == d) return Math.round(ms / d) + ' day'; + if (ms > d) return Math.round(ms / d) + ' days'; + if (ms == h) return Math.round(ms / h) + ' hour'; + if (ms > h) return Math.round(ms / h) + ' hours'; + if (ms == m) return Math.round(ms / m) + ' minute'; + if (ms > m) return Math.round(ms / m) + ' minutes'; + if (ms == s) return Math.round(ms / s) + ' second'; + if (ms > s) return Math.round(ms / s) + ' seconds'; + return ms + ' ms'; +} +}); // module: ms.js + +require.register("reporters/base.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var tty = require('browser/tty') + , diff = require('browser/diff') + , ms = require('../ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Check if both stdio streams are associated with a tty. + */ + +var isatty = tty.isatty(1) && tty.isatty(2); + +/** + * Expose `Base`. + */ + +exports = module.exports = Base; + +/** + * Enable coloring by default. + */ + +exports.useColors = isatty; + +/** + * Default color map. + */ + +exports.colors = { + 'pass': 90 + , 'fail': 31 + , 'bright pass': 92 + , 'bright fail': 91 + , 'bright yellow': 93 + , 'pending': 36 + , 'suite': 0 + , 'error title': 0 + , 'error message': 31 + , 'error stack': 90 + , 'checkmark': 32 + , 'fast': 90 + , 'medium': 33 + , 'slow': 31 + , 'green': 32 + , 'light': 90 + , 'diff gutter': 90 + , 'diff added': 42 + , 'diff removed': 41 +}; + +/** + * Default symbol map. + */ + +exports.symbols = { + ok: '✓', + err: '✖', + dot: '․' +}; + +// With node.js on Windows: use symbols available in terminal default fonts +if ('win32' == process.platform) { + exports.symbols.ok = '\u221A'; + exports.symbols.err = '\u00D7'; + exports.symbols.dot = '.'; +} + +/** + * Color `str` with the given `type`, + * allowing colors to be disabled, + * as well as user-defined color + * schemes. + * + * @param {String} type + * @param {String} str + * @return {String} + * @api private + */ + +var color = exports.color = function(type, str) { + if (!exports.useColors) return str; + return '\u001b[' + exports.colors[type] + 'm' + str + '\u001b[0m'; +}; + +/** + * Expose term window size, with some + * defaults for when stderr is not a tty. + */ + +exports.window = { + width: isatty + ? process.stdout.getWindowSize + ? process.stdout.getWindowSize(1)[0] + : tty.getWindowSize()[1] + : 75 +}; + +/** + * Expose some basic cursor interactions + * that are common among reporters. + */ + +exports.cursor = { + hide: function(){ + process.stdout.write('\u001b[?25l'); + }, + + show: function(){ + process.stdout.write('\u001b[?25h'); + }, + + deleteLine: function(){ + process.stdout.write('\u001b[2K'); + }, + + beginningOfLine: function(){ + process.stdout.write('\u001b[0G'); + }, + + CR: function(){ + exports.cursor.deleteLine(); + exports.cursor.beginningOfLine(); + } +}; + +/** + * Outut the given `failures` as a list. + * + * @param {Array} failures + * @api public + */ + +exports.list = function(failures){ + console.error(); + failures.forEach(function(test, i){ + // format + var fmt = color('error title', ' %s) %s:\n') + + color('error message', ' %s') + + color('error stack', '\n%s\n'); + + // msg + var err = test.err + , message = err.message || '' + , stack = err.stack || message + , index = stack.indexOf(message) + message.length + , msg = stack.slice(0, index) + , actual = err.actual + , expected = err.expected + , escape = true; + + // uncaught + if (err.uncaught) { + msg = 'Uncaught ' + msg; + } + + // explicitly show diff + if (err.showDiff && sameType(actual, expected)) { + escape = false; + err.actual = actual = stringify(actual); + err.expected = expected = stringify(expected); + } + + // actual / expected diff + if ('string' == typeof actual && 'string' == typeof expected) { + msg = errorDiff(err, 'Words', escape); + + // linenos + var lines = msg.split('\n'); + if (lines.length > 4) { + var width = String(lines.length).length; + msg = lines.map(function(str, i){ + return pad(++i, width) + ' |' + ' ' + str; + }).join('\n'); + } + + // legend + msg = '\n' + + color('diff removed', 'actual') + + ' ' + + color('diff added', 'expected') + + '\n\n' + + msg + + '\n'; + + // indent + msg = msg.replace(/^/gm, ' '); + + fmt = color('error title', ' %s) %s:\n%s') + + color('error stack', '\n%s\n'); + } + + // indent stack trace without msg + stack = stack.slice(index ? index + 1 : index) + .replace(/^/gm, ' '); + + console.error(fmt, (i + 1), test.fullTitle(), msg, stack); + }); +}; + +/** + * Initialize a new `Base` reporter. + * + * All other reporters generally + * inherit from this reporter, providing + * stats such as test duration, number + * of tests passed / failed etc. + * + * @param {Runner} runner + * @api public + */ + +function Base(runner) { + var self = this + , stats = this.stats = { suites: 0, tests: 0, passes: 0, pending: 0, failures: 0 } + , failures = this.failures = []; + + if (!runner) return; + this.runner = runner; + + runner.stats = stats; + + runner.on('start', function(){ + stats.start = new Date; + }); + + runner.on('suite', function(suite){ + stats.suites = stats.suites || 0; + suite.root || stats.suites++; + }); + + runner.on('test end', function(test){ + stats.tests = stats.tests || 0; + stats.tests++; + }); + + runner.on('pass', function(test){ + stats.passes = stats.passes || 0; + + var medium = test.slow() / 2; + test.speed = test.duration > test.slow() + ? 'slow' + : test.duration > medium + ? 'medium' + : 'fast'; + + stats.passes++; + }); + + runner.on('fail', function(test, err){ + stats.failures = stats.failures || 0; + stats.failures++; + test.err = err; + failures.push(test); + }); + + runner.on('end', function(){ + stats.end = new Date; + stats.duration = new Date - stats.start; + }); + + runner.on('pending', function(){ + stats.pending++; + }); +} + +/** + * Output common epilogue used by many of + * the bundled reporters. + * + * @api public + */ + +Base.prototype.epilogue = function(){ + var stats = this.stats; + var tests; + var fmt; + + console.log(); + + // passes + fmt = color('bright pass', ' ') + + color('green', ' %d passing') + + color('light', ' (%s)'); + + console.log(fmt, + stats.passes || 0, + ms(stats.duration)); + + // pending + if (stats.pending) { + fmt = color('pending', ' ') + + color('pending', ' %d pending'); + + console.log(fmt, stats.pending); + } + + // failures + if (stats.failures) { + fmt = color('fail', ' %d failing'); + + console.error(fmt, + stats.failures); + + Base.list(this.failures); + console.error(); + } + + console.log(); +}; + +/** + * Pad the given `str` to `len`. + * + * @param {String} str + * @param {String} len + * @return {String} + * @api private + */ + +function pad(str, len) { + str = String(str); + return Array(len - str.length + 1).join(' ') + str; +} + +/** + * Return a character diff for `err`. + * + * @param {Error} err + * @return {String} + * @api private + */ + +function errorDiff(err, type, escape) { + return diff['diff' + type](err.actual, err.expected).map(function(str){ + if (escape) { + str.value = str.value + .replace(/\t/g, '') + .replace(/\r/g, '') + .replace(/\n/g, '\n'); + } + if (str.added) return colorLines('diff added', str.value); + if (str.removed) return colorLines('diff removed', str.value); + return str.value; + }).join(''); +} + +/** + * Color lines for `str`, using the color `name`. + * + * @param {String} name + * @param {String} str + * @return {String} + * @api private + */ + +function colorLines(name, str) { + return str.split('\n').map(function(str){ + return color(name, str); + }).join('\n'); +} + +/** + * Stringify `obj`. + * + * @param {Mixed} obj + * @return {String} + * @api private + */ + +function stringify(obj) { + if (obj instanceof RegExp) return obj.toString(); + return JSON.stringify(obj, null, 2); +} + +/** + * Check that a / b have the same type. + * + * @param {Object} a + * @param {Object} b + * @return {Boolean} + * @api private + */ + +function sameType(a, b) { + a = Object.prototype.toString.call(a); + b = Object.prototype.toString.call(b); + return a == b; +} + +}); // module: reporters/base.js + +require.register("reporters/doc.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Doc`. + */ + +exports = module.exports = Doc; + +/** + * Initialize a new `Doc` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Doc(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total + , indents = 2; + + function indent() { + return Array(indents).join(' '); + } + + runner.on('suite', function(suite){ + if (suite.root) return; + ++indents; + console.log('%s
', indent()); + ++indents; + console.log('%s

%s

', indent(), utils.escape(suite.title)); + console.log('%s
', indent()); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + console.log('%s
', indent()); + --indents; + console.log('%s
', indent()); + --indents; + }); + + runner.on('pass', function(test){ + console.log('%s
%s
', indent(), utils.escape(test.title)); + var code = utils.escape(utils.clean(test.fn.toString())); + console.log('%s
%s
', indent(), code); + }); +} + +}); // module: reporters/doc.js + +require.register("reporters/dot.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = Dot; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Dot(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , n = 0; + + runner.on('start', function(){ + process.stdout.write('\n '); + }); + + runner.on('pending', function(test){ + process.stdout.write(color('pending', Base.symbols.dot)); + }); + + runner.on('pass', function(test){ + if (++n % width == 0) process.stdout.write('\n '); + if ('slow' == test.speed) { + process.stdout.write(color('bright yellow', Base.symbols.dot)); + } else { + process.stdout.write(color(test.speed, Base.symbols.dot)); + } + }); + + runner.on('fail', function(test, err){ + if (++n % width == 0) process.stdout.write('\n '); + process.stdout.write(color('fail', Base.symbols.dot)); + }); + + runner.on('end', function(){ + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Dot.prototype = new F; +Dot.prototype.constructor = Dot; + +}); // module: reporters/dot.js + +require.register("reporters/html-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var JSONCov = require('./json-cov') + , fs = require('browser/fs'); + +/** + * Expose `HTMLCov`. + */ + +exports = module.exports = HTMLCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @api public + */ + +function HTMLCov(runner) { + var jade = require('jade') + , file = __dirname + '/templates/coverage.jade' + , str = fs.readFileSync(file, 'utf8') + , fn = jade.compile(str, { filename: file }) + , self = this; + + JSONCov.call(this, runner, false); + + runner.on('end', function(){ + process.stdout.write(fn({ + cov: self.cov + , coverageClass: coverageClass + })); + }); +} + +/** + * Return coverage class for `n`. + * + * @return {String} + * @api private + */ + +function coverageClass(n) { + if (n >= 75) return 'high'; + if (n >= 50) return 'medium'; + if (n >= 25) return 'low'; + return 'terrible'; +} +}); // module: reporters/html-cov.js + +require.register("reporters/html.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , Progress = require('../browser/progress') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `Doc`. + */ + +exports = module.exports = HTML; + +/** + * Stats template. + */ + +var statsTemplate = ''; + +/** + * Initialize a new `Doc` reporter. + * + * @param {Runner} runner + * @api public + */ + +function HTML(runner, root) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total + , stat = fragment(statsTemplate) + , items = stat.getElementsByTagName('li') + , passes = items[1].getElementsByTagName('em')[0] + , passesLink = items[1].getElementsByTagName('a')[0] + , failures = items[2].getElementsByTagName('em')[0] + , failuresLink = items[2].getElementsByTagName('a')[0] + , duration = items[3].getElementsByTagName('em')[0] + , canvas = stat.getElementsByTagName('canvas')[0] + , report = fragment('
    ') + , stack = [report] + , progress + , ctx + + root = root || document.getElementById('mocha'); + + if (canvas.getContext) { + var ratio = window.devicePixelRatio || 1; + canvas.style.width = canvas.width; + canvas.style.height = canvas.height; + canvas.width *= ratio; + canvas.height *= ratio; + ctx = canvas.getContext('2d'); + ctx.scale(ratio, ratio); + progress = new Progress; + } + + if (!root) return error('#mocha div missing, add it to your document'); + + // pass toggle + on(passesLink, 'click', function(){ + unhide(); + var name = /pass/.test(report.className) ? '' : ' pass'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) hideSuitesWithout('test pass'); + }); + + // failure toggle + on(failuresLink, 'click', function(){ + unhide(); + var name = /fail/.test(report.className) ? '' : ' fail'; + report.className = report.className.replace(/fail|pass/g, '') + name; + if (report.className.trim()) hideSuitesWithout('test fail'); + }); + + root.appendChild(stat); + root.appendChild(report); + + if (progress) progress.size(40); + + runner.on('suite', function(suite){ + if (suite.root) return; + + // suite + var url = '?grep=' + encodeURIComponent(suite.fullTitle()); + var el = fragment('
  • %s

  • ', url, escape(suite.title)); + + // container + stack[0].appendChild(el); + stack.unshift(document.createElement('ul')); + el.appendChild(stack[0]); + }); + + runner.on('suite end', function(suite){ + if (suite.root) return; + stack.shift(); + }); + + runner.on('fail', function(test, err){ + if ('hook' == test.type) runner.emit('test end', test); + }); + + runner.on('test end', function(test){ + // TODO: add to stats + var percent = stats.tests / this.total * 100 | 0; + if (progress) progress.update(percent).draw(ctx); + + // update stats + var ms = new Date - stats.start; + text(passes, stats.passes); + text(failures, stats.failures); + text(duration, (ms / 1000).toFixed(2)); + + // test + if ('passed' == test.state) { + var el = fragment('
  • %e%ems

  • ', test.speed, test.title, test.duration, encodeURIComponent(test.fullTitle())); + } else if (test.pending) { + var el = fragment('
  • %e

  • ', test.title); + } else { + var el = fragment('
  • %e

  • ', test.title, encodeURIComponent(test.fullTitle())); + var str = test.err.stack || test.err.toString(); + + // FF / Opera do not add the message + if (!~str.indexOf(test.err.message)) { + str = test.err.message + '\n' + str; + } + + // <=IE7 stringifies to [Object Error]. Since it can be overloaded, we + // check for the result of the stringifying. + if ('[object Error]' == str) str = test.err.message; + + // Safari doesn't give you a stack. Let's at least provide a source line. + if (!test.err.stack && test.err.sourceURL && test.err.line !== undefined) { + str += "\n(" + test.err.sourceURL + ":" + test.err.line + ")"; + } + + el.appendChild(fragment('
    %e
    ', str)); + } + + // toggle code + // TODO: defer + if (!test.pending) { + var h2 = el.getElementsByTagName('h2')[0]; + + on(h2, 'click', function(){ + pre.style.display = 'none' == pre.style.display + ? 'block' + : 'none'; + }); + + var pre = fragment('
    %e
    ', utils.clean(test.fn.toString())); + el.appendChild(pre); + pre.style.display = 'none'; + } + + // Don't call .appendChild if #mocha-report was already .shift()'ed off the stack. + if (stack[0]) stack[0].appendChild(el); + }); +} + +/** + * Display error `msg`. + */ + +function error(msg) { + document.body.appendChild(fragment('
    %s
    ', msg)); +} + +/** + * Return a DOM fragment from `html`. + */ + +function fragment(html) { + var args = arguments + , div = document.createElement('div') + , i = 1; + + div.innerHTML = html.replace(/%([se])/g, function(_, type){ + switch (type) { + case 's': return String(args[i++]); + case 'e': return escape(args[i++]); + } + }); + + return div.firstChild; +} + +/** + * Check for suites that do not have elements + * with `classname`, and hide them. + */ + +function hideSuitesWithout(classname) { + var suites = document.getElementsByClassName('suite'); + for (var i = 0; i < suites.length; i++) { + var els = suites[i].getElementsByClassName(classname); + if (0 == els.length) suites[i].className += ' hidden'; + } +} + +/** + * Unhide .hidden suites. + */ + +function unhide() { + var els = document.getElementsByClassName('suite hidden'); + for (var i = 0; i < els.length; ++i) { + els[i].className = els[i].className.replace('suite hidden', 'suite'); + } +} + +/** + * Set `el` text to `str`. + */ + +function text(el, str) { + if (el.textContent) { + el.textContent = str; + } else { + el.innerText = str; + } +} + +/** + * Listen on `event` with callback `fn`. + */ + +function on(el, event, fn) { + if (el.addEventListener) { + el.addEventListener(event, fn, false); + } else { + el.attachEvent('on' + event, fn); + } +} + +}); // module: reporters/html.js + +require.register("reporters/index.js", function(module, exports, require){ + +exports.Base = require('./base'); +exports.Dot = require('./dot'); +exports.Doc = require('./doc'); +exports.TAP = require('./tap'); +exports.JSON = require('./json'); +exports.HTML = require('./html'); +exports.List = require('./list'); +exports.Min = require('./min'); +exports.Spec = require('./spec'); +exports.Nyan = require('./nyan'); +exports.XUnit = require('./xunit'); +exports.Markdown = require('./markdown'); +exports.Progress = require('./progress'); +exports.Landing = require('./landing'); +exports.JSONCov = require('./json-cov'); +exports.HTMLCov = require('./html-cov'); +exports.JSONStream = require('./json-stream'); +exports.Teamcity = require('./teamcity'); + +}); // module: reporters/index.js + +require.register("reporters/json-cov.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `JSONCov`. + */ + +exports = module.exports = JSONCov; + +/** + * Initialize a new `JsCoverage` reporter. + * + * @param {Runner} runner + * @param {Boolean} output + * @api public + */ + +function JSONCov(runner, output) { + var self = this + , output = 1 == arguments.length ? true : output; + + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var cov = global._$jscoverage || {}; + var result = self.cov = map(cov); + result.stats = self.stats; + result.tests = tests.map(clean); + result.failures = failures.map(clean); + result.passes = passes.map(clean); + if (!output) return; + process.stdout.write(JSON.stringify(result, null, 2 )); + }); +} + +/** + * Map jscoverage data to a JSON structure + * suitable for reporting. + * + * @param {Object} cov + * @return {Object} + * @api private + */ + +function map(cov) { + var ret = { + instrumentation: 'node-jscoverage' + , sloc: 0 + , hits: 0 + , misses: 0 + , coverage: 0 + , files: [] + }; + + for (var filename in cov) { + var data = coverage(filename, cov[filename]); + ret.files.push(data); + ret.hits += data.hits; + ret.misses += data.misses; + ret.sloc += data.sloc; + } + + ret.files.sort(function(a, b) { + return a.filename.localeCompare(b.filename); + }); + + if (ret.sloc > 0) { + ret.coverage = (ret.hits / ret.sloc) * 100; + } + + return ret; +}; + +/** + * Map jscoverage data for a single source file + * to a JSON structure suitable for reporting. + * + * @param {String} filename name of the source file + * @param {Object} data jscoverage coverage data + * @return {Object} + * @api private + */ + +function coverage(filename, data) { + var ret = { + filename: filename, + coverage: 0, + hits: 0, + misses: 0, + sloc: 0, + source: {} + }; + + data.source.forEach(function(line, num){ + num++; + + if (data[num] === 0) { + ret.misses++; + ret.sloc++; + } else if (data[num] !== undefined) { + ret.hits++; + ret.sloc++; + } + + ret.source[num] = { + source: line + , coverage: data[num] === undefined + ? '' + : data[num] + }; + }); + + ret.coverage = ret.hits / ret.sloc * 100; + + return ret; +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} + +}); // module: reporters/json-cov.js + +require.register("reporters/json-stream.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , total = runner.total; + + runner.on('start', function(){ + console.log(JSON.stringify(['start', { total: total }])); + }); + + runner.on('pass', function(test){ + console.log(JSON.stringify(['pass', clean(test)])); + }); + + runner.on('fail', function(test, err){ + console.log(JSON.stringify(['fail', clean(test)])); + }); + + runner.on('end', function(){ + process.stdout.write(JSON.stringify(['end', self.stats])); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json-stream.js + +require.register("reporters/json.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `JSON`. + */ + +exports = module.exports = JSONReporter; + +/** + * Initialize a new `JSON` reporter. + * + * @param {Runner} runner + * @api public + */ + +function JSONReporter(runner) { + var self = this; + Base.call(this, runner); + + var tests = [] + , failures = [] + , passes = []; + + runner.on('test end', function(test){ + tests.push(test); + }); + + runner.on('pass', function(test){ + passes.push(test); + }); + + runner.on('fail', function(test){ + failures.push(test); + }); + + runner.on('end', function(){ + var obj = { + stats: self.stats + , tests: tests.map(clean) + , failures: failures.map(clean) + , passes: passes.map(clean) + }; + + process.stdout.write(JSON.stringify(obj, null, 2)); + }); +} + +/** + * Return a plain-object representation of `test` + * free of cyclic properties etc. + * + * @param {Object} test + * @return {Object} + * @api private + */ + +function clean(test) { + return { + title: test.title + , fullTitle: test.fullTitle() + , duration: test.duration + } +} +}); // module: reporters/json.js + +require.register("reporters/landing.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Landing`. + */ + +exports = module.exports = Landing; + +/** + * Airplane color. + */ + +Base.colors.plane = 0; + +/** + * Airplane crash color. + */ + +Base.colors['plane crash'] = 31; + +/** + * Runway color. + */ + +Base.colors.runway = 90; + +/** + * Initialize a new `Landing` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Landing(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , total = runner.total + , stream = process.stdout + , plane = color('plane', '✈') + , crashed = -1 + , n = 0; + + function runway() { + var buf = Array(width).join('-'); + return ' ' + color('runway', buf); + } + + runner.on('start', function(){ + stream.write('\n '); + cursor.hide(); + }); + + runner.on('test end', function(test){ + // check if the plane crashed + var col = -1 == crashed + ? width * ++n / total | 0 + : crashed; + + // show the crash + if ('failed' == test.state) { + plane = color('plane crash', '✈'); + crashed = col; + } + + // render landing strip + stream.write('\u001b[4F\n\n'); + stream.write(runway()); + stream.write('\n '); + stream.write(color('runway', Array(col).join('⋅'))); + stream.write(plane) + stream.write(color('runway', Array(width - col).join('⋅') + '\n')); + stream.write(runway()); + stream.write('\u001b[0m'); + }); + + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Landing.prototype = new F; +Landing.prototype.constructor = Landing; + +}); // module: reporters/landing.js + +require.register("reporters/list.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `List`. + */ + +exports = module.exports = List; + +/** + * Initialize a new `List` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function List(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 0; + + runner.on('start', function(){ + console.log(); + }); + + runner.on('test', function(test){ + process.stdout.write(color('pass', ' ' + test.fullTitle() + ': ')); + }); + + runner.on('pending', function(test){ + var fmt = color('checkmark', ' -') + + color('pending', ' %s'); + console.log(fmt, test.fullTitle()); + }); + + runner.on('pass', function(test){ + var fmt = color('checkmark', ' '+Base.symbols.dot) + + color('pass', ' %s: ') + + color(test.speed, '%dms'); + cursor.CR(); + console.log(fmt, test.fullTitle(), test.duration); + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(color('fail', ' %d) %s'), ++n, test.fullTitle()); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +List.prototype = new F; +List.prototype.constructor = List; + + +}); // module: reporters/list.js + +require.register("reporters/markdown.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils'); + +/** + * Expose `Markdown`. + */ + +exports = module.exports = Markdown; + +/** + * Initialize a new `Markdown` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Markdown(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , level = 0 + , buf = ''; + + function title(str) { + return Array(level).join('#') + ' ' + str; + } + + function indent() { + return Array(level).join(' '); + } + + function mapTOC(suite, obj) { + var ret = obj; + obj = obj[suite.title] = obj[suite.title] || { suite: suite }; + suite.suites.forEach(function(suite){ + mapTOC(suite, obj); + }); + return ret; + } + + function stringifyTOC(obj, level) { + ++level; + var buf = ''; + var link; + for (var key in obj) { + if ('suite' == key) continue; + if (key) link = ' - [' + key + '](#' + utils.slug(obj[key].suite.fullTitle()) + ')\n'; + if (key) buf += Array(level).join(' ') + link; + buf += stringifyTOC(obj[key], level); + } + --level; + return buf; + } + + function generateTOC(suite) { + var obj = mapTOC(suite, {}); + return stringifyTOC(obj, 0); + } + + generateTOC(runner.suite); + + runner.on('suite', function(suite){ + ++level; + var slug = utils.slug(suite.fullTitle()); + buf += '' + '\n'; + buf += title(suite.title) + '\n'; + }); + + runner.on('suite end', function(suite){ + --level; + }); + + runner.on('pass', function(test){ + var code = utils.clean(test.fn.toString()); + buf += test.title + '.\n'; + buf += '\n```js\n'; + buf += code + '\n'; + buf += '```\n\n'; + }); + + runner.on('end', function(){ + process.stdout.write('# TOC\n'); + process.stdout.write(generateTOC(runner.suite)); + process.stdout.write(buf); + }); +} +}); // module: reporters/markdown.js + +require.register("reporters/min.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `Min`. + */ + +exports = module.exports = Min; + +/** + * Initialize a new `Min` minimal test reporter (best used with --watch). + * + * @param {Runner} runner + * @api public + */ + +function Min(runner) { + Base.call(this, runner); + + runner.on('start', function(){ + // clear screen + process.stdout.write('\u001b[2J'); + // set cursor position + process.stdout.write('\u001b[1;3H'); + }); + + runner.on('end', this.epilogue.bind(this)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Min.prototype = new F; +Min.prototype.constructor = Min; + + +}); // module: reporters/min.js + +require.register("reporters/nyan.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var Base = require('./base') + , color = Base.color; + +/** + * Expose `Dot`. + */ + +exports = module.exports = NyanCat; + +/** + * Initialize a new `Dot` matrix test reporter. + * + * @param {Runner} runner + * @api public + */ + +function NyanCat(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , width = Base.window.width * .75 | 0 + , rainbowColors = this.rainbowColors = self.generateColors() + , colorIndex = this.colorIndex = 0 + , numerOfLines = this.numberOfLines = 4 + , trajectories = this.trajectories = [[], [], [], []] + , nyanCatWidth = this.nyanCatWidth = 11 + , trajectoryWidthMax = this.trajectoryWidthMax = (width - nyanCatWidth) + , scoreboardWidth = this.scoreboardWidth = 5 + , tick = this.tick = 0 + , n = 0; + + runner.on('start', function(){ + Base.cursor.hide(); + self.draw('start'); + }); + + runner.on('pending', function(test){ + self.draw('pending'); + }); + + runner.on('pass', function(test){ + self.draw('pass'); + }); + + runner.on('fail', function(test, err){ + self.draw('fail'); + }); + + runner.on('end', function(){ + Base.cursor.show(); + for (var i = 0; i < self.numberOfLines; i++) write('\n'); + self.epilogue(); + }); +} + +/** + * Draw the nyan cat with runner `status`. + * + * @param {String} status + * @api private + */ + +NyanCat.prototype.draw = function(status){ + this.appendRainbow(); + this.drawScoreboard(); + this.drawRainbow(); + this.drawNyanCat(status); + this.tick = !this.tick; +}; + +/** + * Draw the "scoreboard" showing the number + * of passes, failures and pending tests. + * + * @api private + */ + +NyanCat.prototype.drawScoreboard = function(){ + var stats = this.stats; + var colors = Base.colors; + + function draw(color, n) { + write(' '); + write('\u001b[' + color + 'm' + n + '\u001b[0m'); + write('\n'); + } + + draw(colors.green, stats.passes); + draw(colors.fail, stats.failures); + draw(colors.pending, stats.pending); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Append the rainbow. + * + * @api private + */ + +NyanCat.prototype.appendRainbow = function(){ + var segment = this.tick ? '_' : '-'; + var rainbowified = this.rainbowify(segment); + + for (var index = 0; index < this.numberOfLines; index++) { + var trajectory = this.trajectories[index]; + if (trajectory.length >= this.trajectoryWidthMax) trajectory.shift(); + trajectory.push(rainbowified); + } +}; + +/** + * Draw the rainbow. + * + * @api private + */ + +NyanCat.prototype.drawRainbow = function(){ + var self = this; + + this.trajectories.forEach(function(line, index) { + write('\u001b[' + self.scoreboardWidth + 'C'); + write(line.join('')); + write('\n'); + }); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Draw the nyan cat with `status`. + * + * @param {String} status + * @api private + */ + +NyanCat.prototype.drawNyanCat = function(status) { + var self = this; + var startWidth = this.scoreboardWidth + this.trajectories[0].length; + var color = '\u001b[' + startWidth + 'C'; + var padding = ''; + + write(color); + write('_,------,'); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write('_|' + padding + '/\\_/\\ '); + write('\n'); + + write(color); + padding = self.tick ? '_' : '__'; + var tail = self.tick ? '~' : '^'; + var face; + switch (status) { + case 'pass': + face = '( ^ .^)'; + break; + case 'fail': + face = '( o .o)'; + break; + default: + face = '( - .-)'; + } + write(tail + '|' + padding + face + ' '); + write('\n'); + + write(color); + padding = self.tick ? ' ' : ' '; + write(padding + '"" "" '); + write('\n'); + + this.cursorUp(this.numberOfLines); +}; + +/** + * Move cursor up `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorUp = function(n) { + write('\u001b[' + n + 'A'); +}; + +/** + * Move cursor down `n`. + * + * @param {Number} n + * @api private + */ + +NyanCat.prototype.cursorDown = function(n) { + write('\u001b[' + n + 'B'); +}; + +/** + * Generate rainbow colors. + * + * @return {Array} + * @api private + */ + +NyanCat.prototype.generateColors = function(){ + var colors = []; + + for (var i = 0; i < (6 * 7); i++) { + var pi3 = Math.floor(Math.PI / 3); + var n = (i * (1.0 / 6)); + var r = Math.floor(3 * Math.sin(n) + 3); + var g = Math.floor(3 * Math.sin(n + 2 * pi3) + 3); + var b = Math.floor(3 * Math.sin(n + 4 * pi3) + 3); + colors.push(36 * r + 6 * g + b + 16); + } + + return colors; +}; + +/** + * Apply rainbow to the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +NyanCat.prototype.rainbowify = function(str){ + var color = this.rainbowColors[this.colorIndex % this.rainbowColors.length]; + this.colorIndex += 1; + return '\u001b[38;5;' + color + 'm' + str + '\u001b[0m'; +}; + +/** + * Stdout helper. + */ + +function write(string) { + process.stdout.write(string); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +NyanCat.prototype = new F; +NyanCat.prototype.constructor = NyanCat; + + +}); // module: reporters/nyan.js + +require.register("reporters/progress.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Progress`. + */ + +exports = module.exports = Progress; + +/** + * General progress bar color. + */ + +Base.colors.progress = 90; + +/** + * Initialize a new `Progress` bar test reporter. + * + * @param {Runner} runner + * @param {Object} options + * @api public + */ + +function Progress(runner, options) { + Base.call(this, runner); + + var self = this + , options = options || {} + , stats = this.stats + , width = Base.window.width * .50 | 0 + , total = runner.total + , complete = 0 + , max = Math.max; + + // default chars + options.open = options.open || '['; + options.complete = options.complete || '▬'; + options.incomplete = options.incomplete || Base.symbols.dot; + options.close = options.close || ']'; + options.verbose = false; + + // tests started + runner.on('start', function(){ + console.log(); + cursor.hide(); + }); + + // tests complete + runner.on('test end', function(){ + complete++; + var incomplete = total - complete + , percent = complete / total + , n = width * percent | 0 + , i = width - n; + + cursor.CR(); + process.stdout.write('\u001b[J'); + process.stdout.write(color('progress', ' ' + options.open)); + process.stdout.write(Array(n).join(options.complete)); + process.stdout.write(Array(i).join(options.incomplete)); + process.stdout.write(color('progress', options.close)); + if (options.verbose) { + process.stdout.write(color('progress', ' ' + complete + ' of ' + total)); + } + }); + + // tests are complete, output some stats + // and the failures if any + runner.on('end', function(){ + cursor.show(); + console.log(); + self.epilogue(); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Progress.prototype = new F; +Progress.prototype.constructor = Progress; + + +}); // module: reporters/progress.js + +require.register("reporters/spec.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `Spec`. + */ + +exports = module.exports = Spec; + +/** + * Initialize a new `Spec` test reporter. + * + * @param {Runner} runner + * @api public + */ + +function Spec(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , indents = 0 + , n = 0; + + function indent() { + return Array(indents).join(' ') + } + + runner.on('start', function(){ + console.log(); + }); + + runner.on('suite', function(suite){ + ++indents; + console.log(color('suite', '%s%s'), indent(), suite.title); + }); + + runner.on('suite end', function(suite){ + --indents; + if (1 == indents) console.log(); + }); + + runner.on('test', function(test){ + process.stdout.write(indent() + color('pass', ' ◦ ' + test.title + ': ')); + }); + + runner.on('pending', function(test){ + var fmt = indent() + color('pending', ' - %s'); + console.log(fmt, test.title); + }); + + runner.on('pass', function(test){ + if ('fast' == test.speed) { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s '); + cursor.CR(); + console.log(fmt, test.title); + } else { + var fmt = indent() + + color('checkmark', ' ' + Base.symbols.ok) + + color('pass', ' %s ') + + color(test.speed, '(%dms)'); + cursor.CR(); + console.log(fmt, test.title, test.duration); + } + }); + + runner.on('fail', function(test, err){ + cursor.CR(); + console.log(indent() + color('fail', ' %d) %s'), ++n, test.title); + }); + + runner.on('end', self.epilogue.bind(self)); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +Spec.prototype = new F; +Spec.prototype.constructor = Spec; + + +}); // module: reporters/spec.js + +require.register("reporters/tap.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , cursor = Base.cursor + , color = Base.color; + +/** + * Expose `TAP`. + */ + +exports = module.exports = TAP; + +/** + * Initialize a new `TAP` reporter. + * + * @param {Runner} runner + * @api public + */ + +function TAP(runner) { + Base.call(this, runner); + + var self = this + , stats = this.stats + , n = 1 + , passes = 0 + , failures = 0; + + runner.on('start', function(){ + var total = runner.grepTotal(runner.suite); + console.log('%d..%d', 1, total); + }); + + runner.on('test end', function(){ + ++n; + }); + + runner.on('pending', function(test){ + console.log('ok %d %s # SKIP -', n, title(test)); + }); + + runner.on('pass', function(test){ + passes++; + console.log('ok %d %s', n, title(test)); + }); + + runner.on('fail', function(test, err){ + failures++; + console.log('not ok %d %s', n, title(test)); + if (err.stack) console.log(err.stack.replace(/^/gm, ' ')); + }); + + runner.on('end', function(){ + console.log('# tests ' + (passes + failures)); + console.log('# pass ' + passes); + console.log('# fail ' + failures); + }); +} + +/** + * Return a TAP-safe title of `test` + * + * @param {Object} test + * @return {String} + * @api private + */ + +function title(test) { + return test.fullTitle().replace(/#/g, ''); +} + +}); // module: reporters/tap.js + +require.register("reporters/teamcity.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base'); + +/** + * Expose `Teamcity`. + */ + +exports = module.exports = Teamcity; + +/** + * Initialize a new `Teamcity` reporter. + * + * @param {Runner} runner + * @api public + */ + +function Teamcity(runner) { + Base.call(this, runner); + var stats = this.stats; + + runner.on('start', function() { + console.log("##teamcity[testSuiteStarted name='mocha.suite']"); + }); + + runner.on('test', function(test) { + console.log("##teamcity[testStarted name='" + escape(test.fullTitle()) + "']"); + }); + + runner.on('fail', function(test, err) { + console.log("##teamcity[testFailed name='" + escape(test.fullTitle()) + "' message='" + escape(err.message) + "']"); + }); + + runner.on('pending', function(test) { + console.log("##teamcity[testIgnored name='" + escape(test.fullTitle()) + "' message='pending']"); + }); + + runner.on('test end', function(test) { + console.log("##teamcity[testFinished name='" + escape(test.fullTitle()) + "' duration='" + test.duration + "']"); + }); + + runner.on('end', function() { + console.log("##teamcity[testSuiteFinished name='mocha.suite' duration='" + stats.duration + "']"); + }); +} + +/** + * Escape the given `str`. + */ + +function escape(str) { + return str + .replace(/\|/g, "||") + .replace(/\n/g, "|n") + .replace(/\r/g, "|r") + .replace(/\[/g, "|[") + .replace(/\]/g, "|]") + .replace(/\u0085/g, "|x") + .replace(/\u2028/g, "|l") + .replace(/\u2029/g, "|p") + .replace(/'/g, "|'"); +} + +}); // module: reporters/teamcity.js + +require.register("reporters/xunit.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Base = require('./base') + , utils = require('../utils') + , escape = utils.escape; + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Expose `XUnit`. + */ + +exports = module.exports = XUnit; + +/** + * Initialize a new `XUnit` reporter. + * + * @param {Runner} runner + * @api public + */ + +function XUnit(runner) { + Base.call(this, runner); + var stats = this.stats + , tests = [] + , self = this; + + runner.on('pass', function(test){ + tests.push(test); + }); + + runner.on('fail', function(test){ + tests.push(test); + }); + + runner.on('end', function(){ + console.log(tag('testsuite', { + name: 'Mocha Tests' + , tests: stats.tests + , failures: stats.failures + , errors: stats.failures + , skipped: stats.tests - stats.failures - stats.passes + , timestamp: (new Date).toUTCString() + , time: (stats.duration / 1000) || 0 + }, false)); + + tests.forEach(test); + console.log(''); + }); +} + +/** + * Inherit from `Base.prototype`. + */ + +function F(){}; +F.prototype = Base.prototype; +XUnit.prototype = new F; +XUnit.prototype.constructor = XUnit; + + +/** + * Output tag for the given `test.` + */ + +function test(test) { + var attrs = { + classname: test.parent.fullTitle() + , name: test.title + , time: test.duration / 1000 + }; + + if ('failed' == test.state) { + var err = test.err; + attrs.message = escape(err.message); + console.log(tag('testcase', attrs, false, tag('failure', attrs, false, cdata(err.stack)))); + } else if (test.pending) { + console.log(tag('testcase', attrs, false, tag('skipped', {}, true))); + } else { + console.log(tag('testcase', attrs, true) ); + } +} + +/** + * HTML tag helper. + */ + +function tag(name, attrs, close, content) { + var end = close ? '/>' : '>' + , pairs = [] + , tag; + + for (var key in attrs) { + pairs.push(key + '="' + escape(attrs[key]) + '"'); + } + + tag = '<' + name + (pairs.length ? ' ' + pairs.join(' ') : '') + end; + if (content) tag += content + ''; +} + +}); // module: reporters/xunit.js + +require.register("runnable.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runnable') + , milliseconds = require('./ms'); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date + , setTimeout = global.setTimeout + , setInterval = global.setInterval + , clearTimeout = global.clearTimeout + , clearInterval = global.clearInterval; + +/** + * Object#toString(). + */ + +var toString = Object.prototype.toString; + +/** + * Expose `Runnable`. + */ + +module.exports = Runnable; + +/** + * Initialize a new `Runnable` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Runnable(title, fn) { + this.title = title; + this.fn = fn; + this.async = fn && fn.length; + this.sync = ! this.async; + this._timeout = 2000; + this._slow = 75; + this.timedOut = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runnable.prototype = new F; +Runnable.prototype.constructor = Runnable; + + +/** + * Set & get timeout `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = ms; + if (this.timer) this.resetTimeout(); + return this; +}; + +/** + * Set & get slow `ms`. + * + * @param {Number|String} ms + * @return {Runnable|Number} ms or self + * @api private + */ + +Runnable.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._slow = ms; + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Runnable.prototype.fullTitle = function(){ + return this.parent.fullTitle() + ' ' + this.title; +}; + +/** + * Clear the timeout. + * + * @api private + */ + +Runnable.prototype.clearTimeout = function(){ + clearTimeout(this.timer); +}; + +/** + * Inspect the runnable void of private properties. + * + * @return {String} + * @api private + */ + +Runnable.prototype.inspect = function(){ + return JSON.stringify(this, function(key, val){ + if ('_' == key[0]) return; + if ('parent' == key) return '#'; + if ('ctx' == key) return '#'; + return val; + }, 2); +}; + +/** + * Reset the timeout. + * + * @api private + */ + +Runnable.prototype.resetTimeout = function(){ + var self = this; + var ms = this.timeout() || 1e9; + + this.clearTimeout(); + this.timer = setTimeout(function(){ + self.callback(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); +}; + +/** + * Run the test and invoke `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runnable.prototype.run = function(fn){ + var self = this + , ms = this.timeout() + , start = new Date + , ctx = this.ctx + , finished + , emitted; + + if (ctx) ctx.runnable(this); + + // timeout + if (this.async) { + if (ms) { + this.timer = setTimeout(function(){ + done(new Error('timeout of ' + ms + 'ms exceeded')); + self.timedOut = true; + }, ms); + } + } + + // called multiple times + function multiple(err) { + if (emitted) return; + emitted = true; + self.emit('error', err || new Error('done() called multiple times')); + } + + // finished + function done(err) { + if (self.timedOut) return; + if (finished) return multiple(err); + self.clearTimeout(); + self.duration = new Date - start; + finished = true; + fn(err); + } + + // for .resetTimeout() + this.callback = done; + + // async + if (this.async) { + try { + this.fn.call(ctx, function(err){ + if (err instanceof Error || toString.call(err) === "[object Error]") return done(err); + if (null != err) return done(new Error('done() invoked with non-Error: ' + err)); + done(); + }); + } catch (err) { + done(err); + } + return; + } + + if (this.asyncOnly) { + return done(new Error('--async-only option in use without declaring `done()`')); + } + + // sync + try { + if (!this.pending) this.fn.call(ctx); + this.duration = new Date - start; + fn(); + } catch (err) { + fn(err); + } +}; + +}); // module: runnable.js + +require.register("runner.js", function(module, exports, require){ +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:runner') + , Test = require('./test') + , utils = require('./utils') + , filter = utils.filter + , keys = utils.keys; + +/** + * Non-enumerable globals. + */ + +var globals = [ + 'setTimeout', + 'clearTimeout', + 'setInterval', + 'clearInterval', + 'XMLHttpRequest', + 'Date' +]; + +/** + * Expose `Runner`. + */ + +module.exports = Runner; + +/** + * Initialize a `Runner` for the given `suite`. + * + * Events: + * + * - `start` execution started + * - `end` execution complete + * - `suite` (suite) test suite execution started + * - `suite end` (suite) all tests (and sub-suites) have finished + * - `test` (test) test execution started + * - `test end` (test) test completed + * - `hook` (hook) hook execution started + * - `hook end` (hook) hook complete + * - `pass` (test) test passed + * - `fail` (test, err) test failed + * - `pending` (test) test pending + * + * @api public + */ + +function Runner(suite) { + var self = this; + this._globals = []; + this.suite = suite; + this.total = suite.total(); + this.failures = 0; + this.on('test end', function(test){ self.checkGlobals(test); }); + this.on('hook end', function(hook){ self.checkGlobals(hook); }); + this.grep(/.*/); + this.globals(this.globalProps().concat(['errno'])); +} + +/** + * Wrapper for setImmediate, process.nextTick, or browser polyfill. + * + * @param {Function} fn + * @api private + */ + +Runner.immediately = global.setImmediate || process.nextTick; + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Runner.prototype = new F; +Runner.prototype.constructor = Runner; + + +/** + * Run tests with full titles matching `re`. Updates runner.total + * with number of tests matched. + * + * @param {RegExp} re + * @param {Boolean} invert + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.grep = function(re, invert){ + debug('grep %s', re); + this._grep = re; + this._invert = invert; + this.total = this.grepTotal(this.suite); + return this; +}; + +/** + * Returns the number of tests matching the grep search for the + * given suite. + * + * @param {Suite} suite + * @return {Number} + * @api public + */ + +Runner.prototype.grepTotal = function(suite) { + var self = this; + var total = 0; + + suite.eachTest(function(test){ + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (match) total++; + }); + + return total; +}; + +/** + * Return a list of global properties. + * + * @return {Array} + * @api private + */ + +Runner.prototype.globalProps = function() { + var props = utils.keys(global); + + // non-enumerables + for (var i = 0; i < globals.length; ++i) { + if (~utils.indexOf(props, globals[i])) continue; + props.push(globals[i]); + } + + return props; +}; + +/** + * Allow the given `arr` of globals. + * + * @param {Array} arr + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.globals = function(arr){ + if (0 == arguments.length) return this._globals; + debug('globals %j', arr); + utils.forEach(arr, function(arr){ + this._globals.push(arr); + }, this); + return this; +}; + +/** + * Check for global variable leaks. + * + * @api private + */ + +Runner.prototype.checkGlobals = function(test){ + if (this.ignoreLeaks) return; + var ok = this._globals; + var globals = this.globalProps(); + var isNode = process.kill; + var leaks; + + // check length - 2 ('errno' and 'location' globals) + if (isNode && 1 == ok.length - globals.length) return + else if (2 == ok.length - globals.length) return; + + leaks = filterLeaks(ok, globals); + this._globals = this._globals.concat(leaks); + + if (leaks.length > 1) { + this.fail(test, new Error('global leaks detected: ' + leaks.join(', ') + '')); + } else if (leaks.length) { + this.fail(test, new Error('global leak detected: ' + leaks[0])); + } +}; + +/** + * Fail the given `test`. + * + * @param {Test} test + * @param {Error} err + * @api private + */ + +Runner.prototype.fail = function(test, err){ + ++this.failures; + test.state = 'failed'; + + if ('string' == typeof err) { + err = new Error('the string "' + err + '" was thrown, throw an Error :)'); + } + + this.emit('fail', test, err); +}; + +/** + * Fail the given `hook` with `err`. + * + * Hook failures (currently) hard-end due + * to that fact that a failing hook will + * surely cause subsequent tests to fail, + * causing jumbled reporting. + * + * @param {Hook} hook + * @param {Error} err + * @api private + */ + +Runner.prototype.failHook = function(hook, err){ + this.fail(hook, err); + this.emit('end'); +}; + +/** + * Run hook `name` callbacks and then invoke `fn()`. + * + * @param {String} name + * @param {Function} function + * @api private + */ + +Runner.prototype.hook = function(name, fn){ + var suite = this.suite + , hooks = suite['_' + name] + , self = this + , timer; + + function next(i) { + var hook = hooks[i]; + if (!hook) return fn(); + if (self.failures && suite.bail()) return fn(); + self.currentRunnable = hook; + + hook.ctx.currentTest = self.test; + + self.emit('hook', hook); + + hook.on('error', function(err){ + self.failHook(hook, err); + }); + + hook.run(function(err){ + hook.removeAllListeners('error'); + var testError = hook.error(); + if (testError) self.fail(self.test, testError); + if (err) return self.failHook(hook, err); + self.emit('hook end', hook); + delete hook.ctx.currentTest; + next(++i); + }); + } + + Runner.immediately(function(){ + next(0); + }); +}; + +/** + * Run hook `name` for the given array of `suites` + * in order, and callback `fn(err)`. + * + * @param {String} name + * @param {Array} suites + * @param {Function} fn + * @api private + */ + +Runner.prototype.hooks = function(name, suites, fn){ + var self = this + , orig = this.suite; + + function next(suite) { + self.suite = suite; + + if (!suite) { + self.suite = orig; + return fn(); + } + + self.hook(name, function(err){ + if (err) { + self.suite = orig; + return fn(err); + } + + next(suites.pop()); + }); + } + + next(suites.pop()); +}; + +/** + * Run hooks from the top level down. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookUp = function(name, fn){ + var suites = [this.suite].concat(this.parents()).reverse(); + this.hooks(name, suites, fn); +}; + +/** + * Run hooks from the bottom up. + * + * @param {String} name + * @param {Function} fn + * @api private + */ + +Runner.prototype.hookDown = function(name, fn){ + var suites = [this.suite].concat(this.parents()); + this.hooks(name, suites, fn); +}; + +/** + * Return an array of parent Suites from + * closest to furthest. + * + * @return {Array} + * @api private + */ + +Runner.prototype.parents = function(){ + var suite = this.suite + , suites = []; + while (suite = suite.parent) suites.push(suite); + return suites; +}; + +/** + * Run the current test and callback `fn(err)`. + * + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTest = function(fn){ + var test = this.test + , self = this; + + if (this.asyncOnly) test.asyncOnly = true; + + try { + test.on('error', function(err){ + self.fail(test, err); + }); + test.run(fn); + } catch (err) { + fn(err); + } +}; + +/** + * Run tests in the given `suite` and invoke + * the callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runTests = function(suite, fn){ + var self = this + , tests = suite.tests.slice() + , test; + + function next(err) { + // if we bail after first err + if (self.failures && suite._bail) return fn(); + + // next test + test = tests.shift(); + + // all done + if (!test) return fn(); + + // grep + var match = self._grep.test(test.fullTitle()); + if (self._invert) match = !match; + if (!match) return next(); + + // pending + if (test.pending) { + self.emit('pending', test); + self.emit('test end', test); + return next(); + } + + // execute test and hook(s) + self.emit('test', self.test = test); + self.hookDown('beforeEach', function(){ + self.currentRunnable = self.test; + self.runTest(function(err){ + test = self.test; + + if (err) { + self.fail(test, err); + self.emit('test end', test); + return self.hookUp('afterEach', next); + } + + test.state = 'passed'; + self.emit('pass', test); + self.emit('test end', test); + self.hookUp('afterEach', next); + }); + }); + } + + this.next = next; + next(); +}; + +/** + * Run the given `suite` and invoke the + * callback `fn()` when complete. + * + * @param {Suite} suite + * @param {Function} fn + * @api private + */ + +Runner.prototype.runSuite = function(suite, fn){ + var total = this.grepTotal(suite) + , self = this + , i = 0; + + debug('run suite %s', suite.fullTitle()); + + if (!total) return fn(); + + this.emit('suite', this.suite = suite); + + function next() { + var curr = suite.suites[i++]; + if (!curr) return done(); + self.runSuite(curr, next); + } + + function done() { + self.suite = suite; + self.hook('afterAll', function(){ + self.emit('suite end', suite); + fn(); + }); + } + + this.hook('beforeAll', function(){ + self.runTests(suite, next); + }); +}; + +/** + * Handle uncaught exceptions. + * + * @param {Error} err + * @api private + */ + +Runner.prototype.uncaught = function(err){ + debug('uncaught exception %s', err.message); + var runnable = this.currentRunnable; + if (!runnable || 'failed' == runnable.state) return; + runnable.clearTimeout(); + err.uncaught = true; + this.fail(runnable, err); + + // recover from test + if ('test' == runnable.type) { + this.emit('test end', runnable); + this.hookUp('afterEach', this.next); + return; + } + + // bail on hooks + this.emit('end'); +}; + +/** + * Run the root suite and invoke `fn(failures)` + * on completion. + * + * @param {Function} fn + * @return {Runner} for chaining + * @api public + */ + +Runner.prototype.run = function(fn){ + var self = this + , fn = fn || function(){}; + + function uncaught(err){ + self.uncaught(err); + } + + debug('start'); + + // callback + this.on('end', function(){ + debug('end'); + process.removeListener('uncaughtException', uncaught); + fn(self.failures); + }); + + // run suites + this.emit('start'); + this.runSuite(this.suite, function(){ + debug('finished running'); + self.emit('end'); + }); + + // uncaught exception + process.on('uncaughtException', uncaught); + + return this; +}; + +/** + * Filter leaks with the given globals flagged as `ok`. + * + * @param {Array} ok + * @param {Array} globals + * @return {Array} + * @api private + */ + +function filterLeaks(ok, globals) { + return filter(globals, function(key){ + // Firefox and Chrome exposes iframes as index inside the window object + if (/^d+/.test(key)) return false; + var matched = filter(ok, function(ok){ + if (~ok.indexOf('*')) return 0 == key.indexOf(ok.split('*')[0]); + // Opera and IE expose global variables for HTML element IDs (issue #243) + if (/^mocha-/.test(key)) return true; + return key == ok; + }); + return matched.length == 0 && (!global.navigator || 'onerror' !== key); + }); +} + +}); // module: runner.js + +require.register("suite.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var EventEmitter = require('browser/events').EventEmitter + , debug = require('browser/debug')('mocha:suite') + , milliseconds = require('./ms') + , utils = require('./utils') + , Hook = require('./hook'); + +/** + * Expose `Suite`. + */ + +exports = module.exports = Suite; + +/** + * Create a new `Suite` with the given `title` + * and parent `Suite`. When a suite with the + * same title is already present, that suite + * is returned to provide nicer reporter + * and more flexible meta-testing. + * + * @param {Suite} parent + * @param {String} title + * @return {Suite} + * @api public + */ + +exports.create = function(parent, title){ + var suite = new Suite(title, parent.ctx); + suite.parent = parent; + if (parent.pending) suite.pending = true; + title = suite.fullTitle(); + parent.addSuite(suite); + return suite; +}; + +/** + * Initialize a new `Suite` with the given + * `title` and `ctx`. + * + * @param {String} title + * @param {Context} ctx + * @api private + */ + +function Suite(title, ctx) { + this.title = title; + this.ctx = ctx; + this.suites = []; + this.tests = []; + this.pending = false; + this._beforeEach = []; + this._beforeAll = []; + this._afterEach = []; + this._afterAll = []; + this.root = !title; + this._timeout = 2000; + this._slow = 75; + this._bail = false; +} + +/** + * Inherit from `EventEmitter.prototype`. + */ + +function F(){}; +F.prototype = EventEmitter.prototype; +Suite.prototype = new F; +Suite.prototype.constructor = Suite; + + +/** + * Return a clone of this `Suite`. + * + * @return {Suite} + * @api private + */ + +Suite.prototype.clone = function(){ + var suite = new Suite(this.title); + debug('clone'); + suite.ctx = this.ctx; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + return suite; +}; + +/** + * Set timeout `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.timeout = function(ms){ + if (0 == arguments.length) return this._timeout; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('timeout %d', ms); + this._timeout = parseInt(ms, 10); + return this; +}; + +/** + * Set slow `ms` or short-hand such as "2s". + * + * @param {Number|String} ms + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.slow = function(ms){ + if (0 === arguments.length) return this._slow; + if ('string' == typeof ms) ms = milliseconds(ms); + debug('slow %d', ms); + this._slow = ms; + return this; +}; + +/** + * Sets whether to bail after first error. + * + * @parma {Boolean} bail + * @return {Suite|Number} for chaining + * @api private + */ + +Suite.prototype.bail = function(bail){ + if (0 == arguments.length) return this._bail; + debug('bail %s', bail); + this._bail = bail; + return this; +}; + +/** + * Run `fn(test[, done])` before running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeAll.push(hook); + this.emit('beforeAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after running tests. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterAll = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after all" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterAll.push(hook); + this.emit('afterAll', hook); + return this; +}; + +/** + * Run `fn(test[, done])` before each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.beforeEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"before each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._beforeEach.push(hook); + this.emit('beforeEach', hook); + return this; +}; + +/** + * Run `fn(test[, done])` after each test case. + * + * @param {Function} fn + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.afterEach = function(fn){ + if (this.pending) return this; + var hook = new Hook('"after each" hook', fn); + hook.parent = this; + hook.timeout(this.timeout()); + hook.slow(this.slow()); + hook.ctx = this.ctx; + this._afterEach.push(hook); + this.emit('afterEach', hook); + return this; +}; + +/** + * Add a test `suite`. + * + * @param {Suite} suite + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addSuite = function(suite){ + suite.parent = this; + suite.timeout(this.timeout()); + suite.slow(this.slow()); + suite.bail(this.bail()); + this.suites.push(suite); + this.emit('suite', suite); + return this; +}; + +/** + * Add a `test` to this suite. + * + * @param {Test} test + * @return {Suite} for chaining + * @api private + */ + +Suite.prototype.addTest = function(test){ + test.parent = this; + test.timeout(this.timeout()); + test.slow(this.slow()); + test.ctx = this.ctx; + this.tests.push(test); + this.emit('test', test); + return this; +}; + +/** + * Return the full title generated by recursively + * concatenating the parent's full title. + * + * @return {String} + * @api public + */ + +Suite.prototype.fullTitle = function(){ + if (this.parent) { + var full = this.parent.fullTitle(); + if (full) return full + ' ' + this.title; + } + return this.title; +}; + +/** + * Return the total number of tests. + * + * @return {Number} + * @api public + */ + +Suite.prototype.total = function(){ + return utils.reduce(this.suites, function(sum, suite){ + return sum + suite.total(); + }, 0) + this.tests.length; +}; + +/** + * Iterates through each suite recursively to find + * all tests. Applies a function in the format + * `fn(test)`. + * + * @param {Function} fn + * @return {Suite} + * @api private + */ + +Suite.prototype.eachTest = function(fn){ + utils.forEach(this.tests, fn); + utils.forEach(this.suites, function(suite){ + suite.eachTest(fn); + }); + return this; +}; + +}); // module: suite.js + +require.register("test.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var Runnable = require('./runnable'); + +/** + * Expose `Test`. + */ + +module.exports = Test; + +/** + * Initialize a new `Test` with the given `title` and callback `fn`. + * + * @param {String} title + * @param {Function} fn + * @api private + */ + +function Test(title, fn) { + Runnable.call(this, title, fn); + this.pending = !fn; + this.type = 'test'; +} + +/** + * Inherit from `Runnable.prototype`. + */ + +function F(){}; +F.prototype = Runnable.prototype; +Test.prototype = new F; +Test.prototype.constructor = Test; + + +}); // module: test.js + +require.register("utils.js", function(module, exports, require){ + +/** + * Module dependencies. + */ + +var fs = require('browser/fs') + , path = require('browser/path') + , join = path.join + , debug = require('browser/debug')('mocha:watch'); + +/** + * Ignored directories. + */ + +var ignore = ['node_modules', '.git']; + +/** + * Escape special characters in the given string of html. + * + * @param {String} html + * @return {String} + * @api private + */ + +exports.escape = function(html){ + return String(html) + .replace(/&/g, '&') + .replace(/"/g, '"') + .replace(//g, '>'); +}; + +/** + * Array#forEach (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} scope + * @api private + */ + +exports.forEach = function(arr, fn, scope){ + for (var i = 0, l = arr.length; i < l; i++) + fn.call(scope, arr[i], i); +}; + +/** + * Array#indexOf (<=IE8) + * + * @parma {Array} arr + * @param {Object} obj to find index of + * @param {Number} start + * @api private + */ + +exports.indexOf = function(arr, obj, start){ + for (var i = start || 0, l = arr.length; i < l; i++) { + if (arr[i] === obj) + return i; + } + return -1; +}; + +/** + * Array#reduce (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @param {Object} initial value + * @api private + */ + +exports.reduce = function(arr, fn, val){ + var rval = val; + + for (var i = 0, l = arr.length; i < l; i++) { + rval = fn(rval, arr[i], i, arr); + } + + return rval; +}; + +/** + * Array#filter (<=IE8) + * + * @param {Array} array + * @param {Function} fn + * @api private + */ + +exports.filter = function(arr, fn){ + var ret = []; + + for (var i = 0, l = arr.length; i < l; i++) { + var val = arr[i]; + if (fn(val, i, arr)) ret.push(val); + } + + return ret; +}; + +/** + * Object.keys (<=IE8) + * + * @param {Object} obj + * @return {Array} keys + * @api private + */ + +exports.keys = Object.keys || function(obj) { + var keys = [] + , has = Object.prototype.hasOwnProperty // for `window` on <=IE8 + + for (var key in obj) { + if (has.call(obj, key)) { + keys.push(key); + } + } + + return keys; +}; + +/** + * Watch the given `files` for changes + * and invoke `fn(file)` on modification. + * + * @param {Array} files + * @param {Function} fn + * @api private + */ + +exports.watch = function(files, fn){ + var options = { interval: 100 }; + files.forEach(function(file){ + debug('file %s', file); + fs.watchFile(file, options, function(curr, prev){ + if (prev.mtime < curr.mtime) fn(file); + }); + }); +}; + +/** + * Ignored files. + */ + +function ignored(path){ + return !~ignore.indexOf(path); +} + +/** + * Lookup files in the given `dir`. + * + * @return {Array} + * @api private + */ + +exports.files = function(dir, ret){ + ret = ret || []; + + fs.readdirSync(dir) + .filter(ignored) + .forEach(function(path){ + path = join(dir, path); + if (fs.statSync(path).isDirectory()) { + exports.files(path, ret); + } else if (path.match(/\.(js|coffee)$/)) { + ret.push(path); + } + }); + + return ret; +}; + +/** + * Compute a slug from the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.slug = function(str){ + return str + .toLowerCase() + .replace(/ +/g, '-') + .replace(/[^-\w]/g, ''); +}; + +/** + * Strip the function definition from `str`, + * and re-indent for pre whitespace. + */ + +exports.clean = function(str) { + str = str + .replace(/^function *\(.*\) *{/, '') + .replace(/\s+\}$/, ''); + + var whitespace = str.match(/^\n?(\s*)/)[1] + , re = new RegExp('^' + whitespace, 'gm'); + + str = str.replace(re, ''); + + return exports.trim(str); +}; + +/** + * Escape regular expression characters in `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.escapeRegexp = function(str){ + return str.replace(/[-\\^$*+?.()|[\]{}]/g, "\\$&"); +}; + +/** + * Trim the given `str`. + * + * @param {String} str + * @return {String} + * @api private + */ + +exports.trim = function(str){ + return str.replace(/^\s+|\s+$/g, ''); +}; + +/** + * Parse the given `qs`. + * + * @param {String} qs + * @return {Object} + * @api private + */ + +exports.parseQuery = function(qs){ + return exports.reduce(qs.replace('?', '').split('&'), function(obj, pair){ + var i = pair.indexOf('=') + , key = pair.slice(0, i) + , val = pair.slice(++i); + + obj[key] = decodeURIComponent(val); + return obj; + }, {}); +}; + +/** + * Highlight the given string of `js`. + * + * @param {String} js + * @return {String} + * @api private + */ + +function highlight(js) { + return js + .replace(//g, '>') + .replace(/\/\/(.*)/gm, '//$1') + .replace(/('.*?')/gm, '$1') + .replace(/(\d+\.\d+)/gm, '$1') + .replace(/(\d+)/gm, '$1') + .replace(/\bnew *(\w+)/gm, 'new $1') + .replace(/\b(function|new|throw|return|var|if|else)\b/gm, '$1') +} + +/** + * Highlight the contents of tag `name`. + * + * @param {String} name + * @api private + */ + +exports.highlightTags = function(name) { + var code = document.getElementsByTagName(name); + for (var i = 0, len = code.length; i < len; ++i) { + code[i].innerHTML = highlight(code[i].innerHTML); + } +}; + +}); // module: utils.js +// The global object is "self" in Web Workers. +global = (function() { return this; })(); + +/** + * Save timer references to avoid Sinon interfering (see GH-237). + */ + +var Date = global.Date; +var setTimeout = global.setTimeout; +var setInterval = global.setInterval; +var clearTimeout = global.clearTimeout; +var clearInterval = global.clearInterval; + +/** + * Node shims. + * + * These are meant only to allow + * mocha.js to run untouched, not + * to allow running node code in + * the browser. + */ + +var process = {}; +process.exit = function(status){}; +process.stdout = {}; + +/** + * Remove uncaughtException listener. + */ + +process.removeListener = function(e){ + if ('uncaughtException' == e) { + global.onerror = function() {}; + } +}; + +/** + * Implements uncaughtException listener. + */ + +process.on = function(e, fn){ + if ('uncaughtException' == e) { + global.onerror = function(err, url, line){ + fn(new Error(err + ' (' + url + ':' + line + ')')); + }; + } +}; + +/** + * Expose mocha. + */ + +var Mocha = global.Mocha = require('mocha'), + mocha = global.mocha = new Mocha({ reporter: 'html' }); + +var immediateQueue = [] + , immediateTimeout; + +function timeslice() { + var immediateStart = new Date().getTime(); + while (immediateQueue.length && (new Date().getTime() - immediateStart) < 100) { + immediateQueue.shift()(); + } + if (immediateQueue.length) { + immediateTimeout = setTimeout(timeslice, 0); + } else { + immediateTimeout = null; + } +} + +/** + * High-performance override of Runner.immediately. + */ + +Mocha.Runner.immediately = function(callback) { + immediateQueue.push(callback); + if (!immediateTimeout) { + immediateTimeout = setTimeout(timeslice, 0); + } +}; + +/** + * Override ui to ensure that the ui functions are initialized. + * Normally this would happen in Mocha.prototype.loadFiles. + */ + +mocha.ui = function(ui){ + Mocha.prototype.ui.call(this, ui); + this.suite.emit('pre-require', global, null, this); + return this; +}; + +/** + * Setup mocha with the given setting options. + */ + +mocha.setup = function(opts){ + if ('string' == typeof opts) opts = { ui: opts }; + for (var opt in opts) this[opt](opts[opt]); + return this; +}; + +/** + * Run mocha, returning the Runner. + */ + +mocha.run = function(fn){ + var options = mocha.options; + mocha.globals('location'); + + var query = Mocha.utils.parseQuery(global.location.search || ''); + if (query.grep) mocha.grep(query.grep); + if (query.invert) mocha.invert(); + + return Mocha.prototype.run.call(mocha, function(){ + // The DOM Document is not available in Web Workers. + if (global.document) { + Mocha.utils.highlightTags('code'); + } + if (fn) fn(); + }); +}; + +/** + * Expose the process shim. + */ + +Mocha.process = process; +})(); \ No newline at end of file diff --git a/bootstrap/node_modules/has-transitions/test/tests.js b/bootstrap/node_modules/has-transitions/test/tests.js new file mode 100644 index 0000000..e8554d8 --- /dev/null +++ b/bootstrap/node_modules/has-transitions/test/tests.js @@ -0,0 +1,38 @@ +var has = require('has-transitions'); +var assert = require('assert'); + +describe('has-transitions', function(){ + var el; + + beforeEach(function(){ + el = document.createElement('div'); + document.body.appendChild(el); + }); + + afterEach(function(){ + document.body.removeChild(el); + }); + + it('should determine if the browser supports transitions', function(){ + assert( has() === true ); + }); + + it('should know when an element has transitions from inline styles', function(){ + el.style.webkitTransition = "all 1s"; + el.style.MozTransition = "all 1s"; + el.style.transition = "all 1s"; + assert( has(el) === true ); + }); + + it('should know when an element has transitions from a class', function(){ + el.className = "transition"; + assert( has(el) === true ); + el.className = ""; + assert( has(el) === false ); + }); + + it("should know when an element doesn't have transitions", function(){ + assert( has(el) === false ); + }); + +}); \ No newline at end of file diff --git a/bootstrap/node_modules/has-translate3d/.npmignore b/bootstrap/node_modules/has-translate3d/.npmignore new file mode 100644 index 0000000..48a2e24 --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/.npmignore @@ -0,0 +1,2 @@ +components +build diff --git a/bootstrap/node_modules/has-translate3d/History.md b/bootstrap/node_modules/has-translate3d/History.md new file mode 100644 index 0000000..1a635a2 --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/History.md @@ -0,0 +1,16 @@ + +0.0.3 / 2014-05-20 +================== + + * index: don't use `return` at the top level + * index: fix for IE8 [yields] (fixes #3) + +0.0.2 / 2013-04-05 +================== + + * index: fix computed style lookeup + +0.0.1 / 2013-04-04 +================== + + * initial release diff --git a/bootstrap/node_modules/has-translate3d/Makefile b/bootstrap/node_modules/has-translate3d/Makefile new file mode 100644 index 0000000..0f14dac --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/Makefile @@ -0,0 +1,11 @@ + +build: components index.js + @component build --dev + +components: component.json + @component install --dev + +clean: + rm -fr build components template.js + +.PHONY: clean diff --git a/bootstrap/node_modules/has-translate3d/Readme.md b/bootstrap/node_modules/has-translate3d/Readme.md new file mode 100644 index 0000000..20b228e --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/Readme.md @@ -0,0 +1,17 @@ + +# has-translate3d + + Feature detection of css `translate3d` + +## Installation + + $ component install component/has-translate3d + +## API + + Exports `true` if the engine supports `translate3d`, + or `false` otherwise. + +## License + + MIT diff --git a/bootstrap/node_modules/has-translate3d/component.json b/bootstrap/node_modules/has-translate3d/component.json new file mode 100644 index 0000000..70ab806 --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/component.json @@ -0,0 +1,15 @@ +{ + "name": "has-translate3d", + "repo": "component/has-translate3d", + "description": "Feature detection of css translate3d", + "version": "0.0.3", + "keywords": [], + "dependencies": { + "component/transform-property": "0.0.1" + }, + "development": {}, + "license": "MIT", + "scripts": [ + "index.js" + ] +} diff --git a/bootstrap/node_modules/has-translate3d/index.js b/bootstrap/node_modules/has-translate3d/index.js new file mode 100644 index 0000000..6bcd0b9 --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/index.js @@ -0,0 +1,24 @@ + +var prop = require('transform-property'); + +// IE <=8 doesn't have `getComputedStyle` +if (!prop || !window.getComputedStyle) { + module.exports = false; + +} else { + var map = { + webkitTransform: '-webkit-transform', + OTransform: '-o-transform', + msTransform: '-ms-transform', + MozTransform: '-moz-transform', + transform: 'transform' + }; + + // from: https://gist.github.com/lorenzopolidori/3794226 + var el = document.createElement('div'); + el.style[prop] = 'translate3d(1px,1px,1px)'; + document.body.insertBefore(el, null); + var val = getComputedStyle(el).getPropertyValue(map[prop]); + document.body.removeChild(el); + module.exports = null != val && val.length && 'none' != val; +} diff --git a/bootstrap/node_modules/has-translate3d/package.json b/bootstrap/node_modules/has-translate3d/package.json new file mode 100644 index 0000000..1a44e24 --- /dev/null +++ b/bootstrap/node_modules/has-translate3d/package.json @@ -0,0 +1,15 @@ +{ + "name": "has-translate3d", + "description": "Feature detection of css translate3d", + "version": "0.0.3", + "keywords": [], + "license": "MIT", + "dependencies": { + "transform-property": "0.0.1" + }, + "component": { + "scripts": { + "has-translate3d/index.js": "index.js" + } + } +} diff --git a/bootstrap/node_modules/index.html b/bootstrap/node_modules/index.html new file mode 100644 index 0000000..7e7e8dc --- /dev/null +++ b/bootstrap/node_modules/index.html @@ -0,0 +1,96 @@ + + + + + + + + + Scrollable Tabs Bootstrap 5 + + + + + + +
    +
    +
    + +
    +
    + This is the content of Tab 1... +
    +
    + This is the content of Tab 2... +
    +
    + This is the content of Tab 3... +
    +
    + This is the content of Tab 4... +
    +
    + This is the content of Tab 5... +
    +
    + This is the content of Tab 6... +
    +
    + This is the content of Tab 7... +
    +
    + This is the content of Tab 8... +
    +
    + This is the content of Tab 9... +
    +
    + This is the content of Tab 10... +
    +
    + This is the content of Tab 11... +
    +
    + This is the content of Tab 12... +
    +
    + This is the content of Tab 13... +
    +
    + This is the content of Tab 14... +
    +
    + This is the content of Tab 15... +
    +
    + This is the content of Tab 16... +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/bootstrap/node_modules/move-js/.npmignore b/bootstrap/node_modules/move-js/.npmignore new file mode 100644 index 0000000..f1250e5 --- /dev/null +++ b/bootstrap/node_modules/move-js/.npmignore @@ -0,0 +1,4 @@ +support +test +examples +*.sock diff --git a/bootstrap/node_modules/move-js/History.md b/bootstrap/node_modules/move-js/History.md new file mode 100644 index 0000000..5ac2da7 --- /dev/null +++ b/bootstrap/node_modules/move-js/History.md @@ -0,0 +1,86 @@ +0.5.0 / 2015-05-09 +================== + + * add npm / browserify support, closes #41 and #42 [axelpale] + * remove `remotes` from component.json, closes #71 [axelpale] + +0.4.0 / 2014-09-08 +================== + + * Add Move.matrix() [abliss] + * Remove transition duration properties instead of setting them to 0 [kimmobrunfeldt] + * add third argument to .setProperty [eivindfjeldstad] + +0.3.3 / 2013-11-11 +================== + + * add ie10 support, closes #32 + +0.3.2 / 2013-09-30 +================== + + * use css component, closes #26 + * fix css number values, closes #30 + +0.3.1 / 2013-09-28 +================== + + * reset duration on "end", closes #4 + +0.3.0 / 2013-09-28 +================== + + * use after-transition, closes #25 and #22 + * move easing functions to a different component, closes #27 + +0.2.2 / 2013-09-27 +================== + + * use .setProperty(), remove component/css dep, closes #24 + +0.2.1 / 2013-09-26 +================== + + * update examples and docs + * fixed typo in Move.prototype.ease function [olegomon] + * use translate3d() when available + +0.2.0 / 2013-09-16 +================== + + * add component.json + +0.1.1 / 2011-12-10 +================== + + * Revert "Changed CSS property transition-properties to transition-property" + +0.1.0 / 2011-11-16 +================== + + * Added more cubic-bezier ease functions [onirame] + +0.0.4 / 2011-10-25 +================== + + * Remove resets in duration timeout causing undesired behaviour + * Changed CSS property transition-properties to transition-property + +0.0.3 / 2011-08-27 +================== + + * Added: allow passing of element to `move()` + +0.0.2 / 2011-06-04 +================== + + * Added map of properties and defaults for numeric values + * Fixed FireFox support [bluntworks] + * Fixed easing example with html doctype + * Fixed second notation for delay / duration + * Fixed duration / delay, append "ms" + +0.0.1 / 2011-06-01 +================== + + * Initial release diff --git a/bootstrap/node_modules/move-js/Makefile b/bootstrap/node_modules/move-js/Makefile new file mode 100644 index 0000000..0097ab9 --- /dev/null +++ b/bootstrap/node_modules/move-js/Makefile @@ -0,0 +1,21 @@ + +UGLIFY_FLAGS = --no-mangle + +build: move.min.js components index.js + @component build --dev + +components: component.json + @component install --dev + +move.js: components + @component build --standalone move --name move --out . + +move.min.js: move.js + @uglifyjs $(UGLIFY_FLAGS) $< > $@ \ + && du -h move.js \ + && du -h move.min.js + +clean: + rm -rf build move.js components move.min.js + +.PHONY: clean diff --git a/bootstrap/node_modules/move-js/Readme.md b/bootstrap/node_modules/move-js/Readme.md new file mode 100644 index 0000000..f0f6804 --- /dev/null +++ b/bootstrap/node_modules/move-js/Readme.md @@ -0,0 +1,121 @@ + +# Move.js + + CSS3 JavaScript animation framework. + +## About + + Move.js is a small JavaScript library making CSS3 backed animation + extremely simple and elegant. Be sure to view the `./examples`, + and view the [documentation](http://visionmedia.github.com/move.js/). + +## Installation + + With [component(1)](http://component.github.io): + + $ component install visionmedia/move.js + + With [npm](https://www.npmjs.com/package/move-js): + + $ npm install move-js + + With a stand-alone build + + + + +## Example + + For example below we translate to the point `(500px, 200px)`, + rotate by `180deg`, scale by `.5`, skew, and alter colors within a 2 second + duration. Once the animation is complete we `then()` fade out the element by setting the `opacity` to `0`, and shrink it with `scale(0.1)`. + + move('.square') + .to(500, 200) + .rotate(180) + .scale(.5) + .set('background-color', '#888') + .set('border-color', 'black') + .duration('2s') + .skew(50, -10) + .then() + .set('opacity', 0) + .duration('0.3s') + .scale(0.1) + .pop() + .end(); + +## Easing functions + + Built-in easing functions are defined as: + +```js +'in': 'ease-in' +'out': 'ease-out' +'in-out': 'ease-in-out' +'snap': 'cubic-bezier(0,1,.5,1)' +'linear': 'cubic-bezier(0.250, 0.250, 0.750, 0.750)' +'ease-in-quad': 'cubic-bezier(0.550, 0.085, 0.680, 0.530)' +'ease-in-cubic': 'cubic-bezier(0.550, 0.055, 0.675, 0.190)' +'ease-in-quart': 'cubic-bezier(0.895, 0.030, 0.685, 0.220)' +'ease-in-quint': 'cubic-bezier(0.755, 0.050, 0.855, 0.060)' +'ease-in-sine': 'cubic-bezier(0.470, 0.000, 0.745, 0.715)' +'ease-in-expo': 'cubic-bezier(0.950, 0.050, 0.795, 0.035)' +'ease-in-circ': 'cubic-bezier(0.600, 0.040, 0.980, 0.335)' +'ease-in-back': 'cubic-bezier(0.600, -0.280, 0.735, 0.045)' +'ease-out-quad': 'cubic-bezier(0.250, 0.460, 0.450, 0.940)' +'ease-out-cubic': 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' +'ease-out-quart': 'cubic-bezier(0.165, 0.840, 0.440, 1.000)' +'ease-out-quint': 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' +'ease-out-sine': 'cubic-bezier(0.390, 0.575, 0.565, 1.000)' +'ease-out-expo': 'cubic-bezier(0.190, 1.000, 0.220, 1.000)' +'ease-out-circ': 'cubic-bezier(0.075, 0.820, 0.165, 1.000)' +'ease-out-back': 'cubic-bezier(0.175, 0.885, 0.320, 1.275)' +'ease-out-quad': 'cubic-bezier(0.455, 0.030, 0.515, 0.955)' +'ease-out-cubic': 'cubic-bezier(0.645, 0.045, 0.355, 1.000)' +'ease-in-out-quart': 'cubic-bezier(0.770, 0.000, 0.175, 1.000)' +'ease-in-out-quint': 'cubic-bezier(0.860, 0.000, 0.070, 1.000)' +'ease-in-out-sine': 'cubic-bezier(0.445, 0.050, 0.550, 0.950)' +'ease-in-out-expo': 'cubic-bezier(1.000, 0.000, 0.000, 1.000)' +'ease-in-out-circ': 'cubic-bezier(0.785, 0.135, 0.150, 0.860)' +'ease-in-out-back': 'cubic-bezier(0.680, -0.550, 0.265, 1.550)' +``` + +## Build + + Move is packaged with a minified version, re-built each release. To do this yourself simply execute: + + $ make move.min.js + + We can also pass flags to uglifyjs: + + $ make UGLIFY_FLAGS=--no-mangle + +## More Information + + - [cubic-bezier()](http://www.roblaplaca.com/examples/bezierBuilder) generator + +## License + +(The MIT License) + +Copyright (c) 2011 TJ Holowaychuk <tj@vision-media.ca> + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/bootstrap/node_modules/move-js/component.json b/bootstrap/node_modules/move-js/component.json new file mode 100644 index 0000000..541a9dc --- /dev/null +++ b/bootstrap/node_modules/move-js/component.json @@ -0,0 +1,15 @@ +{ + "name": "move", + "description": "CSS3 backed JavaScript animation framework", + "repo": "visionmedia/move.js", + "version": "0.5.0", + "keywords": ["animation", "css3"], + "scripts": ["index.js"], + "dependencies": { + "component/has-translate3d": "*", + "yields/after-transition": "*", + "component/emitter": "*", + "yields/css-ease": "*", + "component/query": "*" + } +} diff --git a/bootstrap/node_modules/move-js/index.js b/bootstrap/node_modules/move-js/index.js new file mode 100644 index 0000000..42f7e39 --- /dev/null +++ b/bootstrap/node_modules/move-js/index.js @@ -0,0 +1,598 @@ +// Patch IE9 and below +try { + document.createElement('DIV').style.setProperty('opacity', 0, ''); +} catch (error) { + CSSStyleDeclaration.prototype.getProperty = function(a) { + return this.getAttribute(a); + }; + + CSSStyleDeclaration.prototype.setProperty = function(a,b) { + return this.setAttribute(a, b + ''); + }; + + CSSStyleDeclaration.prototype.removeProperty = function(a) { + return this.removeAttribute(a); + }; +} + +/** + * Module Dependencies. + */ + +var Emitter = require('component-emitter'); +var query = require('component-query'); +var after = require('after-transition'); +var has3d = require('has-translate3d'); +var ease = require('css-ease'); + +/** + * CSS Translate + */ + +var translate = has3d + ? ['translate3d(', ', 0)'] + : ['translate(', ')']; + + +/** + * Export `Move` + */ + +module.exports = Move; + +/** + * Get computed style. + */ + +var style = window.getComputedStyle + || window.currentStyle; + +/** + * Library version. + */ + +Move.version = '0.5.0'; + +/** + * Export `ease` + */ + +Move.ease = ease; + +/** + * Defaults. + * + * `duration` - default duration of 500ms + * + */ + +Move.defaults = { + duration: 500 +}; + +/** + * Default element selection utilized by `move(selector)`. + * + * Override to implement your own selection, for example + * with jQuery one might write: + * + * move.select = function(selector) { + * return jQuery(selector).get(0); + * }; + * + * @param {Object|String} selector + * @return {Element} + * @api public + */ + +Move.select = function(selector){ + if ('string' != typeof selector) return selector; + return query(selector); +}; + +/** + * Initialize a new `Move` with the given `el`. + * + * @param {Element} el + * @api public + */ + +function Move(el) { + if (!(this instanceof Move)) return new Move(el); + if ('string' == typeof el) el = query(el); + if (!el) throw new TypeError('Move must be initialized with element or selector'); + this.el = el; + this._props = {}; + this._rotate = 0; + this._transitionProps = []; + this._transforms = []; + this.duration(Move.defaults.duration) +}; + + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Emitter(Move.prototype); + +/** + * Buffer `transform`. + * + * @param {String} transform + * @return {Move} for chaining + * @api private + */ + +Move.prototype.transform = function(transform){ + this._transforms.push(transform); + return this; +}; + +/** + * Skew `x` and `y`. + * + * @param {Number} x + * @param {Number} y + * @return {Move} for chaining + * @api public + */ + +Move.prototype.skew = function(x, y){ + return this.transform('skew(' + + x + 'deg, ' + + (y || 0) + + 'deg)'); +}; + +/** + * Skew x by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.skewX = function(n){ + return this.transform('skewX(' + n + 'deg)'); +}; + +/** + * Skew y by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.skewY = function(n){ + return this.transform('skewY(' + n + 'deg)'); +}; + +/** + * Translate `x` and `y` axis. + * + * @param {Number|String} x + * @param {Number|String} y + * @return {Move} for chaining + * @api public + */ + +Move.prototype.translate = +Move.prototype.to = function(x, y){ + return this.transform(translate.join('' + + fixUnits(x) + ', ' + + fixUnits(y || 0))); +}; + +/** + * Translate on the x axis to `n`. + * + * @param {Number|String} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.translateX = +Move.prototype.x = function(n){ + return this.transform('translateX(' + fixUnits(n) + ')'); +}; + +/** + * Translate on the y axis to `n`. + * + * @param {Number|String} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.translateY = +Move.prototype.y = function(n){ + return this.transform('translateY(' + fixUnits(n) + ')'); +}; + +/** + * Scale the x and y axis by `x`, or + * individually scale `x` and `y`. + * + * @param {Number} x + * @param {Number} y + * @return {Move} for chaining + * @api public + */ + +Move.prototype.scale = function(x, y){ + return this.transform('scale(' + + x + ', ' + + (y || x) + + ')'); +}; + +/** + * Scale x axis by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.scaleX = function(n){ + return this.transform('scaleX(' + n + ')') +}; + +/** + * Apply a matrix transformation + * + * @param {Number} m11 A matrix coefficient + * @param {Number} m12 A matrix coefficient + * @param {Number} m21 A matrix coefficient + * @param {Number} m22 A matrix coefficient + * @param {Number} m31 A matrix coefficient + * @param {Number} m32 A matrix coefficient + * @return {Move} for chaining + * @api public + */ + +Move.prototype.matrix = function(m11, m12, m21, m22, m31, m32){ + return this.transform('matrix(' + [m11,m12,m21,m22,m31,m32].join(',') + ')'); +}; + +/** + * Scale y axis by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.scaleY = function(n){ + return this.transform('scaleY(' + n + ')') +}; + +/** + * Rotate `n` degrees. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.rotate = function(n){ + return this.transform('rotate(' + n + 'deg)'); +}; + +/** + * Set transition easing function to to `fn` string. + * + * When: + * + * - null "ease" is used + * - "in" "ease-in" is used + * - "out" "ease-out" is used + * - "in-out" "ease-in-out" is used + * + * @param {String} fn + * @return {Move} for chaining + * @api public + */ + +Move.prototype.ease = function(fn){ + fn = ease[fn] || fn || 'ease'; + return this.setVendorProperty('transition-timing-function', fn); +}; + +/** + * Set animation properties + * + * @param {String} name + * @param {Object} props + * @return {Move} for chaining + * @api public + */ + +Move.prototype.animate = function(name, props){ + for (var i in props){ + if (props.hasOwnProperty(i)){ + this.setVendorProperty('animation-' + i, props[i]) + } + } + return this.setVendorProperty('animation-name', name); +} + +/** + * Set duration to `n`. + * + * @param {Number|String} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.duration = function(n){ + n = this._duration = 'string' == typeof n + ? parseFloat(n) * 1000 + : n; + return this.setVendorProperty('transition-duration', n + 'ms'); +}; + +/** + * Delay the animation by `n`. + * + * @param {Number|String} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.delay = function(n){ + n = 'string' == typeof n + ? parseFloat(n) * 1000 + : n; + return this.setVendorProperty('transition-delay', n + 'ms'); +}; + +/** + * Set `prop` to `val`, deferred until `.end()` is invoked. + * + * @param {String} prop + * @param {String} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.setProperty = function(prop, val){ + this._props[prop] = val; + return this; +}; + +/** + * Set a vendor prefixed `prop` with the given `val`. + * + * @param {String} prop + * @param {String} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.setVendorProperty = function(prop, val){ + this.setProperty('-webkit-' + prop, val); + this.setProperty('-moz-' + prop, val); + this.setProperty('-ms-' + prop, val); + this.setProperty('-o-' + prop, val); + return this; +}; + +/** + * Set `prop` to `value`, deferred until `.end()` is invoked + * and adds the property to the list of transition props. + * + * @param {String} prop + * @param {String} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.set = function(prop, val){ + this.transition(prop); + this._props[prop] = val; + return this; +}; + +/** + * Increment `prop` by `val`, deferred until `.end()` is invoked + * and adds the property to the list of transition props. + * + * @param {String} prop + * @param {Number} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.add = function(prop, val){ + if (!style) return; + var self = this; + return this.on('start', function(){ + var curr = parseInt(self.current(prop), 10); + self.set(prop, curr + val + 'px'); + }); +}; + +/** + * Decrement `prop` by `val`, deferred until `.end()` is invoked + * and adds the property to the list of transition props. + * + * @param {String} prop + * @param {Number} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.sub = function(prop, val){ + if (!style) return; + var self = this; + return this.on('start', function(){ + var curr = parseInt(self.current(prop), 10); + self.set(prop, curr - val + 'px'); + }); +}; + +/** + * Get computed or "current" value of `prop`. + * + * @param {String} prop + * @return {String} + * @api public + */ + +Move.prototype.current = function(prop){ + return style(this.el).getPropertyValue(prop); +}; + +/** + * Add `prop` to the list of internal transition properties. + * + * @param {String} prop + * @return {Move} for chaining + * @api private + */ + +Move.prototype.transition = function(prop){ + if (!this._transitionProps.indexOf(prop)) return this; + this._transitionProps.push(prop); + return this; +}; + +/** + * Commit style properties, aka apply them to `el.style`. + * + * @return {Move} for chaining + * @see Move#end() + * @api private + */ + +Move.prototype.applyProperties = function(){ + for (var prop in this._props) { + this.el.style.setProperty(prop, this._props[prop], ''); + } + return this; +}; + +/** + * Re-select element via `selector`, replacing + * the current element. + * + * @param {String} selector + * @return {Move} for chaining + * @api public + */ + +Move.prototype.move = +Move.prototype.select = function(selector){ + this.el = Move.select(selector); + return this; +}; + +/** + * Defer the given `fn` until the animation + * is complete. `fn` may be one of the following: + * + * - a function to invoke + * - an instanceof `Move` to call `.end()` + * - nothing, to return a clone of this `Move` instance for chaining + * + * @param {Function|Move} fn + * @return {Move} for chaining + * @api public + */ + +Move.prototype.then = function(fn){ + // invoke .end() + if (fn instanceof Move) { + this.on('end', function(){ + fn.end(); + }); + // callback + } else if ('function' == typeof fn) { + this.on('end', fn); + // chain + } else { + var clone = new Move(this.el); + clone._transforms = this._transforms.slice(0); + this.then(clone); + clone.parent = this; + return clone; + } + + return this; +}; + +/** + * Pop the move context. + * + * @return {Move} parent Move + * @api public + */ + +Move.prototype.pop = function(){ + return this.parent; +}; + +/** + * Reset duration. + * + * @return {Move} + * @api public + */ + +Move.prototype.reset = function(){ + this.el.style.webkitTransitionDuration = + this.el.style.mozTransitionDuration = + this.el.style.msTransitionDuration = + this.el.style.oTransitionDuration = ''; + return this; +}; + +/** + * Start animation, optionally calling `fn` when complete. + * + * @param {Function} fn + * @return {Move} for chaining + * @api public + */ + +Move.prototype.end = function(fn){ + var self = this; + + // emit "start" event + this.emit('start'); + + // transforms + if (this._transforms.length) { + this.setVendorProperty('transform', this._transforms.join(' ')); + } + + // transition properties + this.setVendorProperty('transition-properties', this._transitionProps.join(', ')); + this.applyProperties(); + + // callback given + if (fn) this.then(fn); + + // emit "end" when complete + after.once(this.el, function(){ + self.reset(); + self.emit('end'); + }); + + return this; +}; + +/** + * Fix value units + * + * @param {Number|String} val + * @return {String} + * @api private + */ + +function fixUnits(val) { + return 'string' === typeof val && isNaN(+val) ? val : val + 'px'; +} diff --git a/bootstrap/node_modules/move-js/move.js b/bootstrap/node_modules/move-js/move.js new file mode 100644 index 0000000..d81f822 --- /dev/null +++ b/bootstrap/node_modules/move-js/move.js @@ -0,0 +1,1276 @@ + +;(function(){ + +/** + * Require the module at `name`. + * + * @param {String} name + * @return {Object} exports + * @api public + */ + +function require(name) { + var module = require.modules[name]; + if (!module) throw new Error('failed to require "' + name + '"'); + + if (!('exports' in module) && typeof module.definition === 'function') { + module.client = module.component = true; + module.definition.call(this, module.exports = {}, module); + delete module.definition; + } + + return module.exports; +} + +/** + * Meta info, accessible in the global scope unless you use AMD option. + */ + +require.loader = 'component'; + +/** + * Internal helper object, contains a sorting function for semantiv versioning + */ +require.helper = {}; +require.helper.semVerSort = function(a, b) { + var aArray = a.version.split('.'); + var bArray = b.version.split('.'); + for (var i=0; i bLex ? 1 : -1; + continue; + } else if (aInt > bInt) { + return 1; + } else { + return -1; + } + } + return 0; +} + +/** + * Find and require a module which name starts with the provided name. + * If multiple modules exists, the highest semver is used. + * This function can only be used for remote dependencies. + + * @param {String} name - module name: `user~repo` + * @param {Boolean} returnPath - returns the canonical require path if true, + * otherwise it returns the epxorted module + */ +require.latest = function (name, returnPath) { + function showError(name) { + throw new Error('failed to find latest module of "' + name + '"'); + } + // only remotes with semvers, ignore local files conataining a '/' + var versionRegexp = /(.*)~(.*)@v?(\d+\.\d+\.\d+[^\/]*)$/; + var remoteRegexp = /(.*)~(.*)/; + if (!remoteRegexp.test(name)) showError(name); + var moduleNames = Object.keys(require.modules); + var semVerCandidates = []; + var otherCandidates = []; // for instance: name of the git branch + for (var i=0; i 0) { + var module = semVerCandidates.sort(require.helper.semVerSort).pop().name; + if (returnPath === true) { + return module; + } + return require(module); + } + // if the build contains more than one branch of the same module + // you should not use this funciton + var module = otherCandidates.sort(function(a, b) {return a.name > b.name})[0].name; + if (returnPath === true) { + return module; + } + return require(module); +} + +/** + * Registered modules. + */ + +require.modules = {}; + +/** + * Register module at `name` with callback `definition`. + * + * @param {String} name + * @param {Function} definition + * @api private + */ + +require.register = function (name, definition) { + require.modules[name] = { + definition: definition + }; +}; + +/** + * Define a module's exports immediately with `exports`. + * + * @param {String} name + * @param {Generic} exports + * @api private + */ + +require.define = function (name, exports) { + require.modules[name] = { + exports: exports + }; +}; +require.register("component~transform-property@0.0.1", function (exports, module) { + +var styles = [ + 'webkitTransform', + 'MozTransform', + 'msTransform', + 'OTransform', + 'transform' +]; + +var el = document.createElement('p'); +var style; + +for (var i = 0; i < styles.length; i++) { + style = styles[i]; + if (null != el.style[style]) { + module.exports = style; + break; + } +} + +}); + +require.register("component~has-translate3d@0.0.3", function (exports, module) { + +var prop = require('component~transform-property@0.0.1'); + +// IE <=8 doesn't have `getComputedStyle` +if (!prop || !window.getComputedStyle) { + module.exports = false; + +} else { + var map = { + webkitTransform: '-webkit-transform', + OTransform: '-o-transform', + msTransform: '-ms-transform', + MozTransform: '-moz-transform', + transform: 'transform' + }; + + // from: https://gist.github.com/lorenzopolidori/3794226 + var el = document.createElement('div'); + el.style[prop] = 'translate3d(1px,1px,1px)'; + document.body.insertBefore(el, null); + var val = getComputedStyle(el).getPropertyValue(map[prop]); + document.body.removeChild(el); + module.exports = null != val && val.length && 'none' != val; +} + +}); + +require.register("yields~has-transitions@1.0.0", function (exports, module) { +/** + * Check if `el` or browser supports transitions. + * + * @param {Element} el + * @return {Boolean} + * @api public + */ + +exports = module.exports = function(el){ + switch (arguments.length) { + case 0: return bool; + case 1: return bool + ? transitions(el) + : bool; + } +}; + +/** + * Check if the given `el` has transitions. + * + * @param {Element} el + * @return {Boolean} + * @api private + */ + +function transitions(el, styl){ + if (el.transition) return true; + styl = window.getComputedStyle(el); + return !! parseFloat(styl.transitionDuration, 10); +} + +/** + * Style. + */ + +var styl = document.body.style; + +/** + * Export support. + */ + +var bool = 'transition' in styl + || 'webkitTransition' in styl + || 'MozTransition' in styl + || 'msTransition' in styl; + +}); + +require.register("component~event@0.1.4", function (exports, module) { +var bind = window.addEventListener ? 'addEventListener' : 'attachEvent', + unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent', + prefix = bind !== 'addEventListener' ? 'on' : ''; + +/** + * Bind `el` event `type` to `fn`. + * + * @param {Element} el + * @param {String} type + * @param {Function} fn + * @param {Boolean} capture + * @return {Function} + * @api public + */ + +exports.bind = function(el, type, fn, capture){ + el[bind](prefix + type, fn, capture || false); + return fn; +}; + +/** + * Unbind `el` event `type`'s callback `fn`. + * + * @param {Element} el + * @param {String} type + * @param {Function} fn + * @param {Boolean} capture + * @return {Function} + * @api public + */ + +exports.unbind = function(el, type, fn, capture){ + el[unbind](prefix + type, fn, capture || false); + return fn; +}; +}); + +require.register("ecarter~css-emitter@0.0.1", function (exports, module) { +/** + * Module Dependencies + */ + +var events = require('component~event@0.1.4'); + +// CSS events + +var watch = [ + 'transitionend' +, 'webkitTransitionEnd' +, 'oTransitionEnd' +, 'MSTransitionEnd' +, 'animationend' +, 'webkitAnimationEnd' +, 'oAnimationEnd' +, 'MSAnimationEnd' +]; + +/** + * Expose `CSSnext` + */ + +module.exports = CssEmitter; + +/** + * Initialize a new `CssEmitter` + * + */ + +function CssEmitter(element){ + if (!(this instanceof CssEmitter)) return new CssEmitter(element); + this.el = element; +} + +/** + * Bind CSS events. + * + * @api public + */ + +CssEmitter.prototype.bind = function(fn){ + for (var i=0; i < watch.length; i++) { + events.bind(this.el, watch[i], fn); + } + return this; +}; + +/** + * Unbind CSS events + * + * @api public + */ + +CssEmitter.prototype.unbind = function(fn){ + for (var i=0; i < watch.length; i++) { + events.unbind(this.el, watch[i], fn); + } + return this; +}; + +/** + * Fire callback only once + * + * @api public + */ + +CssEmitter.prototype.once = function(fn){ + var self = this; + function on(){ + self.unbind(on); + fn.apply(self.el, arguments); + } + self.bind(on); + return this; +}; + + +}); + +require.register("component~once@0.0.1", function (exports, module) { + +/** + * Identifier. + */ + +var n = 0; + +/** + * Global. + */ + +var global = (function(){ return this })(); + +/** + * Make `fn` callable only once. + * + * @param {Function} fn + * @return {Function} + * @api public + */ + +module.exports = function(fn) { + var id = n++; + + function once(){ + // no receiver + if (this == global) { + if (once.called) return; + once.called = true; + return fn.apply(this, arguments); + } + + // receiver + var key = '__called_' + id + '__'; + if (this[key]) return; + this[key] = true; + return fn.apply(this, arguments); + } + + return once; +}; + +}); + +require.register("yields~after-transition@0.0.1", function (exports, module) { + +/** + * dependencies + */ + +var has = require('yields~has-transitions@1.0.0') + , emitter = require('ecarter~css-emitter@0.0.1') + , once = require('component~once@0.0.1'); + +/** + * Transition support. + */ + +var supported = has(); + +/** + * Export `after` + */ + +module.exports = after; + +/** + * Invoke the given `fn` after transitions + * + * It will be invoked only if the browser + * supports transitions __and__ + * the element has transitions + * set in `.style` or css. + * + * @param {Element} el + * @param {Function} fn + * @return {Function} fn + * @api public + */ + +function after(el, fn){ + if (!supported || !has(el)) return fn(); + emitter(el).bind(fn); + return fn; +}; + +/** + * Same as `after()` only the function is invoked once. + * + * @param {Element} el + * @param {Function} fn + * @return {Function} + * @api public + */ + +after.once = function(el, fn){ + var callback = once(fn); + after(el, fn = function(){ + emitter(el).unbind(fn); + callback(); + }); +}; + +}); + +require.register("component~emitter@1.2.0", function (exports, module) { + +/** + * Expose `Emitter`. + */ + +module.exports = Emitter; + +/** + * Initialize a new `Emitter`. + * + * @api public + */ + +function Emitter(obj) { + if (obj) return mixin(obj); +}; + +/** + * Mixin the emitter properties. + * + * @param {Object} obj + * @return {Object} + * @api private + */ + +function mixin(obj) { + for (var key in Emitter.prototype) { + obj[key] = Emitter.prototype[key]; + } + return obj; +} + +/** + * Listen on the given `event` with `fn`. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.on = +Emitter.prototype.addEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + (this._callbacks['$' + event] = this._callbacks['$' + event] || []) + .push(fn); + return this; +}; + +/** + * Adds an `event` listener that will be invoked a single + * time then automatically removed. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.once = function(event, fn){ + function on() { + this.off(event, on); + fn.apply(this, arguments); + } + + on.fn = fn; + this.on(event, on); + return this; +}; + +/** + * Remove the given callback for `event` or all + * registered callbacks. + * + * @param {String} event + * @param {Function} fn + * @return {Emitter} + * @api public + */ + +Emitter.prototype.off = +Emitter.prototype.removeListener = +Emitter.prototype.removeAllListeners = +Emitter.prototype.removeEventListener = function(event, fn){ + this._callbacks = this._callbacks || {}; + + // all + if (0 == arguments.length) { + this._callbacks = {}; + return this; + } + + // specific event + var callbacks = this._callbacks['$' + event]; + if (!callbacks) return this; + + // remove all handlers + if (1 == arguments.length) { + delete this._callbacks['$' + event]; + return this; + } + + // remove specific handler + var cb; + for (var i = 0; i < callbacks.length; i++) { + cb = callbacks[i]; + if (cb === fn || cb.fn === fn) { + callbacks.splice(i, 1); + break; + } + } + return this; +}; + +/** + * Emit `event` with the given args. + * + * @param {String} event + * @param {Mixed} ... + * @return {Emitter} + */ + +Emitter.prototype.emit = function(event){ + this._callbacks = this._callbacks || {}; + var args = [].slice.call(arguments, 1) + , callbacks = this._callbacks['$' + event]; + + if (callbacks) { + callbacks = callbacks.slice(0); + for (var i = 0, len = callbacks.length; i < len; ++i) { + callbacks[i].apply(this, args); + } + } + + return this; +}; + +/** + * Return array of callbacks for `event`. + * + * @param {String} event + * @return {Array} + * @api public + */ + +Emitter.prototype.listeners = function(event){ + this._callbacks = this._callbacks || {}; + return this._callbacks['$' + event] || []; +}; + +/** + * Check if this emitter has `event` handlers. + * + * @param {String} event + * @return {Boolean} + * @api public + */ + +Emitter.prototype.hasListeners = function(event){ + return !! this.listeners(event).length; +}; + +}); + +require.register("yields~css-ease@0.0.1", function (exports, module) { + +/** + * CSS Easing functions + */ + +module.exports = { + 'in': 'ease-in' + , 'out': 'ease-out' + , 'in-out': 'ease-in-out' + , 'snap': 'cubic-bezier(0,1,.5,1)' + , 'linear': 'cubic-bezier(0.250, 0.250, 0.750, 0.750)' + , 'ease-in-quad': 'cubic-bezier(0.550, 0.085, 0.680, 0.530)' + , 'ease-in-cubic': 'cubic-bezier(0.550, 0.055, 0.675, 0.190)' + , 'ease-in-quart': 'cubic-bezier(0.895, 0.030, 0.685, 0.220)' + , 'ease-in-quint': 'cubic-bezier(0.755, 0.050, 0.855, 0.060)' + , 'ease-in-sine': 'cubic-bezier(0.470, 0.000, 0.745, 0.715)' + , 'ease-in-expo': 'cubic-bezier(0.950, 0.050, 0.795, 0.035)' + , 'ease-in-circ': 'cubic-bezier(0.600, 0.040, 0.980, 0.335)' + , 'ease-in-back': 'cubic-bezier(0.600, -0.280, 0.735, 0.045)' + , 'ease-out-quad': 'cubic-bezier(0.250, 0.460, 0.450, 0.940)' + , 'ease-out-cubic': 'cubic-bezier(0.215, 0.610, 0.355, 1.000)' + , 'ease-out-quart': 'cubic-bezier(0.165, 0.840, 0.440, 1.000)' + , 'ease-out-quint': 'cubic-bezier(0.230, 1.000, 0.320, 1.000)' + , 'ease-out-sine': 'cubic-bezier(0.390, 0.575, 0.565, 1.000)' + , 'ease-out-expo': 'cubic-bezier(0.190, 1.000, 0.220, 1.000)' + , 'ease-out-circ': 'cubic-bezier(0.075, 0.820, 0.165, 1.000)' + , 'ease-out-back': 'cubic-bezier(0.175, 0.885, 0.320, 1.275)' + , 'ease-out-quad': 'cubic-bezier(0.455, 0.030, 0.515, 0.955)' + , 'ease-out-cubic': 'cubic-bezier(0.645, 0.045, 0.355, 1.000)' + , 'ease-in-out-quart': 'cubic-bezier(0.770, 0.000, 0.175, 1.000)' + , 'ease-in-out-quint': 'cubic-bezier(0.860, 0.000, 0.070, 1.000)' + , 'ease-in-out-sine': 'cubic-bezier(0.445, 0.050, 0.550, 0.950)' + , 'ease-in-out-expo': 'cubic-bezier(1.000, 0.000, 0.000, 1.000)' + , 'ease-in-out-circ': 'cubic-bezier(0.785, 0.135, 0.150, 0.860)' + , 'ease-in-out-back': 'cubic-bezier(0.680, -0.550, 0.265, 1.550)' +}; + +}); + +require.register("component~query@0.0.3", function (exports, module) { +function one(selector, el) { + return el.querySelector(selector); +} + +exports = module.exports = function(selector, el){ + el = el || document; + return one(selector, el); +}; + +exports.all = function(selector, el){ + el = el || document; + return el.querySelectorAll(selector); +}; + +exports.engine = function(obj){ + if (!obj.one) throw new Error('.one callback required'); + if (!obj.all) throw new Error('.all callback required'); + one = obj.one; + exports.all = obj.all; + return exports; +}; + +}); + +require.register("move", function (exports, module) { +/** + * Module Dependencies. + */ + +var Emitter = require('component~emitter@1.2.0'); +var query = require('component~query@0.0.3'); +var after = require('yields~after-transition@0.0.1'); +var has3d = require('component~has-translate3d@0.0.3'); +var ease = require('yields~css-ease@0.0.1'); + +/** + * CSS Translate + */ + +var translate = has3d + ? ['translate3d(', ', 0)'] + : ['translate(', ')']; + +/** + * Export `Move` + */ + +module.exports = Move; + +/** + * Get computed style. + */ + +var style = window.getComputedStyle + || window.currentStyle; + +/** + * Library version. + */ + +Move.version = '0.5.0'; + +/** + * Export `ease` + */ + +Move.ease = ease; + +/** + * Defaults. + * + * `duration` - default duration of 500ms + * + */ + +Move.defaults = { + duration: 500 +}; + +/** + * Default element selection utilized by `move(selector)`. + * + * Override to implement your own selection, for example + * with jQuery one might write: + * + * move.select = function(selector) { + * return jQuery(selector).get(0); + * }; + * + * @param {Object|String} selector + * @return {Element} + * @api public + */ + +Move.select = function(selector){ + if ('string' != typeof selector) return selector; + return query(selector); +}; + +/** + * Initialize a new `Move` with the given `el`. + * + * @param {Element} el + * @api public + */ + +function Move(el) { + if (!(this instanceof Move)) return new Move(el); + if ('string' == typeof el) el = query(el); + if (!el) throw new TypeError('Move must be initialized with element or selector'); + this.el = el; + this._props = {}; + this._rotate = 0; + this._transitionProps = []; + this._transforms = []; + this.duration(Move.defaults.duration) +}; + + +/** + * Inherit from `EventEmitter.prototype`. + */ + +Emitter(Move.prototype); + +/** + * Buffer `transform`. + * + * @param {String} transform + * @return {Move} for chaining + * @api private + */ + +Move.prototype.transform = function(transform){ + this._transforms.push(transform); + return this; +}; + +/** + * Skew `x` and `y`. + * + * @param {Number} x + * @param {Number} y + * @return {Move} for chaining + * @api public + */ + +Move.prototype.skew = function(x, y){ + return this.transform('skew(' + + x + 'deg, ' + + (y || 0) + + 'deg)'); +}; + +/** + * Skew x by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.skewX = function(n){ + return this.transform('skewX(' + n + 'deg)'); +}; + +/** + * Skew y by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.skewY = function(n){ + return this.transform('skewY(' + n + 'deg)'); +}; + +/** + * Translate `x` and `y` axis. + * + * @param {Number} x + * @param {Number} y + * @return {Move} for chaining + * @api public + */ + +Move.prototype.translate = +Move.prototype.to = function(x, y){ + return this.transform(translate.join('' + + x +'px, ' + + (y || 0) + + 'px')); +}; + +/** + * Translate on the x axis to `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.translateX = +Move.prototype.x = function(n){ + return this.transform('translateX(' + n + 'px)'); +}; + +/** + * Translate on the y axis to `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.translateY = +Move.prototype.y = function(n){ + return this.transform('translateY(' + n + 'px)'); +}; + +/** + * Scale the x and y axis by `x`, or + * individually scale `x` and `y`. + * + * @param {Number} x + * @param {Number} y + * @return {Move} for chaining + * @api public + */ + +Move.prototype.scale = function(x, y){ + return this.transform('scale(' + + x + ', ' + + (y || x) + + ')'); +}; + +/** + * Scale x axis by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.scaleX = function(n){ + return this.transform('scaleX(' + n + ')') +}; + +/** + * Apply a matrix transformation + * + * @param {Number} m11 A matrix coefficient + * @param {Number} m12 A matrix coefficient + * @param {Number} m21 A matrix coefficient + * @param {Number} m22 A matrix coefficient + * @param {Number} m31 A matrix coefficient + * @param {Number} m32 A matrix coefficient + * @return {Move} for chaining + * @api public + */ + +Move.prototype.matrix = function(m11, m12, m21, m22, m31, m32){ + return this.transform('matrix(' + [m11,m12,m21,m22,m31,m32].join(',') + ')'); +}; + +/** + * Scale y axis by `n`. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.scaleY = function(n){ + return this.transform('scaleY(' + n + ')') +}; + +/** + * Rotate `n` degrees. + * + * @param {Number} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.rotate = function(n){ + return this.transform('rotate(' + n + 'deg)'); +}; + +/** + * Set transition easing function to to `fn` string. + * + * When: + * + * - null "ease" is used + * - "in" "ease-in" is used + * - "out" "ease-out" is used + * - "in-out" "ease-in-out" is used + * + * @param {String} fn + * @return {Move} for chaining + * @api public + */ + +Move.prototype.ease = function(fn){ + fn = ease[fn] || fn || 'ease'; + return this.setVendorProperty('transition-timing-function', fn); +}; + +/** + * Set animation properties + * + * @param {String} name + * @param {Object} props + * @return {Move} for chaining + * @api public + */ + +Move.prototype.animate = function(name, props){ + for (var i in props){ + if (props.hasOwnProperty(i)){ + this.setVendorProperty('animation-' + i, props[i]) + } + } + return this.setVendorProperty('animation-name', name); +} + +/** + * Set duration to `n`. + * + * @param {Number|String} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.duration = function(n){ + n = this._duration = 'string' == typeof n + ? parseFloat(n) * 1000 + : n; + return this.setVendorProperty('transition-duration', n + 'ms'); +}; + +/** + * Delay the animation by `n`. + * + * @param {Number|String} n + * @return {Move} for chaining + * @api public + */ + +Move.prototype.delay = function(n){ + n = 'string' == typeof n + ? parseFloat(n) * 1000 + : n; + return this.setVendorProperty('transition-delay', n + 'ms'); +}; + +/** + * Set `prop` to `val`, deferred until `.end()` is invoked. + * + * @param {String} prop + * @param {String} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.setProperty = function(prop, val){ + this._props[prop] = val; + return this; +}; + +/** + * Set a vendor prefixed `prop` with the given `val`. + * + * @param {String} prop + * @param {String} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.setVendorProperty = function(prop, val){ + this.setProperty('-webkit-' + prop, val); + this.setProperty('-moz-' + prop, val); + this.setProperty('-ms-' + prop, val); + this.setProperty('-o-' + prop, val); + return this; +}; + +/** + * Set `prop` to `value`, deferred until `.end()` is invoked + * and adds the property to the list of transition props. + * + * @param {String} prop + * @param {String} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.set = function(prop, val){ + this.transition(prop); + this._props[prop] = val; + return this; +}; + +/** + * Increment `prop` by `val`, deferred until `.end()` is invoked + * and adds the property to the list of transition props. + * + * @param {String} prop + * @param {Number} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.add = function(prop, val){ + if (!style) return; + var self = this; + return this.on('start', function(){ + var curr = parseInt(self.current(prop), 10); + self.set(prop, curr + val + 'px'); + }); +}; + +/** + * Decrement `prop` by `val`, deferred until `.end()` is invoked + * and adds the property to the list of transition props. + * + * @param {String} prop + * @param {Number} val + * @return {Move} for chaining + * @api public + */ + +Move.prototype.sub = function(prop, val){ + if (!style) return; + var self = this; + return this.on('start', function(){ + var curr = parseInt(self.current(prop), 10); + self.set(prop, curr - val + 'px'); + }); +}; + +/** + * Get computed or "current" value of `prop`. + * + * @param {String} prop + * @return {String} + * @api public + */ + +Move.prototype.current = function(prop){ + return style(this.el).getPropertyValue(prop); +}; + +/** + * Add `prop` to the list of internal transition properties. + * + * @param {String} prop + * @return {Move} for chaining + * @api private + */ + +Move.prototype.transition = function(prop){ + if (!this._transitionProps.indexOf(prop)) return this; + this._transitionProps.push(prop); + return this; +}; + +/** + * Commit style properties, aka apply them to `el.style`. + * + * @return {Move} for chaining + * @see Move#end() + * @api private + */ + +Move.prototype.applyProperties = function(){ + for (var prop in this._props) { + this.el.style.setProperty(prop, this._props[prop], ''); + } + return this; +}; + +/** + * Re-select element via `selector`, replacing + * the current element. + * + * @param {String} selector + * @return {Move} for chaining + * @api public + */ + +Move.prototype.move = +Move.prototype.select = function(selector){ + this.el = Move.select(selector); + return this; +}; + +/** + * Defer the given `fn` until the animation + * is complete. `fn` may be one of the following: + * + * - a function to invoke + * - an instanceof `Move` to call `.end()` + * - nothing, to return a clone of this `Move` instance for chaining + * + * @param {Function|Move} fn + * @return {Move} for chaining + * @api public + */ + +Move.prototype.then = function(fn){ + // invoke .end() + if (fn instanceof Move) { + this.on('end', function(){ + fn.end(); + }); + // callback + } else if ('function' == typeof fn) { + this.on('end', fn); + // chain + } else { + var clone = new Move(this.el); + clone._transforms = this._transforms.slice(0); + this.then(clone); + clone.parent = this; + return clone; + } + + return this; +}; + +/** + * Pop the move context. + * + * @return {Move} parent Move + * @api public + */ + +Move.prototype.pop = function(){ + return this.parent; +}; + +/** + * Reset duration. + * + * @return {Move} + * @api public + */ + +Move.prototype.reset = function(){ + this.el.style.webkitTransitionDuration = + this.el.style.mozTransitionDuration = + this.el.style.msTransitionDuration = + this.el.style.oTransitionDuration = ''; + return this; +}; + +/** + * Start animation, optionally calling `fn` when complete. + * + * @param {Function} fn + * @return {Move} for chaining + * @api public + */ + +Move.prototype.end = function(fn){ + var self = this; + + // emit "start" event + this.emit('start'); + + // transforms + if (this._transforms.length) { + this.setVendorProperty('transform', this._transforms.join(' ')); + } + + // transition properties + this.setVendorProperty('transition-properties', this._transitionProps.join(', ')); + this.applyProperties(); + + // callback given + if (fn) this.then(fn); + + // emit "end" when complete + after.once(this.el, function(){ + self.reset(); + self.emit('end'); + }); + + return this; +}; + +}); + +if (typeof exports == "object") { + module.exports = require("move"); +} else if (typeof define == "function" && define.amd) { + define("move", [], function(){ return require("move"); }); +} else { + (this || window)["move"] = require("move"); +} +})() diff --git a/bootstrap/node_modules/move-js/move.min.js b/bootstrap/node_modules/move-js/move.min.js new file mode 100644 index 0000000..eab0d5c --- /dev/null +++ b/bootstrap/node_modules/move-js/move.min.js @@ -0,0 +1 @@ +(function(){function require(name){var module=require.modules[name];if(!module)throw new Error('failed to require "'+name+'"');if(!("exports"in module)&&typeof module.definition==="function"){module.client=module.component=true;module.definition.call(this,module.exports={},module);delete module.definition}return module.exports}require.loader="component";require.helper={};require.helper.semVerSort=function(a,b){var aArray=a.version.split(".");var bArray=b.version.split(".");for(var i=0;ibLex?1:-1;continue}else if(aInt>bInt){return 1}else{return-1}}return 0};require.latest=function(name,returnPath){function showError(name){throw new Error('failed to find latest module of "'+name+'"')}var versionRegexp=/(.*)~(.*)@v?(\d+\.\d+\.\d+[^\/]*)$/;var remoteRegexp=/(.*)~(.*)/;if(!remoteRegexp.test(name))showError(name);var moduleNames=Object.keys(require.modules);var semVerCandidates=[];var otherCandidates=[];for(var i=0;i0){var module=semVerCandidates.sort(require.helper.semVerSort).pop().name;if(returnPath===true){return module}return require(module)}var module=otherCandidates.sort(function(a,b){return a.name>b.name})[0].name;if(returnPath===true){return module}return require(module)};require.modules={};require.register=function(name,definition){require.modules[name]={definition:definition}};require.define=function(name,exports){require.modules[name]={exports:exports}};require.register("component~transform-property@0.0.1",function(exports,module){var styles=["webkitTransform","MozTransform","msTransform","OTransform","transform"];var el=document.createElement("p");var style;for(var i=0;i + + + + + + + + + +``` + +### HTML example: + +```html +
    +
    +
    +
    + +
    +
    +
    + This is the content of Tab 1... +
    +
    + This is the content of Tab 2... +
    +
    + This is the content of Tab 3... +
    +
    + This is the content of Tab 4... +
    +
    + This is the content of Tab 5... +
    +
    + This is the content of Tab 6... +
    +
    +
    +``` + +**Based on:** + +https://www.codeply.com/go/Loo3CqsA7T + + [1]: preview.gif + [2]: https://raw.githubusercontent.com/FANMixco/Xamarin-SearchBar/master/bmc-rezr5vpd.gif diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.css b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.css new file mode 100644 index 0000000..f9a52fa --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.css @@ -0,0 +1,38 @@ + +.wrapper-nav { + position:relative; + margin:0 auto; + overflow:hidden; + padding:5px; + height:50px; +} + +.list { + position:absolute; + left:0px; + top:0px; + min-width:3500px; + margin-top:0px; +} + +.list li{ + display:table-cell; + position:relative; + text-align:center; + cursor:grab; + cursor:-webkit-grab; + color:#efefef; + vertical-align:middle; +} + +.scroller { + text-align:center; + cursor:pointer; + display:none; + padding:7px; + white-space:no-wrap; + vertical-align:middle; + background-color:#fff; +} + +.pointer {cursor: pointer;} diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.js b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.js new file mode 100644 index 0000000..2a6adec --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.js @@ -0,0 +1,137 @@ +//let move = require('move'); + +const scrollBarWidths = 40; +const wrapper = document.getElementsByClassName("wrapper-nav")[0]; +const navLink = document.getElementsByClassName("nav-item nav-link"); +const lastNavLink = navLink[navLink.length - 1]; + +const scrollerRight = document.getElementsByClassName("scroller-right")[0]; +const scrollerLeft = document.getElementsByClassName("scroller-left")[0]; + +const list = document.querySelectorAll(".list"); + +let btnTriggered = false; + +let widthOfList = function() { + let itemsWidth = 0; + + const listLinks = document.querySelectorAll(".list a"); + + listLinks.forEach((el) => { + let itemWidth = getOuterWidth(el); + itemsWidth += itemWidth; + }); + + return itemsWidth; +}; + +let widthOfHidden = function(w) { + const wrapperh = document.getElementsByClassName("wrapper-nav")[0]; + + w = (!w) ? 0 : w; + + oW = getOuterWidth(wrapperh) - w; + + let ww = parseFloat((0 - oW).toFixed(3)); + + let hw = (oW - widthOfList() - getLeftPosi()) - scrollBarWidths; + + let rp = document.body.clientWidth - (getOuterLeft(lastNavLink) + getOuterWidth(lastNavLink)) - w; + + if (ww > hw) { + //return ww; + return (rp > ww ? rp : ww); + } + else { + //return hw; + return (rp > hw ? rp : hw); + } +}; + +let getLeftPosi = function() { + let ww = 0 - getOuterWidth(wrapper); + let lp = getOuterLeft(list[0]); + + if (ww > lp) { + return ww; + } + else { + return lp; + } +}; + +let reAdjust = function() { + let rp = document.body.clientWidth - (getOuterLeft(lastNavLink) + getOuterWidth(lastNavLink)); + + if (getOuterWidth(wrapper) < widthOfList() && (rp < 0)) { + scrollerRight.style.cssText = 'display: flex'; + } + else { + scrollerRight.style.display = 'none'; + } + + if (getLeftPosi() < 0) { + scrollerLeft.style.cssText = 'display: flex'; + } + else { + scrollerLeft.style.display = 'none'; + } + + btnTriggered = false; +} + +window.addEventListener('resize', function(event) { + reAdjust(); +}, true); + +scrollerRight.addEventListener("click", function() { + if (btnTriggered) return; + + btnTriggered = true; + + fade(scrollerLeft); + unfade(scrollerRight); + + let wR = getOuterWidth(scrollerRight); + + move(document.querySelectorAll(".list")[0]).add("left", +widthOfHidden(wR), 200).end().then(x=> { + reAdjust(); + }); +}); + +scrollerLeft.addEventListener("click", function() { + if (btnTriggered) return; + + btnTriggered = true; + + fade(scrollerRight); + unfade(scrollerLeft); + + let wL = getOuterWidth(scrollerLeft); + + move(document.querySelectorAll(".list")[0]).add("left", -getLeftPosi() + wL, 200).end().then(()=> { + reAdjust(); + }); +}); + +let getOuterLeft = function(elem) { + return elem.getBoundingClientRect().left; +} + +let getOuterWidth = function(elem) { + return parseFloat(window.getComputedStyle(elem).width); +} + +function fade(elem) { + elem.style.display = "none"; + elem.style.transition="opacity 0.6s"; + elem.style.opacity=0; +} + +function unfade(elem) { + elem.style.display = "block"; + elem.style.transition="opacity 0.6s"; + elem.style.opacity=1; +} + +reAdjust(); \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.min.css b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.min.css new file mode 100644 index 0000000..9556d95 --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.min.css @@ -0,0 +1 @@ +.wrapper-nav{position:relative;margin:0 auto;overflow:hidden;padding:5px;height:50px}.list{position:absolute;left:0;top:0;min-width:3500px;margin-top:0}.list li{display:table-cell;position:relative;text-align:center;cursor:grab;cursor:-webkit-grab;color:#efefef;vertical-align:middle}.scroller{text-align:center;cursor:pointer;display:none;padding:7px;white-space:no-wrap;vertical-align:middle;background-color:#fff}.pointer{cursor:pointer} \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.min.js b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.min.js new file mode 100644 index 0000000..1d8a208 --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/dist/scrollable-tabs.min.js @@ -0,0 +1 @@ +const scrollBarWidths=40,wrapper=document.getElementsByClassName("wrapper-nav")[0],navLink=document.getElementsByClassName("nav-item nav-link"),lastNavLink=navLink[navLink.length-1],scrollerRight=document.getElementsByClassName("scroller-right")[0],scrollerLeft=document.getElementsByClassName("scroller-left")[0],list=document.querySelectorAll(".list");let btnTriggered=!1,widthOfList=function(){let e=0;return document.querySelectorAll(".list a").forEach(t=>{let l=getOuterWidth(t);e+=l}),e},widthOfHidden=function(e){const t=document.getElementsByClassName("wrapper-nav")[0];e=e||0,oW=getOuterWidth(t)-e;let l=parseFloat((0-oW).toFixed(3)),r=oW-widthOfList()-getLeftPosi()-40,n=document.body.clientWidth-(getOuterLeft(lastNavLink)+getOuterWidth(lastNavLink))-e;return l>r?n>l?n:l:n>r?n:r},getLeftPosi=function(){let e=0-getOuterWidth(wrapper),t=getOuterLeft(list[0]);return e>t?e:t},reAdjust=function(){let e=document.body.clientWidth-(getOuterLeft(lastNavLink)+getOuterWidth(lastNavLink));getOuterWidth(wrapper){reAdjust()})}),scrollerLeft.addEventListener("click",function(){if(btnTriggered)return;btnTriggered=!0,fade(scrollerRight),unfade(scrollerLeft);let e=getOuterWidth(scrollerLeft);move(document.querySelectorAll(".list")[0]).add("left",-getLeftPosi()+e,200).end().then(()=>{reAdjust()})});let getOuterLeft=function(e){return e.getBoundingClientRect().left},getOuterWidth=function(e){return parseFloat(window.getComputedStyle(e).width)};function fade(e){e.style.display="none",e.style.transition="opacity 0.6s",e.style.opacity=0}function unfade(e){e.style.display="block",e.style.transition="opacity 0.6s",e.style.opacity=1}reAdjust(); \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/example/index.html b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/example/index.html new file mode 100644 index 0000000..7e7e8dc --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/example/index.html @@ -0,0 +1,96 @@ + + + + + + + + + Scrollable Tabs Bootstrap 5 + + + + + + +
    +
    +
    + +
    +
    + This is the content of Tab 1... +
    +
    + This is the content of Tab 2... +
    +
    + This is the content of Tab 3... +
    +
    + This is the content of Tab 4... +
    +
    + This is the content of Tab 5... +
    +
    + This is the content of Tab 6... +
    +
    + This is the content of Tab 7... +
    +
    + This is the content of Tab 8... +
    +
    + This is the content of Tab 9... +
    +
    + This is the content of Tab 10... +
    +
    + This is the content of Tab 11... +
    +
    + This is the content of Tab 12... +
    +
    + This is the content of Tab 13... +
    +
    + This is the content of Tab 14... +
    +
    + This is the content of Tab 15... +
    +
    + This is the content of Tab 16... +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/example/index_b4.html b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/example/index_b4.html new file mode 100644 index 0000000..3d19c94 --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/example/index_b4.html @@ -0,0 +1,218 @@ + + + + + + Scrollable Tabs Bootstrap 4 + + + + + + + + + +
    +
    +
    + +
    +
    + This is the content of Tab 1... +
    + + + + + + + + + + + + + + + + +
    +
    + + + + + diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/index.html b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/index.html new file mode 100644 index 0000000..7e7e8dc --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/index.html @@ -0,0 +1,96 @@ + + + + + + + + + Scrollable Tabs Bootstrap 5 + + + + + + +
    +
    +
    + +
    +
    + This is the content of Tab 1... +
    +
    + This is the content of Tab 2... +
    +
    + This is the content of Tab 3... +
    +
    + This is the content of Tab 4... +
    +
    + This is the content of Tab 5... +
    +
    + This is the content of Tab 6... +
    +
    + This is the content of Tab 7... +
    +
    + This is the content of Tab 8... +
    +
    + This is the content of Tab 9... +
    +
    + This is the content of Tab 10... +
    +
    + This is the content of Tab 11... +
    +
    + This is the content of Tab 12... +
    +
    + This is the content of Tab 13... +
    +
    + This is the content of Tab 14... +
    +
    + This is the content of Tab 15... +
    +
    + This is the content of Tab 16... +
    + +
    +
    + + + + + + \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/package.json b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/package.json new file mode 100644 index 0000000..1ab9d97 --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/package.json @@ -0,0 +1,39 @@ +{ + "name": "scrolling-tabs-bootstrap-5", + "version": "1.0.7", + "description": "A simple plugin to create scrollable tabs with Bootstrap 5.", + "main": "./dist/scrollable-tabs.js", + "repository": { + "type": "git", + "url": "git+https://github.com/SupernovaIC/scrollable-tabs-bootstrap-5.git" + }, + "keywords": [ + "scrollable", + "scrolling", + "tabs", + "bootstrap", + "boostrap", + "bootstrap-5", + "javascript", + "css", + "web", + "front-end", + "move-js", + "css" + ], + "ignore": [ + ".gitignore", + "README.md" + ], + "author": "Federico Navarrete ", + "license": "Apache 2.0", + "bugs": { + "url": "https://github.com/SupernovaIC/scrollable-tabs-bootstrap-5/issues" + }, + "homepage": "https://github.com/SupernovaIC/scrollable-tabs-bootstrap-5#readme", + "dependencies": { + "bootstrap": "^5.1.3", + "bootstrap-icons": "^1.7.2", + "move-js": "^0.5.0" + } +} diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/preview.gif b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/preview.gif new file mode 100644 index 0000000..b19a0e9 Binary files /dev/null and b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/preview.gif differ diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/css/scrollable-tabs.css b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/css/scrollable-tabs.css new file mode 100644 index 0000000..f9a52fa --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/css/scrollable-tabs.css @@ -0,0 +1,38 @@ + +.wrapper-nav { + position:relative; + margin:0 auto; + overflow:hidden; + padding:5px; + height:50px; +} + +.list { + position:absolute; + left:0px; + top:0px; + min-width:3500px; + margin-top:0px; +} + +.list li{ + display:table-cell; + position:relative; + text-align:center; + cursor:grab; + cursor:-webkit-grab; + color:#efefef; + vertical-align:middle; +} + +.scroller { + text-align:center; + cursor:pointer; + display:none; + padding:7px; + white-space:no-wrap; + vertical-align:middle; + background-color:#fff; +} + +.pointer {cursor: pointer;} diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/css/scrollable-tabs.min.css b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/css/scrollable-tabs.min.css new file mode 100644 index 0000000..9556d95 --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/css/scrollable-tabs.min.css @@ -0,0 +1 @@ +.wrapper-nav{position:relative;margin:0 auto;overflow:hidden;padding:5px;height:50px}.list{position:absolute;left:0;top:0;min-width:3500px;margin-top:0}.list li{display:table-cell;position:relative;text-align:center;cursor:grab;cursor:-webkit-grab;color:#efefef;vertical-align:middle}.scroller{text-align:center;cursor:pointer;display:none;padding:7px;white-space:no-wrap;vertical-align:middle;background-color:#fff}.pointer{cursor:pointer} \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/js/scrollable-tabs.js b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/js/scrollable-tabs.js new file mode 100644 index 0000000..2a6adec --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/js/scrollable-tabs.js @@ -0,0 +1,137 @@ +//let move = require('move'); + +const scrollBarWidths = 40; +const wrapper = document.getElementsByClassName("wrapper-nav")[0]; +const navLink = document.getElementsByClassName("nav-item nav-link"); +const lastNavLink = navLink[navLink.length - 1]; + +const scrollerRight = document.getElementsByClassName("scroller-right")[0]; +const scrollerLeft = document.getElementsByClassName("scroller-left")[0]; + +const list = document.querySelectorAll(".list"); + +let btnTriggered = false; + +let widthOfList = function() { + let itemsWidth = 0; + + const listLinks = document.querySelectorAll(".list a"); + + listLinks.forEach((el) => { + let itemWidth = getOuterWidth(el); + itemsWidth += itemWidth; + }); + + return itemsWidth; +}; + +let widthOfHidden = function(w) { + const wrapperh = document.getElementsByClassName("wrapper-nav")[0]; + + w = (!w) ? 0 : w; + + oW = getOuterWidth(wrapperh) - w; + + let ww = parseFloat((0 - oW).toFixed(3)); + + let hw = (oW - widthOfList() - getLeftPosi()) - scrollBarWidths; + + let rp = document.body.clientWidth - (getOuterLeft(lastNavLink) + getOuterWidth(lastNavLink)) - w; + + if (ww > hw) { + //return ww; + return (rp > ww ? rp : ww); + } + else { + //return hw; + return (rp > hw ? rp : hw); + } +}; + +let getLeftPosi = function() { + let ww = 0 - getOuterWidth(wrapper); + let lp = getOuterLeft(list[0]); + + if (ww > lp) { + return ww; + } + else { + return lp; + } +}; + +let reAdjust = function() { + let rp = document.body.clientWidth - (getOuterLeft(lastNavLink) + getOuterWidth(lastNavLink)); + + if (getOuterWidth(wrapper) < widthOfList() && (rp < 0)) { + scrollerRight.style.cssText = 'display: flex'; + } + else { + scrollerRight.style.display = 'none'; + } + + if (getLeftPosi() < 0) { + scrollerLeft.style.cssText = 'display: flex'; + } + else { + scrollerLeft.style.display = 'none'; + } + + btnTriggered = false; +} + +window.addEventListener('resize', function(event) { + reAdjust(); +}, true); + +scrollerRight.addEventListener("click", function() { + if (btnTriggered) return; + + btnTriggered = true; + + fade(scrollerLeft); + unfade(scrollerRight); + + let wR = getOuterWidth(scrollerRight); + + move(document.querySelectorAll(".list")[0]).add("left", +widthOfHidden(wR), 200).end().then(x=> { + reAdjust(); + }); +}); + +scrollerLeft.addEventListener("click", function() { + if (btnTriggered) return; + + btnTriggered = true; + + fade(scrollerRight); + unfade(scrollerLeft); + + let wL = getOuterWidth(scrollerLeft); + + move(document.querySelectorAll(".list")[0]).add("left", -getLeftPosi() + wL, 200).end().then(()=> { + reAdjust(); + }); +}); + +let getOuterLeft = function(elem) { + return elem.getBoundingClientRect().left; +} + +let getOuterWidth = function(elem) { + return parseFloat(window.getComputedStyle(elem).width); +} + +function fade(elem) { + elem.style.display = "none"; + elem.style.transition="opacity 0.6s"; + elem.style.opacity=0; +} + +function unfade(elem) { + elem.style.display = "block"; + elem.style.transition="opacity 0.6s"; + elem.style.opacity=1; +} + +reAdjust(); \ No newline at end of file diff --git a/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/js/scrollable-tabs.min.js b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/js/scrollable-tabs.min.js new file mode 100644 index 0000000..1d8a208 --- /dev/null +++ b/bootstrap/node_modules/scrolling-tabs-bootstrap-5/src/js/scrollable-tabs.min.js @@ -0,0 +1 @@ +const scrollBarWidths=40,wrapper=document.getElementsByClassName("wrapper-nav")[0],navLink=document.getElementsByClassName("nav-item nav-link"),lastNavLink=navLink[navLink.length-1],scrollerRight=document.getElementsByClassName("scroller-right")[0],scrollerLeft=document.getElementsByClassName("scroller-left")[0],list=document.querySelectorAll(".list");let btnTriggered=!1,widthOfList=function(){let e=0;return document.querySelectorAll(".list a").forEach(t=>{let l=getOuterWidth(t);e+=l}),e},widthOfHidden=function(e){const t=document.getElementsByClassName("wrapper-nav")[0];e=e||0,oW=getOuterWidth(t)-e;let l=parseFloat((0-oW).toFixed(3)),r=oW-widthOfList()-getLeftPosi()-40,n=document.body.clientWidth-(getOuterLeft(lastNavLink)+getOuterWidth(lastNavLink))-e;return l>r?n>l?n:l:n>r?n:r},getLeftPosi=function(){let e=0-getOuterWidth(wrapper),t=getOuterLeft(list[0]);return e>t?e:t},reAdjust=function(){let e=document.body.clientWidth-(getOuterLeft(lastNavLink)+getOuterWidth(lastNavLink));getOuterWidth(wrapper){reAdjust()})}),scrollerLeft.addEventListener("click",function(){if(btnTriggered)return;btnTriggered=!0,fade(scrollerRight),unfade(scrollerLeft);let e=getOuterWidth(scrollerLeft);move(document.querySelectorAll(".list")[0]).add("left",-getLeftPosi()+e,200).end().then(()=>{reAdjust()})});let getOuterLeft=function(e){return e.getBoundingClientRect().left},getOuterWidth=function(e){return parseFloat(window.getComputedStyle(e).width)};function fade(e){e.style.display="none",e.style.transition="opacity 0.6s",e.style.opacity=0}function unfade(e){e.style.display="block",e.style.transition="opacity 0.6s",e.style.opacity=1}reAdjust(); \ No newline at end of file diff --git a/bootstrap/node_modules/transform-property/.npmignore b/bootstrap/node_modules/transform-property/.npmignore new file mode 100644 index 0000000..48a2e24 --- /dev/null +++ b/bootstrap/node_modules/transform-property/.npmignore @@ -0,0 +1,2 @@ +components +build diff --git a/bootstrap/node_modules/transform-property/History.md b/bootstrap/node_modules/transform-property/History.md new file mode 100644 index 0000000..a339d6d --- /dev/null +++ b/bootstrap/node_modules/transform-property/History.md @@ -0,0 +1,5 @@ + +0.0.1 / 2013-04-04 +================== + + * initial release diff --git a/bootstrap/node_modules/transform-property/Makefile b/bootstrap/node_modules/transform-property/Makefile new file mode 100644 index 0000000..0f14dac --- /dev/null +++ b/bootstrap/node_modules/transform-property/Makefile @@ -0,0 +1,11 @@ + +build: components index.js + @component build --dev + +components: component.json + @component install --dev + +clean: + rm -fr build components template.js + +.PHONY: clean diff --git a/bootstrap/node_modules/transform-property/Readme.md b/bootstrap/node_modules/transform-property/Readme.md new file mode 100644 index 0000000..28474f6 --- /dev/null +++ b/bootstrap/node_modules/transform-property/Readme.md @@ -0,0 +1,17 @@ + +# transform-property + + Name of the CSS transform property (cross-browser) + +## Installation + + $ component install component/transform-property + +## API + + Exports the name of transform property as a `String` or `null` if + the property is not supported. + +## License + + MIT diff --git a/bootstrap/node_modules/transform-property/component.json b/bootstrap/node_modules/transform-property/component.json new file mode 100644 index 0000000..3539f19 --- /dev/null +++ b/bootstrap/node_modules/transform-property/component.json @@ -0,0 +1,13 @@ +{ + "name": "transform-property", + "repo": "component/transform-property", + "description": "Name of the CSS transform property (cross-browser)", + "version": "0.0.1", + "keywords": [], + "dependencies": {}, + "development": {}, + "license": "MIT", + "scripts": [ + "index.js" + ] +} \ No newline at end of file diff --git a/bootstrap/node_modules/transform-property/index.js b/bootstrap/node_modules/transform-property/index.js new file mode 100644 index 0000000..389e8e7 --- /dev/null +++ b/bootstrap/node_modules/transform-property/index.js @@ -0,0 +1,19 @@ + +var styles = [ + 'webkitTransform', + 'MozTransform', + 'msTransform', + 'OTransform', + 'transform' +]; + +var el = document.createElement('p'); +var style; + +for (var i = 0; i < styles.length; i++) { + style = styles[i]; + if (null != el.style[style]) { + module.exports = style; + break; + } +} diff --git a/bootstrap/node_modules/transform-property/package.json b/bootstrap/node_modules/transform-property/package.json new file mode 100644 index 0000000..ad9d8eb --- /dev/null +++ b/bootstrap/node_modules/transform-property/package.json @@ -0,0 +1,9 @@ +{ + "name": "transform-property", + "version": "0.0.1", + "component": { + "scripts": { + "transform-property/index.js": "index.js" + } + } +} diff --git a/classes/TestProjektSmarty.class.php b/classes/TestProjektSmarty.class.php new file mode 100644 index 0000000..db42f46 --- /dev/null +++ b/classes/TestProjektSmarty.class.php @@ -0,0 +1,19 @@ +Smarty(); + + $this->template_dir = REQUIRED_SMARTY_DIR.'templates'; + $this->compile_dir = REQUIRED_SMARTY_DIR.'templates_c'; + $this->config_dir = REQUIRED_SMARTY_DIR.'config'; + $this->cache_dir = REQUIRED_SMARTY_DIR.'cache'; + } + } +?> \ No newline at end of file diff --git a/classes/TestProjektSmarty.class_subdir.php b/classes/TestProjektSmarty.class_subdir.php new file mode 100644 index 0000000..f37a2bb --- /dev/null +++ b/classes/TestProjektSmarty.class_subdir.php @@ -0,0 +1,18 @@ +template_dir = REQUIRED_SMARTY_DIR.'../templates'; + $this->compile_dir = REQUIRED_SMARTY_DIR.'../templates_c'; + $this->config_dir = REQUIRED_SMARTY_DIR.'../config'; + $this->cache_dir = REQUIRED_SMARTY_DIR.'../cache'; + } + } +?> \ No newline at end of file diff --git a/config.inc.php b/config.inc.php new file mode 100644 index 0000000..d8352f9 --- /dev/null +++ b/config.inc.php @@ -0,0 +1,54 @@ +query("SELECT wert1, wert2 FROM dep_parameter WHERE pid='1'"); +# $row_ansprech_global = $result_ansprech_global->fetch_array(); + +# $global_service_admin = "$row_ansprech_global[wert1]"; +# $global_service_mail = "$row_ansprech_global[wert2]"; + +# $query_ldapuser = $db->query("SELECT wert1, wert2 FROM dep_parameter WHERE pid='2'"); +# $row_ldapuser = $query_ldapuser->fetch_array(); + +# $global_ldap_user = "$row_ldapuser[wert1]"; +# $global_ldap_pwd = "$row_ldapuser[wert2]"; + +# $query_ldapserver = $db->query("SELECT wert1, wert2 FROM dep_parameter WHERE pid='3'"); +# $row_ldapserver = $query_ldapserver->fetch_array(); +# $global_ldap_serverhsnet = "$row_ldapserver[wert1]"; +# $global_ldap_porthsnet = "$row_ldapserver[wert2]"; + +# $result_ldap_global = $db->query("SELECT wert1 FROM dep_parameter WHERE pid='4'"); +# $row_ldap_global = $result_ldap_global->fetch_array(); +# $global_ldap_art = "$row_ldap_global[wert1]"; + +#--------------------------------------------------------------------------------------------------------------------------------------- + + +#$username = $_SESSION["global_username"]; +$uid = $_SESSION["global_uid"]; + +$login_dateiname = basename($_SERVER['PHP_SELF']); + +#if($uid == "" AND $login_dateiname !='index.php'){ +#echo "hier:$uid"; +#exit; +# echo""; +# exit; +#} + +# echo "
    "; +# echo nl2br(print_r($_SESSION,true)); +# echo "
    "; + + +$template = "modern"; + +#--------------------------------------------------------------------------------------------------------------------------------------- +?> \ No newline at end of file diff --git a/config/.htaccess b/config/.htaccess new file mode 100644 index 0000000..2270e80 --- /dev/null +++ b/config/.htaccess @@ -0,0 +1,4 @@ +AuthName "pwd" +AuthType Basic +AuthUserFile /var/www/web712/html/config/.htpasswd +require valid-user diff --git a/config/.htpasswd b/config/.htpasswd new file mode 100644 index 0000000..f00df80 --- /dev/null +++ b/config/.htpasswd @@ -0,0 +1 @@ +admin:$1$mJMmTGPR$/db9TUBE9VIYJMUcNezBk0 diff --git a/config/datenbankanbindung.php b/config/datenbankanbindung.php new file mode 100644 index 0000000..77ce3fc --- /dev/null +++ b/config/datenbankanbindung.php @@ -0,0 +1,13 @@ +query("SET NAMES 'utf8'"); + return $db; + } + +//-------------------------------------------------------------------------------------------------- +?> diff --git a/config/func_cryption.php b/config/func_cryption.php new file mode 100644 index 0000000..8daf0c1 --- /dev/null +++ b/config/func_cryption.php @@ -0,0 +1,46 @@ +"; +#echo cryption($crypt, 'd'); +?> \ No newline at end of file diff --git a/datepicker/browserSniffer.js b/datepicker/browserSniffer.js new file mode 100644 index 0000000..8e30702 --- /dev/null +++ b/datepicker/browserSniffer.js @@ -0,0 +1,204 @@ +// end hide JavaScript diff --git a/datepicker/dynCalendar.css b/datepicker/dynCalendar.css new file mode 100644 index 0000000..c267712 --- /dev/null +++ b/datepicker/dynCalendar.css @@ -0,0 +1,40 @@ +.dynCalendar_header{ + font-family: Arial, Verdana, Helvetica, Sans-Serif; + font-size: 10pt; + font-weight: bold; + z-index: 1000; +} +.dynCalendar_dayname { + background-color: #eeeeee; + border: 1px solid #c0c0c0; + font-family: Arial, Verdana, Helvetica, Sans-Serif; + font-size: 8pt; + text-align: center; + z-index: 1000; +} + +.dynCalendar_day { + background-color: #eeeeee; + color: #000000; + font-family: Arial, Verdana, Helvetica, Sans-Serif; + font-size: 8pt; + z-index: 1000; +} + +.dynCalendar_today { + background-color: #ffffff; + border: 1px solid #c0c0c0; + font-family: Arial, Verdana, Helvetica, Sans-Serif; + font-size: 8pt; + z-index: 1000; +} + +.dynCalendar { + background-color: #c0c0c0; + border: 2px outset white; + visibility: hidden; + position: absolute; + top: 1px; + left: 1px; + z-index: 1000; +} diff --git a/datepicker/dynCalendar.js b/datepicker/dynCalendar.js new file mode 100644 index 0000000..80220c5 --- /dev/null +++ b/datepicker/dynCalendar.js @@ -0,0 +1,465 @@ + + /** + * o------------------------------------------------------------------------------o + * | This package is licensed under the Phpguru license. A quick summary is | + * | that the code is free to use for non-commercial purposes. For commercial | + * | purposes of any kind there is a small license fee to pay. You can read more | + * | at: | + * | http://www.phpguru.org/static/license.html | + * o------------------------------------------------------------------------------o + * + * Copyright 2008 Richard Heyes + */ + +/** +* Global variables +*/ + dynCalendar_layers = new Array(); + dynCalendar_mouseoverStatus = false; + dynCalendar_mouseX = 0; + dynCalendar_mouseY = 0; + +/** +* The calendar constructor +* +* @access public +* @param string objName Name of the object that you create +* @param string callbackFunc Name of the callback function +* @param string OPTIONAL Optional layer name +* @param string OPTIONAL Optional images path +*/ + function dynCalendar(objName, callbackFunc) + { + /** + * Properties + */ + // Todays date + this.today = new Date(); + this.date = this.today.getDate(); + this.month = this.today.getMonth(); + this.year = this.today.getFullYear(); + + this.objName = objName; + this.callbackFunc = callbackFunc; + this.imagesPath = arguments[2] ? arguments[2] : 'images/'; + this.layerID = arguments[3] ? arguments[3] : 'dynCalendar_layer_' + dynCalendar_layers.length; + + /*byAli*/ + this.pos = arguments[4]; + + this.offsetX = 5; + this.offsetY = -155; + + this.useMonthCombo = true; + this.useYearCombo = true; + this.yearComboRange = 5; + + this.currentMonth = this.month; + this.currentYear = this.year; + + /** + * Public Methods + */ + this.show = dynCalendar_show; + this.writeHTML = dynCalendar_writeHTML; + + // Accessor methods + this.setOffset = dynCalendar_setOffset; + this.setOffsetX = dynCalendar_setOffsetX; + this.setOffsetY = dynCalendar_setOffsetY; + this.setImagesPath = dynCalendar_setImagesPath; + this.setMonthCombo = dynCalendar_setMonthCombo; + this.setYearCombo = dynCalendar_setYearCombo; + this.setCurrentMonth = dynCalendar_setCurrentMonth; + this.setCurrentYear = dynCalendar_setCurrentYear; + this.setYearComboRange = dynCalendar_setYearComboRange; + + /** + * Private methods + */ + // Layer manipulation + this._getLayer = dynCalendar_getLayer; + this._hideLayer = dynCalendar_hideLayer; + this._showLayer = dynCalendar_showLayer; + this._setLayerPosition = dynCalendar_setLayerPosition; + this._setHTML = dynCalendar_setHTML; + + // Miscellaneous + this._getDaysInMonth = dynCalendar_getDaysInMonth; + this._mouseover = dynCalendar_mouseover; + + /** + * Constructor type code + */ + dynCalendar_layers[dynCalendar_layers.length] = this; + this.writeHTML(); + } + +/** +* Shows the calendar, or updates the layer if +* already visible. +* +* @access public +* @param integer month Optional month number (0-11) +* @param integer year Optional year (YYYY format) +*/ + function dynCalendar_show() + { + // Variable declarations to prevent globalisation + var month, year, monthnames, numdays, thisMonth, firstOfMonth; + var ret, row, i, cssClass, linkHTML, previousMonth, previousYear; + var nextMonth, nextYear, prevImgHTML, prevLinkHTML, nextImgHTML, nextLinkHTML; + var monthComboOptions, monthCombo, yearComboOptions, yearCombo, html; + + this.currentMonth = month = arguments[0] != null ? arguments[0] : this.currentMonth; + this.currentYear = year = arguments[1] != null ? arguments[1] : this.currentYear; + + monthnames = new Array('Januar', 'Februar', 'März', 'April', 'Mai', 'Juni', 'Juli', 'August', 'September', 'Oktober', 'November', 'Dezember'); + numdays = this._getDaysInMonth(month, year); + + thisMonth = new Date(year, month, 1); + firstOfMonth = thisMonth.getDay(); + + // First few blanks up to first day + ret = new Array(new Array()); + for(i=0; i' + (i++) + ''; + ret[row][ret[row].length] = '
    ' + linkHTML + '
    '; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += ''; + html += '' + ret.join('\n') + ''; + html += '
    ' + prevLinkHTML + '' + monthCombo + ' ' + yearCombo + '' + nextLinkHTML + '
    SoMoDiMiDoFrSa
    '; + + this._setHTML(html); + if (!arguments[0] && !arguments[1]) { + this._showLayer(); + this._setLayerPosition(); + } + } + +/** +* Writes HTML to document for layer +* +* @access public +*/ + function dynCalendar_writeHTML() + { + if (is_ie5up || is_nav6up || is_gecko) { + document.write(''); + document.write('

    '); + } + } + +/** +* Sets the offset to the mouse position +* that the calendar appears at. +* +* @access public +* @param integer Xoffset Number of pixels for vertical +* offset from mouse position +* @param integer Yoffset Number of pixels for horizontal +* offset from mouse position +*/ + function dynCalendar_setOffset(Xoffset, Yoffset) + { + this.setOffsetX(Xoffset); + this.setOffsetY(Yoffset); + } + +/** +* Sets the X offset to the mouse position +* that the calendar appears at. +* +* @access public +* @param integer Xoffset Number of pixels for horizontal +* offset from mouse position +*/ + function dynCalendar_setOffsetX(Xoffset) + { + this.offsetX = Xoffset; + } + +/** +* Sets the Y offset to the mouse position +* that the calendar appears at. +* +* @access public +* @param integer Yoffset Number of pixels for vertical +* offset from mouse position +*/ + function dynCalendar_setOffsetY(Yoffset) + { + this.offsetY = Yoffset; + } + +/** +* Sets the images path +* +* @access public +* @param string path Path to use for images +*/ + function dynCalendar_setImagesPath(path) + { + this.imagesPath = path; + } + +/** +* Turns on/off the month dropdown +* +* @access public +* @param boolean useMonthCombo Whether to use month dropdown or not +*/ + function dynCalendar_setMonthCombo(useMonthCombo) + { + this.useMonthCombo = useMonthCombo; + } + +/** +* Turns on/off the year dropdown +* +* @access public +* @param boolean useYearCombo Whether to use year dropdown or not +*/ + function dynCalendar_setYearCombo(useYearCombo) + { + this.useYearCombo = useYearCombo; + } + +/** +* Sets the current month being displayed +* +* @access public +* @param boolean month The month to set the current month to +*/ + function dynCalendar_setCurrentMonth(month) + { + this.currentMonth = month; + } + +/** +* Sets the current month being displayed +* +* @access public +* @param boolean year The year to set the current year to +*/ + function dynCalendar_setCurrentYear(year) + { + this.currentYear = year; + } + +/** +* Sets the range of the year combo. Displays this number of +* years either side of the year being displayed. +* +* @access public +* @param integer range The range to set +*/ + function dynCalendar_setYearComboRange(range) + { + this.yearComboRange = range; + } + +/** +* Returns the layer object +* +* @access private +*/ + function dynCalendar_getLayer() + { + var layerID = this.layerID; + + if (document.getElementById(layerID)) { + + return document.getElementById(layerID); + + } else if (document.all(layerID)) { + return document.all(layerID); + } + } + +/** +* Hides the calendar layer +* +* @access private +*/ + function dynCalendar_hideLayer() + { + this._getLayer().style.visibility = 'hidden'; + } + +/** +* Shows the calendar layer +* +* @access private +*/ + function dynCalendar_showLayer() + { + this._getLayer().style.visibility = 'visible'; + } + +/** +* Sets the layers position +* +* @access private +*/ + function dynCalendar_setLayerPosition() + { + this._getLayer().style.top = (dynCalendar_mouseY + this.offsetY) + 'px'; + this._getLayer().style.left = (dynCalendar_mouseX + this.offsetX) + 'px'; + } + +/** +* Sets the innerHTML attribute of the layer +* +* @access private +*/ + function dynCalendar_setHTML(html) + { + this._getLayer().innerHTML = html; + } + +/** +* Returns number of days in the supplied month +* +* @access private +* @param integer month The month to get number of days in +* @param integer year The year of the month in question +*/ + function dynCalendar_getDaysInMonth(month, year) + { + monthdays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; + if (month != 1) { + return monthdays[month]; + } else { + return ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0 ? 29 : 28); + } + } + +/** +* onMouse(Over|Out) event handler +* +* @access private +* @param boolean status Whether the mouse is over the +* calendar or not +*/ + function dynCalendar_mouseover(status) + { + dynCalendar_mouseoverStatus = status; + return true; + } + +/** +* onMouseMove event handler +*/ + dynCalendar_oldOnmousemove = document.onmousemove ? document.onmousemove : new Function; + + document.onmousemove = function () + { + if (is_ie5up || is_nav6up || is_gecko) { + if (arguments[0]) { + dynCalendar_mouseX = arguments[0].pageX; + dynCalendar_mouseY = arguments[0].pageY; + } else { + dynCalendar_mouseX = event.clientX + document.body.scrollLeft; + dynCalendar_mouseY = event.clientY + document.body.scrollTop; + arguments[0] = null; + } + + dynCalendar_oldOnmousemove(); + } + } + +/** +* Callbacks for document.onclick +*/ + dynCalendar_oldOnclick = document.onclick ? document.onclick : new Function; + + document.onclick = function () + { + if (is_ie5up || is_nav6up || is_gecko) { + if(!dynCalendar_mouseoverStatus){ + for(i=0; i + + + + + + + + + + + + + + + + + + + + +
    + + .. + + bis + + .. + + +
    + + .. + + + +
    + + + + + +"; + +?> \ No newline at end of file diff --git a/datepicker/images/dynCalendar.gif b/datepicker/images/dynCalendar.gif new file mode 100644 index 0000000..b2bd3b4 Binary files /dev/null and b/datepicker/images/dynCalendar.gif differ diff --git a/datepicker/images/next.gif b/datepicker/images/next.gif new file mode 100644 index 0000000..b25fe2d Binary files /dev/null and b/datepicker/images/next.gif differ diff --git a/datepicker/images/prev.gif b/datepicker/images/prev.gif new file mode 100644 index 0000000..c880a45 Binary files /dev/null and b/datepicker/images/prev.gif differ diff --git a/func_doppelanmelder.php b/func_doppelanmelder.php new file mode 100644 index 0000000..d2ba927 --- /dev/null +++ b/func_doppelanmelder.php @@ -0,0 +1,33 @@ +query("SELECT bid, nachname, vorname + FROM jumi_buchung + WHERE upper(vorname)='$vorname1' + AND upper(nachname)='$nachname1' + AND tid=$termin + "); + $row_angemeldet= $query_angemeldet->fetch_array(); + + if($row_angemeldet['bid'] != ''){ + $bid = $row_angemeldet['bid']; + $value = cryption("$bid|$nachname|$termin", 'e');; + }else{ + $value = FALSE; + } + return $value; +} + +#if($return = doppelanmelder(6, 'Alexander', 'Schwarz')){ +# echo "$return"; +#}else{ +# echo "keine Treffer"; +#} + +?> diff --git a/func_generate_qr_by_name.php b/func_generate_qr_by_name.php new file mode 100644 index 0000000..e08cca5 --- /dev/null +++ b/func_generate_qr_by_name.php @@ -0,0 +1,74 @@ +query("SELECT qr + FROM jumi_qr_fellbach + WHERE upper(vorname)='$vorname1' + AND upper(nachname)='$nachname1' + "); + $row_qr= $query_qr->fetch_array(); + + if($row_qr['qr'] != ''){ + $PNG_TEMP_DIR = dirname(__FILE__).DIRECTORY_SEPARATOR.'admin'.DIRECTORY_SEPARATOR.'phpqrcode'.DIRECTORY_SEPARATOR.'temp'.DIRECTORY_SEPARATOR; + $PNG_WEB_DIR = 'phpqrcode/temp/'; + + $filename = $PNG_TEMP_DIR.$row_qr['qr'].'.png'; + QRcode::png($row_qr['qr'], $filename, H, 10, 2); + return $row_qr['qr']; + }else{ + + $empfaenger = "service@nak-btb.de"; + $betreff = "Fehlender QR Code"; + $text = " + + + Fehlender QR Code + + + + Guten Tag!

    + Für nachfolgende Person fehlt ein QR Code für die Gemeinde Fellbach +
    +
    + + + + + +
    + Name: + + $nachname, $vorname + +
    +
    +
    + Link zur Gottesdienstadministration: Gottesdienstadministration +

    + Diese Mail wurde automatisch generiert!
    + Antworten Sie daher nicht auf diese Mail
    +
    + Vielen Dank + + "; + + + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: Gottesdienstregistrierung \n"; + #$headers .= "Bcc: \n"; + + $mail_return = @mail($empfaenger, $betreff, $text, $headers); + return 'NA'; + } + +} +#echo generate_qr_by_name('Bantleon', 'Lea'); +?> diff --git a/func_get_lfd_haushalt.php b/func_get_lfd_haushalt.php new file mode 100644 index 0000000..7d6b05f --- /dev/null +++ b/func_get_lfd_haushalt.php @@ -0,0 +1,21 @@ +query("SELECT max(lfd_haushalt)+1 lfd_hhnr FROM jumi_buchung WHERE tid=$tid"); + $row_get_lfd_haushalt = $query_get_lfd_haushalt->fetch_array(); + if($row_get_lfd_haushalt['lfd_hhnr']==''){ + $next = 1; + }else{ + $next = $row_get_lfd_haushalt['lfd_hhnr']; + } + return $next; +} + +#echo get_lfd_haushalt(4); + +?> + diff --git a/func_get_parameter.php b/func_get_parameter.php new file mode 100644 index 0000000..2f7c35d --- /dev/null +++ b/func_get_parameter.php @@ -0,0 +1,16 @@ +query("SELECT wert FROM jumi_parameter WHERE pid=$pid"); + $row_get_parameter= $query_get_parameter->fetch_array(); + $wert = $row_get_parameter['wert']; + return $wert; +} + +#echo get_parameter(6); + +?> diff --git a/func_get_sitzplatz.php b/func_get_sitzplatz.php new file mode 100644 index 0000000..8dc1d9e --- /dev/null +++ b/func_get_sitzplatz.php @@ -0,0 +1,22 @@ +query("SELECT reihe, platz FROM jumi_standardsitzplatz WHERE nachname='$nachname' AND vorname='$vorname'"); + $row_getplatz = $query_getplatz->fetch_array(); + + if($row_getplatz['reihe'] != ''){ + $platz = "$row_getplatz[reihe]|$row_getplatz[platz]"; + }else{ + $platz = "|"; + } + + return $platz; +} + +#echo get_sitzplatz('Schwarz', 'Alexander'); + +?> \ No newline at end of file diff --git a/func_kritische_haushalte.php b/func_kritische_haushalte.php new file mode 100644 index 0000000..c3e8de7 --- /dev/null +++ b/func_kritische_haushalte.php @@ -0,0 +1,89 @@ +query("SELECT wert FROM jumi_parameter WHERE pid=1"); + $row_get_parameter_mail= $query_get_parameter_mail->fetch_array(); + + $query_get_parameter = $db->query("SELECT wert FROM jumi_parameter WHERE pid=2"); + $row_get_parameter= $query_get_parameter->fetch_array(); + + $query_get_sperrung = $db->query("SELECT wert FROM jumi_parameter WHERE pid=4"); + $row_get_sperrung= $query_get_sperrung->fetch_array(); + + + $marke = $row_get_parameter['wert']; + $sperrung = $row_get_sperrung['wert']; + + $query_ist = $db->query("SELECT count(distinct lfd_haushalt) ANZ_IST + FROM jumi_buchung + WHERE tid=$termin"); + $row_ist= $query_ist->fetch_array(); + + + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + if($row_ist['ANZ_IST'] >= $sperrung){ + $datum = date("Y-m-d H:i:s"); + $update = $db->query("UPDATE jumi_termine + SET loginstop ='$datum' + WHERE tid = $termin + "); + $hinweis = "
    Die Maximalmarke wurde berschritten. Der Gottesdienst wurde automatisch gesperrt"; + } + + if($row_ist['ANZ_IST'] >= $marke){ + $empfaenger = "$row_get_parameter_mail[wert]"; + $betreff = "Gottesdienst: Kritische Marke am $row_termin[beginn] Uhr erreicht"; + $text = " + + + Kritische Marke + + + + Guten Tag!

    + Die Anzahl der kritischen Marke von $marke Haushalten wurde erreicht. +
    + Aktuelle Zahl der Haushaltsanmeldungen: $row_ist[ANZ_IST] +
    "; + if($hinweis != ''){ + $text .= " + $hinweis +
    + "; + } + $text .= " +
    + Link zur Registrierung: Administration zum Gottesdienst +

    + Diese Mail wurde automatisch generiert!
    + Antworten Sie daher nicht auf diese Mail
    +
    + Vielen Dank + + "; + + + $text = stripslashes($text); + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= "From: Gottesdienstregistrierung \n"; + #$headers .= "Bcc: \n"; + + $return = @mail($empfaenger, $betreff, $text, $headers); + } +} + +#echo get_parameter(6); + +?> diff --git a/index.php b/index.php new file mode 100644 index 0000000..14e73e7 --- /dev/null +++ b/index.php @@ -0,0 +1,1381 @@ + now() + ORDER BY date_format(datum, '%Y%m%d') ASC"; + + ($result1 = $db->query($query1)) or die("Cannot execute query1"); + + $gesperrt1 = []; + while ($row1 = $result1->fetch_array()) { + $query_anzgesp = $db->query("SELECT count(distinct lfd_haushalt) Anz + FROM jumi_buchung + WHERE tid = $row1[tid] + "); + $row_anzgesp = $query_anzgesp->fetch_array(); + + #04.07.2021 | 1 | 0 + #11.07.2021 | 1 | 2 + #18.07.2021 | 1 | 3 + #25.07.2021 | 1 | 4 + + // Überprüfung, ob die Anmeldefrist überschritten ist + $heute = mktime( + date("H"), + date("i"), + date("s"), + date("m"), + date("d"), + date("Y") + ); // heutiges Datum + $heute_format = date("YmdHis", $heute); // ISO-8601 Format wie in der Datenbank: Formatierung für Vergleiche erforderlich + + $a = strtotime($heute_format); //Umrechnung des Fristgrenztages in eine Zahl + $b = strtotime($row1["Anmeldestopp"]); // Umrechnung des Enddatums in eine Zahl + + #echo "$row1[datum] | $a | $b
    "; + if ( + $row_anzgesp["Anz"] >= $gesperrt or + $row1["loginstop"] != "0000-00-00 00:00:00" or + $b <= $a + ) { + $hinweis_gepserrt = 1; + $gesperrt1[] = 1; + } else { + $hinweis_gepserrt = 0; + $gesperrt1[] = 0; + } + if (!isset($zaehler) or $zaehler == 1) { + $zaehler = 0; + } else { + $zaehler = 1; + } + $row1["hinweis_gepserrt"] = $hinweis_gepserrt; + $row1["zaehler"] = $zaehler; + $table_data1[] = $row1; + } + $smarty->assign("table_data1", $table_data1); + + if (in_array(1, $gesperrt1)) { + $smarty->assign("warteliste", 1); + } else { + $smarty->assign("warteliste", 0); + } + + # + for ($i = 0; $i < count($_SESSION["termin"]); $i++) { + $smarty->assign("checked_" . $_SESSION["termin"][$i], "1"); + } + #Session wird zurückgesetzt, da Sie nach dem Auslesen wieder durch POST gesetzt wird + unset($_SESSION["termin"]); + #echo "

    ";
    +    #print_r($table_data1);
    +    #echo "
    "; + + ## Fehlerhandling + $error1 = $_GET["error1"]; + + if ($error1 == 1) { + $smarty->assign("termin_error", 1); + + if ($error1 == 1) { + $smarty->assign( + "termin_error_text", + "Sie müssen einen Termin auswählen für den nächsten Schritt" + ); + } + } +} + +if ($action == "warteliste_terminwahl") { + # Gespeicherte Termine + $anmeldestopp = get_parameter(3); + $gesperrt = get_parameter(4); + + $query1 = "SELECT tid, date_format(datum, '%d.%m.%Y') datum, date_format(datum, '%H:%i') zeit, hinweis, loginstop, date_format(DATE_SUB(datum, INTERVAL $anmeldestopp HOUR), '%Y%m%d%H%i%s') Anmeldestopp + FROM jumi_termine + WHERE datum > now() + ORDER BY date_format(datum, '%Y%m%d') ASC"; + + ($result1 = $db->query($query1)) or die("Cannot execute query1"); + + while ($row1 = $result1->fetch_array()) { + $query_anzgesp = $db->query("SELECT count(distinct lfd_haushalt) Anz + FROM jumi_buchung + WHERE tid = $row1[tid] + "); + $row_anzgesp = $query_anzgesp->fetch_array(); + + #04.07.2021 | 1 | 0 + #11.07.2021 | 1 | 2 + #18.07.2021 | 1 | 3 + #25.07.2021 | 1 | 4 + + // Überprüfung, ob die Anmeldefrist überschritten ist + $heute = mktime( + date("H"), + date("i"), + date("s"), + date("m"), + date("d"), + date("Y") + ); // heutiges Datum + $heute_format = date("YmdHis", $heute); // ISO-8601 Format wie in der Datenbank: Formatierung für Vergleiche erforderlich + + $a = strtotime($heute_format); //Umrechnung des Fristgrenztages in eine Zahl + $b = strtotime($row1["Anmeldestopp"]); // Umrechnung des Enddatums in eine Zahl + + #echo "$row1[datum] | $a | $b
    "; + if ( + $row_anzgesp["Anz"] >= $gesperrt or + $row1["loginstop"] != "0000-00-00 00:00:00" or + $b <= $a + ) { + $hinweis_gepserrt = 1; + } else { + $hinweis_gepserrt = 0; + } + if (!isset($zaehler) or $zaehler == 1) { + $zaehler = 0; + } else { + $zaehler = 1; + } + $row1["hinweis_gepserrt"] = $hinweis_gepserrt; + $row1["zaehler"] = $zaehler; + $table_data1[] = $row1; + } + $smarty->assign("table_data1", $table_data1); +} + +if ($action == "hausstand") { + if (isset($_POST["termin"])) { + $termin = $_POST["termin"]; + $_SESSION["termin"] = $termin; + } else { + if (isset($_SESSION["termin"])) { + $termin = $_SESSION["termin"]; + } else { + $error1 = 1; + $error = true; + } + } + + if (isset($error)) { + echo ""; + exit(); + } + + $smarty->assign("hausstand_value_nachname1", $_SESSION["nachname1"]); + $smarty->assign("hausstand_value_vorname1", $_SESSION["vorname1"]); + $smarty->assign("hausstand_value_nachname2", $_SESSION["nachname2"]); + $smarty->assign("hausstand_value_vorname2", $_SESSION["vorname2"]); + $smarty->assign("hausstand_value_nachname3", $_SESSION["nachname3"]); + $smarty->assign("hausstand_value_vorname3", $_SESSION["vorname3"]); + $smarty->assign("hausstand_value_nachname4", $_SESSION["nachname4"]); + $smarty->assign("hausstand_value_vorname4", $_SESSION["vorname4"]); + $smarty->assign("hausstand_value_nachname5", $_SESSION["nachname5"]); + $smarty->assign("hausstand_value_mail", $_SESSION["mail"]); + $smarty->assign("hausstand_value_vorname5", $_SESSION["vorname5"]); + + ## Fehlerhandling + $error1 = $_GET["error1"]; + + if ($error1 == 1) { + $smarty->assign("hausstand_error", 1); + + if ($error1 == 1) { + $smarty->assign( + "hausstand_error_text", + "Sie müssen zumindest eine Person erfassen." + ); + } + } +} + +if ($action == "warteliste_hausstand") { + if (isset($_POST["termin"])) { + $termin = $_POST["termin"]; + $_SESSION["termin"] = $termin; + } else { + if (isset($_SESSION["termin"])) { + $termin = $_SESSION["termin"]; + } else { + $error1 = 1; + $error = true; + } + } + + if (isset($error)) { + echo ""; + exit(); + } + + $smarty->assign("hausstand_value_nachname1", $_SESSION["nachname1"]); + $smarty->assign("hausstand_value_vorname1", $_SESSION["vorname1"]); + $smarty->assign("hausstand_value_nachname2", $_SESSION["nachname2"]); + $smarty->assign("hausstand_value_vorname2", $_SESSION["vorname2"]); + $smarty->assign("hausstand_value_nachname3", $_SESSION["nachname3"]); + $smarty->assign("hausstand_value_vorname3", $_SESSION["vorname3"]); + $smarty->assign("hausstand_value_nachname4", $_SESSION["nachname4"]); + $smarty->assign("hausstand_value_vorname4", $_SESSION["vorname4"]); + $smarty->assign("hausstand_value_nachname5", $_SESSION["nachname5"]); + $smarty->assign("hausstand_value_vorname5", $_SESSION["vorname5"]); + $smarty->assign("hausstand_value_mail", $_SESSION["mail"]); + $smarty->assign("hausstand_value_warteliste_grund", $_SESSION["warteliste_grund"]); + + ## Fehlerhandling + $error1 = $_GET["error1"]; + $error2 = $_GET["error2"]; + + if ($error1 == 1 or $error2 == 1) { + $smarty->assign("hausstand_error", 1); + + if ($error1 == 1) { + $smarty->assign( + "hausstand_error_text", + "Sie müssen zumindest eine Person erfassen." + ); + } + + if ($error2 == 1) { + $smarty->assign( + "hausstand_error_text", + "Sie müssen Ihre Emailadresse angeben." + ); + } + } +} + +if ($action == "overview") { + if (isset($_POST["nachname1"])) { + $nachname1 = trim($_POST["nachname1"]); + } else { + $nachname1 = $_SESSION["nachname1"]; + } + + if (isset($_POST["vorname1"])) { + $vorname1 = trim($_POST["vorname1"]); + } else { + $vorname1 = $_SESSION["vorname1"]; + } + + if (isset($_POST["nachname2"])) { + $nachname2 = trim($_POST["nachname2"]); + } else { + $nachname2 = $_SESSION["nachname2"]; + } + + if (isset($_POST["vorname2"])) { + $vorname2 = trim($_POST["vorname2"]); + } else { + $vorname2 = $_SESSION["vorname2"]; + } + + if (isset($_POST["nachname3"])) { + $nachname3 = trim($_POST["nachname3"]); + } else { + $nachname3 = $_SESSION["nachname3"]; + } + + if (isset($_POST["vorname3"])) { + $vorname3 = trim($_POST["vorname3"]); + } else { + $vorname3 = $_SESSION["vorname3"]; + } + + if (isset($_POST["nachname4"])) { + $nachname4 = trim($_POST["nachname4"]); + } else { + $nachname4 = $_SESSION["nachname4"]; + } + + if (isset($_POST["vorname4"])) { + $vorname4 = trim($_POST["vorname4"]); + } else { + $vorname4 = $_SESSION["vorname4"]; + } + + if (isset($_POST["nachname5"])) { + $nachname5 = trim($_POST["nachname5"]); + } else { + $nachname5 = $_SESSION["nachname5"]; + } + + if (isset($_POST["mail"])) { + $mail = trim($_POST["mail"]); + } else { + $mail = $_SESSION["mail"]; + } + + + if (isset($_POST["vorname5"])) { + $vorname5 = trim($_POST["vorname5"]); + } else { + $vorname5 = $_SESSION["vorname5"]; + } + + $_SESSION["nachname1"] = $nachname1; + $_SESSION["vorname1"] = $vorname1; + $_SESSION["nachname2"] = $nachname2; + $_SESSION["vorname2"] = $vorname2; + $_SESSION["nachname3"] = $nachname3; + $_SESSION["vorname3"] = $vorname3; + $_SESSION["nachname4"] = $nachname4; + $_SESSION["vorname4"] = $vorname4; + $_SESSION["nachname5"] = $nachname5; + $_SESSION["vorname5"] = $vorname5; + $_SESSION["mail"] = $mail; + + if ( + $nachname1 == "" and + $nachname2 == "" and + $nachname3 == "" and + $nachname4 == "" and + $nachname5 == "" + ) { + $error1 = 1; + $error = true; + } + + if (isset($error)) { + echo ""; + exit(); + } + for ($i = 0; $i < count($_SESSION["termin"]); $i++) { + $termin = $_SESSION["termin"][$i]; + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + $row1["beginn"] = $row_termin["beginn"]; + $row1["hinweis"] = $row_termin["hinweis"]; + $table_data1[] = $row1; + } + $smarty->assign("table_data1", $table_data1); + + $smarty->assign("overview_value_beginn", $row_termin["beginn"]); + $smarty->assign("overview_value_hinweis", $row_termin["hinweis"]); + $smarty->assign("overview_value_nachname1", $_SESSION["nachname1"]); + $smarty->assign("overview_value_vorname1", $_SESSION["vorname1"]); + $smarty->assign("overview_value_nachname2", $_SESSION["nachname2"]); + $smarty->assign("overview_value_vorname2", $_SESSION["vorname2"]); + $smarty->assign("overview_value_nachname3", $_SESSION["nachname3"]); + $smarty->assign("overview_value_vorname3", $_SESSION["vorname3"]); + $smarty->assign("overview_value_nachname4", $_SESSION["nachname4"]); + $smarty->assign("overview_value_vorname4", $_SESSION["vorname4"]); + $smarty->assign("overview_value_nachname5", $_SESSION["nachname5"]); + $smarty->assign("overview_value_vorname5", $_SESSION["vorname5"]); + $smarty->assign("overview_value_mail", $_SESSION["mail"]); +} + +if ($action == "warteliste_overview") { + + if (isset($_POST["nachname1"])) { + $nachname1 = trim($_POST["nachname1"]); + } else { + $nachname1 = $_SESSION["nachname1"]; + } + + if (isset($_POST["vorname1"])) { + $vorname1 = trim($_POST["vorname1"]); + } else { + $vorname1 = $_SESSION["vorname1"]; + } + + if (isset($_POST["nachname2"])) { + $nachname2 = trim($_POST["nachname2"]); + } else { + $nachname2 = $_SESSION["nachname2"]; + } + + if (isset($_POST["vorname2"])) { + $vorname2 = trim($_POST["vorname2"]); + } else { + $vorname2 = $_SESSION["vorname2"]; + } + + if (isset($_POST["nachname3"])) { + $nachname3 = trim($_POST["nachname3"]); + } else { + $nachname3 = $_SESSION["nachname3"]; + } + + if (isset($_POST["vorname3"])) { + $vorname3 = trim($_POST["vorname3"]); + } else { + $vorname3 = $_SESSION["vorname3"]; + } + + if (isset($_POST["nachname4"])) { + $nachname4 = trim($_POST["nachname4"]); + } else { + $nachname4 = $_SESSION["nachname4"]; + } + + if (isset($_POST["vorname4"])) { + $vorname4 = trim($_POST["vorname4"]); + } else { + $vorname4 = $_SESSION["vorname4"]; + } + + if (isset($_POST["nachname5"])) { + $nachname5 = trim($_POST["nachname5"]); + } else { + $nachname5 = $_SESSION["nachname5"]; + } + + if (isset($_POST["mail"])) { + $mail = trim($_POST["mail"]); + } else { + $mail = $_SESSION["mail"]; + } + + if (isset($_POST["warteliste_grund"])) { + $warteliste_grund = trim($_POST["warteliste_grund"]); + } else { + $warteliste_grund = $_SESSION["warteliste_grund"]; + } + + if (isset($_POST["vorname5"])) { + $vorname5 = trim($_POST["vorname5"]); + } else { + $vorname5 = $_SESSION["vorname5"]; + } + + $_SESSION["nachname1"] = $nachname1; + $_SESSION["vorname1"] = $vorname1; + $_SESSION["nachname2"] = $nachname2; + $_SESSION["vorname2"] = $vorname2; + $_SESSION["nachname3"] = $nachname3; + $_SESSION["vorname3"] = $vorname3; + $_SESSION["nachname4"] = $nachname4; + $_SESSION["vorname4"] = $vorname4; + $_SESSION["nachname5"] = $nachname5; + $_SESSION["vorname5"] = $vorname5; + $_SESSION["mail"] = $mail; + $_SESSION["warteliste_grund"] = $warteliste_grund; + + + + + if ( + $nachname1 == "" and + $nachname2 == "" and + $nachname3 == "" and + $nachname4 == "" and + $nachname5 == "" + ) { + $error1 = 1; + $error = true; + } + if ($mail == "") { + $error2 = 1; + $error = true; + } + + if (isset($error)) { + echo ""; + exit(); + } + for ($i = 0; $i < count($_SESSION["termin"]); $i++) { + $termin = $_SESSION["termin"][$i]; + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + $row1["beginn"] = $row_termin["beginn"]; + $row1["hinweis"] = $row_termin["hinweis"]; + $table_data1[] = $row1; + } + $smarty->assign("table_data1", $table_data1); + + $smarty->assign("overview_value_beginn", $row_termin["beginn"]); + $smarty->assign("overview_value_hinweis", $row_termin["hinweis"]); + $smarty->assign("overview_value_nachname1", $_SESSION["nachname1"]); + $smarty->assign("overview_value_vorname1", $_SESSION["vorname1"]); + $smarty->assign("overview_value_nachname2", $_SESSION["nachname2"]); + $smarty->assign("overview_value_vorname2", $_SESSION["vorname2"]); + $smarty->assign("overview_value_nachname3", $_SESSION["nachname3"]); + $smarty->assign("overview_value_vorname3", $_SESSION["vorname3"]); + $smarty->assign("overview_value_nachname4", $_SESSION["nachname4"]); + $smarty->assign("overview_value_vorname4", $_SESSION["vorname4"]); + $smarty->assign("overview_value_nachname5", $_SESSION["nachname5"]); + $smarty->assign("overview_value_vorname5", $_SESSION["vorname5"]); + $smarty->assign("overview_value_mail", $_SESSION["mail"]); + $smarty->assign("overview_value_warteliste_grund", $_SESSION["warteliste_grund"]); +} + +if ($action == "save") { + $nachname1 = $_SESSION["nachname1"]; + $vorname1 = $_SESSION["vorname1"]; + $nachname2 = $_SESSION["nachname2"]; + $vorname2 = $_SESSION["vorname2"]; + $nachname3 = $_SESSION["nachname3"]; + $vorname3 = $_SESSION["vorname3"]; + $nachname4 = $_SESSION["nachname4"]; + $vorname4 = $_SESSION["vorname4"]; + $nachname5 = $_SESSION["nachname5"]; + $vorname5 = $_SESSION["vorname5"]; + $mail = $_SESSION["mail"]; + + + for ($i = 0; $i < count($_SESSION["termin"]); $i++) { + $termin = $_SESSION["termin"][$i]; + $lfd_haushalt = get_lfd_haushalt($termin); + # echo " + # get_lfd_haushalt($termin) + #
    + # $lfd_haushalt + #
    + # "; + $datum = date("Y-m-d H:i:s"); + + if ($nachname1 != "") { + if ($return = doppelanmelder($termin, $vorname1, $nachname1)) { + $crypt1 = "$return"; + } else { + $sitzplatz1 = get_sitzplatz($nachname1, $vorname1); + $split1 = explode("|", $sitzplatz1); + $reihe1 = $split1[0]; + $platz1 = $split1[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname1', '$vorname1', '$reihe1', '$platz1', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid1 = $db->insert_id; + $crypt1 = rawurlencode( + cryption("$bid1|$nachname1|$termin", "e") + ); + } + } + if ($nachname2 != "") { + if ($return = doppelanmelder($termin, $vorname2, $nachname2)) { + $crypt2 = "$return"; + } else { + $sitzplatz2 = get_sitzplatz($nachname2, $vorname2); + $split2 = explode("|", $sitzplatz2); + $reihe2 = $split2[0]; + $platz2 = $split2[1]; + $sql1 = $db->query( + "insert into jumi_jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname2', '$vorname2', '$reihe2', '$platz2', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid2 = $db->insert_id; + $crypt2 = rawurlencode( + cryption("$bid2|$nachname2|$termin", "e") + ); + } + } + if ($nachname3 != "") { + if ($return = doppelanmelder($termin, $vorname3, $nachname3)) { + $crypt3 = "$return"; + } else { + $sitzplatz3 = get_sitzplatz($nachname3, $vorname3); + $split3 = explode("|", $sitzplatz3); + $reihe3 = $split3[0]; + $platz3 = $split3[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname3', '$vorname3', '$reihe3', '$platz3', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid3 = $db->insert_id; + $crypt3 = rawurlencode( + cryption("$bid3|$nachname3|$termin", "e") + ); + } + } + if ($nachname4 != "") { + if ($return = doppelanmelder($termin, $vorname4, $nachname4)) { + $crypt4 = "$return"; + } else { + $sitzplatz4 = get_sitzplatz($nachname4, $vorname4); + $split4 = explode("|", $sitzplatz4); + $reihe4 = $split4[0]; + $platz4 = $split4[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname4', '$vorname4', '$reihe4', '$platz4', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid4 = $db->insert_id; + $crypt4 = rawurlencode( + cryption("$bid4|$nachname4|$termin", "e") + ); + } + } + if ($nachname5 != "") { + if ($return = doppelanmelder($termin, $vorname5, $nachname5)) { + $crypt5 = "$return"; + } else { + $sitzplatz5 = get_sitzplatz($nachname5, $vorname5); + $split5 = explode("|", $sitzplatz5); + $reihe5 = $split5[0]; + $platz5 = $split5[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, reihe, platz, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname5', '$vorname5', '$reihe5', '$platz5', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid5 = $db->insert_id; + $crypt5 = rawurlencode( + cryption("$bid5|$nachname5|$termin", "e") + ); + } + } + #Anzahl der gemeldeten Haushalte überschritten? + kritische_haushalte($termin); + + if (isset($_SESSION["mail"]) and $mail != "") { + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis, fellbach_gd + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + $empfaenger = "$mail"; + $betreff = "Registrierung zum Gottesdienst am $row_termin[beginn] Uhr"; + $text = " + + + Registrierung zum Gottesdienst + + + + Guten Tag!

    + Sie haben sich zum Gottesdienst in der neuapostolischen Kirche Weinstadt-Beutelsbach registriert.
    + Nachfolgend finden Sie die hinterlegten Daten: +
    +
    + + + + + + + + + + + "; + if ($nachname1 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname1"; + $vname[] = "$vorname1"; + } + if ($nachname2 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname2"; + $vname[] = "$vorname2"; + } + if ($nachname3 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname3"; + $vname[] = "$vorname3"; + } + if ($nachname4 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname4"; + $vname[] = "$vorname4"; + } + if ($nachname5 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname5"; + $vname[] = "$vorname5"; + } + $text .= " + +
    + + Datum: + + + + $row_termin[beginn]"; + if ($row_termin["hinweis"] != "") { + $text .= " ($row_termin[hinweis])"; + } + $text .= " + +
    +   + +   + +   +
    + + Person 1: + + + + $nachname1, $vorname1 + + + Abmeldung +
    + + Person 2: + + + + $nachname2, $vorname2 + + + Abmeldung +
    + + Person 3: + + + + $nachname3, $vorname3 + + + Abmeldung +
    + + Person 4: + + + + $nachname4, $vorname4 + + + Abmeldung +
    + + Person 5: + + + + $nachname5, $vorname5 + + + Abmeldung +
    +
    + Link zur Registrierung: Registrierung zum Gottesdienst +
    +
    + Bitte melden Sie sich rechtzeitig von der Warteliste ab, falls Sie nicht zum Gottesdienst kommen können! +

    +
    + Diese Mail wurde automatisch generiert!
    + Antworten Sie daher nicht auf diese Mail
    +
    + Vielen Dank + + "; + $text = stripslashes($text); + + if ($row_termin["fellbach_gd"] == "N") { + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= + "From: Gottesdienstregistrierung \n"; + #$headers .= "Bcc: \n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + } else { + require_once "./mpdf/vendor/autoload.php"; + $mpdf = new \Mpdf\Mpdf([ + "mode" => "utf-8", + "format" => "A4", + "orientation" => "P", + "margin_top" => 10, + "margin_bottom" => 20, + "margin_left" => 10, + "margin_right" => 16, + "default_font" => "arial", + ]); + $buffer = + ''; + $buffer .= " + "; + $cnt = 0; + for ($i = 0; $i < count($nname); $i++) { + if ($cnt == 3) { + $buffer .= ""; + } + $qr_id = generate_qr_by_name($nname[$i], $vname[$i]); + if ($qr_id != "NA") { + $buffer .= + " + "; + } else { + $buffer .= " + "; + } + if ($cnt == 3) { + #$buffer.=""; + $cnt = 0; + } + + $cnt++; + } + $buffer .= " + +
    + QR-Code zur Erfassung der Gottesdienstteilnehmer in der Neuapostolischen Kirche Fellbach
    +
    +
    + $qr_id +

    $vname[$i] $nname[$i]


    + Dieser QR-Code dient lediglich zur Einlasskontrolle in die KircheFellbach und enthält keine persönlichen Daten.

    + Neuapostolische Kirche Fellbach
    + Kastanienweg 5
    + 70734 Fellbach +
    + Kein QR Code vorhanden! +
    +

    $vname[$i] $nname[$i]

    +
    +
    "; + $mpdf->WriteHTML($buffer); + $mpdf->Output( + "./admin/pdfs/QR_Codes_Fellbach_$nachname1.pdf", + F + ); + + $pdfLocation = "./admin/pdfs/QR_Codes_Fellbach_$nachname1.pdf"; // file location + $pdfName = "QR_Codes_Fellbach_$nachname1.pdf"; // pdf file name recipient will get + $filetype = "application/pdf"; // type + + // create headers and mime boundry + $eol = PHP_EOL; + $semi_rand = md5(time()); + $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; + $headers = + "From: Gottesdienstregistrierung $eol" . + "MIME-Version: 1.0$eol" . + "Content-Type: multipart/mixed;$eol" . + " boundary=\"$mime_boundary\""; + + // add html message body + $message = + "--$mime_boundary$eol" . + "Content-Type: text/html; charset=\"utf-8\"$eol" . + "Content-Transfer-Encoding: 7bit$eol$eol" . + $text . + $eol; + + // fetch pdf + $file = fopen($pdfLocation, "rb"); + $data = fread($file, filesize($pdfLocation)); + fclose($file); + $pdf = chunk_split(base64_encode($data)); + + // attach pdf to email + $message .= + "--$mime_boundary$eol" . + "Content-Type: $filetype;$eol" . + " name=\"$pdfName\"$eol" . + "Content-Disposition: attachment;$eol" . + " filename=\"$pdfName\"$eol" . + "Content-Transfer-Encoding: base64$eol$eol" . + $pdf . + $eol . + "--$mime_boundary--"; + + // Send the email + $return = @mail($empfaenger, $betreff, $message, $headers); + unlink($pdfLocation); + } + } + } + + session_destroy(); +} + + + + +if ($action == "warteliste_save") { + $nachname1 = $_SESSION["nachname1"]; + $vorname1 = $_SESSION["vorname1"]; + $nachname2 = $_SESSION["nachname2"]; + $vorname2 = $_SESSION["vorname2"]; + $nachname3 = $_SESSION["nachname3"]; + $vorname3 = $_SESSION["vorname3"]; + $nachname4 = $_SESSION["nachname4"]; + $vorname4 = $_SESSION["vorname4"]; + $nachname5 = $_SESSION["nachname5"]; + $vorname5 = $_SESSION["vorname5"]; + $mail = $_SESSION["mail"]; + $warteliste_grund = $_SESSION["warteliste_grund"]; + + for ($i = 0; $i < count($_SESSION["termin"]); $i++) { + $termin = $_SESSION["termin"][$i]; + $lfd_haushalt = get_lfd_haushalt($termin); + # echo " + # get_lfd_haushalt($termin) + #
    + # $lfd_haushalt + #
    + # "; + $datum = date("Y-m-d H:i:s"); + + if ($nachname1 != "") { + if ($return = doppelanmelder($termin, $vorname1, $nachname1)) { + $crypt1 = "$return"; + } else { + #Warteliste kein Sitzplatz + #$sitzplatz1 = get_sitzplatz($nachname1, $vorname1); + #$split1 = explode("|", $sitzplatz1); + #$reihe1 = $split1[0]; + #$platz1 = $split1[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, warteliste, warteliste_grund, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname1', '$vorname1', 'Y', '$warteliste_grund', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid1 = $db->insert_id; + $crypt1 = rawurlencode( + cryption("$bid1|$nachname1|$termin", "e") + ); + } + } + if ($nachname2 != "") { + if ($return = doppelanmelder($termin, $vorname2, $nachname2)) { + $crypt2 = "$return"; + } else { + #Warteliste kein Sitzplatz + #$sitzplatz2 = get_sitzplatz($nachname2, $vorname2); + #$split2 = explode("|", $sitzplatz2); + #$reihe2 = $split2[0]; + #$platz2 = $split2[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, warteliste, warteliste_grund, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname2', '$vorname2', 'Y', '$warteliste_grund', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid2 = $db->insert_id; + $crypt2 = rawurlencode( + cryption("$bid2|$nachname2|$termin", "e") + ); + } + } + if ($nachname3 != "") { + if ($return = doppelanmelder($termin, $vorname3, $nachname3)) { + $crypt3 = "$return"; + } else { + #Warteliste kein Sitzplatz + #$sitzplatz3 = get_sitzplatz($nachname3, $vorname3); + #$split3 = explode("|", $sitzplatz3); + #$reihe3 = $split3[0]; + #$platz3 = $split3[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, warteliste, warteliste_grund, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname3', '$vorname3', 'Y', '$warteliste_grund', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid3 = $db->insert_id; + $crypt3 = rawurlencode( + cryption("$bid3|$nachname3|$termin", "e") + ); + } + } + if ($nachname4 != "") { + if ($return = doppelanmelder($termin, $vorname4, $nachname4)) { + $crypt4 = "$return"; + } else { + #Warteliste kein Sitzplatz + #$sitzplatz4 = get_sitzplatz($nachname4, $vorname4); + #$split4 = explode("|", $sitzplatz4); + #$reihe4 = $split4[0]; + #$platz4 = $split4[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, warteliste, warteliste_grund, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname4', '$vorname4', 'Y', '$warteliste_grund', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid4 = $db->insert_id; + $crypt4 = rawurlencode( + cryption("$bid4|$nachname4|$termin", "e") + ); + } + } + if ($nachname5 != "") { + if ($return = doppelanmelder($termin, $vorname5, $nachname5)) { + $crypt5 = "$return"; + } else { + #Warteliste kein Sitzplatz + #$sitzplatz5 = get_sitzplatz($nachname5, $vorname5); + #$split5 = explode("|", $sitzplatz5); + #$reihe5 = $split5[0]; + #$platz5 = $split5[1]; + $sql1 = $db->query( + "insert into jumi_buchung (tid, nachname, vorname, warteliste, warteliste_grund, mail, lfd_haushalt, save_date) VALUES('$termin', '$nachname5', '$vorname5', 'Y', '$warteliste_grund', '$mail', '$lfd_haushalt', '$datum')" + ); + $bid5 = $db->insert_id; + $crypt5 = rawurlencode( + cryption("$bid5|$nachname5|$termin", "e") + ); + } + } + #Anzahl der gemeldeten Haushalte überschritten? + #kritische_haushalte($termin); + + if (isset($_SESSION["mail"]) and $mail != "") { + $query_termin = $db->query("SELECT date_format(datum, '%d.%m.%Y - %H:%i') beginn, hinweis, fellbach_gd + FROM jumi_termine + WHERE tid = $termin + LIMIT 1 + "); + $row_termin = $query_termin->fetch_array(); + + $empfaenger = "$mail"; + $betreff = "Anmeldung zur Warteliste für den Gottesdienst am $row_termin[beginn] Uhr"; + $text = " + + + Anmeldung zur Warteliste für den Gottesdienst + + + + Guten Tag!

    + Sie haben sich auf die Warteliste in der neuapostolischen Kirche Weinstadt-Beutelsbach angemeldet.
    + Nachfolgend finden Sie die hinterlegten Daten: +
    +
    + + + + + + + + + + + "; + if ($nachname1 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname1"; + $vname[] = "$vorname1"; + } + if ($nachname2 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname2"; + $vname[] = "$vorname2"; + } + if ($nachname3 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname3"; + $vname[] = "$vorname3"; + } + if ($nachname4 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname4"; + $vname[] = "$vorname4"; + } + if ($nachname5 != "") { + $text .= " + + + + + "; + $nname[] = "$nachname5"; + $vname[] = "$vorname5"; + } + $text .= " + +
    + + Datum: + + + + $row_termin[beginn]"; + if ($row_termin["hinweis"] != "") { + $text .= " ($row_termin[hinweis])"; + } + $text .= " + +
    +   + +   + +   +
    + + Person 1: + + + + $nachname1, $vorname1 + + + Abmeldung +
    + + Person 2: + + + + $nachname2, $vorname2 + + + Abmeldung +
    + + Person 3: + + + + $nachname3, $vorname3 + + + Abmeldung +
    + + Person 4: + + + + $nachname4, $vorname4 + + + Abmeldung +
    + + Person 5: + + + + $nachname5, $vorname5 + + + Abmeldung +
    +
    + Dies ist keine Zusage für die Anmeldung zum Gottesdienst. Diese Mail bestätigt einen Warteplatz. +
    + Eine Zusage zum Gottesdienst kommt in einer separater Mail. +
    + Checken Sie Ihren Maileingang am Samstagabend. Sollten Sie bis dahin keine Zusage erhalten haben ist leider kein Platz mehr verfügbar! +
    +
    +
    + Bitte melden Sie sich rechtzeitig von der Warteliste ab, falls Sie nicht zum Gottesdienst kommen können! +
    +
    + Link zur Registrierung: Registrierung zum Gottesdienst +

    + Diese Mail wurde automatisch generiert!
    + Antworten Sie daher nicht auf diese Mail
    +
    + Vielen Dank + + "; + $text = stripslashes($text); + + if ($row_termin["fellbach_gd"] == "N") { + $headers = "MIME-Version: 1.0\n"; + #$headers .= "Content-type: text/html; charset=iso-8859-1\n"; + $headers .= "Content-type: text/html; charset=utf-8\n"; + $headers .= + "From: Warteliste \n"; + #$headers .= "Bcc: \n"; + $return = @mail($empfaenger, $betreff, $text, $headers); + } else { + require_once "./mpdf/vendor/autoload.php"; + $mpdf = new \Mpdf\Mpdf([ + "mode" => "utf-8", + "format" => "A4", + "orientation" => "P", + "margin_top" => 10, + "margin_bottom" => 20, + "margin_left" => 10, + "margin_right" => 16, + "default_font" => "arial", + ]); + $buffer = + ''; + $buffer .= " + "; + $cnt = 0; + for ($i = 0; $i < count($nname); $i++) { + if ($cnt == 3) { + $buffer .= ""; + } + $qr_id = generate_qr_by_name($nname[$i], $vname[$i]); + if ($qr_id != "NA") { + $buffer .= + " + "; + } else { + $buffer .= " + "; + } + if ($cnt == 3) { + #$buffer.=""; + $cnt = 0; + } + + $cnt++; + } + $buffer .= " + +
    + QR-Code zur Erfassung der Gottesdienstteilnehmer in der Neuapostolischen Kirche Fellbach
    +
    +
    + $qr_id +

    $vname[$i] $nname[$i]


    + Dieser QR-Code dient lediglich zur Einlasskontrolle in die KircheFellbach und enthält keine persönlichen Daten.

    + Neuapostolische Kirche Fellbach
    + Kastanienweg 5
    + 70734 Fellbach +
    + Kein QR Code vorhanden! +
    +

    $vname[$i] $nname[$i]

    +
    +
    "; + $mpdf->WriteHTML($buffer); + $mpdf->Output( + "./admin/pdfs/QR_Codes_Fellbach_$nachname1.pdf", + F + ); + + $pdfLocation = "./admin/pdfs/QR_Codes_Fellbach_$nachname1.pdf"; // file location + $pdfName = "QR_Codes_Fellbach_$nachname1.pdf"; // pdf file name recipient will get + $filetype = "application/pdf"; // type + + // create headers and mime boundry + $eol = PHP_EOL; + $semi_rand = md5(time()); + $mime_boundary = "==Multipart_Boundary_x{$semi_rand}x"; + $headers = + "From: Gottesdienstregistrierung $eol" . + "MIME-Version: 1.0$eol" . + "Content-Type: multipart/mixed;$eol" . + " boundary=\"$mime_boundary\""; + + // add html message body + $message = + "--$mime_boundary$eol" . + "Content-Type: text/html; charset=\"utf-8\"$eol" . + "Content-Transfer-Encoding: 7bit$eol$eol" . + $text . + $eol; + + // fetch pdf + $file = fopen($pdfLocation, "rb"); + $data = fread($file, filesize($pdfLocation)); + fclose($file); + $pdf = chunk_split(base64_encode($data)); + + // attach pdf to email + $message .= + "--$mime_boundary$eol" . + "Content-Type: $filetype;$eol" . + " name=\"$pdfName\"$eol" . + "Content-Disposition: attachment;$eol" . + " filename=\"$pdfName\"$eol" . + "Content-Transfer-Encoding: base64$eol$eol" . + $pdf . + $eol . + "--$mime_boundary--"; + + // Send the email + $return = @mail($empfaenger, $betreff, $message, $headers); + unlink($pdfLocation); + } + } + } + + session_destroy(); +} + +$smarty->assign("action", "$action"); +$smarty->display("$template/$templatename"); +?> diff --git a/jquery/AUTHORS.txt b/jquery/AUTHORS.txt new file mode 100644 index 0000000..eba9048 --- /dev/null +++ b/jquery/AUTHORS.txt @@ -0,0 +1,333 @@ +Authors ordered by first contribution +A list of current team members is available at http://jqueryui.com/about + +Paul Bakaus +Richard Worth +Yehuda Katz +Sean Catchpole +John Resig +Tane Piper +Dmitri Gaskin +Klaus Hartl +Stefan Petre +Gilles van den Hoven +Micheil Bryan Smith +Jörn Zaefferer +Marc Grabanski +Keith Wood +Brandon Aaron +Scott González +Eduardo Lundgren +Aaron Eisenberger +Joan Piedra +Bruno Basto +Remy Sharp +Bohdan Ganicky +David Bolter +Chi Cheng +Ca-Phun Ung +Ariel Flesler +Maggie Wachs +Scott Jehl +Todd Parker +Andrew Powell +Brant Burnett +Douglas Neiner +Paul Irish +Ralph Whitbeck +Thibault Duplessis +Dominique Vincent +Jack Hsu +Adam Sontag +Carl Fürstenberg +Kevin Dalman +Alberto Fernández Capel +Jacek Jędrzejewski (http://jacek.jedrzejewski.name) +Ting Kuei +Samuel Cormier-Iijima +Jon Palmer +Ben Hollis +Justin MacCarthy +Eyal Kobrigo +Tiago Freire +Diego Tres +Holger Rüprich +Ziling Zhao +Mike Alsup +Robson Braga Araujo +Pierre-Henri Ausseil +Christopher McCulloh +Andrew Newcomb +Lim Chee Aun +Jorge Barreiro +Daniel Steigerwald +John Firebaugh +John Enters +Andrey Kapitcyn +Dmitry Petrov +Eric Hynds +Chairat Sunthornwiphat +Josh Varner +Stéphane Raimbault +Jay Merrifield +J. Ryan Stinnett +Peter Heiberg +Alex Dovenmuehle +Jamie Gegerson +Raymond Schwartz +Phillip Barnes +Kyle Wilkinson +Khaled AlHourani +Marian Rudzynski +Jean-Francois Remy +Doug Blood +Filippo Cavallarin +Heiko Henning +Aliaksandr Rahalevich +Mario Visic +Xavi Ramirez +Max Schnur +Saji Nediyanchath +Corey Frang +Aaron Peterson +Ivan Peters +Mohamed Cherif Bouchelaghem +Marcos Sousa +Michael DellaNoce +George Marshall +Tobias Brunner +Martin Solli +David Petersen +Dan Heberden +William Kevin Manire +Gilmore Davidson +Michael Wu +Adam Parod +Guillaume Gautreau +Marcel Toele +Dan Streetman +Matt Hoskins +Giovanni Giacobbi +Kyle Florence +Pavol Hluchý +Hans Hillen +Mark Johnson +Trey Hunner +Shane Whittet +Edward A Faulkner +Adam Baratz +Kato Kazuyoshi +Eike Send +Kris Borchers +Eddie Monge +Israel Tsadok +Carson McDonald +Jason Davies +Garrison Locke +David Murdoch +Benjamin Scott Boyle +Jesse Baird +Jonathan Vingiano +Dylan Just +Hiroshi Tomita +Glenn Goodrich +Tarafder Ashek-E-Elahi +Ryan Neufeld +Marc Neuwirth +Philip Graham +Benjamin Sterling +Wesley Walser +Kouhei Sutou +Karl Kirch +Chris Kelly +Jason Oster +Felix Nagel +Alexander Polomoshnov +David Leal +Igor Milla +Dave Methvin +Florian Gutmann +Marwan Al Jubeh +Milan Broum +Sebastian Sauer +Gaëtan Muller +Michel Weimerskirch +William Griffiths +Stojce Slavkovski +David Soms +David De Sloovere +Michael P. Jung +Shannon Pekary +Dan Wellman +Matthew Edward Hutton +James Khoury +Rob Loach +Alberto Monteiro +Alex Rhea +Krzysztof Rosiński +Ryan Olton +Genie <386@mail.com> +Rick Waldron +Ian Simpson +Lev Kitsis +TJ VanToll +Justin Domnitz +Douglas Cerna +Bert ter Heide +Jasvir Nagra +Yuriy Khabarov <13real008@gmail.com> +Harri Kilpiö +Lado Lomidze +Amir E. Aharoni +Simon Sattes +Jo Liss +Guntupalli Karunakar +Shahyar Ghobadpour +Lukasz Lipinski +Timo Tijhof +Jason Moon +Martin Frost +Eneko Illarramendi +EungJun Yi +Courtland Allen +Viktar Varvanovich +Danny Trunk +Pavel Stetina +Michael Stay +Steven Roussey +Michael Hollis +Lee Rowlands +Timmy Willison +Karl Swedberg +Baoju Yuan +Maciej Mroziński +Luis Dalmolin +Mark Aaron Shirley +Martin Hoch +Jiayi Yang +Philipp Benjamin Köppchen +Sindre Sorhus +Bernhard Sirlinger +Jared A. Scheel +Rafael Xavier de Souza +John Chen +Robert Beuligmann +Dale Kocian +Mike Sherov +Andrew Couch +Marc-Andre Lafortune +Nate Eagle +David Souther +Mathias Stenbom +Sergey Kartashov +Avinash R +Ethan Romba +Cory Gackenheimer +Juan Pablo Kaniefsky +Roman Salnikov +Anika Henke +Samuel Bovée +Fabrício Matté +Viktor Kojouharov +Pawel Maruszczyk (http://hrabstwo.net) +Pavel Selitskas +Bjørn Johansen +Matthieu Penant +Dominic Barnes +David Sullivan +Thomas Jaggi +Vahid Sohrabloo +Travis Carden +Bruno M. Custódio +Nathanael Silverman +Christian Wenz +Steve Urmston +Zaven Muradyan +Woody Gilk +Zbigniew Motyka +Suhail Alkowaileet +Toshi MARUYAMA +David Hansen +Brian Grinstead +Christian Klammer +Steven Luscher +Gan Eng Chin +Gabriel Schulhof +Alexander Schmitz +Vilhjálmur Skúlason +Siebrand Mazeland +Mohsen Ekhtiari +Pere Orga +Jasper de Groot +Stephane Deschamps +Jyoti Deka +Andrei Picus +Ondrej Novy +Jacob McCutcheon +Monika Piotrowicz +Imants Horsts +Eric Dahl +Dave Stein +Dylan Barrell +Daniel DeGroff +Michael Wiencek +Thomas Meyer +Ruslan Yakhyaev +Brian J. Dowling +Ben Higgins +Yermo Lamers +Patrick Stapleton +Trisha Crowley +Usman Akeju +Rodrigo Menezes +Jacques Perrault +Frederik Elvhage +Will Holley +Uri Gilad +Richard Gibson +Simen Bekkhus +Chen Eshchar +Bruno Pérel +Mohammed Alshehri +Lisa Seacat DeLuca +Anne-Gaelle Colom +Adam Foster +Luke Page +Daniel Owens +Michael Orchard +Marcus Warren +Nils Heuermann +Marco Ziech +Patricia Juarez +Ben Mosher +Ablay Keldibek +Thomas Applencourt +Jiabao Wu +Eric Lee Carraway +Victor Homyakov +Myeongjin Lee +Liran Sharir +Weston Ruter +Mani Mishra +Hannah Methvin +Leonardo Balter +Benjamin Albert +Michał Gołębiowski +Alyosha Pushak +Fahad Ahmad +Matt Brundage +Francesc Baeta +Piotr Baran +Mukul Hase +Konstantin Dinev +Rand Scullard +Dan Strohl +Maksim Ryzhikov +Amine HADDAD +Amanpreet Singh +Alexey Balchunas +Peter Kehl +Peter Dave Hello +Johannes Schäfer +Ville Skyttä +Ryan Oriecuia diff --git a/jquery/LICENSE.txt b/jquery/LICENSE.txt new file mode 100644 index 0000000..989dacc --- /dev/null +++ b/jquery/LICENSE.txt @@ -0,0 +1,43 @@ +Copyright jQuery Foundation and other contributors, https://jquery.org/ + +This software consists of voluntary contributions made by many +individuals. For exact contribution history, see the revision history +available at https://github.com/jquery/jquery-ui + +The following license applies to all parts of this software except as +documented below: + +==== + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +==== + +Copyright and related rights for sample code are waived via CC0. Sample +code is defined as all source code contained within the demos directory. + +CC0: http://creativecommons.org/publicdomain/zero/1.0/ + +==== + +All files located in the node_modules and external directories are +externally maintained libraries used by this software which have their +own licenses; we recommend you read them, as their terms may differ from +the terms above. diff --git a/jquery/bootstrap.min.css b/jquery/bootstrap.min.css new file mode 100644 index 0000000..ca98845 --- /dev/null +++ b/jquery/bootstrap.min.css @@ -0,0 +1,5740 @@ +/*! * Bootstrap v3.3.6 (http://getbootstrap.com) * Copyright 2011-2015 Twitter, Inc. * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{ + display:block +} +audio,canvas,progress,video{ + display:inline-block; + vertical-align:baseline +} +audio:not([controls]){ + display:none; + height:0 +} +[hidden],template{ + display:none +} +a{ + background-color:transparent +} +a:active,a:hover{ + outline:0 +} +abbr[title]{ + border-bottom:1px dotted +} +b,strong{ + font-weight:700 +} +dfn{ + font-style:italic +} +h1{ + margin:.67em 0; + font-size:2em +} +mark{ + color:#000; + background:#ff0 +} +small{ + font-size:80% +} +sub,sup{ + position:relative; + font-size:75%; + line-height:0; + vertical-align:baseline +} +sup{ + top:-.5em +} +sub{ + bottom:-.25em +} +img{ + border:0 +} +svg:not(:root){ + overflow:hidden +} +figure{ + margin:1em 40px +} +hr{ + height:0; + -webkit-box-sizing:content-box; + -moz-box-sizing:content-box; + box-sizing:content-box +} +pre{ + overflow:auto +} +code,kbd,pre,samp{ + font-family:monospace,monospace; + font-size:1em +} +button,input,optgroup,select,textarea{ + margin:0; + font:inherit; + color:inherit +} +button{ + overflow:visible +} +button,select{ + text-transform:none +} +button,html input[type=button],input[type=reset],input[type=submit]{ + -webkit-appearance:button; + cursor:pointer +} +button[disabled],html input[disabled]{ + cursor:default +} +button::-moz-focus-inner,input::-moz-focus-inner{ + padding:0; + border:0 +} +input{ + line-height:normal +} +input[type=checkbox],input[type=radio]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box; + padding:0 +} +input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{ + height:auto +} +input[type=search]{ + -webkit-box-sizing:content-box; + -moz-box-sizing:content-box; + box-sizing:content-box; + -webkit-appearance:textfield +} +input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{ + -webkit-appearance:none +} + + +textarea{ + overflow:auto +} +optgroup{ + font-weight:700 +} +table{ + border-spacing:0; + border-collapse:collapse +} +td,th{ + padding:0 +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print{ + *,:after,:before{ + color:#000!important; + text-shadow:none!important; + background:0 0!important; + -webkit-box-shadow:none!important; + box-shadow:none!important + } + a,a:visited{ + text-decoration:underline + } + a[href]:after{ + content:" (" attr(href) ")" + } + abbr[title]:after{ + content:" (" attr(title) ")" + } + a[href^="javascript:"]:after,a[href^="#"]:after{ + content:"" + } + blockquote,pre{ + border:1px solid #999; + page-break-inside:avoid + } + thead{ + display:table-header-group + } + img,tr{ + page-break-inside:avoid + } + img{ + max-width:100%!important + } + h2,h3,p{ + orphans:3; + widows:3 + } + h2,h3{ + page-break-after:avoid + } + .navbar{ + display:none + } + .btn>.caret,.dropup>.btn>.caret{ + border-top-color:#000!important + } + .label{ + border:1px solid #000 + } + .table{ + border-collapse:collapse!important + } + .table td,.table th{ + background-color:#fff!important + } + .table-bordered td,.table-bordered th{ + border:1px solid #ddd!important + } +} +@font-face{ + font-family:'Glyphicons Halflings'; + src:url(../fonts/glyphicons-halflings-regular.eot); + src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg') +} +.glyphicon{ + position:relative; + top:1px; + display:inline-block; + font-family:'Glyphicons Halflings'; + font-style:normal; + font-weight:400; + line-height:1; + -webkit-font-smoothing:antialiased; + -moz-osx-font-smoothing:grayscale +} +.glyphicon-asterisk:before{ + content:"\002a" +} +.glyphicon-plus:before{ + content:"\002b" +} +.glyphicon-eur:before,.glyphicon-euro:before{ + content:"\20ac" +} +.glyphicon-minus:before{ + content:"\2212" +} +.glyphicon-cloud:before{ + content:"\2601" +} +.glyphicon-envelope:before{ + content:"\2709" +} +.glyphicon-pencil:before{ + content:"\270f" +} +.glyphicon-glass:before{ + content:"\e001" +} +.glyphicon-music:before{ + content:"\e002" +} +.glyphicon-search:before{ + content:"\e003" +} +.glyphicon-heart:before{ + content:"\e005" +} +.glyphicon-star:before{ + content:"\e006" +} +.glyphicon-star-empty:before{ + content:"\e007" +} +.glyphicon-user:before{ + content:"\e008" +} +.glyphicon-film:before{ + content:"\e009" +} +.glyphicon-th-large:before{ + content:"\e010" +} +.glyphicon-th:before{ + content:"\e011" +} +.glyphicon-th-list:before{ + content:"\e012" +} +.glyphicon-ok:before{ + content:"\e013" +} +.glyphicon-remove:before{ + content:"\e014" +} +.glyphicon-zoom-in:before{ + content:"\e015" +} +.glyphicon-zoom-out:before{ + content:"\e016" +} +.glyphicon-off:before{ + content:"\e017" +} +.glyphicon-signal:before{ + content:"\e018" +} +.glyphicon-cog:before{ + content:"\e019" +} +.glyphicon-trash:before{ + content:"\e020" +} +.glyphicon-home:before{ + content:"\e021" +} +.glyphicon-file:before{ + content:"\e022" +} +.glyphicon-time:before{ + content:"\e023" +} +.glyphicon-road:before{ + content:"\e024" +} +.glyphicon-download-alt:before{ + content:"\e025" +} +.glyphicon-download:before{ + content:"\e026" +} +.glyphicon-upload:before{ + content:"\e027" +} +.glyphicon-inbox:before{ + content:"\e028" +} +.glyphicon-play-circle:before{ + content:"\e029" +} +.glyphicon-repeat:before{ + content:"\e030" +} +.glyphicon-refresh:before{ + content:"\e031" +} +.glyphicon-list-alt:before{ + content:"\e032" +} +.glyphicon-lock:before{ + content:"\e033" +} +.glyphicon-flag:before{ + content:"\e034" +} +.glyphicon-headphones:before{ + content:"\e035" +} +.glyphicon-volume-off:before{ + content:"\e036" +} +.glyphicon-volume-down:before{ + content:"\e037" +} +.glyphicon-volume-up:before{ + content:"\e038" +} +.glyphicon-qrcode:before{ + content:"\e039" +} +.glyphicon-barcode:before{ + content:"\e040" +} +.glyphicon-tag:before{ + content:"\e041" +} +.glyphicon-tags:before{ + content:"\e042" +} +.glyphicon-book:before{ + content:"\e043" +} +.glyphicon-bookmark:before{ + content:"\e044" +} +.glyphicon-print:before{ + content:"\e045" +} +.glyphicon-camera:before{ + content:"\e046" +} +.glyphicon-font:before{ + content:"\e047" +} +.glyphicon-bold:before{ + content:"\e048" +} +.glyphicon-italic:before{ + content:"\e049" +} +.glyphicon-text-height:before{ + content:"\e050" +} +.glyphicon-text-width:before{ + content:"\e051" +} +.glyphicon-align-left:before{ + content:"\e052" +} +.glyphicon-align-center:before{ + content:"\e053" +} +.glyphicon-align-right:before{ + content:"\e054" +} +.glyphicon-align-justify:before{ + content:"\e055" +} +.glyphicon-list:before{ + content:"\e056" +} +.glyphicon-indent-left:before{ + content:"\e057" +} +.glyphicon-indent-right:before{ + content:"\e058" +} +.glyphicon-facetime-video:before{ + content:"\e059" +} +.glyphicon-picture:before{ + content:"\e060" +} +.glyphicon-map-marker:before{ + content:"\e062" +} +.glyphicon-adjust:before{ + content:"\e063" +} +.glyphicon-tint:before{ + content:"\e064" +} +.glyphicon-edit:before{ + content:"\e065" +} +.glyphicon-share:before{ + content:"\e066" +} +.glyphicon-check:before{ + content:"\e067" +} +.glyphicon-move:before{ + content:"\e068" +} +.glyphicon-step-backward:before{ + content:"\e069" +} +.glyphicon-fast-backward:before{ + content:"\e070" +} +.glyphicon-backward:before{ + content:"\e071" +} +.glyphicon-play:before{ + content:"\e072" +} +.glyphicon-pause:before{ + content:"\e073" +} +.glyphicon-stop:before{ + content:"\e074" +} +.glyphicon-forward:before{ + content:"\e075" +} +.glyphicon-fast-forward:before{ + content:"\e076" +} +.glyphicon-step-forward:before{ + content:"\e077" +} +.glyphicon-eject:before{ + content:"\e078" +} +.glyphicon-chevron-left:before{ + content:"\e079" +} +.glyphicon-chevron-right:before{ + content:"\e080" +} +.glyphicon-plus-sign:before{ + content:"\e081" +} +.glyphicon-minus-sign:before{ + content:"\e082" +} +.glyphicon-remove-sign:before{ + content:"\e083" +} +.glyphicon-ok-sign:before{ + content:"\e084" +} +.glyphicon-question-sign:before{ + content:"\e085" +} +.glyphicon-info-sign:before{ + content:"\e086" +} +.glyphicon-screenshot:before{ + content:"\e087" +} +.glyphicon-remove-circle:before{ + content:"\e088" +} +.glyphicon-ok-circle:before{ + content:"\e089" +} +.glyphicon-ban-circle:before{ + content:"\e090" +} +.glyphicon-arrow-left:before{ + content:"\e091" +} +.glyphicon-arrow-right:before{ + content:"\e092" +} +.glyphicon-arrow-up:before{ + content:"\e093" +} +.glyphicon-arrow-down:before{ + content:"\e094" +} +.glyphicon-share-alt:before{ + content:"\e095" +} +.glyphicon-resize-full:before{ + content:"\e096" +} +.glyphicon-resize-small:before{ + content:"\e097" +} +.glyphicon-exclamation-sign:before{ + content:"\e101" +} +.glyphicon-gift:before{ + content:"\e102" +} +.glyphicon-leaf:before{ + content:"\e103" +} +.glyphicon-fire:before{ + content:"\e104" +} +.glyphicon-eye-open:before{ + content:"\e105" +} +.glyphicon-eye-close:before{ + content:"\e106" +} +.glyphicon-warning-sign:before{ + content:"\e107" +} +.glyphicon-plane:before{ + content:"\e108" +} +.glyphicon-calendar:before{ + content:"\e109" +} +.glyphicon-random:before{ + content:"\e110" +} +.glyphicon-comment:before{ + content:"\e111" +} +.glyphicon-magnet:before{ + content:"\e112" +} +.glyphicon-chevron-up:before{ + content:"\e113" +} +.glyphicon-chevron-down:before{ + content:"\e114" +} +.glyphicon-retweet:before{ + content:"\e115" +} +.glyphicon-shopping-cart:before{ + content:"\e116" +} +.glyphicon-folder-close:before{ + content:"\e117" +} +.glyphicon-folder-open:before{ + content:"\e118" +} +.glyphicon-resize-vertical:before{ + content:"\e119" +} +.glyphicon-resize-horizontal:before{ + content:"\e120" +} +.glyphicon-hdd:before{ + content:"\e121" +} +.glyphicon-bullhorn:before{ + content:"\e122" +} +.glyphicon-bell:before{ + content:"\e123" +} +.glyphicon-certificate:before{ + content:"\e124" +} +.glyphicon-thumbs-up:before{ + content:"\e125" +} +.glyphicon-thumbs-down:before{ + content:"\e126" +} +.glyphicon-hand-right:before{ + content:"\e127" +} +.glyphicon-hand-left:before{ + content:"\e128" +} +.glyphicon-hand-up:before{ + content:"\e129" +} +.glyphicon-hand-down:before{ + content:"\e130" +} +.glyphicon-circle-arrow-right:before{ + content:"\e131" +} +.glyphicon-circle-arrow-left:before{ + content:"\e132" +} +.glyphicon-circle-arrow-up:before{ + content:"\e133" +} +.glyphicon-circle-arrow-down:before{ + content:"\e134" +} +.glyphicon-globe:before{ + content:"\e135" +} +.glyphicon-wrench:before{ + content:"\e136" +} +.glyphicon-tasks:before{ + content:"\e137" +} +.glyphicon-filter:before{ + content:"\e138" +} +.glyphicon-briefcase:before{ + content:"\e139" +} +.glyphicon-fullscreen:before{ + content:"\e140" +} +.glyphicon-dashboard:before{ + content:"\e141" +} +.glyphicon-paperclip:before{ + content:"\e142" +} +.glyphicon-heart-empty:before{ + content:"\e143" +} +.glyphicon-link:before{ + content:"\e144" +} +.glyphicon-phone:before{ + content:"\e145" +} +.glyphicon-pushpin:before{ + content:"\e146" +} +.glyphicon-usd:before{ + content:"\e148" +} +.glyphicon-gbp:before{ + content:"\e149" +} +.glyphicon-sort:before{ + content:"\e150" +} +.glyphicon-sort-by-alphabet:before{ + content:"\e151" +} +.glyphicon-sort-by-alphabet-alt:before{ + content:"\e152" +} +.glyphicon-sort-by-order:before{ + content:"\e153" +} +.glyphicon-sort-by-order-alt:before{ + content:"\e154" +} +.glyphicon-sort-by-attributes:before{ + content:"\e155" +} +.glyphicon-sort-by-attributes-alt:before{ + content:"\e156" +} +.glyphicon-unchecked:before{ + content:"\e157" +} +.glyphicon-expand:before{ + content:"\e158" +} +.glyphicon-collapse-down:before{ + content:"\e159" +} +.glyphicon-collapse-up:before{ + content:"\e160" +} +.glyphicon-log-in:before{ + content:"\e161" +} +.glyphicon-flash:before{ + content:"\e162" +} +.glyphicon-log-out:before{ + content:"\e163" +} +.glyphicon-new-window:before{ + content:"\e164" +} +.glyphicon-record:before{ + content:"\e165" +} +.glyphicon-save:before{ + content:"\e166" +} +.glyphicon-open:before{ + content:"\e167" +} +.glyphicon-saved:before{ + content:"\e168" +} +.glyphicon-import:before{ + content:"\e169" +} +.glyphicon-export:before{ + content:"\e170" +} +.glyphicon-send:before{ + content:"\e171" +} +.glyphicon-floppy-disk:before{ + content:"\e172" +} +.glyphicon-floppy-saved:before{ + content:"\e173" +} +.glyphicon-floppy-remove:before{ + content:"\e174" +} +.glyphicon-floppy-save:before{ + content:"\e175" +} +.glyphicon-floppy-open:before{ + content:"\e176" +} +.glyphicon-credit-card:before{ + content:"\e177" +} +.glyphicon-transfer:before{ + content:"\e178" +} +.glyphicon-cutlery:before{ + content:"\e179" +} +.glyphicon-header:before{ + content:"\e180" +} +.glyphicon-compressed:before{ + content:"\e181" +} +.glyphicon-earphone:before{ + content:"\e182" +} +.glyphicon-phone-alt:before{ + content:"\e183" +} +.glyphicon-tower:before{ + content:"\e184" +} +.glyphicon-stats:before{ + content:"\e185" +} +.glyphicon-sd-video:before{ + content:"\e186" +} +.glyphicon-hd-video:before{ + content:"\e187" +} +.glyphicon-subtitles:before{ + content:"\e188" +} +.glyphicon-sound-stereo:before{ + content:"\e189" +} +.glyphicon-sound-dolby:before{ + content:"\e190" +} +.glyphicon-sound-5-1:before{ + content:"\e191" +} +.glyphicon-sound-6-1:before{ + content:"\e192" +} +.glyphicon-sound-7-1:before{ + content:"\e193" +} +.glyphicon-copyright-mark:before{ + content:"\e194" +} +.glyphicon-registration-mark:before{ + content:"\e195" +} +.glyphicon-cloud-download:before{ + content:"\e197" +} +.glyphicon-cloud-upload:before{ + content:"\e198" +} +.glyphicon-tree-conifer:before{ + content:"\e199" +} +.glyphicon-tree-deciduous:before{ + content:"\e200" +} +.glyphicon-cd:before{ + content:"\e201" +} +.glyphicon-save-file:before{ + content:"\e202" +} +.glyphicon-open-file:before{ + content:"\e203" +} +.glyphicon-level-up:before{ + content:"\e204" +} +.glyphicon-copy:before{ + content:"\e205" +} +.glyphicon-paste:before{ + content:"\e206" +} +.glyphicon-alert:before{ + content:"\e209" +} +.glyphicon-equalizer:before{ + content:"\e210" +} +.glyphicon-king:before{ + content:"\e211" +} +.glyphicon-queen:before{ + content:"\e212" +} +.glyphicon-pawn:before{ + content:"\e213" +} +.glyphicon-bishop:before{ + content:"\e214" +} +.glyphicon-knight:before{ + content:"\e215" +} +.glyphicon-baby-formula:before{ + content:"\e216" +} +.glyphicon-tent:before{ + content:"\26fa" +} +.glyphicon-blackboard:before{ + content:"\e218" +} +.glyphicon-bed:before{ + content:"\e219" +} +.glyphicon-apple:before{ + content:"\f8ff" +} +.glyphicon-erase:before{ + content:"\e221" +} +.glyphicon-hourglass:before{ + content:"\231b" +} +.glyphicon-lamp:before{ + content:"\e223" +} +.glyphicon-duplicate:before{ + content:"\e224" +} +.glyphicon-piggy-bank:before{ + content:"\e225" +} +.glyphicon-scissors:before{ + content:"\e226" +} +.glyphicon-bitcoin:before{ + content:"\e227" +} +.glyphicon-btc:before{ + content:"\e227" +} +.glyphicon-xbt:before{ + content:"\e227" +} +.glyphicon-yen:before{ + content:"\00a5" +} +.glyphicon-jpy:before{ + content:"\00a5" +} +.glyphicon-ruble:before{ + content:"\20bd" +} +.glyphicon-rub:before{ + content:"\20bd" +} +.glyphicon-scale:before{ + content:"\e230" +} +.glyphicon-ice-lolly:before{ + content:"\e231" +} +.glyphicon-ice-lolly-tasted:before{ + content:"\e232" +} +.glyphicon-education:before{ + content:"\e233" +} +.glyphicon-option-horizontal:before{ + content:"\e234" +} +.glyphicon-option-vertical:before{ + content:"\e235" +} +.glyphicon-menu-hamburger:before{ + content:"\e236" +} +.glyphicon-modal-window:before{ + content:"\e237" +} +.glyphicon-oil:before{ + content:"\e238" +} +.glyphicon-grain:before{ + content:"\e239" +} +.glyphicon-sunglasses:before{ + content:"\e240" +} +.glyphicon-text-size:before{ + content:"\e241" +} +.glyphicon-text-color:before{ + content:"\e242" +} +.glyphicon-text-background:before{ + content:"\e243" +} +.glyphicon-object-align-top:before{ + content:"\e244" +} +.glyphicon-object-align-bottom:before{ + content:"\e245" +} +.glyphicon-object-align-horizontal:before{ + content:"\e246" +} +.glyphicon-object-align-left:before{ + content:"\e247" +} +.glyphicon-object-align-vertical:before{ + content:"\e248" +} +.glyphicon-object-align-right:before{ + content:"\e249" +} +.glyphicon-triangle-right:before{ + content:"\e250" +} +.glyphicon-triangle-left:before{ + content:"\e251" +} +.glyphicon-triangle-bottom:before{ + content:"\e252" +} +.glyphicon-triangle-top:before{ + content:"\e253" +} +.glyphicon-console:before{ + content:"\e254" +} +.glyphicon-superscript:before{ + content:"\e255" +} +.glyphicon-subscript:before{ + content:"\e256" +} +.glyphicon-menu-left:before{ + content:"\e257" +} +.glyphicon-menu-right:before{ + content:"\e258" +} +.glyphicon-menu-down:before{ + content:"\e259" +} +.glyphicon-menu-up:before{ + content:"\e260" +} +*{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +:after,:before{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +html{ + font-size:10px; + -webkit-tap-highlight-color:rgba(0,0,0,0) +} +body{ + font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; + font-size:14px; + line-height:1.42857143; + color:#333; + background-color:#fff +} +button,input,select,textarea{ + font-family:inherit; + font-size:inherit; + line-height:inherit +} +a{ + color:#337ab7; + text-decoration:none +} +a:focus,a:hover{ + color:#23527c; + text-decoration:underline +} +a:focus{ + outline:thin dotted; + outline:5px auto -webkit-focus-ring-color; + outline-offset:-2px +} +figure{ + margin:0 +} +img{ + vertical-align:middle +} +.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{ + display:block; + max-width:100%; + height:auto +} +.img-rounded{ + border-radius:6px +} +.img-thumbnail{ + display:inline-block; + max-width:100%; + height:auto; + padding:4px; + line-height:1.42857143; + background-color:#fff; + border:1px solid #ddd; + border-radius:4px; + -webkit-transition:all .2s ease-in-out; + -o-transition:all .2s ease-in-out; + transition:all .2s ease-in-out +} +.img-circle{ + border-radius:50% +} +hr{ + margin-top:20px; + margin-bottom:20px; + border:0; + border-top:1px solid #eee +} +.sr-only{ + position:absolute; + width:1px; + height:1px; + padding:0; + margin:-1px; + overflow:hidden; + clip:rect(0,0,0,0); + border:0 +} +.sr-only-focusable:active,.sr-only-focusable:focus{ + position:static; + width:auto; + height:auto; + margin:0; + overflow:visible; + clip:auto +} +[role=button]{ + cursor:pointer +} +.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{ + font-family:inherit; + font-weight:500; + line-height:1.1; + color:inherit +} +.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{ + font-weight:400; + line-height:1; + color:#777 +} +.h1,.h2,.h3,h1,h2,h3{ + margin-top:20px; + margin-bottom:10px +} +.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{ + font-size:65% +} +.h4,.h5,.h6,h4,h5,h6{ + margin-top:10px; + margin-bottom:10px +} +.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{ + font-size:75% +} +.h1,h1{ + font-size:36px +} +.h2,h2{ + font-size:30px +} +.h3,h3{ + font-size:24px +} +.h4,h4{ + font-size:18px +} +.h5,h5{ + font-size:14px +} +.h6,h6{ + font-size:12px +} +p{ + margin:0 0 10px +} +.lead{ + margin-bottom:20px; + font-size:16px; + font-weight:300; + line-height:1.4 +} +@media (min-width:768px){ + .lead{ + font-size:21px + } +} +.small,small{ + font-size:85% +} +.mark,mark{ + padding:.2em; + background-color:#fcf8e3 +} +.text-left{ + text-align:left +} +.text-right{ + text-align:right +} +.text-center{ + text-align:center +} +.text-justify{ + text-align:justify +} +.text-nowrap{ + white-space:nowrap +} +.text-lowercase{ + text-transform:lowercase +} +.text-uppercase{ + text-transform:uppercase +} +.text-capitalize{ + text-transform:capitalize +} +.text-muted{ + color:#777 +} +.text-primary{ + color:#337ab7 +} +a.text-primary:focus,a.text-primary:hover{ + color:#286090 +} +.text-success{ + color:#3c763d +} +a.text-success:focus,a.text-success:hover{ + color:#2b542c +} +.text-info{ + color:#31708f +} +a.text-info:focus,a.text-info:hover{ + color:#245269 +} +.text-warning{ + color:#8a6d3b +} +a.text-warning:focus,a.text-warning:hover{ + color:#66512c +} +.text-danger{ + color:#a94442 +} +a.text-danger:focus,a.text-danger:hover{ + color:#843534 +} +.bg-primary{ + color:#fff; + background-color:#337ab7 +} +a.bg-primary:focus,a.bg-primary:hover{ + background-color:#286090 +} +.bg-success{ + background-color:#dff0d8 +} +a.bg-success:focus,a.bg-success:hover{ + background-color:#c1e2b3 +} +.bg-info{ + background-color:#d9edf7 +} +a.bg-info:focus,a.bg-info:hover{ + background-color:#afd9ee +} +.bg-warning{ + background-color:#fcf8e3 +} +a.bg-warning:focus,a.bg-warning:hover{ + background-color:#f7ecb5 +} +.bg-danger{ + background-color:#f2dede +} +a.bg-danger:focus,a.bg-danger:hover{ + background-color:#e4b9b9 +} +.page-header{ + padding-bottom:9px; + margin:40px 0 20px; + border-bottom:1px solid #eee +} +ol,ul{ + margin-top:0; + margin-bottom:10px +} +ol ol,ol ul,ul ol,ul ul{ + margin-bottom:0 +} +.list-unstyled{ + padding-left:0; + list-style:none +} +.list-inline{ + padding-left:0; + margin-left:-5px; + list-style:none +} +.list-inline>li{ + display:inline-block; + padding-right:5px; + padding-left:5px +} +dl{ + margin-top:0; + margin-bottom:20px +} +dd,dt{ + line-height:1.42857143 +} +dt{ + font-weight:700 +} +dd{ + margin-left:0 +} +@media (min-width:768px){ + .dl-horizontal dt{ + float:left; + width:160px; + overflow:hidden; + clear:left; + text-align:right; + text-overflow:ellipsis; + white-space:nowrap + } + .dl-horizontal dd{ + margin-left:180px + } +} +abbr[data-original-title],abbr[title]{ + cursor:help; + border-bottom:1px dotted #777 +} +.initialism{ + font-size:90%; + text-transform:uppercase +} +blockquote{ + padding:10px 20px; + margin:0 0 20px; + font-size:17.5px; + border-left:5px solid #eee +} +blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{ + margin-bottom:0 +} +blockquote .small,blockquote footer,blockquote small{ + display:block; + font-size:80%; + line-height:1.42857143; + color:#777 +} +blockquote .small:before,blockquote footer:before,blockquote small:before{ + content:'\2014 \00A0' +} +.blockquote-reverse,blockquote.pull-right{ + padding-right:15px; + padding-left:0; + text-align:right; + border-right:5px solid #eee; + border-left:0 +} +.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{ + content:'' +} +.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{ + content:'\00A0 \2014' +} +address{ + margin-bottom:20px; + font-style:normal; + line-height:1.42857143 +} +code,kbd,pre,samp{ + font-family:Menlo,Monaco,Consolas,"Courier New",monospace +} +code{ + padding:2px 4px; + font-size:90%; + color:#c7254e; + background-color:#f9f2f4; + border-radius:4px +} +kbd{ + padding:2px 4px; + font-size:90%; + color:#fff; + background-color:#333; + border-radius:3px; + -webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25); + box-shadow:inset 0 -1px 0 rgba(0,0,0,.25) +} +kbd kbd{ + padding:0; + font-size:100%; + font-weight:700; + -webkit-box-shadow:none; + box-shadow:none +} +pre{ + display:block; + padding:9.5px; + margin:0 0 10px; + font-size:13px; + line-height:1.42857143; + color:#333; + word-break:break-all; + word-wrap:break-word; + background-color:#f5f5f5; + border:1px solid #ccc; + border-radius:4px +} +pre code{ + padding:0; + font-size:inherit; + color:inherit; + white-space:pre-wrap; + background-color:transparent; + border-radius:0 +} +.pre-scrollable{ + max-height:340px; + overflow-y:scroll +} +.container{ + padding-right:15px; + padding-left:15px; + margin-right:auto; + margin-left:auto +} +@media (min-width:768px){ + .container{ + width:750px + } +} +@media (min-width:992px){ + .container{ + width:970px + } +} +@media (min-width:1200px){ + .container{ + width:1170px + } +} +.container-fluid{ + padding-right:15px; + padding-left:15px; + margin-right:auto; + margin-left:auto +} +.row{ + margin-right:-15px; + margin-left:-15px +} +.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{ + position:relative; + min-height:1px; + padding-right:15px; + padding-left:15px +} +.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{ + float:left +} +.col-xs-12{ + width:100% +} +.col-xs-11{ + width:91.66666667% +} +.col-xs-10{ + width:83.33333333% +} +.col-xs-9{ + width:75% +} +.col-xs-8{ + width:66.66666667% +} +.col-xs-7{ + width:58.33333333% +} +.col-xs-6{ + width:50% +} +.col-xs-5{ + width:41.66666667% +} +.col-xs-4{ + width:33.33333333% +} +.col-xs-3{ + width:25% +} +.col-xs-2{ + width:16.66666667% +} +.col-xs-1{ + width:8.33333333% +} +.col-xs-pull-12{ + right:100% +} +.col-xs-pull-11{ + right:91.66666667% +} +.col-xs-pull-10{ + right:83.33333333% +} +.col-xs-pull-9{ + right:75% +} +.col-xs-pull-8{ + right:66.66666667% +} +.col-xs-pull-7{ + right:58.33333333% +} +.col-xs-pull-6{ + right:50% +} +.col-xs-pull-5{ + right:41.66666667% +} +.col-xs-pull-4{ + right:33.33333333% +} +.col-xs-pull-3{ + right:25% +} +.col-xs-pull-2{ + right:16.66666667% +} +.col-xs-pull-1{ + right:8.33333333% +} +.col-xs-pull-0{ + right:auto +} +.col-xs-push-12{ + left:100% +} +.col-xs-push-11{ + left:91.66666667% +} +.col-xs-push-10{ + left:83.33333333% +} +.col-xs-push-9{ + left:75% +} +.col-xs-push-8{ + left:66.66666667% +} +.col-xs-push-7{ + left:58.33333333% +} +.col-xs-push-6{ + left:50% +} +.col-xs-push-5{ + left:41.66666667% +} +.col-xs-push-4{ + left:33.33333333% +} +.col-xs-push-3{ + left:25% +} +.col-xs-push-2{ + left:16.66666667% +} +.col-xs-push-1{ + left:8.33333333% +} +.col-xs-push-0{ + left:auto +} +.col-xs-offset-12{ + margin-left:100% +} +.col-xs-offset-11{ + margin-left:91.66666667% +} +.col-xs-offset-10{ + margin-left:83.33333333% +} +.col-xs-offset-9{ + margin-left:75% +} +.col-xs-offset-8{ + margin-left:66.66666667% +} +.col-xs-offset-7{ + margin-left:58.33333333% +} +.col-xs-offset-6{ + margin-left:50% +} +.col-xs-offset-5{ + margin-left:41.66666667% +} +.col-xs-offset-4{ + margin-left:33.33333333% +} +.col-xs-offset-3{ + margin-left:25% +} +.col-xs-offset-2{ + margin-left:16.66666667% +} +.col-xs-offset-1{ + margin-left:8.33333333% +} +.col-xs-offset-0{ + margin-left:0 +} +@media (min-width:768px){ + .col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{ + float:left + } + .col-sm-12{ + width:100% + } + .col-sm-11{ + width:91.66666667% + } + .col-sm-10{ + width:83.33333333% + } + .col-sm-9{ + width:75% + } + .col-sm-8{ + width:66.66666667% + } + .col-sm-7{ + width:58.33333333% + } + .col-sm-6{ + width:50% + } + .col-sm-5{ + width:41.66666667% + } + .col-sm-4{ + width:33.33333333% + } + .col-sm-3{ + width:25% + } + .col-sm-2{ + width:16.66666667% + } + .col-sm-1{ + width:8.33333333% + } + .col-sm-pull-12{ + right:100% + } + .col-sm-pull-11{ + right:91.66666667% + } + .col-sm-pull-10{ + right:83.33333333% + } + .col-sm-pull-9{ + right:75% + } + .col-sm-pull-8{ + right:66.66666667% + } + .col-sm-pull-7{ + right:58.33333333% + } + .col-sm-pull-6{ + right:50% + } + .col-sm-pull-5{ + right:41.66666667% + } + .col-sm-pull-4{ + right:33.33333333% + } + .col-sm-pull-3{ + right:25% + } + .col-sm-pull-2{ + right:16.66666667% + } + .col-sm-pull-1{ + right:8.33333333% + } + .col-sm-pull-0{ + right:auto + } + .col-sm-push-12{ + left:100% + } + .col-sm-push-11{ + left:91.66666667% + } + .col-sm-push-10{ + left:83.33333333% + } + .col-sm-push-9{ + left:75% + } + .col-sm-push-8{ + left:66.66666667% + } + .col-sm-push-7{ + left:58.33333333% + } + .col-sm-push-6{ + left:50% + } + .col-sm-push-5{ + left:41.66666667% + } + .col-sm-push-4{ + left:33.33333333% + } + .col-sm-push-3{ + left:25% + } + .col-sm-push-2{ + left:16.66666667% + } + .col-sm-push-1{ + left:8.33333333% + } + .col-sm-push-0{ + left:auto + } + .col-sm-offset-12{ + margin-left:100% + } + .col-sm-offset-11{ + margin-left:91.66666667% + } + .col-sm-offset-10{ + margin-left:83.33333333% + } + .col-sm-offset-9{ + margin-left:75% + } + .col-sm-offset-8{ + margin-left:66.66666667% + } + .col-sm-offset-7{ + margin-left:58.33333333% + } + .col-sm-offset-6{ + margin-left:50% + } + .col-sm-offset-5{ + margin-left:41.66666667% + } + .col-sm-offset-4{ + margin-left:33.33333333% + } + .col-sm-offset-3{ + margin-left:25% + } + .col-sm-offset-2{ + margin-left:16.66666667% + } + .col-sm-offset-1{ + margin-left:8.33333333% + } + .col-sm-offset-0{ + margin-left:0 + } +} +@media (min-width:992px){ + .col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{ + float:left + } + .col-md-12{ + width:100% + } + .col-md-11{ + width:91.66666667% + } + .col-md-10{ + width:83.33333333% + } + .col-md-9{ + width:75% + } + .col-md-8{ + width:66.66666667% + } + .col-md-7{ + width:58.33333333% + } + .col-md-6{ + width:50% + } + .col-md-5{ + width:41.66666667% + } + .col-md-4{ + width:33.33333333% + } + .col-md-3{ + width:25% + } + .col-md-2{ + width:16.66666667% + } + .col-md-1{ + width:8.33333333% + } + .col-md-pull-12{ + right:100% + } + .col-md-pull-11{ + right:91.66666667% + } + .col-md-pull-10{ + right:83.33333333% + } + .col-md-pull-9{ + right:75% + } + .col-md-pull-8{ + right:66.66666667% + } + .col-md-pull-7{ + right:58.33333333% + } + .col-md-pull-6{ + right:50% + } + .col-md-pull-5{ + right:41.66666667% + } + .col-md-pull-4{ + right:33.33333333% + } + .col-md-pull-3{ + right:25% + } + .col-md-pull-2{ + right:16.66666667% + } + .col-md-pull-1{ + right:8.33333333% + } + .col-md-pull-0{ + right:auto + } + .col-md-push-12{ + left:100% + } + .col-md-push-11{ + left:91.66666667% + } + .col-md-push-10{ + left:83.33333333% + } + .col-md-push-9{ + left:75% + } + .col-md-push-8{ + left:66.66666667% + } + .col-md-push-7{ + left:58.33333333% + } + .col-md-push-6{ + left:50% + } + .col-md-push-5{ + left:41.66666667% + } + .col-md-push-4{ + left:33.33333333% + } + .col-md-push-3{ + left:25% + } + .col-md-push-2{ + left:16.66666667% + } + .col-md-push-1{ + left:8.33333333% + } + .col-md-push-0{ + left:auto + } + .col-md-offset-12{ + margin-left:100% + } + .col-md-offset-11{ + margin-left:91.66666667% + } + .col-md-offset-10{ + margin-left:83.33333333% + } + .col-md-offset-9{ + margin-left:75% + } + .col-md-offset-8{ + margin-left:66.66666667% + } + .col-md-offset-7{ + margin-left:58.33333333% + } + .col-md-offset-6{ + margin-left:50% + } + .col-md-offset-5{ + margin-left:41.66666667% + } + .col-md-offset-4{ + margin-left:33.33333333% + } + .col-md-offset-3{ + margin-left:25% + } + .col-md-offset-2{ + margin-left:16.66666667% + } + .col-md-offset-1{ + margin-left:8.33333333% + } + .col-md-offset-0{ + margin-left:0 + } +} +@media (min-width:1200px){ + .col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{ + float:left + } + .col-lg-12{ + width:100% + } + .col-lg-11{ + width:91.66666667% + } + .col-lg-10{ + width:83.33333333% + } + .col-lg-9{ + width:75% + } + .col-lg-8{ + width:66.66666667% + } + .col-lg-7{ + width:58.33333333% + } + .col-lg-6{ + width:50% + } + .col-lg-5{ + width:41.66666667% + } + .col-lg-4{ + width:33.33333333% + } + .col-lg-3{ + width:25% + } + .col-lg-2{ + width:16.66666667% + } + .col-lg-1{ + width:8.33333333% + } + .col-lg-pull-12{ + right:100% + } + .col-lg-pull-11{ + right:91.66666667% + } + .col-lg-pull-10{ + right:83.33333333% + } + .col-lg-pull-9{ + right:75% + } + .col-lg-pull-8{ + right:66.66666667% + } + .col-lg-pull-7{ + right:58.33333333% + } + .col-lg-pull-6{ + right:50% + } + .col-lg-pull-5{ + right:41.66666667% + } + .col-lg-pull-4{ + right:33.33333333% + } + .col-lg-pull-3{ + right:25% + } + .col-lg-pull-2{ + right:16.66666667% + } + .col-lg-pull-1{ + right:8.33333333% + } + .col-lg-pull-0{ + right:auto + } + .col-lg-push-12{ + left:100% + } + .col-lg-push-11{ + left:91.66666667% + } + .col-lg-push-10{ + left:83.33333333% + } + .col-lg-push-9{ + left:75% + } + .col-lg-push-8{ + left:66.66666667% + } + .col-lg-push-7{ + left:58.33333333% + } + .col-lg-push-6{ + left:50% + } + .col-lg-push-5{ + left:41.66666667% + } + .col-lg-push-4{ + left:33.33333333% + } + .col-lg-push-3{ + left:25% + } + .col-lg-push-2{ + left:16.66666667% + } + .col-lg-push-1{ + left:8.33333333% + } + .col-lg-push-0{ + left:auto + } + .col-lg-offset-12{ + margin-left:100% + } + .col-lg-offset-11{ + margin-left:91.66666667% + } + .col-lg-offset-10{ + margin-left:83.33333333% + } + .col-lg-offset-9{ + margin-left:75% + } + .col-lg-offset-8{ + margin-left:66.66666667% + } + .col-lg-offset-7{ + margin-left:58.33333333% + } + .col-lg-offset-6{ + margin-left:50% + } + .col-lg-offset-5{ + margin-left:41.66666667% + } + .col-lg-offset-4{ + margin-left:33.33333333% + } + .col-lg-offset-3{ + margin-left:25% + } + .col-lg-offset-2{ + margin-left:16.66666667% + } + .col-lg-offset-1{ + margin-left:8.33333333% + } + .col-lg-offset-0{ + margin-left:0 + } +} +table{ + background-color:transparent +} +caption{ + padding-top:8px; + padding-bottom:8px; + color:#777; + text-align:left +} +th{ + text-align:left +} +.table{ + width:100%; + max-width:100%; + margin-bottom:20px +} +.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{ + padding:8px; + line-height:1.42857143; + vertical-align:top; + border-top:1px solid #ddd +} +.table>thead>tr>th{ + vertical-align:bottom; + border-bottom:2px solid #ddd +} +.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{ + border-top:0 +} +.table>tbody+tbody{ + border-top:2px solid #ddd +} +.table .table{ + background-color:#fff +} +.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{ + padding:5px +} +.table-bordered{ + border:1px solid #ddd +} +.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{ + border:1px solid #ddd +} +.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{ + border-bottom-width:2px +} +.table-striped>tbody>tr:nth-of-type(odd){ + background-color:#f9f9f9 +} +.table-hover>tbody>tr:hover{ + background-color:#f5f5f5 +} +table col[class*=col-]{ + position:static; + display:table-column; + float:none +} +table td[class*=col-],table th[class*=col-]{ + position:static; + display:table-cell; + float:none +} +.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{ + background-color:#f5f5f5 +} +.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{ + background-color:#e8e8e8 +} +.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{ + background-color:#dff0d8 +} +.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{ + background-color:#d0e9c6 +} +.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{ + background-color:#d9edf7 +} +.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{ + background-color:#c4e3f3 +} +.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{ + background-color:#fcf8e3 +} +.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{ + background-color:#faf2cc +} +.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{ + background-color:#f2dede +} +.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{ + background-color:#ebcccc +} +.table-responsive{ + min-height:.01%; + overflow-x:auto +} +@media screen and (max-width:767px){ + .table-responsive{ + width:100%; + margin-bottom:15px; + overflow-y:hidden; + -ms-overflow-style:-ms-autohiding-scrollbar; + border:1px solid #ddd + } + .table-responsive>.table{ + margin-bottom:0 + } + .table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{ + white-space:nowrap + } + .table-responsive>.table-bordered{ + border:0 + } + .table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{ + border-left:0 + } + .table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{ + border-right:0 + } + .table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{ + border-bottom:0 + } +} + + +label{ + display:inline-block; + max-width:100%; + margin-bottom:5px; + font-weight:700 +} +input[type=search]{ + -webkit-box-sizing:border-box; + -moz-box-sizing:border-box; + box-sizing:border-box +} +input[type=checkbox],input[type=radio]{ + margin:4px 0 0; + margin-top:1px\9; + line-height:normal +} +input[type=file]{ + display:block +} +input[type=range]{ + display:block; + width:100% +} +select[multiple],select[size]{ + height:auto +} +input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{ + outline:thin dotted; + outline:5px auto -webkit-focus-ring-color; + outline-offset:-2px +} +output{ + display:block; + padding-top:7px; + font-size:14px; + line-height:1.42857143; + color:#555 +} +.form-control{ + display:block; + width:100%; + height:34px; + padding:6px 12px; + font-size:14px; + line-height:1.42857143; + color:#555; + background-color:#fff; + background-image:none; + border:1px solid #ccc; + border-radius:4px; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + -webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s; + -o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s; + transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s +} +.form-control:focus{ + border-color:#66afe9; + outline:0; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6) +} +.form-control::-moz-placeholder{ + color:#999; + opacity:1 +} +.form-control:-ms-input-placeholder{ + color:#999 +} +.form-control::-webkit-input-placeholder{ + color:#999 +} +.form-control::-ms-expand{ + background-color:transparent; + border:0 +} +.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{ + background-color:#eee; + opacity:1 +} +.form-control[disabled],fieldset[disabled] .form-control{ + cursor:not-allowed +} +textarea.form-control{ + height:auto +} +input[type=search]{ + -webkit-appearance:none +} +@media screen and (-webkit-min-device-pixel-ratio:0){ + input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{ + line-height:34px + } + .input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],input[type=date].input-sm,input[type=time].input-sm,input[type=datetime-local].input-sm,input[type=month].input-sm{ + line-height:30px + } + .input-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{ + line-height:46px + } +} +.form-group{ + margin-bottom:15px +} +.checkbox,.radio{ + position:relative; + display:block; + margin-top:10px; + margin-bottom:10px +} +.checkbox label,.radio label{ + min-height:20px; + padding-left:20px; + margin-bottom:0; + font-weight:400; + cursor:pointer +} +.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{ + position:absolute; + margin-top:4px\9; + margin-left:-20px +} +.checkbox+.checkbox,.radio+.radio{ + margin-top:-5px +} +.checkbox-inline,.radio-inline{ + position:relative; + display:inline-block; + padding-left:20px; + margin-bottom:0; + font-weight:400; + vertical-align:middle; + cursor:pointer +} +.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{ + margin-top:0; + margin-left:10px +} +fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{ + cursor:not-allowed +} +.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{ + cursor:not-allowed +} +.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{ + cursor:not-allowed +} +.form-control-static{ + min-height:34px; + padding-top:7px; + padding-bottom:7px; + margin-bottom:0 +} +.form-control-static.input-lg,.form-control-static.input-sm{ + padding-right:0; + padding-left:0 +} +.input-sm{ + height:30px; + padding:5px 10px; + font-size:12px; + line-height:1.5; + border-radius:3px +} +select.input-sm{ + height:30px; + line-height:30px +} +select[multiple].input-sm,textarea.input-sm{ + height:auto +} +.form-group-sm .form-control{ + height:30px; + padding:5px 10px; + font-size:12px; + line-height:1.5; + border-radius:3px +} +.form-group-sm select.form-control{ + height:30px; + line-height:30px +} +.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{ + height:auto +} +.form-group-sm .form-control-static{ + height:30px; + min-height:32px; + padding:6px 10px; + font-size:12px; + line-height:1.5 +} +.input-lg{ + height:46px; + padding:10px 16px; + font-size:18px; + line-height:1.3333333; + border-radius:6px +} +select.input-lg{ + height:46px; + line-height:46px +} +select[multiple].input-lg,textarea.input-lg{ + height:auto +} +.form-group-lg .form-control{ + height:46px; + padding:10px 16px; + font-size:18px; + line-height:1.3333333; + border-radius:6px +} +.form-group-lg select.form-control{ + height:46px; + line-height:46px +} +.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{ + height:auto +} +.form-group-lg .form-control-static{ + height:46px; + min-height:38px; + padding:11px 16px; + font-size:18px; + line-height:1.3333333 +} +.has-feedback{ + position:relative +} +.has-feedback .form-control{ + padding-right:42.5px +} +.form-control-feedback{ + position:absolute; + top:0; + right:0; + z-index:2; + display:block; + width:34px; + height:34px; + line-height:34px; + text-align:center; + pointer-events:none +} +.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{ + width:46px; + height:46px; + line-height:46px +} +.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{ + width:30px; + height:30px; + line-height:30px +} +.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{ + color:#3c763d +} +.has-success .form-control{ + border-color:#3c763d; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075) +} +.has-success .form-control:focus{ + border-color:#2b542c; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168; + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168 +} +.has-success .input-group-addon{ + color:#3c763d; + background-color:#dff0d8; + border-color:#3c763d +} +.has-success .form-control-feedback{ + color:#3c763d +} +.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{ + color:#8a6d3b +} +.has-warning .form-control{ + border-color:#8a6d3b; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075) +} +.has-warning .form-control:focus{ + border-color:#66512c; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b; + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b +} +.has-warning .input-group-addon{ + color:#8a6d3b; + background-color:#fcf8e3; + border-color:#8a6d3b +} +.has-warning .form-control-feedback{ + color:#8a6d3b +} +.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{ + color:#a94442 +} +.has-error .form-control{ + border-color:#a94442; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075); + box-shadow:inset 0 1px 1px rgba(0,0,0,.075) +} +.has-error .form-control:focus{ + border-color:#843534; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483; + box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483 +} +.has-error .input-group-addon{ + color:#a94442; + background-color:#f2dede; + border-color:#a94442 +} +.has-error .form-control-feedback{ + color:#a94442 +} +.has-feedback label~.form-control-feedback{ + top:25px +} +.has-feedback label.sr-only~.form-control-feedback{ + top:0 +} +.help-block{ + display:block; + margin-top:5px; + margin-bottom:10px; + color:#737373 +} +@media (min-width:768px){ + .form-inline .form-group{ + display:inline-block; + margin-bottom:0; + vertical-align:middle + } + .form-inline .form-control{ + display:inline-block; + width:auto; + vertical-align:middle + } + .form-inline .form-control-static{ + display:inline-block + } + .form-inline .input-group{ + display:inline-table; + vertical-align:middle + } + .form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{ + width:auto + } + .form-inline .input-group>.form-control{ + width:100% + } + .form-inline .control-label{ + margin-bottom:0; + vertical-align:middle + } + .form-inline .checkbox,.form-inline .radio{ + display:inline-block; + margin-top:0; + margin-bottom:0; + vertical-align:middle + } + .form-inline .checkbox label,.form-inline .radio label{ + padding-left:0 + } + .form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{ + position:relative; + margin-left:0 + } + .form-inline .has-feedback .form-control-feedback{ + top:0 + } +} +.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{ + padding-top:7px; + margin-top:0; + margin-bottom:0 +} +.form-horizontal .checkbox,.form-horizontal .radio{ + min-height:27px +} +.form-horizontal .form-group{ + margin-right:-15px; + margin-left:-15px +} +@media (min-width:768px){ + .form-horizontal .control-label{ + padding-top:7px; + margin-bottom:0; + text-align:right + } +} +.form-horizontal .has-feedback .form-control-feedback{ + right:15px +} +@media (min-width:768px){ + .form-horizontal .form-group-lg .control-label{ + padding-top:11px; + font-size:18px + } +} +@media (min-width:768px){ + .form-horizontal .form-group-sm .control-label{ + padding-top:6px; + font-size:12px + } +} +.btn{ + display:inline-block; + padding:6px 12px; + margin-bottom:0; + font-size:14px; + font-weight:400; + line-height:1.42857143; + text-align:center; + white-space:nowrap; + vertical-align:middle; + -ms-touch-action:manipulation; + touch-action:manipulation; + cursor:pointer; + -webkit-user-select:none; + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + background-image:none; + border:1px solid transparent; + border-radius:4px +} +.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{ + outline:thin dotted; + outline:5px auto -webkit-focus-ring-color; + outline-offset:-2px +} +.btn.focus,.btn:focus,.btn:hover{ + color:#333; + text-decoration:none +} +.btn.active,.btn:active{ + background-image:none; + outline:0; + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125) +} +.btn.disabled,.btn[disabled],fieldset[disabled] .btn{ + cursor:not-allowed; + filter:alpha(opacity=65); + -webkit-box-shadow:none; + box-shadow:none; + opacity:.65 +} +a.btn.disabled,fieldset[disabled] a.btn{ + pointer-events:none +} +.btn-default{ + color:#333; + background-color:#fff; + border-color:#ccc +} +.btn-default.focus,.btn-default:focus{ + color:#333; + background-color:#e6e6e6; + border-color:#8c8c8c +} +.btn-default:hover{ + color:#333; + background-color:#e6e6e6; + border-color:#adadad +} +.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{ + color:#333; + background-color:#e6e6e6; + border-color:#adadad +} +.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{ + color:#333; + background-color:#d4d4d4; + border-color:#8c8c8c +} +.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{ + background-image:none +} +.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{ + background-color:#fff; + border-color:#ccc +} +.btn-default .badge{ + color:#fff; + background-color:#333 +} +.btn-primary{ + color:#fff; + background-color:#337ab7; + border-color:#2e6da4 +} +.btn-primary.focus,.btn-primary:focus{ + color:#fff; + background-color:#286090; + border-color:#122b40 +} +.btn-primary:hover{ + color:#fff; + background-color:#286090; + border-color:#204d74 +} +.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{ + color:#fff; + background-color:#286090; + border-color:#204d74 +} +.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{ + color:#fff; + background-color:#204d74; + border-color:#122b40 +} +.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{ + background-image:none +} +.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{ + background-color:#337ab7; + border-color:#2e6da4 +} +.btn-primary .badge{ + color:#337ab7; + background-color:#fff +} +.btn-success{ + color:#fff; + background-color:#5cb85c; + border-color:#4cae4c +} +.btn-success.focus,.btn-success:focus{ + color:#fff; + background-color:#449d44; + border-color:#255625 +} +.btn-success:hover{ + color:#fff; + background-color:#449d44; + border-color:#398439 +} +.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{ + color:#fff; + background-color:#449d44; + border-color:#398439 +} +.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{ + color:#fff; + background-color:#398439; + border-color:#255625 +} +.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{ + background-image:none +} +.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{ + background-color:#5cb85c; + border-color:#4cae4c +} +.btn-success .badge{ + color:#5cb85c; + background-color:#fff +} +.btn-info{ + color:#fff; + background-color:#5bc0de; + border-color:#46b8da +} +.btn-info.focus,.btn-info:focus{ + color:#fff; + background-color:#31b0d5; + border-color:#1b6d85 +} +.btn-info:hover{ + color:#fff; + background-color:#31b0d5; + border-color:#269abc +} +.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{ + color:#fff; + background-color:#31b0d5; + border-color:#269abc +} +.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{ + color:#fff; + background-color:#269abc; + border-color:#1b6d85 +} +.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{ + background-image:none +} +.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{ + background-color:#5bc0de; + border-color:#46b8da +} +.btn-info .badge{ + color:#5bc0de; + background-color:#fff +} +.btn-warning{ + color:#fff; + background-color:#f0ad4e; + border-color:#eea236 +} +.btn-warning.focus,.btn-warning:focus{ + color:#fff; + background-color:#ec971f; + border-color:#985f0d +} +.btn-warning:hover{ + color:#fff; + background-color:#ec971f; + border-color:#d58512 +} +.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{ + color:#fff; + background-color:#ec971f; + border-color:#d58512 +} +.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{ + color:#fff; + background-color:#d58512; + border-color:#985f0d +} +.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{ + background-image:none +} +.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{ + background-color:#f0ad4e; + border-color:#eea236 +} +.btn-warning .badge{ + color:#f0ad4e; + background-color:#fff +} +.btn-danger{ + color:#fff; + background-color:#d9534f; + border-color:#d43f3a +} +.btn-danger.focus,.btn-danger:focus{ + color:#fff; + background-color:#c9302c; + border-color:#761c19 +} +.btn-danger:hover{ + color:#fff; + background-color:#c9302c; + border-color:#ac2925 +} +.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{ + color:#fff; + background-color:#c9302c; + border-color:#ac2925 +} +.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{ + color:#fff; + background-color:#ac2925; + border-color:#761c19 +} +.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{ + background-image:none +} +.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{ + background-color:#d9534f; + border-color:#d43f3a +} +.btn-danger .badge{ + color:#d9534f; + background-color:#fff +} +.btn-link{ + font-weight:400; + color:#337ab7; + border-radius:0 +} +.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{ + background-color:transparent; + -webkit-box-shadow:none; + box-shadow:none +} +.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{ + border-color:transparent +} +.btn-link:focus,.btn-link:hover{ + color:#23527c; + text-decoration:underline; + background-color:transparent +} +.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{ + color:#777; + text-decoration:none +} +.btn-group-lg>.btn,.btn-lg{ + padding:10px 16px; + font-size:18px; + line-height:1.3333333; + border-radius:6px +} +.btn-group-sm>.btn,.btn-sm{ + padding:5px 10px; + font-size:12px; + line-height:1.5; + border-radius:3px +} +.btn-group-xs>.btn,.btn-xs{ + padding:1px 5px; + font-size:12px; + line-height:1.5; + border-radius:3px +} +.btn-block{ + display:block; + width:100% +} +.btn-block+.btn-block{ + margin-top:5px +} +input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{ + width:100% +} +.fade{ + opacity:0; + -webkit-transition:opacity .15s linear; + -o-transition:opacity .15s linear; + transition:opacity .15s linear +} +.fade.in{ + opacity:1 +} +.collapse{ + display:none +} +.collapse.in{ + display:block +} +tr.collapse.in{ + display:table-row +} +tbody.collapse.in{ + display:table-row-group +} +.collapsing{ + position:relative; + height:0; + overflow:hidden; + -webkit-transition-timing-function:ease; + -o-transition-timing-function:ease; + transition-timing-function:ease; + -webkit-transition-duration:.35s; + -o-transition-duration:.35s; + transition-duration:.35s; + -webkit-transition-property:height,visibility; + -o-transition-property:height,visibility; + transition-property:height,visibility +} +.caret{ + display:inline-block; + width:0; + height:0; + margin-left:2px; + vertical-align:middle; + border-top:4px dashed; + border-top:4px solid\9; + border-right:4px solid transparent; + border-left:4px solid transparent +} +.dropdown,.dropup{ + position:relative +} +.dropdown-toggle:focus{ + outline:0 +} +.dropdown-menu{ + position:absolute; + top:100%; + left:0; + z-index:1000; + display:none; + float:left; + min-width:160px; + padding:5px 0; + margin:2px 0 0; + font-size:14px; + text-align:left; + list-style:none; + background-color:#fff; + -webkit-background-clip:padding-box; + background-clip:padding-box; + border:1px solid #ccc; + border:1px solid rgba(0,0,0,.15); + border-radius:4px; + -webkit-box-shadow:0 6px 12px rgba(0,0,0,.175); + box-shadow:0 6px 12px rgba(0,0,0,.175) +} +.dropdown-menu.pull-right{ + right:0; + left:auto +} +.dropdown-menu .divider{ + height:1px; + margin:9px 0; + overflow:hidden; + background-color:#e5e5e5 +} +.dropdown-menu>li>a{ + display:block; + padding:3px 20px; + clear:both; + font-weight:400; + line-height:1.42857143; + color:#333; + white-space:nowrap +} +.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{ + color:#262626; + text-decoration:none; + background-color:#f5f5f5 +} +.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{ + color:#fff; + text-decoration:none; + background-color:#337ab7; + outline:0 +} +.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{ + color:#777 +} +.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{ + text-decoration:none; + cursor:not-allowed; + background-color:transparent; + background-image:none; + filter:progid:DXImageTransform.Microsoft.gradient(enabled=false) +} +.open>.dropdown-menu{ + display:block +} +.open>a{ + outline:0 +} +.dropdown-menu-right{ + right:0; + left:auto +} +.dropdown-menu-left{ + right:auto; + left:0 +} +.dropdown-header{ + display:block; + padding:3px 20px; + font-size:12px; + line-height:1.42857143; + color:#777; + white-space:nowrap +} +.dropdown-backdrop{ + position:fixed; + top:0; + right:0; + bottom:0; + left:0; + z-index:990 +} +.pull-right>.dropdown-menu{ + right:0; + left:auto +} +.dropup .caret,.navbar-fixed-bottom .dropdown .caret{ + content:""; + border-top:0; + border-bottom:4px dashed; + border-bottom:4px solid\9 +} +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{ + top:auto; + bottom:100%; + margin-bottom:2px +} +@media (min-width:768px){ + .navbar-right .dropdown-menu{ + right:0; + left:auto + } + .navbar-right .dropdown-menu-left{ + right:auto; + left:0 + } +} +.btn-group,.btn-group-vertical{ + position:relative; + display:inline-block; + vertical-align:middle +} +.btn-group-vertical>.btn,.btn-group>.btn{ + position:relative; + float:left +} +.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{ + z-index:2 +} +.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{ + margin-left:-1px +} +.btn-toolbar{ + margin-left:-5px +} +.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{ + float:left +} +.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{ + margin-left:5px +} +.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){ + border-radius:0 +} +.btn-group>.btn:first-child{ + margin-left:0 +} +.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){ + border-top-right-radius:0; + border-bottom-right-radius:0 +} +.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){ + border-top-left-radius:0; + border-bottom-left-radius:0 +} +.btn-group>.btn-group{ + float:left +} +.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{ + border-radius:0 +} +.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{ + border-top-right-radius:0; + border-bottom-right-radius:0 +} +.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{ + border-top-left-radius:0; + border-bottom-left-radius:0 +} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{ + outline:0 +} +.btn-group>.btn+.dropdown-toggle{ + padding-right:8px; + padding-left:8px +} +.btn-group>.btn-lg+.dropdown-toggle{ + padding-right:12px; + padding-left:12px +} +.btn-group.open .dropdown-toggle{ + -webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125); + box-shadow:inset 0 3px 5px rgba(0,0,0,.125) +} +.btn-group.open .dropdown-toggle.btn-link{ + -webkit-box-shadow:none; + box-shadow:none +} +.btn .caret{ + margin-left:0 +} +.btn-lg .caret{ + border-width:5px 5px 0; + border-bottom-width:0 +} +.dropup .btn-lg .caret{ + border-width:0 5px 5px +} +.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{ + display:block; + float:none; + width:100%; + max-width:100% +} +.btn-group-vertical>.btn-group>.btn{ + float:none +} +.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{ + margin-top:-1px; + margin-left:0 +} +.btn-group-vertical>.btn:not(:first-child):not(:last-child){ + border-radius:0 +} +.btn-group-vertical>.btn:first-child:not(:last-child){ + border-top-left-radius:4px; + border-top-right-radius:4px; + border-bottom-right-radius:0; + border-bottom-left-radius:0 +} +.btn-group-vertical>.btn:last-child:not(:first-child){ + border-top-left-radius:0; + border-top-right-radius:0; + border-bottom-right-radius:4px; + border-bottom-left-radius:4px +} +.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{ + border-radius:0 +} +.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{ + border-bottom-right-radius:0; + border-bottom-left-radius:0 +} +.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{ + border-top-left-radius:0; + border-top-right-radius:0 +} +.btn-group-justified{ + display:table; + width:100%; + table-layout:fixed; + border-collapse:separate +} +.btn-group-justified>.btn,.btn-group-justified>.btn-group{ + display:table-cell; + float:none; + width:1% +} +.btn-group-justified>.btn-group .btn{ + width:100% +} +.btn-group-justified>.btn-group .dropdown-menu{ + left:auto +} +[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{ + position:absolute; + clip:rect(0,0,0,0); + pointer-events:none +} +.input-group{ + position:relative; + display:table; + border-collapse:separate +} +.input-group[class*=col-]{ + float:none; + padding-right:0; + padding-left:0 +} +.input-group .form-control{ + position:relative; + z-index:2; + float:left; + width:100%; + margin-bottom:0 +} +.input-group .form-control:focus{ + z-index:3 +} +.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{ + height:46px; + padding:10px 16px; + font-size:18px; + line-height:1.3333333; + border-radius:6px +} +select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{ + height:46px; + line-height:46px +} +select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{ + height:auto +} +.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{ + height:30px; + padding:5px 10px; + font-size:12px; + line-height:1.5; + border-radius:3px +} +select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{ + height:30px; + line-height:30px +} +select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{ + height:auto +} +.input-group .form-control,.input-group-addon,.input-group-btn{ + display:table-cell +} +.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){ + border-radius:0 +} +.input-group-addon,.input-group-btn{ + width:1%; + white-space:nowrap; + vertical-align:middle +} +.input-group-addon{ + padding:6px 12px; + font-size:14px; + font-weight:400; + line-height:1; + color:#555; + text-align:center; + background-color:#eee; + border:1px solid #ccc; + border-radius:4px +} +.input-group-addon.input-sm{ + padding:5px 10px; + font-size:12px; + border-radius:3px +} +.input-group-addon.input-lg{ + padding:10px 16px; + font-size:18px; + border-radius:6px +} +.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{ + margin-top:0 +} +.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){ + border-top-right-radius:0; + border-bottom-right-radius:0 +} +.input-group-addon:first-child{ + border-right:0 +} +.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{ + border-top-left-radius:0; + border-bottom-left-radius:0 +} +.input-group-addon:last-child{ + border-left:0 +} +.input-group-btn{ + position:relative; + font-size:0; + white-space:nowrap +} +.input-group-btn>.btn{ + position:relative +} +.input-group-btn>.btn+.btn{ + margin-left:-1px +} +.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{ + z-index:2 +} +.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{ + margin-right:-1px +} +.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{ + z-index:2; + margin-left:-1px +} +.nav{ + padding-left:0; + margin-bottom:0; + list-style:none +} +.nav>li{ + position:relative; + display:block +} +.nav>li>a{ + position:relative; + display:block; + padding:10px 15px +} +.nav>li>a:focus,.nav>li>a:hover{ + text-decoration:none; + background-color:#eee +} +.nav>li.disabled>a{ + color:#777 +} +.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{ + color:#777; + text-decoration:none; + cursor:not-allowed; + background-color:transparent +} +.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{ + background-color:#eee; + border-color:#337ab7 +} +.nav .nav-divider{ + height:1px; + margin:9px 0; + overflow:hidden; + background-color:#e5e5e5 +} +.nav>li>a>img{ + max-width:none +} +.nav-tabs{ + border-bottom:1px solid #ddd +} +.nav-tabs>li{ + float:left; + margin-bottom:-1px +} +.nav-tabs>li>a{ + margin-right:2px; + line-height:1.42857143; + border:1px solid transparent; + border-radius:4px 4px 0 0 +} +.nav-tabs>li>a:hover{ + border-color:#eee #eee #ddd +} +.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{ + color:#555; + cursor:default; + background-color:#fff; + border:1px solid #ddd; + border-bottom-color:transparent +} +.nav-tabs.nav-justified{ + width:100%; + border-bottom:0 +} +.nav-tabs.nav-justified>li{ + float:none +} +.nav-tabs.nav-justified>li>a{ + margin-bottom:5px; + text-align:center +} +.nav-tabs.nav-justified>.dropdown .dropdown-menu{ + top:auto; + left:auto +} +@media (min-width:768px){ + .nav-tabs.nav-justified>li{ + display:table-cell; + width:1% + } + .nav-tabs.nav-justified>li>a{ + margin-bottom:0 + } +} +.nav-tabs.nav-justified>li>a{ + margin-right:0; + border-radius:4px +} +.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{ + border:1px solid #ddd +} +@media (min-width:768px){ + .nav-tabs.nav-justified>li>a{ + border-bottom:1px solid #ddd; + border-radius:4px 4px 0 0 + } + .nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{ + border-bottom-color:#fff + } +} +.nav-pills>li{ + float:left +} +.nav-pills>li>a{ + border-radius:4px +} +.nav-pills>li+li{ + margin-left:2px +} +.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{ + color:#fff; + background-color:#337ab7 +} +.nav-stacked>li{ + float:none +} +.nav-stacked>li+li{ + margin-top:2px; + margin-left:0 +} +.nav-justified{ + width:100% +} +.nav-justified>li{ + float:none +} +.nav-justified>li>a{ + margin-bottom:5px; + text-align:center +} +.nav-justified>.dropdown .dropdown-menu{ + top:auto; + left:auto +} +@media (min-width:768px){ + .nav-justified>li{ + display:table-cell; + width:1% + } + .nav-justified>li>a{ + margin-bottom:0 + } +} +.nav-tabs-justified{ + border-bottom:0 +} +.nav-tabs-justified>li>a{ + margin-right:0; + border-radius:4px +} +.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{ + border:1px solid #ddd +} +@media (min-width:768px){ + .nav-tabs-justified>li>a{ + border-bottom:1px solid #ddd; + border-radius:4px 4px 0 0 + } + .nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{ + border-bottom-color:#fff + } +} +.tab-content>.tab-pane{ + display:none +} +.tab-content>.active{ + display:block +} +.nav-tabs .dropdown-menu{ + margin-top:-1px; + border-top-left-radius:0; + border-top-right-radius:0 +} +.navbar{ + position:relative; + min-height:50px; + margin-bottom:20px; + border:1px solid transparent +} +@media (min-width:768px){ + .navbar{ + border-radius:4px + } +} +@media (min-width:768px){ + .navbar-header{ + float:left + } +} +.navbar-collapse{ + padding-right:15px; + padding-left:15px; + overflow-x:visible; + -webkit-overflow-scrolling:touch; + border-top:1px solid transparent; + -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1); + box-shadow:inset 0 1px 0 rgba(255,255,255,.1) +} +.navbar-collapse.in{ + overflow-y:auto +} +@media (min-width:768px){ + .navbar-collapse{ + width:auto; + border-top:0; + -webkit-box-shadow:none; + box-shadow:none + } + .navbar-collapse.collapse{ + display:block!important; + height:auto!important; + padding-bottom:0; + overflow:visible!important + } + .navbar-collapse.in{ + overflow-y:visible + } + .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{ + padding-right:0; + padding-left:0 + } +} +.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{ + max-height:340px +} +@media (max-device-width:480px) and (orientation:landscape){ + .navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{ + max-height:200px + } +} +.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{ + margin-right:-15px; + margin-left:-15px +} +@media (min-width:768px){ + .container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{ + margin-right:0; + margin-left:0 + } +} +.navbar-static-top{ + z-index:1000; + border-width:0 0 1px +} +@media (min-width:768px){ + .navbar-static-top{ + border-radius:0 + } +} +.navbar-fixed-bottom,.navbar-fixed-top{ + position:fixed; + right:0; + left:0; + z-index:1030 +} +@media (min-width:768px){ + .navbar-fixed-bottom,.navbar-fixed-top{ + border-radius:0 + } +} +.navbar-fixed-top{ + top:0; + border-width:0 0 1px +} +.navbar-fixed-bottom{ + bottom:0; + margin-bottom:0; + border-width:1px 0 0 +} +.navbar-brand{ + float:left; + height:50px; + padding:15px 15px; + font-size:18px; + line-height:20px +} +.navbar-brand:focus,.navbar-brand:hover{ + text-decoration:none +} +.navbar-brand>img{ + display:block +} +@media (min-width:768px){ + .navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{ + margin-left:-15px + } +} +.navbar-toggle{ + position:relative; + float:right; + padding:9px 10px; + margin-top:8px; + margin-right:15px; + margin-bottom:8px; + background-color:transparent; + background-image:none; + border:1px solid transparent; + border-radius:4px +} +.navbar-toggle:focus{ + outline:0 +} +.navbar-toggle .icon-bar{ + display:block; + width:22px; + height:2px; + border-radius:1px +} +.navbar-toggle .icon-bar+.icon-bar{ + margin-top:4px +} +@media (min-width:768px){ + .navbar-toggle{ + display:none + } +} +.navbar-nav{ + margin:7.5px -15px +} +.navbar-nav>li>a{ + padding-top:10px; + padding-bottom:10px; + line-height:20px +} +@media (max-width:767px){ + .navbar-nav .open .dropdown-menu{ + position:static; + float:none; + width:auto; + margin-top:0; + background-color:transparent; + border:0; + -webkit-box-shadow:none; + box-shadow:none + } + .navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{ + padding:5px 15px 5px 25px + } + .navbar-nav .open .dropdown-menu>li>a{ + line-height:20px + } + .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{ + background-image:none + } +} +@media (min-width:768px){ + .navbar-nav{ + float:left; + margin:0 + } + .navbar-nav>li{ + float:left + } + .navbar-nav>li>a{ + padding-top:15px; + padding-bottom:15px + } +} +.navbar-form{ + padding:10px 15px; + margin-top:8px; + margin-right:-15px; + margin-bottom:8px; + margin-left:-15px; + border-top:1px solid transparent; + border-bottom:1px solid transparent; + -webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1); + box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1) +} +@media (min-width:768px){ + .navbar-form .form-group{ + display:inline-block; + margin-bottom:0; + vertical-align:middle + } + .navbar-form .form-control{ + display:inline-block; + width:auto; + vertical-align:middle + } + .navbar-form .form-control-static{ + display:inline-block + } + .navbar-form .input-group{ + display:inline-table; + vertical-align:middle + } + .navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{ + width:auto + } + .navbar-form .input-group>.form-control{ + width:100% + } + .navbar-form .control-label{ + margin-bottom:0; + vertical-align:middle + } + .navbar-form .checkbox,.navbar-form .radio{ + display:inline-block; + margin-top:0; + margin-bottom:0; + vertical-align:middle + } + .navbar-form .checkbox label,.navbar-form .radio label{ + padding-left:0 + } + .navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{ + position:relative; + margin-left:0 + } + .navbar-form .has-feedback .form-control-feedback{ + top:0 + } +} +@media (max-width:767px){ + .navbar-form .form-group{ + margin-bottom:5px + } + .navbar-form .form-group:last-child{ + margin-bottom:0 + } +} +@media (min-width:768px){ + .navbar-form{ + width:auto; + padding-top:0; + padding-bottom:0; + margin-right:0; + margin-left:0; + border:0; + -webkit-box-shadow:none; + box-shadow:none + } +} +.navbar-nav>li>.dropdown-menu{ + margin-top:0; + border-top-left-radius:0; + border-top-right-radius:0 +} +.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{ + margin-bottom:0; + border-top-left-radius:4px; + border-top-right-radius:4px; + border-bottom-right-radius:0; + border-bottom-left-radius:0 +} +.navbar-btn{ + margin-top:8px; + margin-bottom:8px +} +.navbar-btn.btn-sm{ + margin-top:10px; + margin-bottom:10px +} +.navbar-btn.btn-xs{ + margin-top:14px; + margin-bottom:14px +} +.navbar-text{ + margin-top:15px; + margin-bottom:15px +} +@media (min-width:768px){ + .navbar-text{ + float:left; + margin-right:15px; + margin-left:15px + } +} +@media (min-width:768px){ + .navbar-left{ + float:left!important + } + .navbar-right{ + float:right!important; + margin-right:-15px + } + .navbar-right~.navbar-right{ + margin-right:0 + } +} +.navbar-default{ + background-color:#f8f8f8; + border-color:#e7e7e7 +} +.navbar-default .navbar-brand{ + color:#777 +} +.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{ + color:#5e5e5e; + background-color:transparent +} +.navbar-default .navbar-text{ + color:#777 +} +.navbar-default .navbar-nav>li>a{ + color:#777 +} +.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{ + color:#333; + background-color:transparent +} +.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{ + color:#555; + background-color:#e7e7e7 +} +.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{ + color:#ccc; + background-color:transparent +} +.navbar-default .navbar-toggle{ + border-color:#ddd +} +.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{ + background-color:#ddd +} +.navbar-default .navbar-toggle .icon-bar{ + background-color:#888 +} +.navbar-default .navbar-collapse,.navbar-default .navbar-form{ + border-color:#e7e7e7 +} +.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{ + color:#555; + background-color:#e7e7e7 +} +@media (max-width:767px){ + .navbar-default .navbar-nav .open .dropdown-menu>li>a{ + color:#777 + } + .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{ + color:#333; + background-color:transparent + } + .navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{ + color:#555; + background-color:#e7e7e7 + } + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{ + color:#ccc; + background-color:transparent + } +} +.navbar-default .navbar-link{ + color:#777 +} +.navbar-default .navbar-link:hover{ + color:#333 +} +.navbar-default .btn-link{ + color:#777 +} +.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{ + color:#333 +} +.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{ + color:#ccc +} +.navbar-inverse{ + background-color:#222; + border-color:#080808 +} +.navbar-inverse .navbar-brand{ + color:#9d9d9d +} +.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{ + color:#fff; + background-color:transparent +} +.navbar-inverse .navbar-text{ + color:#9d9d9d +} +.navbar-inverse .navbar-nav>li>a{ + color:#9d9d9d +} +.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{ + color:#fff; + background-color:transparent +} +.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{ + color:#fff; + background-color:#080808 +} +.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{ + color:#444; + background-color:transparent +} +.navbar-inverse .navbar-toggle{ + border-color:#333 +} +.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{ + background-color:#333 +} +.navbar-inverse .navbar-toggle .icon-bar{ + background-color:#fff +} +.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{ + border-color:#101010 +} +.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{ + color:#fff; + background-color:#080808 +} +@media (max-width:767px){ + .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{ + border-color:#080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider{ + background-color:#080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a{ + color:#9d9d9d + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{ + color:#fff; + background-color:transparent + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{ + color:#fff; + background-color:#080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{ + color:#444; + background-color:transparent + } +} +.navbar-inverse .navbar-link{ + color:#9d9d9d +} +.navbar-inverse .navbar-link:hover{ + color:#fff +} +.navbar-inverse .btn-link{ + color:#9d9d9d +} +.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{ + color:#fff +} +.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{ + color:#444 +} +.breadcrumb{ + padding:8px 15px; + margin-bottom:20px; + list-style:none; + background-color:#f5f5f5; + border-radius:4px +} +.breadcrumb>li{ + display:inline-block +} +.breadcrumb>li+li:before{ + padding:0 5px; + color:#ccc; + content:"/\00a0" +} +.breadcrumb>.active{ + color:#777 +} +.pagination{ + display:inline-block; + padding-left:0; + margin:20px 0; + border-radius:4px +} +.pagination>li{ + display:inline +} +.pagination>li>a,.pagination>li>span{ + position:relative; + float:left; + padding:6px 12px; + margin-left:-1px; + line-height:1.42857143; + color:#337ab7; + text-decoration:none; + background-color:#fff; + border:1px solid #ddd +} +.pagination>li:first-child>a,.pagination>li:first-child>span{ + margin-left:0; + border-top-left-radius:4px; + border-bottom-left-radius:4px +} +.pagination>li:last-child>a,.pagination>li:last-child>span{ + border-top-right-radius:4px; + border-bottom-right-radius:4px +} +.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{ + z-index:2; + color:#23527c; + background-color:#eee; + border-color:#ddd +} +.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{ + z-index:3; + color:#fff; + cursor:default; + background-color:#337ab7; + border-color:#337ab7 +} +.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{ + color:#777; + cursor:not-allowed; + background-color:#fff; + border-color:#ddd +} +.pagination-lg>li>a,.pagination-lg>li>span{ + padding:10px 16px; + font-size:18px; + line-height:1.3333333 +} +.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{ + border-top-left-radius:6px; + border-bottom-left-radius:6px +} +.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{ + border-top-right-radius:6px; + border-bottom-right-radius:6px +} +.pagination-sm>li>a,.pagination-sm>li>span{ + padding:5px 10px; + font-size:12px; + line-height:1.5 +} +.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{ + border-top-left-radius:3px; + border-bottom-left-radius:3px +} +.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{ + border-top-right-radius:3px; + border-bottom-right-radius:3px +} +.pager{ + padding-left:0; + margin:20px 0; + text-align:center; + list-style:none +} +.pager li{ + display:inline +} +.pager li>a,.pager li>span{ + display:inline-block; + padding:5px 14px; + background-color:#fff; + border:1px solid #ddd; + border-radius:15px +} +.pager li>a:focus,.pager li>a:hover{ + text-decoration:none; + background-color:#eee +} +.pager .next>a,.pager .next>span{ + float:right +} +.pager .previous>a,.pager .previous>span{ + float:left +} +.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{ + color:#777; + cursor:not-allowed; + background-color:#fff +} +.label{ + display:inline; + padding:.2em .6em .3em; + font-size:75%; + font-weight:700; + line-height:1; + color:#fff; + text-align:center; + white-space:nowrap; + vertical-align:baseline; + border-radius:.25em +} +a.label:focus,a.label:hover{ + color:#fff; + text-decoration:none; + cursor:pointer +} +.label:empty{ + display:none +} +.btn .label{ + position:relative; + top:-1px +} +.label-default{ + background-color:#777 +} +.label-default[href]:focus,.label-default[href]:hover{ + background-color:#5e5e5e +} +.label-primary{ + background-color:#337ab7 +} +.label-primary[href]:focus,.label-primary[href]:hover{ + background-color:#286090 +} +.label-success{ + background-color:#5cb85c +} +.label-success[href]:focus,.label-success[href]:hover{ + background-color:#449d44 +} +.label-info{ + background-color:#5bc0de +} +.label-info[href]:focus,.label-info[href]:hover{ + background-color:#31b0d5 +} +.label-warning{ + background-color:#f0ad4e +} +.label-warning[href]:focus,.label-warning[href]:hover{ + background-color:#ec971f +} +.label-danger{ + background-color:#d9534f +} +.label-danger[href]:focus,.label-danger[href]:hover{ + background-color:#c9302c +} +.badge{ + display:inline-block; + min-width:10px; + padding:3px 7px; + font-size:12px; + font-weight:700; + line-height:1; + color:#fff; + text-align:center; + white-space:nowrap; + vertical-align:middle; + background-color:#777; + border-radius:10px +} +.badge:empty{ + display:none +} +.btn .badge{ + position:relative; + top:-1px +} +.btn-group-xs>.btn .badge,.btn-xs .badge{ + top:0; + padding:1px 5px +} +a.badge:focus,a.badge:hover{ + color:#fff; + text-decoration:none; + cursor:pointer +} +.list-group-item.active>.badge,.nav-pills>.active>a>.badge{ + color:#337ab7; + background-color:#fff +} +.list-group-item>.badge{ + float:right +} +.list-group-item>.badge+.badge{ + margin-right:5px +} +.nav-pills>li>a>.badge{ + margin-left:3px +} +.jumbotron{ + padding-top:30px; + padding-bottom:30px; + margin-bottom:30px; + color:inherit; + background-color:#eee +} +.jumbotron .h1,.jumbotron h1{ + color:inherit +} +.jumbotron p{ + margin-bottom:15px; + font-size:21px; + font-weight:200 +} +.jumbotron>hr{ + border-top-color:#d5d5d5 +} +.container .jumbotron,.container-fluid .jumbotron{ + padding-right:15px; + padding-left:15px; + border-radius:6px +} +.jumbotron .container{ + max-width:100% +} +@media screen and (min-width:768px){ + .jumbotron{ + padding-top:48px; + padding-bottom:48px + } + .container .jumbotron,.container-fluid .jumbotron{ + padding-right:60px; + padding-left:60px + } + .jumbotron .h1,.jumbotron h1{ + font-size:63px + } +} +.thumbnail{ + display:block; + padding:4px; + margin-bottom:20px; + line-height:1.42857143; + background-color:#fff; + border:1px solid #ddd; + border-radius:4px; + -webkit-transition:border .2s ease-in-out; + -o-transition:border .2s ease-in-out; + transition:border .2s ease-in-out +} +.thumbnail a>img,.thumbnail>img{ + margin-right:auto; + margin-left:auto +} +a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{ + border-color:#337ab7 +} +.thumbnail .caption{ + padding:9px; + color:#333 +} +.alert{ + padding:15px; + margin-bottom:20px; + border:1px solid transparent; + border-radius:4px +} +.alert h4{ + margin-top:0; + color:inherit +} +.alert .alert-link{ + font-weight:700 +} +.alert>p,.alert>ul{ + margin-bottom:0 +} +.alert>p+p{ + margin-top:5px +} +.alert-dismissable,.alert-dismissible{ + padding-right:35px +} +.alert-dismissable .close,.alert-dismissible .close{ + position:relative; + top:-2px; + right:-21px; + color:inherit +} +.alert-success{ + color:#3c763d; + background-color:#dff0d8; + border-color:#d6e9c6 +} +.alert-success hr{ + border-top-color:#c9e2b3 +} +.alert-success .alert-link{ + color:#2b542c +} +.alert-info{ + color:#31708f; + background-color:#d9edf7; + border-color:#bce8f1 +} +.alert-info hr{ + border-top-color:#a6e1ec +} +.alert-info .alert-link{ + color:#245269 +} +.alert-warning{ + color:#8a6d3b; + background-color:#fcf8e3; + border-color:#faebcc +} +.alert-warning hr{ + border-top-color:#f7e1b5 +} +.alert-warning .alert-link{ + color:#66512c +} +.alert-danger{ + color:#a94442; + background-color:#f2dede; + border-color:#ebccd1 +} +.alert-danger hr{ + border-top-color:#e4b9c0 +} +.alert-danger .alert-link{ + color:#843534 +} +@-webkit-keyframes progress-bar-stripes{ + from{ + background-position:40px 0 + } + to{ + background-position:0 0 + } +} +@-o-keyframes progress-bar-stripes{ + from{ + background-position:40px 0 + } + to{ + background-position:0 0 + } +} +@keyframes progress-bar-stripes{ + from{ + background-position:40px 0 + } + to{ + background-position:0 0 + } +} +.progress{ + height:20px; + margin-bottom:20px; + overflow:hidden; + background-color:#f5f5f5; + border-radius:4px; + -webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1); + box-shadow:inset 0 1px 2px rgba(0,0,0,.1) +} +.progress-bar{ + float:left; + width:0; + height:100%; + font-size:12px; + line-height:20px; + color:#fff; + text-align:center; + background-color:#337ab7; + -webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15); + box-shadow:inset 0 -1px 0 rgba(0,0,0,.15); + -webkit-transition:width .6s ease; + -o-transition:width .6s ease; + transition:width .6s ease +} +.progress-bar-striped,.progress-striped .progress-bar{ + background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + -webkit-background-size:40px 40px; + background-size:40px 40px +} +.progress-bar.active,.progress.active .progress-bar{ + -webkit-animation:progress-bar-stripes 2s linear infinite; + -o-animation:progress-bar-stripes 2s linear infinite; + animation:progress-bar-stripes 2s linear infinite +} +.progress-bar-success{ + background-color:#5cb85c +} +.progress-striped .progress-bar-success{ + background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent) +} +.progress-bar-info{ + background-color:#5bc0de +} +.progress-striped .progress-bar-info{ + background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent) +} +.progress-bar-warning{ + background-color:#f0ad4e +} +.progress-striped .progress-bar-warning{ + background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent) +} +.progress-bar-danger{ + background-color:#d9534f +} +.progress-striped .progress-bar-danger{ + background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent); + background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent) +} +.media{ + margin-top:15px +} +.media:first-child{ + margin-top:0 +} +.media,.media-body{ + overflow:hidden; + zoom:1 +} +.media-body{ + width:10000px +} +.media-object{ + display:block +} +.media-object.img-thumbnail{ + max-width:none +} +.media-right,.media>.pull-right{ + padding-left:10px +} +.media-left,.media>.pull-left{ + padding-right:10px +} +.media-body,.media-left,.media-right{ + display:table-cell; + vertical-align:top +} +.media-middle{ + vertical-align:middle +} +.media-bottom{ + vertical-align:bottom +} +.media-heading{ + margin-top:0; + margin-bottom:5px +} +.media-list{ + padding-left:0; + list-style:none +} +.list-group{ + padding-left:0; + margin-bottom:20px +} +.list-group-item{ + position:relative; + display:block; + padding:10px 15px; + margin-bottom:-1px; + background-color:#fff; + border:1px solid #ddd +} +.list-group-item:first-child{ + border-top-left-radius:4px; + border-top-right-radius:4px +} +.list-group-item:last-child{ + margin-bottom:0; + border-bottom-right-radius:4px; + border-bottom-left-radius:4px +} +a.list-group-item,button.list-group-item{ + color:#555 +} +a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{ + color:#333 +} +a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{ + color:#555; + text-decoration:none; + background-color:#f5f5f5 +} +button.list-group-item{ + width:100%; + text-align:left +} +.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{ + color:#777; + cursor:not-allowed; + background-color:#eee +} +.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{ + color:inherit +} +.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{ + color:#777 +} +.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{ + z-index:2; + color:#fff; + background-color:#337ab7; + border-color:#337ab7 +} +.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{ + color:inherit +} +.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{ + color:#c7ddef +} +.list-group-item-success{ + color:#3c763d; + background-color:#dff0d8 +} +a.list-group-item-success,button.list-group-item-success{ + color:#3c763d +} +a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{ + color:inherit +} +a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{ + color:#3c763d; + background-color:#d0e9c6 +} +a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{ + color:#fff; + background-color:#3c763d; + border-color:#3c763d +} +.list-group-item-info{ + color:#31708f; + background-color:#d9edf7 +} +a.list-group-item-info,button.list-group-item-info{ + color:#31708f +} +a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{ + color:inherit +} +a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{ + color:#31708f; + background-color:#c4e3f3 +} +a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{ + color:#fff; + background-color:#31708f; + border-color:#31708f +} +.list-group-item-warning{ + color:#8a6d3b; + background-color:#fcf8e3 +} +a.list-group-item-warning,button.list-group-item-warning{ + color:#8a6d3b +} +a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{ + color:inherit +} +a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{ + color:#8a6d3b; + background-color:#faf2cc +} +a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{ + color:#fff; + background-color:#8a6d3b; + border-color:#8a6d3b +} +.list-group-item-danger{ + color:#a94442; + background-color:#f2dede +} +a.list-group-item-danger,button.list-group-item-danger{ + color:#a94442 +} +a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{ + color:inherit +} +a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{ + color:#a94442; + background-color:#ebcccc +} +a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{ + color:#fff; + background-color:#a94442; + border-color:#a94442 +} +.list-group-item-heading{ + margin-top:0; + margin-bottom:5px +} +.list-group-item-text{ + margin-bottom:0; + line-height:1.3 +} +.panel{ + margin-bottom:20px; + background-color:#fff; + border:1px solid transparent; + border-radius:4px; + -webkit-box-shadow:0 1px 1px rgba(0,0,0,.05); + box-shadow:0 1px 1px rgba(0,0,0,.05) +} +.panel-body{ + padding:15px +} +.panel-heading{ + padding:10px 15px; + border-bottom:1px solid transparent; + border-top-left-radius:3px; + border-top-right-radius:3px +} +.panel-heading>.dropdown .dropdown-toggle{ + color:inherit +} +.panel-title{ + margin-top:0; + margin-bottom:0; + font-size:16px; + color:inherit +} +.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{ + color:inherit +} +.panel-footer{ + padding:10px 15px; + background-color:#f5f5f5; + border-top:1px solid #ddd; + border-bottom-right-radius:3px; + border-bottom-left-radius:3px +} +.panel>.list-group,.panel>.panel-collapse>.list-group{ + margin-bottom:0 +} +.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{ + border-width:1px 0; + border-radius:0 +} +.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{ + border-top:0; + border-top-left-radius:3px; + border-top-right-radius:3px +} +.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{ + border-bottom:0; + border-bottom-right-radius:3px; + border-bottom-left-radius:3px +} +.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{ + border-top-left-radius:0; + border-top-right-radius:0 +} +.panel-heading+.list-group .list-group-item:first-child{ + border-top-width:0 +} +.list-group+.panel-footer{ + border-top-width:0 +} +.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{ + margin-bottom:0 +} +.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{ + padding-right:15px; + padding-left:15px +} +.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{ + border-top-left-radius:3px; + border-top-right-radius:3px +} +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table:first-child>thead:first-child>tr:first-child{ + border-top-left-radius:3px; + border-top-right-radius:3px +} +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{ + border-top-left-radius:3px +} +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{ + border-top-right-radius:3px +} +.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{ + border-bottom-right-radius:3px; + border-bottom-left-radius:3px +} +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{ + border-bottom-right-radius:3px; + border-bottom-left-radius:3px +} +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{ + border-bottom-left-radius:3px +} +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{ + border-bottom-right-radius:3px +} +.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{ + border-top:1px solid #ddd +} +.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{ + border-top:0 +} +.panel>.table-bordered,.panel>.table-responsive>.table-bordered{ + border:0 +} +.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{ + border-left:0 +} +.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{ + border-right:0 +} +.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{ + border-bottom:0 +} +.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{ + border-bottom:0 +} +.panel>.table-responsive{ + margin-bottom:0; + border:0 +} +.panel-group{ + margin-bottom:20px +} +.panel-group .panel{ + margin-bottom:0; + border-radius:4px +} +.panel-group .panel+.panel{ + margin-top:5px +} +.panel-group .panel-heading{ + border-bottom:0 +} +.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{ + border-top:1px solid #ddd +} +.panel-group .panel-footer{ + border-top:0 +} +.panel-group .panel-footer+.panel-collapse .panel-body{ + border-bottom:1px solid #ddd +} +.panel-default{ + border-color:#ddd +} +.panel-default>.panel-heading{ + color:#333; + background-color:#f5f5f5; + border-color:#ddd +} +.panel-default>.panel-heading+.panel-collapse>.panel-body{ + border-top-color:#ddd +} +.panel-default>.panel-heading .badge{ + color:#f5f5f5; + background-color:#333 +} +.panel-default>.panel-footer+.panel-collapse>.panel-body{ + border-bottom-color:#ddd +} +.panel-primary{ + border-color:#337ab7 +} +.panel-primary>.panel-heading{ + color:#fff; + background-color:#337ab7; + border-color:#337ab7 +} +.panel-primary>.panel-heading+.panel-collapse>.panel-body{ + border-top-color:#337ab7 +} +.panel-primary>.panel-heading .badge{ + color:#337ab7; + background-color:#fff +} +.panel-primary>.panel-footer+.panel-collapse>.panel-body{ + border-bottom-color:#337ab7 +} +.panel-success{ + border-color:#d6e9c6 +} +.panel-success>.panel-heading{ + color:#3c763d; + background-color:#dff0d8; + border-color:#d6e9c6 +} +.panel-success>.panel-heading+.panel-collapse>.panel-body{ + border-top-color:#d6e9c6 +} +.panel-success>.panel-heading .badge{ + color:#dff0d8; + background-color:#3c763d +} +.panel-success>.panel-footer+.panel-collapse>.panel-body{ + border-bottom-color:#d6e9c6 +} +.panel-info{ + border-color:#bce8f1 +} +.panel-info>.panel-heading{ + color:#31708f; + background-color:#d9edf7; + border-color:#bce8f1 +} +.panel-info>.panel-heading+.panel-collapse>.panel-body{ + border-top-color:#bce8f1 +} +.panel-info>.panel-heading .badge{ + color:#d9edf7; + background-color:#31708f +} +.panel-info>.panel-footer+.panel-collapse>.panel-body{ + border-bottom-color:#bce8f1 +} +.panel-warning{ + border-color:#faebcc +} +.panel-warning>.panel-heading{ + color:#8a6d3b; + background-color:#fcf8e3; + border-color:#faebcc +} +.panel-warning>.panel-heading+.panel-collapse>.panel-body{ + border-top-color:#faebcc +} +.panel-warning>.panel-heading .badge{ + color:#fcf8e3; + background-color:#8a6d3b +} +.panel-warning>.panel-footer+.panel-collapse>.panel-body{ + border-bottom-color:#faebcc +} +.panel-danger{ + border-color:#ebccd1 +} +.panel-danger>.panel-heading{ + color:#a94442; + background-color:#f2dede; + border-color:#ebccd1 +} +.panel-danger>.panel-heading+.panel-collapse>.panel-body{ + border-top-color:#ebccd1 +} +.panel-danger>.panel-heading .badge{ + color:#f2dede; + background-color:#a94442 +} +.panel-danger>.panel-footer+.panel-collapse>.panel-body{ + border-bottom-color:#ebccd1 +} +.embed-responsive{ + position:relative; + display:block; + height:0; + padding:0; + overflow:hidden +} +.embed-responsive .embed-responsive-item,.embed-responsive embed,.embed-responsive iframe,.embed-responsive object,.embed-responsive video{ + position:absolute; + top:0; + bottom:0; + left:0; + width:100%; + height:100%; + border:0 +} +.embed-responsive-16by9{ + padding-bottom:56.25% +} +.embed-responsive-4by3{ + padding-bottom:75% +} +.well{ + min-height:20px; + padding:19px; + margin-bottom:20px; + background-color:#f5f5f5; + border:1px solid #e3e3e3; + border-radius:4px; + -webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05); + box-shadow:inset 0 1px 1px rgba(0,0,0,.05) +} +.well blockquote{ + border-color:#ddd; + border-color:rgba(0,0,0,.15) +} +.well-lg{ + padding:24px; + border-radius:6px +} +.well-sm{ + padding:9px; + border-radius:3px +} +.close{ + float:right; + font-size:21px; + font-weight:700; + line-height:1; + color:#000; + text-shadow:0 1px 0 #fff; + filter:alpha(opacity=20); + opacity:.2 +} +.close:focus,.close:hover{ + color:#000; + text-decoration:none; + cursor:pointer; + filter:alpha(opacity=50); + opacity:.5 +} +button.close{ + -webkit-appearance:none; + padding:0; + cursor:pointer; + background:0 0; + border:0 +} +.modal-open{ + overflow:hidden +} +.modal{ + position:fixed; + top:0; + right:0; + bottom:0; + left:0; + z-index:1050; + display:none; + overflow:hidden; + -webkit-overflow-scrolling:touch; + outline:0 +} +.modal.fade .modal-dialog{ + -webkit-transition:-webkit-transform .3s ease-out; + -o-transition:-o-transform .3s ease-out; + transition:transform .3s ease-out; + -webkit-transform:translate(0,-25%); + -ms-transform:translate(0,-25%); + -o-transform:translate(0,-25%); + transform:translate(0,-25%) +} +.modal.in .modal-dialog{ + -webkit-transform:translate(0,0); + -ms-transform:translate(0,0); + -o-transform:translate(0,0); + transform:translate(0,0) +} +.modal-open .modal{ + overflow-x:hidden; + overflow-y:auto +} +.modal-dialog{ + position:relative; + width:auto; + margin:10px +} +.modal-content{ + position:relative; + background-color:#fff; + -webkit-background-clip:padding-box; + background-clip:padding-box; + border:1px solid #999; + border:1px solid rgba(0,0,0,.2); + border-radius:6px; + outline:0; + -webkit-box-shadow:0 3px 9px rgba(0,0,0,.5); + box-shadow:0 3px 9px rgba(0,0,0,.5) +} +.modal-backdrop{ + position:fixed; + top:0; + right:0; + bottom:0; + left:0; + z-index:1040; + background-color:#000 +} +.modal-backdrop.fade{ + filter:alpha(opacity=0); + opacity:0 +} +.modal-backdrop.in{ + filter:alpha(opacity=50); + opacity:.5 +} +.modal-header{ + padding:15px; + border-bottom:1px solid #e5e5e5 +} +.modal-header .close{ + margin-top:-2px +} +.modal-title{ + margin:0; + line-height:1.42857143 +} +.modal-body{ + position:relative; + padding:15px +} +.modal-footer{ + padding:15px; + text-align:right; + border-top:1px solid #e5e5e5 +} +.modal-footer .btn+.btn{ + margin-bottom:0; + margin-left:5px +} +.modal-footer .btn-group .btn+.btn{ + margin-left:-1px +} +.modal-footer .btn-block+.btn-block{ + margin-left:0 +} +.modal-scrollbar-measure{ + position:absolute; + top:-9999px; + width:50px; + height:50px; + overflow:scroll +} +@media (min-width:768px){ + .modal-dialog{ + width:600px; + margin:30px auto + } + .modal-content{ + -webkit-box-shadow:0 5px 15px rgba(0,0,0,.5); + box-shadow:0 5px 15px rgba(0,0,0,.5) + } + .modal-sm{ + width:300px + } +} +@media (min-width:992px){ + .modal-lg{ + width:900px + } +} +.tooltip{ + position:absolute; + z-index:1070; + display:block; + font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; + font-size:12px; + font-style:normal; + font-weight:400; + line-height:1.42857143; + text-align:left; + text-align:start; + text-decoration:none; + text-shadow:none; + text-transform:none; + letter-spacing:normal; + word-break:normal; + word-spacing:normal; + word-wrap:normal; + white-space:normal; + filter:alpha(opacity=0); + opacity:0; + line-break:auto +} +.tooltip.in{ + filter:alpha(opacity=90); + opacity:.9 +} +.tooltip.top{ + padding:5px 0; + margin-top:-3px +} +.tooltip.right{ + padding:0 5px; + margin-left:3px +} +.tooltip.bottom{ + padding:5px 0; + margin-top:3px +} +.tooltip.left{ + padding:0 5px; + margin-left:-3px +} +.tooltip-inner{ + max-width:200px; + padding:3px 8px; + color:#fff; + text-align:center; + background-color:#000; + border-radius:4px +} +.tooltip-arrow{ + position:absolute; + width:0; + height:0; + border-color:transparent; + border-style:solid +} +.tooltip.top .tooltip-arrow{ + bottom:0; + left:50%; + margin-left:-5px; + border-width:5px 5px 0; + border-top-color:#000 +} +.tooltip.top-left .tooltip-arrow{ + right:5px; + bottom:0; + margin-bottom:-5px; + border-width:5px 5px 0; + border-top-color:#000 +} +.tooltip.top-right .tooltip-arrow{ + bottom:0; + left:5px; + margin-bottom:-5px; + border-width:5px 5px 0; + border-top-color:#000 +} +.tooltip.right .tooltip-arrow{ + top:50%; + left:0; + margin-top:-5px; + border-width:5px 5px 5px 0; + border-right-color:#000 +} +.tooltip.left .tooltip-arrow{ + top:50%; + right:0; + margin-top:-5px; + border-width:5px 0 5px 5px; + border-left-color:#000 +} +.tooltip.bottom .tooltip-arrow{ + top:0; + left:50%; + margin-left:-5px; + border-width:0 5px 5px; + border-bottom-color:#000 +} +.tooltip.bottom-left .tooltip-arrow{ + top:0; + right:5px; + margin-top:-5px; + border-width:0 5px 5px; + border-bottom-color:#000 +} +.tooltip.bottom-right .tooltip-arrow{ + top:0; + left:5px; + margin-top:-5px; + border-width:0 5px 5px; + border-bottom-color:#000 +} +.popover{ + position:absolute; + top:0; + left:0; + z-index:1060; + display:none; + max-width:276px; + padding:1px; + font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; + font-size:14px; + font-style:normal; + font-weight:400; + line-height:1.42857143; + text-align:left; + text-align:start; + text-decoration:none; + text-shadow:none; + text-transform:none; + letter-spacing:normal; + word-break:normal; + word-spacing:normal; + word-wrap:normal; + white-space:normal; + background-color:#fff; + -webkit-background-clip:padding-box; + background-clip:padding-box; + border:1px solid #ccc; + border:1px solid rgba(0,0,0,.2); + border-radius:6px; + -webkit-box-shadow:0 5px 10px rgba(0,0,0,.2); + box-shadow:0 5px 10px rgba(0,0,0,.2); + line-break:auto +} +.popover.top{ + margin-top:-10px +} +.popover.right{ + margin-left:10px +} +.popover.bottom{ + margin-top:10px +} +.popover.left{ + margin-left:-10px +} +.popover-title{ + padding:8px 14px; + margin:0; + font-size:14px; + background-color:#f7f7f7; + border-bottom:1px solid #ebebeb; + border-radius:5px 5px 0 0 +} +.popover-content{ + padding:9px 14px +} +.popover>.arrow,.popover>.arrow:after{ + position:absolute; + display:block; + width:0; + height:0; + border-color:transparent; + border-style:solid +} +.popover>.arrow{ + border-width:11px +} +.popover>.arrow:after{ + content:""; + border-width:10px +} +.popover.top>.arrow{ + bottom:-11px; + left:50%; + margin-left:-11px; + border-top-color:#999; + border-top-color:rgba(0,0,0,.25); + border-bottom-width:0 +} +.popover.top>.arrow:after{ + bottom:1px; + margin-left:-10px; + content:" "; + border-top-color:#fff; + border-bottom-width:0 +} +.popover.right>.arrow{ + top:50%; + left:-11px; + margin-top:-11px; + border-right-color:#999; + border-right-color:rgba(0,0,0,.25); + border-left-width:0 +} +.popover.right>.arrow:after{ + bottom:-10px; + left:1px; + content:" "; + border-right-color:#fff; + border-left-width:0 +} +.popover.bottom>.arrow{ + top:-11px; + left:50%; + margin-left:-11px; + border-top-width:0; + border-bottom-color:#999; + border-bottom-color:rgba(0,0,0,.25) +} +.popover.bottom>.arrow:after{ + top:1px; + margin-left:-10px; + content:" "; + border-top-width:0; + border-bottom-color:#fff +} +.popover.left>.arrow{ + top:50%; + right:-11px; + margin-top:-11px; + border-right-width:0; + border-left-color:#999; + border-left-color:rgba(0,0,0,.25) +} +.popover.left>.arrow:after{ + right:1px; + bottom:-10px; + content:" "; + border-right-width:0; + border-left-color:#fff +} +.carousel{ + position:relative +} +.carousel-inner{ + position:relative; + width:100%; + overflow:hidden +} +.carousel-inner>.item{ + position:relative; + display:none; + -webkit-transition:.6s ease-in-out left; + -o-transition:.6s ease-in-out left; + transition:.6s ease-in-out left +} +.carousel-inner>.item>a>img,.carousel-inner>.item>img{ + line-height:1 +} +@media all and (transform-3d),(-webkit-transform-3d){ + .carousel-inner>.item{ + -webkit-transition:-webkit-transform .6s ease-in-out; + -o-transition:-o-transform .6s ease-in-out; + transition:transform .6s ease-in-out; + -webkit-backface-visibility:hidden; + backface-visibility:hidden; + -webkit-perspective:1000px; + perspective:1000px + } + .carousel-inner>.item.active.right,.carousel-inner>.item.next{ + left:0; + -webkit-transform:translate3d(100%,0,0); + transform:translate3d(100%,0,0) + } + .carousel-inner>.item.active.left,.carousel-inner>.item.prev{ + left:0; + -webkit-transform:translate3d(-100%,0,0); + transform:translate3d(-100%,0,0) + } + .carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{ + left:0; + -webkit-transform:translate3d(0,0,0); + transform:translate3d(0,0,0) + } +} +.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{ + display:block +} +.carousel-inner>.active{ + left:0 +} +.carousel-inner>.next,.carousel-inner>.prev{ + position:absolute; + top:0; + width:100% +} +.carousel-inner>.next{ + left:100% +} +.carousel-inner>.prev{ + left:-100% +} +.carousel-inner>.next.left,.carousel-inner>.prev.right{ + left:0 +} +.carousel-inner>.active.left{ + left:-100% +} +.carousel-inner>.active.right{ + left:100% +} +.carousel-control{ + position:absolute; + top:0; + bottom:0; + left:0; + width:15%; + font-size:20px; + color:#fff; + text-align:center; + text-shadow:0 1px 2px rgba(0,0,0,.6); + background-color:rgba(0,0,0,0); + filter:alpha(opacity=50); + opacity:.5 +} +.carousel-control.left{ + background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%); + background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%); + background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001))); + background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat:repeat-x +} +.carousel-control.right{ + right:0; + left:auto; + background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%); + background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%); + background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5))); + background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%); + filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat:repeat-x +} +.carousel-control:focus,.carousel-control:hover{ + color:#fff; + text-decoration:none; + filter:alpha(opacity=90); + outline:0; + opacity:.9 +} +.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{ + position:absolute; + top:50%; + z-index:5; + display:inline-block; + margin-top:-10px +} +.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{ + left:50%; + margin-left:-10px +} +.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{ + right:50%; + margin-right:-10px +} +.carousel-control .icon-next,.carousel-control .icon-prev{ + width:20px; + height:20px; + font-family:serif; + line-height:1 +} +.carousel-control .icon-prev:before{ + content:'\2039' +} +.carousel-control .icon-next:before{ + content:'\203a' +} +.carousel-indicators{ + position:absolute; + bottom:10px; + left:50%; + z-index:15; + width:60%; + padding-left:0; + margin-left:-30%; + text-align:center; + list-style:none +} +.carousel-indicators li{ + display:inline-block; + width:10px; + height:10px; + margin:1px; + text-indent:-999px; + cursor:pointer; + background-color:#000\9; + background-color:rgba(0,0,0,0); + border:1px solid #fff; + border-radius:10px +} +.carousel-indicators .active{ + width:12px; + height:12px; + margin:0; + background-color:#fff +} +.carousel-caption{ + position:absolute; + right:15%; + bottom:20px; + left:15%; + z-index:10; + padding-top:20px; + padding-bottom:20px; + color:#fff; + text-align:center; + text-shadow:0 1px 2px rgba(0,0,0,.6) +} +.carousel-caption .btn{ + text-shadow:none +} +@media screen and (min-width:768px){ + .carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{ + width:30px; + height:30px; + margin-top:-10px; + font-size:30px + } + .carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{ + margin-left:-10px + } + .carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{ + margin-right:-10px + } + .carousel-caption{ + right:20%; + left:20%; + padding-bottom:30px + } + .carousel-indicators{ + bottom:20px + } +} +.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{ + display:table; + content:" " +} +.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{ + clear:both +} +.center-block{ + display:block; + margin-right:auto; + margin-left:auto +} +.pull-right{ + float:right!important +} +.pull-left{ + float:left!important +} +.hide{ + display:none!important +} +.show{ + display:block!important +} +.invisible{ + visibility:hidden +} +.text-hide{ + font:0/0 a; + color:transparent; + text-shadow:none; + background-color:transparent; + border:0 +} +.hidden{ + display:none!important +} +.affix{ + position:fixed +} +@-ms-viewport{ + width:device-width +} +.visible-lg,.visible-md,.visible-sm,.visible-xs{ + display:none!important +} +.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{ + display:none!important +} +@media (max-width:767px){ + .visible-xs{ + display:block!important + } + table.visible-xs{ + display:table!important + } + tr.visible-xs{ + display:table-row!important + } + td.visible-xs,th.visible-xs{ + display:table-cell!important + } +} +@media (max-width:767px){ + .visible-xs-block{ + display:block!important + } +} +@media (max-width:767px){ + .visible-xs-inline{ + display:inline!important + } +} +@media (max-width:767px){ + .visible-xs-inline-block{ + display:inline-block!important + } +} +@media (min-width:768px) and (max-width:991px){ + .visible-sm{ + display:block!important + } + table.visible-sm{ + display:table!important + } + tr.visible-sm{ + display:table-row!important + } + td.visible-sm,th.visible-sm{ + display:table-cell!important + } +} +@media (min-width:768px) and (max-width:991px){ + .visible-sm-block{ + display:block!important + } +} +@media (min-width:768px) and (max-width:991px){ + .visible-sm-inline{ + display:inline!important + } +} +@media (min-width:768px) and (max-width:991px){ + .visible-sm-inline-block{ + display:inline-block!important + } +} +@media (min-width:992px) and (max-width:1199px){ + .visible-md{ + display:block!important + } + table.visible-md{ + display:table!important + } + tr.visible-md{ + display:table-row!important + } + td.visible-md,th.visible-md{ + display:table-cell!important + } +} +@media (min-width:992px) and (max-width:1199px){ + .visible-md-block{ + display:block!important + } +} +@media (min-width:992px) and (max-width:1199px){ + .visible-md-inline{ + display:inline!important + } +} +@media (min-width:992px) and (max-width:1199px){ + .visible-md-inline-block{ + display:inline-block!important + } +} +@media (min-width:1200px){ + .visible-lg{ + display:block!important + } + table.visible-lg{ + display:table!important + } + tr.visible-lg{ + display:table-row!important + } + td.visible-lg,th.visible-lg{ + display:table-cell!important + } +} +@media (min-width:1200px){ + .visible-lg-block{ + display:block!important + } +} +@media (min-width:1200px){ + .visible-lg-inline{ + display:inline!important + } +} +@media (min-width:1200px){ + .visible-lg-inline-block{ + display:inline-block!important + } +} +@media (max-width:767px){ + .hidden-xs{ + display:none!important + } +} +@media (min-width:768px) and (max-width:991px){ + .hidden-sm{ + display:none!important + } +} +@media (min-width:992px) and (max-width:1199px){ + .hidden-md{ + display:none!important + } +} +@media (min-width:1200px){ + .hidden-lg{ + display:none!important + } +} +.visible-print{ + display:none!important +} +@media print{ + .visible-print{ + display:block!important + } + table.visible-print{ + display:table!important + } + tr.visible-print{ + display:table-row!important + } + td.visible-print,th.visible-print{ + display:table-cell!important + } +} +.visible-print-block{ + display:none!important +} +@media print{ + .visible-print-block{ + display:block!important + } +} +.visible-print-inline{ + display:none!important +} +@media print{ + .visible-print-inline{ + display:inline!important + } +} +.visible-print-inline-block{ + display:none!important +} +@media print{ + .visible-print-inline-block{ + display:inline-block!important + } +} +@media print{ + .hidden-print{ + display:none!important + } +} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/jquery/bootstrap.min.js b/jquery/bootstrap.min.js new file mode 100644 index 0000000..aea9164 --- /dev/null +++ b/jquery/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v4.0.0-beta.3 (https://getbootstrap.com) + * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors) + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(i.end)},supportsTransitionEnd:function(){return Boolean(i)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,n,i){for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var o=i[r],a=n[r],l=a&&s.isElement(a)?"element":e(a);if(!new RegExp(o).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+o+'".')}}};return i=!window.QUnit&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,s.supportsTransitionEnd()&&(t.event.special[s.TRANSITION_END]={bindType:i.end,delegateType:i.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),s}(e),a=function(t){var e="alert",n="bs.alert",i="."+n,r=t.fn[e],a={CLOSE:"close"+i,CLOSED:"closed"+i,CLICK_DATA_API:"click"+i+".data-api"},l="alert",h="fade",c="show",u=function(){function e(t){this._element=t}var i=e.prototype;return i.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},i.dispose=function(){t.removeData(this._element,n),this._element=null},i._getRootElement=function(e){var n=o.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l)[0]),i},i._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},i._removeElement=function(e){var n=this;t(e).removeClass(c),o.supportsTransitionEnd()&&t(e).hasClass(h)?t(e).one(o.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150):this._destroyElement(e)},i._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(i){return this.each(function(){var s=t(this),r=s.data(n);r||(r=new e(this),s.data(n,r)),"close"===i&&r[i](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}}]),e}();return t(document).on(a.CLICK_DATA_API,'[data-dismiss="alert"]',u._handleDismiss(new u)),t.fn[e]=u._jQueryInterface,t.fn[e].Constructor=u,t.fn[e].noConflict=function(){return t.fn[e]=r,u._jQueryInterface},u}(e),l=function(t){var e="button",n="bs.button",i="."+n,r=".data-api",o=t.fn[e],a="active",l="btn",h="focus",c='[data-toggle^="button"]',u='[data-toggle="buttons"]',f="input",d=".active",_=".btn",g={CLICK_DATA_API:"click"+i+r,FOCUS_BLUR_DATA_API:"focus"+i+r+" blur"+i+r},m=function(){function e(t){this._element=t}var i=e.prototype;return i.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(u)[0];if(i){var s=t(this._element).find(f)[0];if(s){if("radio"===s.type)if(s.checked&&t(this._element).hasClass(a))e=!1;else{var r=t(i).find(d)[0];r&&t(r).removeClass(a)}if(e){if(s.hasAttribute("disabled")||i.hasAttribute("disabled")||s.classList.contains("disabled")||i.classList.contains("disabled"))return;s.checked=!t(this._element).hasClass(a),t(s).trigger("change")}s.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(a)),e&&t(this._element).toggleClass(a)},i.dispose=function(){t.removeData(this._element,n),this._element=null},e._jQueryInterface=function(i){return this.each(function(){var s=t(this).data(n);s||(s=new e(this),t(this).data(n,s)),"toggle"===i&&s[i]()})},s(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}}]),e}();return t(document).on(g.CLICK_DATA_API,c,function(e){e.preventDefault();var n=e.target;t(n).hasClass(l)||(n=t(n).closest(_)),m._jQueryInterface.call(t(n),"toggle")}).on(g.FOCUS_BLUR_DATA_API,c,function(e){var n=t(e.target).closest(_)[0];t(n).toggleClass(h,/^focus(in)?$/.test(e.type))}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),h=function(t){var e="carousel",n="bs.carousel",i="."+n,a=t.fn[e],l={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},h={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},c="next",u="prev",f="left",d="right",_={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},g="carousel",m="active",p="slide",v="carousel-item-right",E="carousel-item-left",T="carousel-item-next",y="carousel-item-prev",C={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},I=function(){function a(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(C.INDICATORS)[0],this._addEventListeners()}var I=a.prototype;return I.next=function(){this._isSliding||this._slide(c)},I.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},I.prev=function(){this._isSliding||this._slide(u)},I.pause=function(e){e||(this._isPaused=!0),t(this._element).find(C.NEXT_PREV)[0]&&o.supportsTransitionEnd()&&(o.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},I.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},I.to=function(e){var n=this;this._activeElement=t(this._element).find(C.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(_.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?c:u;this._slide(s,this._items[e])}},I.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},I._getConfig=function(t){return t=r({},l,t),o.typeCheckConfig(e,t,h),t},I._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(_.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(_.MOUSEENTER,function(t){return e.pause(t)}).on(_.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(_.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},I._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},I._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(C.ITEM)),this._items.indexOf(e)},I._getItemByDirection=function(t,e){var n=t===c,i=t===u,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===u?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},I._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(C.ACTIVE_ITEM)[0]),r=t.Event(_.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},I._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(C.ACTIVE).removeClass(m);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(m)}},I._slide=function(e,n){var i,s,r,a=this,l=t(this._element).find(C.ACTIVE_ITEM)[0],h=this._getItemIndex(l),u=n||l&&this._getItemByDirection(e,l),g=this._getItemIndex(u),I=Boolean(this._interval);if(e===c?(i=E,s=T,r=f):(i=v,s=y,r=d),u&&t(u).hasClass(m))this._isSliding=!1;else{if(!this._triggerSlideEvent(u,r).isDefaultPrevented()&&l&&u){this._isSliding=!0,I&&this.pause(),this._setActiveIndicatorElement(u);var A=t.Event(_.SLID,{relatedTarget:u,direction:r,from:h,to:g});o.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(u).addClass(s),o.reflow(u),t(l).addClass(i),t(u).addClass(i),t(l).one(o.TRANSITION_END,function(){t(u).removeClass(i+" "+s).addClass(m),t(l).removeClass(m+" "+s+" "+i),a._isSliding=!1,setTimeout(function(){return t(a._element).trigger(A)},0)}).emulateTransitionEnd(600)):(t(l).removeClass(m),t(u).addClass(m),this._isSliding=!1,t(this._element).trigger(A)),I&&this.cycle()}}},a._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},l,t(this).data());"object"==typeof e&&(s=r({},s,e));var o="string"==typeof e?e:s.slide;if(i||(i=new a(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof o){if("undefined"==typeof i[o])throw new Error('No method named "'+o+'"');i[o]()}else s.interval&&(i.pause(),i.cycle())})},a._dataApiClickHandler=function(e){var i=o.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(g)){var l=r({},t(s).data(),t(this).data()),h=this.getAttribute("data-slide-to");h&&(l.interval=!1),a._jQueryInterface.call(t(s),l),h&&t(s).data(n).to(h),e.preventDefault()}}},s(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}}]),a}();return t(document).on(_.CLICK_DATA_API,C.DATA_SLIDE,I._dataApiClickHandler),t(window).on(_.LOAD_DATA_API,function(){t(C.DATA_RIDE).each(function(){var e=t(this);I._jQueryInterface.call(e,e.data())})}),t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),c=function(t){var e="collapse",n="bs.collapse",i="."+n,a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"(string|element)"},c={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},u="show",f="collapse",d="collapsing",_="collapsed",g="width",m="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},v=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s0&&this._triggerArray.push(r)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var a=i.prototype;return a.toggle=function(){t(this._element).hasClass(u)?this.hide():this.show()},a.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u)){var s,r;if(this._parent&&((s=t.makeArray(t(this._parent).children().children(p.ACTIVES))).length||(s=null)),!(s&&(r=t(s).data(n))&&r._isTransitioning)){var a=t.Event(c.SHOW);if(t(this._element).trigger(a),!a.isDefaultPrevented()){s&&(i._jQueryInterface.call(t(s),"hide"),r||t(s).data(n,null));var l=this._getDimension();t(this._element).removeClass(f).addClass(d),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(_).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(d).addClass(f).addClass(u),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(o.supportsTransitionEnd()){var g="scroll"+(l[0].toUpperCase()+l.slice(1));t(this._element).one(o.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[g]+"px"}else h()}}}},a.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",o.reflow(this._element),t(this._element).addClass(d).removeClass(f).removeClass(u),this._triggerArray.length)for(var s=0;s0},h._getPopperConfig=function(){var t=this,e={};"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset;return{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new l(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new Error('No method named "'+e+'"');n[e]()}})},l._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(T)),s=0;s0&&r--,40===e.which&&rdocument.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right

    ',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},d="show",_="out",g={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,INSERTED:"inserted"+a,CLICK:"click"+a,FOCUSIN:"focusin"+a,FOCUSOUT:"focusout"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a},m="fade",p="show",v=".tooltip-inner",E=".arrow",T="hover",y="focus",C="click",I="manual",A=function(){function l(t,e){if("undefined"==typeof n)throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var A=l.prototype;return A.enable=function(){this._isEnabled=!0},A.disable=function(){this._isEnabled=!1},A.toggleEnabled=function(){this._isEnabled=!this._isEnabled},A.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},A.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},A.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),a=o.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&t(r).addClass(m);var h="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,c=this._getAttachment(h);this.addAttachmentClass(c);var u=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(u),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:c,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:E},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var f=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===_&&e._leave(null,e)};o.supportsTransitionEnd()&&t(this.tip).hasClass(m)?t(this.tip).one(o.TRANSITION_END,f).emulateTransitionEnd(l._TRANSITION_DURATION):f()}},A.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==d&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[C]=!1,this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,o.supportsTransitionEnd()&&t(this.tip).hasClass(m)?t(i).one(o.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},A.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},A.isWithContent=function(){return Boolean(this.getTitle())},A.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},A.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},A.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(v),this.getTitle()),e.removeClass(m+" "+p)},A.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},A.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},A._getAttachment=function(t){return u[t.toUpperCase()]},A._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==I){var i=n===T?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===T?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},A._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},A._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?y:T]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===d?n._hoverState=d:(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===d&&n.show()},n.config.delay.show):n.show())},A._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?y:T]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=_,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===_&&n.hide()},n.config.delay.hide):n.hide())},A._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},A._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),o.typeCheckConfig(e,n,this.constructor.DefaultType),n},A._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},A._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(h);null!==n&&n.length>0&&e.removeClass(n.join(""))},A._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},A._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(m),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new l(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new Error('No method named "'+e+'"');n[e]()}})},s(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return f}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return g}},{key:"EVENT_KEY",get:function(){return a}},{key:"DefaultType",get:function(){return c}}]),l}();return t.fn[e]=A._jQueryInterface,t.fn[e].Constructor=A,t.fn[e].noConflict=function(){return t.fn[e]=l,A._jQueryInterface},A}(e),_=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},d.Default,{placement:"right",trigger:"click",content:"",template:''}),h=r({},d.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",_=".popover-body",g={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},m=function(r){function o(){return r.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(o,r);var d=o.prototype;return d.isWithContent=function(){return this.getTitle()||this._getContent()},d.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},d.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},d.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(_),n),e.removeClass(c+" "+u)},d._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},d._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new o(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new Error('No method named "'+e+'"');i[e]()}})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return g}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),o}(d);return t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),g=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,a=t.fn[e],l={offset:10,method:"auto",target:""},h={offset:"number",method:"string",target:"(string|element)"},c={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},u="dropdown-item",f="active",d={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},_="offset",g="position",m=function(){function a(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+d.NAV_LINKS+","+this._config.target+" "+d.LIST_ITEMS+","+this._config.target+" "+d.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(c.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var m=a.prototype;return m.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?g:_,i="auto"===this._config.method?n:this._config.method,s=i===g?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight();t.makeArray(t(this._selector)).map(function(e){var n,r=o.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},m.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},m._getConfig=function(n){if("string"!=typeof(n=r({},l,n)).target){var i=t(n.target).attr("id");i||(i=o.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return o.typeCheckConfig(e,n,h),n},m._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},m._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},m._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},m._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=o,t.Alert=a,t.Button=l,t.Carousel=h,t.Collapse=c,t.Dropdown=u,t.Modal=f,t.Popover=_,t.Scrollspy=g,t.Tab=m,t.Tooltip=d,Object.defineProperty(t,"__esModule",{value:!0})}); +//# sourceMappingURL=bootstrap.min.js.map diff --git a/jquery/controls.js b/jquery/controls.js new file mode 100644 index 0000000..ba70c6e --- /dev/null +++ b/jquery/controls.js @@ -0,0 +1,108 @@ +$(function(){ + /* + * For the sake keeping the code clean and the examples simple this file + * contains only the plugin configuration & callbacks. + * + * UI functions ui_* can be located in: + * - assets/demo/uploader/js/ui-main.js + * - assets/demo/uploader/js/ui-multiple.js + * - assets/demo/uploader/js/ui-single.js + */ + $('#drag-and-drop-zone').dmUploader({ // + url: '/demo/java-script/upload', + maxFileSize: 3000000, // 3 Megs max + auto: false, + queue: false, + onDragEnter: function(){ + // Happens when dragging something over the DnD area + this.addClass('active'); + }, + onDragLeave: function(){ + // Happens when dragging something OUT of the DnD area + this.removeClass('active'); + }, + onInit: function(){ + // Plugin is ready to use + ui_add_log('Penguin initialized :)', 'info'); + }, + onComplete: function(){ + // All files in the queue are processed (success or error) + ui_add_log('All pending tranfers finished'); + }, + onNewFile: function(id, file){ + // When a new file is added using the file selector or the DnD area + ui_add_log('New file added #' + id); + ui_multi_add_file(id, file); + }, + onBeforeUpload: function(id){ + // about tho start uploading a file + ui_add_log('Starting the upload of #' + id); + ui_multi_update_file_status(id, 'uploading', 'Uploading...'); + ui_multi_update_file_progress(id, 0, '', true); + ui_multi_update_file_controls(id, false, true); // change control buttons status + }, + onUploadProgress: function(id, percent){ + // Updating file progress + ui_multi_update_file_progress(id, percent); + }, + onUploadSuccess: function(id, data){ + // A file was successfully uploaded + ui_add_log('Server Response for file #' + id + ': ' + JSON.stringify(data)); + ui_add_log('Upload of file #' + id + ' COMPLETED', 'success'); + ui_multi_update_file_status(id, 'success', 'Upload Complete'); + ui_multi_update_file_progress(id, 100, 'success', false); + ui_multi_update_file_controls(id, false, false); // change control buttons status + }, + onUploadCanceled: function(id) { + // Happens when a file is directly canceled by the user. + ui_multi_update_file_status(id, 'warning', 'Canceled by User'); + ui_multi_update_file_progress(id, 0, 'warning', false); + ui_multi_update_file_controls(id, true, false); + }, + onUploadError: function(id, xhr, status, message){ + // Happens when an upload error happens + ui_multi_update_file_status(id, 'danger', message); + ui_multi_update_file_progress(id, 0, 'danger', false); + ui_multi_update_file_controls(id, true, false, true); // change control buttons status + }, + onFallbackMode: function(){ + // When the browser doesn't support this plugin :( + ui_add_log('Plugin cant be used here, running Fallback callback', 'danger'); + }, + onFileSizeError: function(file){ + ui_add_log('File \'' + file.name + '\' cannot be added: size excess limit', 'danger'); + } + }); + + /* + Global controls + */ + $('#btnApiStart').on('click', function(evt){ + evt.preventDefault(); + + $('#drag-and-drop-zone').dmUploader('start'); + }); + + $('#btnApiCancel').on('click', function(evt){ + evt.preventDefault(); + + $('#drag-and-drop-zone').dmUploader('cancel'); + }); + + /* + Each File element action + */ + $('#files').on('click', 'button.start', function(evt){ + evt.preventDefault(); + + var id = $(this).closest('li.media').data('file-id'); + $('#drag-and-drop-zone').dmUploader('start', id); + }); + + $('#files').on('click', 'button.cancel', function(evt){ + evt.preventDefault(); + + var id = $(this).closest('li.media').data('file-id'); + $('#drag-and-drop-zone').dmUploader('cancel', id); + }); +}); diff --git a/jquery/external/jquery/jquery.js b/jquery/external/jquery/jquery.js new file mode 100644 index 0000000..934b306 --- /dev/null +++ b/jquery/external/jquery/jquery.js @@ -0,0 +1,11008 @@ +/*! + * jQuery JavaScript Library v1.12.4 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2016-05-20T17:17Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +//"use strict"; +var deletedIds = []; + +var document = window.document; + +var slice = deletedIds.slice; + +var concat = deletedIds.concat; + +var push = deletedIds.push; + +var indexOf = deletedIds.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + version = "1.12.4", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1, IE<9 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + each: function( callback ) { + return jQuery.each( this, callback ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map( this, function( elem, i ) { + return callback.call( elem, i, elem ); + } ) ); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: deletedIds.sort, + splice: deletedIds.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var src, copyIsArray, copy, name, options, clone, + target = arguments[ 0 ] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction( target ) ) { + target = {}; + } + + // extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + + // Only deal with non-null/undefined values + if ( ( options = arguments[ i ] ) != null ) { + + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject( copy ) || + ( copyIsArray = jQuery.isArray( copy ) ) ) ) { + + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray( src ) ? src : []; + + } else { + clone = src && jQuery.isPlainObject( src ) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend( { + + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + // See test/unit/core.js for details concerning isFunction. + // Since version 1.3, DOM methods and functions like alert + // aren't supported. They return false on IE (#2968). + isFunction: function( obj ) { + return jQuery.type( obj ) === "function"; + }, + + isArray: Array.isArray || function( obj ) { + return jQuery.type( obj ) === "array"; + }, + + isWindow: function( obj ) { + /* jshint eqeqeq: false */ + return obj != null && obj == obj.window; + }, + + isNumeric: function( obj ) { + + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + var realStringObj = obj && obj.toString(); + return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + isPlainObject: function( obj ) { + var key; + + // Must be an Object. + // Because of IE, we also have to check the presence of the constructor property. + // Make sure that DOM nodes and window objects don't pass through, as well + if ( !obj || jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + try { + + // Not own constructor property must be Object + if ( obj.constructor && + !hasOwn.call( obj, "constructor" ) && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + } catch ( e ) { + + // IE8,9 Will throw exceptions on certain host objects #9897 + return false; + } + + // Support: IE<9 + // Handle iteration over inherited properties before own properties. + if ( !support.ownFirst ) { + for ( key in obj ) { + return hasOwn.call( obj, key ); + } + } + + // Own properties are enumerated firstly, so to speed up, + // if last one is own, then all properties are own. + for ( key in obj ) {} + + return key === undefined || hasOwn.call( obj, key ); + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call( obj ) ] || "object" : + typeof obj; + }, + + // Workarounds based on findings by Jim Driscoll + // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context + globalEval: function( data ) { + if ( data && jQuery.trim( data ) ) { + + // We use execScript on Internet Explorer + // We use an anonymous function so that context is window + // rather than jQuery in Firefox + ( window.execScript || function( data ) { + window[ "eval" ].call( window, data ); // jscs:ignore requireDotNotation + } )( data ); + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + each: function( obj, callback ) { + var length, i = 0; + + if ( isArrayLike( obj ) ) { + length = obj.length; + for ( ; i < length; i++ ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } else { + for ( i in obj ) { + if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) { + break; + } + } + } + + return obj; + }, + + // Support: Android<4.1, IE<9 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArrayLike( Object( arr ) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + var len; + + if ( arr ) { + if ( indexOf ) { + return indexOf.call( arr, elem, i ); + } + + len = arr.length; + i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0; + + for ( ; i < len; i++ ) { + + // Skip accessing in sparse arrays + if ( i in arr && arr[ i ] === elem ) { + return i; + } + } + } + + return -1; + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + while ( j < len ) { + first[ i++ ] = second[ j++ ]; + } + + // Support: IE<9 + // Workaround casting of .length to NaN on otherwise arraylike objects (e.g., NodeLists) + if ( len !== len ) { + while ( second[ j ] !== undefined ) { + first[ i++ ] = second[ j++ ]; + } + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var length, value, + i = 0, + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArrayLike( elems ) ) { + length = elems.length; + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var args, proxy, tmp; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: function() { + return +( new Date() ); + }, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +} ); + +// JSHint would error on this code due to the Symbol not being defined in ES5. +// Defining this global in .jshintrc would create a danger of using the global +// unguarded in another place, it seems safer to just disable JSHint for these +// three lines. +/* jshint ignore: start */ +if ( typeof Symbol === "function" ) { + jQuery.fn[ Symbol.iterator ] = deletedIds[ Symbol.iterator ]; +} +/* jshint ignore: end */ + +// Populate the class2type map +jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ), +function( i, name ) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +} ); + +function isArrayLike( obj ) { + + // Support: iOS 8.2 (not reproducible in simulator) + // `in` check used to prevent JIT error (gh-2145) + // hasOwn isn't used here due to false negatives + // regarding Nodelist length in IE + var length = !!obj && "length" in obj && obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.1 + * http://sizzlejs.com/ + * + * Copyright jQuery Foundation and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2015-10-17 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + + // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + identifier + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + identifier + ")" ), + "CLASS": new RegExp( "^\\.(" + identifier + ")" ), + "TAG": new RegExp( "^(" + identifier + "|[*])" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var m, i, elem, nid, nidselect, match, groups, newSelector, + newContext = context && context.ownerDocument, + + // nodeType defaults to 9, since context defaults to document + nodeType = context ? context.nodeType : 9; + + results = results || []; + + // Return early from calls with invalid selector or context + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + // Try to shortcut find operations (as opposed to filters) in HTML documents + if ( !seed ) { + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + context = context || document; + + if ( documentIsHTML ) { + + // If the selector is sufficiently simple, try using a "get*By*" DOM method + // (excepting DocumentFragment context, where the methods don't exist) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + + // ID selector + if ( (m = match[1]) ) { + + // Document context + if ( nodeType === 9 ) { + if ( (elem = context.getElementById( m )) ) { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE, Opera, Webkit + // TODO: identify versions + // getElementById can match elements by name instead of ID + if ( newContext && (elem = newContext.getElementById( m )) && + contains( context, elem ) && + elem.id === m ) { + + results.push( elem ); + return results; + } + } + + // Type selector + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( (m = match[3]) && support.getElementsByClassName && + context.getElementsByClassName ) { + + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( support.qsa && + !compilerCache[ selector + " " ] && + (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + + if ( nodeType !== 1 ) { + newContext = context; + newSelector = selector; + + // qSA looks outside Element context, which is not what we want + // Thanks to Andrew Dupont for this workaround technique + // Support: IE <=8 + // Exclude object elements + } else if ( context.nodeName.toLowerCase() !== "object" ) { + + // Capture the context ID, setting it first if necessary + if ( (nid = context.getAttribute( "id" )) ) { + nid = nid.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", (nid = expando) ); + } + + // Prefix every selector in the list + groups = tokenize( selector ); + i = groups.length; + nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']"; + while ( i-- ) { + groups[i] = nidselect + " " + toSelector( groups[i] ); + } + newSelector = groups.join( "," ); + + // Expand context for sibling selectors + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || + context; + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch ( qsaError ) { + } finally { + if ( nid === expando ) { + context.removeAttribute( "id" ); + } + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {function(string, object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = arr.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // Return early if doc is invalid or already selected + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Update global variables + document = doc; + docElem = document.documentElement; + documentIsHTML = !isXML( document ); + + // Support: IE 9-11, Edge + // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936) + if ( (parent = document.defaultView) && parent.top !== parent ) { + // Support: IE 11 + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + + // Support: IE 9 - 10 only + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( document.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( document.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !document.getElementsByName || !document.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + return m ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && + elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( document.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = document.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully self-exclusive + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === document ? -1 : + b === document ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return document; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + !compilerCache[ expr + " " ] && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, uniqueCache, outerCache, node, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType, + diff = false; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) { + + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + + // Seek `elem` from a previously-cached index + + // ...in a gzip-friendly way + node = parent; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex && cache[ 2 ]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + uniqueCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + // Use previously-cached element index if available + if ( useCache ) { + // ...in a gzip-friendly way + node = elem; + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + cache = uniqueCache[ type ] || []; + nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ]; + diff = nodeIndex; + } + + // xml :nth-child(...) + // or :nth-last-child(...) or :nth(-last)?-of-type(...) + if ( diff === false ) { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? + node.nodeName.toLowerCase() === name : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || (node[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ node.uniqueID ] || + (outerCache[ node.uniqueID ] = {}); + + uniqueCache[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, uniqueCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + + // Support: IE <9 only + // Defend against cloned attroperties (jQuery gh-1709) + uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {}); + + if ( (oldCache = uniqueCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + uniqueCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context === document || context || outermost; + } + + // Add elements passing elementMatchers directly to results + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: ) matching elements by id + for ( ; i !== len && (elem = elems[i]) != null; i++ ) { + if ( byElement && elem ) { + j = 0; + if ( !context && elem.ownerDocument !== document ) { + setDocument( elem ); + xml = !documentIsHTML; + } + while ( (matcher = elementMatchers[j++]) ) { + if ( matcher( elem, context || document, xml) ) { + results.push( elem ); + break; + } + } + if ( outermost ) { + dirruns = dirrunsUnique; + } + } + + // Track unmatched elements for set filters + if ( bySet ) { + // They will have gone through all possible matchers + if ( (elem = !matcher && elem) ) { + matchedCount--; + } + + // Lengthen the array for every element, matched or not + if ( seed ) { + unmatched.push( elem ); + } + } + } + + // `i` is now the count of elements visited above, and adding it to `matchedCount` + // makes the latter nonnegative. + matchedCount += i; + + // Apply set filters to unmatched elements + // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount` + // equals `i`), unless we didn't visit _any_ elements in the above loop because we have + // no element matchers and no seed. + // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that + // case, which will result in a "00" `matchedCount` that differs from `i` but is also + // numerically zero. + if ( bySet && i !== matchedCount ) { + j = 0; + while ( (matcher = setMatchers[j++]) ) { + matcher( unmatched, setMatched, context, xml ); + } + + if ( seed ) { + // Reintegrate element matches to eliminate the need for sorting + if ( matchedCount > 0 ) { + while ( i-- ) { + if ( !(unmatched[i] || setMatched[i]) ) { + setMatched[i] = pop.call( results ); + } + } + } + + // Discard index placeholder values to get only actual matches + setMatched = condense( setMatched ); + } + + // Add matches to results + push.apply( results, setMatched ); + + // Seedless set matches succeeding multiple successful matchers stipulate sorting + if ( outermost && !seed && setMatched.length > 0 && + ( matchedCount + setMatchers.length ) > 1 ) { + + Sizzle.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) { + var i, + setMatchers = [], + elementMatchers = [], + cached = compilerCache[ selector + " " ]; + + if ( !cached ) { + // Generate a function of recursive functions that can be used to check each element + if ( !match ) { + match = tokenize( selector ); + } + i = match.length; + while ( i-- ) { + cached = matcherFromTokens( match[i] ); + if ( cached[ expando ] ) { + setMatchers.push( cached ); + } else { + elementMatchers.push( cached ); + } + } + + // Cache the compiled function + cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) ); + + // Save selector and tokenization + cached.selector = selector; + } + return cached; +}; + +/** + * A low-level selection function that works with Sizzle's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with Sizzle.compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +select = Sizzle.select = function( selector, context, results, seed ) { + var i, tokens, token, type, find, + compiled = typeof selector === "function" && selector, + match = !seed && tokenize( (selector = compiled.selector || selector) ); + + results = results || []; + + // Try to minimize operations if there is only one selector in the list and no seed + // (the latter of which guarantees us context) + if ( match.length === 1 ) { + + // Reduce context if the leading compound selector is an ID + tokens = match[0] = match[0].slice( 0 ); + if ( tokens.length > 2 && (token = tokens[0]).type === "ID" && + support.getById && context.nodeType === 9 && documentIsHTML && + Expr.relative[ tokens[1].type ] ) { + + context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0]; + if ( !context ) { + return results; + + // Precompiled matchers will still verify ancestry, so step up a level + } else if ( compiled ) { + context = context.parentNode; + } + + selector = selector.slice( tokens.shift().value.length ); + } + + // Fetch a seed set for right-to-left matching + i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length; + while ( i-- ) { + token = tokens[i]; + + // Abort if we hit a combinator + if ( Expr.relative[ (type = token.type) ] ) { + break; + } + if ( (find = Expr.find[ type ]) ) { + // Search, expanding context for leading sibling combinators + if ( (seed = find( + token.matches[0].replace( runescape, funescape ), + rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context + )) ) { + + // If seed is empty or no tokens remain, we can return early + tokens.splice( i, 1 ); + selector = seed.length && toSelector( tokens ); + if ( !selector ) { + push.apply( results, seed ); + return results; + } + + break; + } + } + } + } + + // Compile and execute a filtering function if one is not provided + // Provide `match` to avoid retokenization if we modified the selector above + ( compiled || compile( selector, match ) )( + seed, + context, + !documentIsHTML, + results, + !context || rsibling.test( selector ) && testContext( context.parentNode ) || context + ); + return results; +}; + +// One-time assignments + +// Sort stability +support.sortStable = expando.split("").sort( sortOrder ).join("") === expando; + +// Support: Chrome 14-35+ +// Always assume duplicates if they aren't passed to the comparison function +support.detectDuplicates = !!hasDuplicate; + +// Initialize against the default document +setDocument(); + +// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27) +// Detached nodes confoundingly follow *each other* +support.sortDetached = assert(function( div1 ) { + // Should return 1, but returns 4 (following) + return div1.compareDocumentPosition( document.createElement("div") ) & 1; +}); + +// Support: IE<8 +// Prevent attribute/property "interpolation" +// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx +if ( !assert(function( div ) { + div.innerHTML = ""; + return div.firstChild.getAttribute("href") === "#" ; +}) ) { + addHandle( "type|href|height|width", function( elem, name, isXML ) { + if ( !isXML ) { + return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 ); + } + }); +} + +// Support: IE<9 +// Use defaultValue in place of getAttribute("value") +if ( !support.attributes || !assert(function( div ) { + div.innerHTML = ""; + div.firstChild.setAttribute( "value", "" ); + return div.firstChild.getAttribute( "value" ) === ""; +}) ) { + addHandle( "value", function( elem, name, isXML ) { + if ( !isXML && elem.nodeName.toLowerCase() === "input" ) { + return elem.defaultValue; + } + }); +} + +// Support: IE<9 +// Use getAttributeNode to fetch booleans when getAttribute lies +if ( !assert(function( div ) { + return div.getAttribute("disabled") == null; +}) ) { + addHandle( booleans, function( elem, name, isXML ) { + var val; + if ( !isXML ) { + return elem[ name ] === true ? name.toLowerCase() : + (val = elem.getAttributeNode( name )) && val.specified ? + val.value : + null; + } + }); +} + +return Sizzle; + +})( window ); + + + +jQuery.find = Sizzle; +jQuery.expr = Sizzle.selectors; +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort; +jQuery.text = Sizzle.getText; +jQuery.isXMLDoc = Sizzle.isXML; +jQuery.contains = Sizzle.contains; + + + +var dir = function( elem, dir, until ) { + var matched = [], + truncate = until !== undefined; + + while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) { + if ( elem.nodeType === 1 ) { + if ( truncate && jQuery( elem ).is( until ) ) { + break; + } + matched.push( elem ); + } + } + return matched; +}; + + +var siblings = function( n, elem ) { + var matched = []; + + for ( ; n; n = n.nextSibling ) { + if ( n.nodeType === 1 && n !== elem ) { + matched.push( n ); + } + } + + return matched; +}; + + +var rneedsContext = jQuery.expr.match.needsContext; + +var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ ); + + + +var risSimple = /^.[^:#\[\.,]*$/; + +// Implement the identical functionality for filter and not +function winnow( elements, qualifier, not ) { + if ( jQuery.isFunction( qualifier ) ) { + return jQuery.grep( elements, function( elem, i ) { + /* jshint -W018 */ + return !!qualifier.call( elem, i, elem ) !== not; + } ); + + } + + if ( qualifier.nodeType ) { + return jQuery.grep( elements, function( elem ) { + return ( elem === qualifier ) !== not; + } ); + + } + + if ( typeof qualifier === "string" ) { + if ( risSimple.test( qualifier ) ) { + return jQuery.filter( qualifier, elements, not ); + } + + qualifier = jQuery.filter( qualifier, elements ); + } + + return jQuery.grep( elements, function( elem ) { + return ( jQuery.inArray( elem, qualifier ) > -1 ) !== not; + } ); +} + +jQuery.filter = function( expr, elems, not ) { + var elem = elems[ 0 ]; + + if ( not ) { + expr = ":not(" + expr + ")"; + } + + return elems.length === 1 && elem.nodeType === 1 ? + jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] : + jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) { + return elem.nodeType === 1; + } ) ); +}; + +jQuery.fn.extend( { + find: function( selector ) { + var i, + ret = [], + self = this, + len = self.length; + + if ( typeof selector !== "string" ) { + return this.pushStack( jQuery( selector ).filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( self[ i ], this ) ) { + return true; + } + } + } ) ); + } + + for ( i = 0; i < len; i++ ) { + jQuery.find( selector, self[ i ], ret ); + } + + // Needed because $( selector, context ) becomes $( context ).find( selector ) + ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret ); + ret.selector = this.selector ? this.selector + " " + selector : selector; + return ret; + }, + filter: function( selector ) { + return this.pushStack( winnow( this, selector || [], false ) ); + }, + not: function( selector ) { + return this.pushStack( winnow( this, selector || [], true ) ); + }, + is: function( selector ) { + return !!winnow( + this, + + // If this is a positional/relative selector, check membership in the returned set + // so $("p:first").is("p:last") won't return true for a doc with two "p". + typeof selector === "string" && rneedsContext.test( selector ) ? + jQuery( selector ) : + selector || [], + false + ).length; + } +} ); + + +// Initialize a jQuery object + + +// A central reference to the root jQuery(document) +var rootjQuery, + + // A simple way to check for HTML strings + // Prioritize #id over to avoid XSS via location.hash (#9521) + // Strict HTML recognition (#11290: must start with <) + rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/, + + init = jQuery.fn.init = function( selector, context, root ) { + var match, elem; + + // HANDLE: $(""), $(null), $(undefined), $(false) + if ( !selector ) { + return this; + } + + // init accepts an alternate rootjQuery + // so migrate can support jQuery.sub (gh-2101) + root = root || rootjQuery; + + // Handle HTML strings + if ( typeof selector === "string" ) { + if ( selector.charAt( 0 ) === "<" && + selector.charAt( selector.length - 1 ) === ">" && + selector.length >= 3 ) { + + // Assume that strings that start and end with <> are HTML and skip the regex check + match = [ null, selector, null ]; + + } else { + match = rquickExpr.exec( selector ); + } + + // Match html or make sure no context is specified for #id + if ( match && ( match[ 1 ] || !context ) ) { + + // HANDLE: $(html) -> $(array) + if ( match[ 1 ] ) { + context = context instanceof jQuery ? context[ 0 ] : context; + + // scripts is true for back-compat + // Intentionally let the error be thrown if parseHTML is not present + jQuery.merge( this, jQuery.parseHTML( + match[ 1 ], + context && context.nodeType ? context.ownerDocument || context : document, + true + ) ); + + // HANDLE: $(html, props) + if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) { + for ( match in context ) { + + // Properties of context are called as methods if possible + if ( jQuery.isFunction( this[ match ] ) ) { + this[ match ]( context[ match ] ); + + // ...and otherwise set as attributes + } else { + this.attr( match, context[ match ] ); + } + } + } + + return this; + + // HANDLE: $(#id) + } else { + elem = document.getElementById( match[ 2 ] ); + + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + if ( elem && elem.parentNode ) { + + // Handle the case where IE and Opera return items + // by name instead of ID + if ( elem.id !== match[ 2 ] ) { + return rootjQuery.find( selector ); + } + + // Otherwise, we inject the element directly into the jQuery object + this.length = 1; + this[ 0 ] = elem; + } + + this.context = document; + this.selector = selector; + return this; + } + + // HANDLE: $(expr, $(...)) + } else if ( !context || context.jquery ) { + return ( context || root ).find( selector ); + + // HANDLE: $(expr, context) + // (which is just equivalent to: $(context).find(expr) + } else { + return this.constructor( context ).find( selector ); + } + + // HANDLE: $(DOMElement) + } else if ( selector.nodeType ) { + this.context = this[ 0 ] = selector; + this.length = 1; + return this; + + // HANDLE: $(function) + // Shortcut for document ready + } else if ( jQuery.isFunction( selector ) ) { + return typeof root.ready !== "undefined" ? + root.ready( selector ) : + + // Execute immediately if ready is not present + selector( jQuery ); + } + + if ( selector.selector !== undefined ) { + this.selector = selector.selector; + this.context = selector.context; + } + + return jQuery.makeArray( selector, this ); + }; + +// Give the init function the jQuery prototype for later instantiation +init.prototype = jQuery.fn; + +// Initialize central reference +rootjQuery = jQuery( document ); + + +var rparentsprev = /^(?:parents|prev(?:Until|All))/, + + // methods guaranteed to produce a unique set when starting from a unique set + guaranteedUnique = { + children: true, + contents: true, + next: true, + prev: true + }; + +jQuery.fn.extend( { + has: function( target ) { + var i, + targets = jQuery( target, this ), + len = targets.length; + + return this.filter( function() { + for ( i = 0; i < len; i++ ) { + if ( jQuery.contains( this, targets[ i ] ) ) { + return true; + } + } + } ); + }, + + closest: function( selectors, context ) { + var cur, + i = 0, + l = this.length, + matched = [], + pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ? + jQuery( selectors, context || this.context ) : + 0; + + for ( ; i < l; i++ ) { + for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) { + + // Always skip document fragments + if ( cur.nodeType < 11 && ( pos ? + pos.index( cur ) > -1 : + + // Don't pass non-elements to Sizzle + cur.nodeType === 1 && + jQuery.find.matchesSelector( cur, selectors ) ) ) { + + matched.push( cur ); + break; + } + } + } + + return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched ); + }, + + // Determine the position of an element within + // the matched set of elements + index: function( elem ) { + + // No argument, return index in parent + if ( !elem ) { + return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1; + } + + // index in selector + if ( typeof elem === "string" ) { + return jQuery.inArray( this[ 0 ], jQuery( elem ) ); + } + + // Locate the position of the desired element + return jQuery.inArray( + + // If it receives a jQuery object, the first element is used + elem.jquery ? elem[ 0 ] : elem, this ); + }, + + add: function( selector, context ) { + return this.pushStack( + jQuery.uniqueSort( + jQuery.merge( this.get(), jQuery( selector, context ) ) + ) + ); + }, + + addBack: function( selector ) { + return this.add( selector == null ? + this.prevObject : this.prevObject.filter( selector ) + ); + } +} ); + +function sibling( cur, dir ) { + do { + cur = cur[ dir ]; + } while ( cur && cur.nodeType !== 1 ); + + return cur; +} + +jQuery.each( { + parent: function( elem ) { + var parent = elem.parentNode; + return parent && parent.nodeType !== 11 ? parent : null; + }, + parents: function( elem ) { + return dir( elem, "parentNode" ); + }, + parentsUntil: function( elem, i, until ) { + return dir( elem, "parentNode", until ); + }, + next: function( elem ) { + return sibling( elem, "nextSibling" ); + }, + prev: function( elem ) { + return sibling( elem, "previousSibling" ); + }, + nextAll: function( elem ) { + return dir( elem, "nextSibling" ); + }, + prevAll: function( elem ) { + return dir( elem, "previousSibling" ); + }, + nextUntil: function( elem, i, until ) { + return dir( elem, "nextSibling", until ); + }, + prevUntil: function( elem, i, until ) { + return dir( elem, "previousSibling", until ); + }, + siblings: function( elem ) { + return siblings( ( elem.parentNode || {} ).firstChild, elem ); + }, + children: function( elem ) { + return siblings( elem.firstChild ); + }, + contents: function( elem ) { + return jQuery.nodeName( elem, "iframe" ) ? + elem.contentDocument || elem.contentWindow.document : + jQuery.merge( [], elem.childNodes ); + } +}, function( name, fn ) { + jQuery.fn[ name ] = function( until, selector ) { + var ret = jQuery.map( this, fn, until ); + + if ( name.slice( -5 ) !== "Until" ) { + selector = until; + } + + if ( selector && typeof selector === "string" ) { + ret = jQuery.filter( selector, ret ); + } + + if ( this.length > 1 ) { + + // Remove duplicates + if ( !guaranteedUnique[ name ] ) { + ret = jQuery.uniqueSort( ret ); + } + + // Reverse order for parents* and prev-derivatives + if ( rparentsprev.test( name ) ) { + ret = ret.reverse(); + } + } + + return this.pushStack( ret ); + }; +} ); +var rnotwhite = ( /\S+/g ); + + + +// Convert String-formatted options into Object-formatted ones +function createOptions( options ) { + var object = {}; + jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) { + object[ flag ] = true; + } ); + return object; +} + +/* + * Create a callback list using the following parameters: + * + * options: an optional list of space-separated options that will change how + * the callback list behaves or a more traditional option object + * + * By default a callback list will act like an event callback list and can be + * "fired" multiple times. + * + * Possible options: + * + * once: will ensure the callback list can only be fired once (like a Deferred) + * + * memory: will keep track of previous values and will call any callback added + * after the list has been fired right away with the latest "memorized" + * values (like a Deferred) + * + * unique: will ensure a callback can only be added once (no duplicate in the list) + * + * stopOnFalse: interrupt callings when a callback returns false + * + */ +jQuery.Callbacks = function( options ) { + + // Convert options from String-formatted to Object-formatted if needed + // (we check in cache first) + options = typeof options === "string" ? + createOptions( options ) : + jQuery.extend( {}, options ); + + var // Flag to know if list is currently firing + firing, + + // Last fire value for non-forgettable lists + memory, + + // Flag to know if list was already fired + fired, + + // Flag to prevent firing + locked, + + // Actual callback list + list = [], + + // Queue of execution data for repeatable lists + queue = [], + + // Index of currently firing callback (modified by add/remove as needed) + firingIndex = -1, + + // Fire callbacks + fire = function() { + + // Enforce single-firing + locked = options.once; + + // Execute callbacks for all pending executions, + // respecting firingIndex overrides and runtime changes + fired = firing = true; + for ( ; queue.length; firingIndex = -1 ) { + memory = queue.shift(); + while ( ++firingIndex < list.length ) { + + // Run callback and check for early termination + if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false && + options.stopOnFalse ) { + + // Jump to end and forget the data so .add doesn't re-fire + firingIndex = list.length; + memory = false; + } + } + } + + // Forget the data if we're done with it + if ( !options.memory ) { + memory = false; + } + + firing = false; + + // Clean up if we're done firing for good + if ( locked ) { + + // Keep an empty list if we have data for future add calls + if ( memory ) { + list = []; + + // Otherwise, this object is spent + } else { + list = ""; + } + } + }, + + // Actual Callbacks object + self = { + + // Add a callback or a collection of callbacks to the list + add: function() { + if ( list ) { + + // If we have memory from a past run, we should fire after adding + if ( memory && !firing ) { + firingIndex = list.length - 1; + queue.push( memory ); + } + + ( function add( args ) { + jQuery.each( args, function( _, arg ) { + if ( jQuery.isFunction( arg ) ) { + if ( !options.unique || !self.has( arg ) ) { + list.push( arg ); + } + } else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) { + + // Inspect recursively + add( arg ); + } + } ); + } )( arguments ); + + if ( memory && !firing ) { + fire(); + } + } + return this; + }, + + // Remove a callback from the list + remove: function() { + jQuery.each( arguments, function( _, arg ) { + var index; + while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) { + list.splice( index, 1 ); + + // Handle firing indexes + if ( index <= firingIndex ) { + firingIndex--; + } + } + } ); + return this; + }, + + // Check if a given callback is in the list. + // If no argument is given, return whether or not list has callbacks attached. + has: function( fn ) { + return fn ? + jQuery.inArray( fn, list ) > -1 : + list.length > 0; + }, + + // Remove all callbacks from the list + empty: function() { + if ( list ) { + list = []; + } + return this; + }, + + // Disable .fire and .add + // Abort any current/pending executions + // Clear all callbacks and values + disable: function() { + locked = queue = []; + list = memory = ""; + return this; + }, + disabled: function() { + return !list; + }, + + // Disable .fire + // Also disable .add unless we have memory (since it would have no effect) + // Abort any pending executions + lock: function() { + locked = true; + if ( !memory ) { + self.disable(); + } + return this; + }, + locked: function() { + return !!locked; + }, + + // Call all callbacks with the given context and arguments + fireWith: function( context, args ) { + if ( !locked ) { + args = args || []; + args = [ context, args.slice ? args.slice() : args ]; + queue.push( args ); + if ( !firing ) { + fire(); + } + } + return this; + }, + + // Call all the callbacks with the given arguments + fire: function() { + self.fireWith( this, arguments ); + return this; + }, + + // To know if the callbacks have already been called at least once + fired: function() { + return !!fired; + } + }; + + return self; +}; + + +jQuery.extend( { + + Deferred: function( func ) { + var tuples = [ + + // action, add listener, listener list, final state + [ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ], + [ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ], + [ "notify", "progress", jQuery.Callbacks( "memory" ) ] + ], + state = "pending", + promise = { + state: function() { + return state; + }, + always: function() { + deferred.done( arguments ).fail( arguments ); + return this; + }, + then: function( /* fnDone, fnFail, fnProgress */ ) { + var fns = arguments; + return jQuery.Deferred( function( newDefer ) { + jQuery.each( tuples, function( i, tuple ) { + var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ]; + + // deferred[ done | fail | progress ] for forwarding actions to newDefer + deferred[ tuple[ 1 ] ]( function() { + var returned = fn && fn.apply( this, arguments ); + if ( returned && jQuery.isFunction( returned.promise ) ) { + returned.promise() + .progress( newDefer.notify ) + .done( newDefer.resolve ) + .fail( newDefer.reject ); + } else { + newDefer[ tuple[ 0 ] + "With" ]( + this === promise ? newDefer.promise() : this, + fn ? [ returned ] : arguments + ); + } + } ); + } ); + fns = null; + } ).promise(); + }, + + // Get a promise for this deferred + // If obj is provided, the promise aspect is added to the object + promise: function( obj ) { + return obj != null ? jQuery.extend( obj, promise ) : promise; + } + }, + deferred = {}; + + // Keep pipe for back-compat + promise.pipe = promise.then; + + // Add list-specific methods + jQuery.each( tuples, function( i, tuple ) { + var list = tuple[ 2 ], + stateString = tuple[ 3 ]; + + // promise[ done | fail | progress ] = list.add + promise[ tuple[ 1 ] ] = list.add; + + // Handle state + if ( stateString ) { + list.add( function() { + + // state = [ resolved | rejected ] + state = stateString; + + // [ reject_list | resolve_list ].disable; progress_list.lock + }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock ); + } + + // deferred[ resolve | reject | notify ] + deferred[ tuple[ 0 ] ] = function() { + deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments ); + return this; + }; + deferred[ tuple[ 0 ] + "With" ] = list.fireWith; + } ); + + // Make the deferred a promise + promise.promise( deferred ); + + // Call given func if any + if ( func ) { + func.call( deferred, deferred ); + } + + // All done! + return deferred; + }, + + // Deferred helper + when: function( subordinate /* , ..., subordinateN */ ) { + var i = 0, + resolveValues = slice.call( arguments ), + length = resolveValues.length, + + // the count of uncompleted subordinates + remaining = length !== 1 || + ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0, + + // the master Deferred. + // If resolveValues consist of only a single Deferred, just use that. + deferred = remaining === 1 ? subordinate : jQuery.Deferred(), + + // Update function for both resolve and progress values + updateFunc = function( i, contexts, values ) { + return function( value ) { + contexts[ i ] = this; + values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value; + if ( values === progressValues ) { + deferred.notifyWith( contexts, values ); + + } else if ( !( --remaining ) ) { + deferred.resolveWith( contexts, values ); + } + }; + }, + + progressValues, progressContexts, resolveContexts; + + // add listeners to Deferred subordinates; treat others as resolved + if ( length > 1 ) { + progressValues = new Array( length ); + progressContexts = new Array( length ); + resolveContexts = new Array( length ); + for ( ; i < length; i++ ) { + if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) { + resolveValues[ i ].promise() + .progress( updateFunc( i, progressContexts, progressValues ) ) + .done( updateFunc( i, resolveContexts, resolveValues ) ) + .fail( deferred.reject ); + } else { + --remaining; + } + } + } + + // if we're not waiting on anything, resolve the master + if ( !remaining ) { + deferred.resolveWith( resolveContexts, resolveValues ); + } + + return deferred.promise(); + } +} ); + + +// The deferred used on DOM ready +var readyList; + +jQuery.fn.ready = function( fn ) { + + // Add the callback + jQuery.ready.promise().done( fn ); + + return this; +}; + +jQuery.extend( { + + // Is the DOM ready to be used? Set to true once it occurs. + isReady: false, + + // A counter to track how many items to wait for before + // the ready event fires. See #6781 + readyWait: 1, + + // Hold (or release) the ready event + holdReady: function( hold ) { + if ( hold ) { + jQuery.readyWait++; + } else { + jQuery.ready( true ); + } + }, + + // Handle when the DOM is ready + ready: function( wait ) { + + // Abort if there are pending holds or we're already ready + if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) { + return; + } + + // Remember that the DOM is ready + jQuery.isReady = true; + + // If a normal DOM Ready event fired, decrement, and wait if need be + if ( wait !== true && --jQuery.readyWait > 0 ) { + return; + } + + // If there are functions bound, to execute + readyList.resolveWith( document, [ jQuery ] ); + + // Trigger any bound ready events + if ( jQuery.fn.triggerHandler ) { + jQuery( document ).triggerHandler( "ready" ); + jQuery( document ).off( "ready" ); + } + } +} ); + +/** + * Clean-up method for dom ready events + */ +function detach() { + if ( document.addEventListener ) { + document.removeEventListener( "DOMContentLoaded", completed ); + window.removeEventListener( "load", completed ); + + } else { + document.detachEvent( "onreadystatechange", completed ); + window.detachEvent( "onload", completed ); + } +} + +/** + * The ready event handler and self cleanup method + */ +function completed() { + + // readyState === "complete" is good enough for us to call the dom ready in oldIE + if ( document.addEventListener || + window.event.type === "load" || + document.readyState === "complete" ) { + + detach(); + jQuery.ready(); + } +} + +jQuery.ready.promise = function( obj ) { + if ( !readyList ) { + + readyList = jQuery.Deferred(); + + // Catch cases where $(document).ready() is called + // after the browser event has already occurred. + // Support: IE6-10 + // Older IE sometimes signals "interactive" too soon + if ( document.readyState === "complete" || + ( document.readyState !== "loading" && !document.documentElement.doScroll ) ) { + + // Handle it asynchronously to allow scripts the opportunity to delay ready + window.setTimeout( jQuery.ready ); + + // Standards-based browsers support DOMContentLoaded + } else if ( document.addEventListener ) { + + // Use the handy event callback + document.addEventListener( "DOMContentLoaded", completed ); + + // A fallback to window.onload, that will always work + window.addEventListener( "load", completed ); + + // If IE event model is used + } else { + + // Ensure firing before onload, maybe late but safe also for iframes + document.attachEvent( "onreadystatechange", completed ); + + // A fallback to window.onload, that will always work + window.attachEvent( "onload", completed ); + + // If IE and not a frame + // continually check to see if the document is ready + var top = false; + + try { + top = window.frameElement == null && document.documentElement; + } catch ( e ) {} + + if ( top && top.doScroll ) { + ( function doScrollCheck() { + if ( !jQuery.isReady ) { + + try { + + // Use the trick by Diego Perini + // http://javascript.nwbox.com/IEContentLoaded/ + top.doScroll( "left" ); + } catch ( e ) { + return window.setTimeout( doScrollCheck, 50 ); + } + + // detach all dom ready events + detach(); + + // and execute any waiting functions + jQuery.ready(); + } + } )(); + } + } + } + return readyList.promise( obj ); +}; + +// Kick off the DOM ready check even if the user does not +jQuery.ready.promise(); + + + + +// Support: IE<9 +// Iteration over object's inherited properties before its own +var i; +for ( i in jQuery( support ) ) { + break; +} +support.ownFirst = i === "0"; + +// Note: most support tests are defined in their respective modules. +// false until the test is run +support.inlineBlockNeedsLayout = false; + +// Execute ASAP in case we need to set body.style.zoom +jQuery( function() { + + // Minified: var a,b,c,d + var val, div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Return for frameset docs that don't have a body + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + if ( typeof div.style.zoom !== "undefined" ) { + + // Support: IE<8 + // Check if natively block-level elements act like inline-block + // elements when setting their display to 'inline' and giving + // them layout + div.style.cssText = "display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1"; + + support.inlineBlockNeedsLayout = val = div.offsetWidth === 3; + if ( val ) { + + // Prevent IE 6 from affecting layout for positioned elements #11048 + // Prevent IE from shrinking the body in IE 7 mode #12869 + // Support: IE<8 + body.style.zoom = 1; + } + } + + body.removeChild( container ); +} ); + + +( function() { + var div = document.createElement( "div" ); + + // Support: IE<9 + support.deleteExpando = true; + try { + delete div.test; + } catch ( e ) { + support.deleteExpando = false; + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); +var acceptData = function( elem ) { + var noData = jQuery.noData[ ( elem.nodeName + " " ).toLowerCase() ], + nodeType = +elem.nodeType || 1; + + // Do not set data on non-element DOM nodes because it will not be cleared (#8335). + return nodeType !== 1 && nodeType !== 9 ? + false : + + // Nodes accept data unless otherwise specified; rejection can be conditional + !noData || noData !== true && elem.getAttribute( "classid" ) === noData; +}; + + + + +var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, + rmultiDash = /([A-Z])/g; + +function dataAttr( elem, key, data ) { + + // If nothing was found internally, try to fetch any + // data from the HTML5 data-* attribute + if ( data === undefined && elem.nodeType === 1 ) { + + var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase(); + + data = elem.getAttribute( name ); + + if ( typeof data === "string" ) { + try { + data = data === "true" ? true : + data === "false" ? false : + data === "null" ? null : + + // Only convert to a number if it doesn't change the string + +data + "" === data ? +data : + rbrace.test( data ) ? jQuery.parseJSON( data ) : + data; + } catch ( e ) {} + + // Make sure we set the data so it isn't changed later + jQuery.data( elem, key, data ); + + } else { + data = undefined; + } + } + + return data; +} + +// checks a cache object for emptiness +function isEmptyDataObject( obj ) { + var name; + for ( name in obj ) { + + // if the public data object is empty, the private is still empty + if ( name === "data" && jQuery.isEmptyObject( obj[ name ] ) ) { + continue; + } + if ( name !== "toJSON" ) { + return false; + } + } + + return true; +} + +function internalData( elem, name, data, pvt /* Internal Use Only */ ) { + if ( !acceptData( elem ) ) { + return; + } + + var ret, thisCache, + internalKey = jQuery.expando, + + // We have to handle DOM nodes and JS objects differently because IE6-7 + // can't GC object references properly across the DOM-JS boundary + isNode = elem.nodeType, + + // Only DOM nodes need the global jQuery cache; JS object data is + // attached directly to the object so GC can occur automatically + cache = isNode ? jQuery.cache : elem, + + // Only defining an ID for JS objects if its cache already exists allows + // the code to shortcut on the same path as a DOM node with no cache + id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey; + + // Avoid doing any more work than we need to when trying to get data on an + // object that has no data at all + if ( ( !id || !cache[ id ] || ( !pvt && !cache[ id ].data ) ) && + data === undefined && typeof name === "string" ) { + return; + } + + if ( !id ) { + + // Only DOM nodes need a new unique ID for each element since their data + // ends up in the global cache + if ( isNode ) { + id = elem[ internalKey ] = deletedIds.pop() || jQuery.guid++; + } else { + id = internalKey; + } + } + + if ( !cache[ id ] ) { + + // Avoid exposing jQuery metadata on plain JS objects when the object + // is serialized using JSON.stringify + cache[ id ] = isNode ? {} : { toJSON: jQuery.noop }; + } + + // An object can be passed to jQuery.data instead of a key/value pair; this gets + // shallow copied over onto the existing cache + if ( typeof name === "object" || typeof name === "function" ) { + if ( pvt ) { + cache[ id ] = jQuery.extend( cache[ id ], name ); + } else { + cache[ id ].data = jQuery.extend( cache[ id ].data, name ); + } + } + + thisCache = cache[ id ]; + + // jQuery data() is stored in a separate object inside the object's internal data + // cache in order to avoid key collisions between internal data and user-defined + // data. + if ( !pvt ) { + if ( !thisCache.data ) { + thisCache.data = {}; + } + + thisCache = thisCache.data; + } + + if ( data !== undefined ) { + thisCache[ jQuery.camelCase( name ) ] = data; + } + + // Check for both converted-to-camel and non-converted data property names + // If a data property was specified + if ( typeof name === "string" ) { + + // First Try to find as-is property data + ret = thisCache[ name ]; + + // Test for null|undefined property data + if ( ret == null ) { + + // Try to find the camelCased property + ret = thisCache[ jQuery.camelCase( name ) ]; + } + } else { + ret = thisCache; + } + + return ret; +} + +function internalRemoveData( elem, name, pvt ) { + if ( !acceptData( elem ) ) { + return; + } + + var thisCache, i, + isNode = elem.nodeType, + + // See jQuery.data for more information + cache = isNode ? jQuery.cache : elem, + id = isNode ? elem[ jQuery.expando ] : jQuery.expando; + + // If there is already no cache entry for this object, there is no + // purpose in continuing + if ( !cache[ id ] ) { + return; + } + + if ( name ) { + + thisCache = pvt ? cache[ id ] : cache[ id ].data; + + if ( thisCache ) { + + // Support array or space separated string names for data keys + if ( !jQuery.isArray( name ) ) { + + // try the string as a key before any manipulation + if ( name in thisCache ) { + name = [ name ]; + } else { + + // split the camel cased version by spaces unless a key with the spaces exists + name = jQuery.camelCase( name ); + if ( name in thisCache ) { + name = [ name ]; + } else { + name = name.split( " " ); + } + } + } else { + + // If "name" is an array of keys... + // When data is initially created, via ("key", "val") signature, + // keys will be converted to camelCase. + // Since there is no way to tell _how_ a key was added, remove + // both plain key and camelCase key. #12786 + // This will only penalize the array argument path. + name = name.concat( jQuery.map( name, jQuery.camelCase ) ); + } + + i = name.length; + while ( i-- ) { + delete thisCache[ name[ i ] ]; + } + + // If there is no data left in the cache, we want to continue + // and let the cache object itself get destroyed + if ( pvt ? !isEmptyDataObject( thisCache ) : !jQuery.isEmptyObject( thisCache ) ) { + return; + } + } + } + + // See jQuery.data for more information + if ( !pvt ) { + delete cache[ id ].data; + + // Don't destroy the parent cache unless the internal data object + // had been the only thing left in it + if ( !isEmptyDataObject( cache[ id ] ) ) { + return; + } + } + + // Destroy the cache + if ( isNode ) { + jQuery.cleanData( [ elem ], true ); + + // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080) + /* jshint eqeqeq: false */ + } else if ( support.deleteExpando || cache != cache.window ) { + /* jshint eqeqeq: true */ + delete cache[ id ]; + + // When all else fails, undefined + } else { + cache[ id ] = undefined; + } +} + +jQuery.extend( { + cache: {}, + + // The following elements (space-suffixed to avoid Object.prototype collisions) + // throw uncatchable exceptions if you attempt to set expando properties + noData: { + "applet ": true, + "embed ": true, + + // ...but Flash objects (which have this classid) *can* handle expandos + "object ": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" + }, + + hasData: function( elem ) { + elem = elem.nodeType ? jQuery.cache[ elem[ jQuery.expando ] ] : elem[ jQuery.expando ]; + return !!elem && !isEmptyDataObject( elem ); + }, + + data: function( elem, name, data ) { + return internalData( elem, name, data ); + }, + + removeData: function( elem, name ) { + return internalRemoveData( elem, name ); + }, + + // For internal use only. + _data: function( elem, name, data ) { + return internalData( elem, name, data, true ); + }, + + _removeData: function( elem, name ) { + return internalRemoveData( elem, name, true ); + } +} ); + +jQuery.fn.extend( { + data: function( key, value ) { + var i, name, data, + elem = this[ 0 ], + attrs = elem && elem.attributes; + + // Special expections of .data basically thwart jQuery.access, + // so implement the relevant behavior ourselves + + // Gets all values + if ( key === undefined ) { + if ( this.length ) { + data = jQuery.data( elem ); + + if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) { + i = attrs.length; + while ( i-- ) { + + // Support: IE11+ + // The attrs elements can be null (#14894) + if ( attrs[ i ] ) { + name = attrs[ i ].name; + if ( name.indexOf( "data-" ) === 0 ) { + name = jQuery.camelCase( name.slice( 5 ) ); + dataAttr( elem, name, data[ name ] ); + } + } + } + jQuery._data( elem, "parsedAttrs", true ); + } + } + + return data; + } + + // Sets multiple values + if ( typeof key === "object" ) { + return this.each( function() { + jQuery.data( this, key ); + } ); + } + + return arguments.length > 1 ? + + // Sets one value + this.each( function() { + jQuery.data( this, key, value ); + } ) : + + // Gets one value + // Try to fetch any internally stored data first + elem ? dataAttr( elem, key, jQuery.data( elem, key ) ) : undefined; + }, + + removeData: function( key ) { + return this.each( function() { + jQuery.removeData( this, key ); + } ); + } +} ); + + +jQuery.extend( { + queue: function( elem, type, data ) { + var queue; + + if ( elem ) { + type = ( type || "fx" ) + "queue"; + queue = jQuery._data( elem, type ); + + // Speed up dequeue by getting out quickly if this is just a lookup + if ( data ) { + if ( !queue || jQuery.isArray( data ) ) { + queue = jQuery._data( elem, type, jQuery.makeArray( data ) ); + } else { + queue.push( data ); + } + } + return queue || []; + } + }, + + dequeue: function( elem, type ) { + type = type || "fx"; + + var queue = jQuery.queue( elem, type ), + startLength = queue.length, + fn = queue.shift(), + hooks = jQuery._queueHooks( elem, type ), + next = function() { + jQuery.dequeue( elem, type ); + }; + + // If the fx queue is dequeued, always remove the progress sentinel + if ( fn === "inprogress" ) { + fn = queue.shift(); + startLength--; + } + + if ( fn ) { + + // Add a progress sentinel to prevent the fx queue from being + // automatically dequeued + if ( type === "fx" ) { + queue.unshift( "inprogress" ); + } + + // clear up the last queue stop function + delete hooks.stop; + fn.call( elem, next, hooks ); + } + + if ( !startLength && hooks ) { + hooks.empty.fire(); + } + }, + + // not intended for public consumption - generates a queueHooks object, + // or returns the current one + _queueHooks: function( elem, type ) { + var key = type + "queueHooks"; + return jQuery._data( elem, key ) || jQuery._data( elem, key, { + empty: jQuery.Callbacks( "once memory" ).add( function() { + jQuery._removeData( elem, type + "queue" ); + jQuery._removeData( elem, key ); + } ) + } ); + } +} ); + +jQuery.fn.extend( { + queue: function( type, data ) { + var setter = 2; + + if ( typeof type !== "string" ) { + data = type; + type = "fx"; + setter--; + } + + if ( arguments.length < setter ) { + return jQuery.queue( this[ 0 ], type ); + } + + return data === undefined ? + this : + this.each( function() { + var queue = jQuery.queue( this, type, data ); + + // ensure a hooks for this queue + jQuery._queueHooks( this, type ); + + if ( type === "fx" && queue[ 0 ] !== "inprogress" ) { + jQuery.dequeue( this, type ); + } + } ); + }, + dequeue: function( type ) { + return this.each( function() { + jQuery.dequeue( this, type ); + } ); + }, + clearQueue: function( type ) { + return this.queue( type || "fx", [] ); + }, + + // Get a promise resolved when queues of a certain type + // are emptied (fx is the type by default) + promise: function( type, obj ) { + var tmp, + count = 1, + defer = jQuery.Deferred(), + elements = this, + i = this.length, + resolve = function() { + if ( !( --count ) ) { + defer.resolveWith( elements, [ elements ] ); + } + }; + + if ( typeof type !== "string" ) { + obj = type; + type = undefined; + } + type = type || "fx"; + + while ( i-- ) { + tmp = jQuery._data( elements[ i ], type + "queueHooks" ); + if ( tmp && tmp.empty ) { + count++; + tmp.empty.add( resolve ); + } + } + resolve(); + return defer.promise( obj ); + } +} ); + + +( function() { + var shrinkWrapBlocksVal; + + support.shrinkWrapBlocks = function() { + if ( shrinkWrapBlocksVal != null ) { + return shrinkWrapBlocksVal; + } + + // Will be changed later if needed. + shrinkWrapBlocksVal = false; + + // Minified: var b,c,d + var div, body, container; + + body = document.getElementsByTagName( "body" )[ 0 ]; + if ( !body || !body.style ) { + + // Test fired too early or in an unsupported environment, exit. + return; + } + + // Setup + div = document.createElement( "div" ); + container = document.createElement( "div" ); + container.style.cssText = "position:absolute;border:0;width:0;height:0;top:0;left:-9999px"; + body.appendChild( container ).appendChild( div ); + + // Support: IE6 + // Check if elements with layout shrink-wrap their children + if ( typeof div.style.zoom !== "undefined" ) { + + // Reset CSS: box-sizing; display; margin; border + div.style.cssText = + + // Support: Firefox<29, Android 2.3 + // Vendor-prefix box-sizing + "-webkit-box-sizing:content-box;-moz-box-sizing:content-box;" + + "box-sizing:content-box;display:block;margin:0;border:0;" + + "padding:1px;width:1px;zoom:1"; + div.appendChild( document.createElement( "div" ) ).style.width = "5px"; + shrinkWrapBlocksVal = div.offsetWidth !== 3; + } + + body.removeChild( container ); + + return shrinkWrapBlocksVal; + }; + +} )(); +var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source; + +var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ); + + +var cssExpand = [ "Top", "Right", "Bottom", "Left" ]; + +var isHidden = function( elem, el ) { + + // isHidden might be called from jQuery#filter function; + // in that case, element will be second argument + elem = el || elem; + return jQuery.css( elem, "display" ) === "none" || + !jQuery.contains( elem.ownerDocument, elem ); + }; + + + +function adjustCSS( elem, prop, valueParts, tween ) { + var adjusted, + scale = 1, + maxIterations = 20, + currentValue = tween ? + function() { return tween.cur(); } : + function() { return jQuery.css( elem, prop, "" ); }, + initial = currentValue(), + unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ), + + // Starting value computation is required for potential unit mismatches + initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) && + rcssNum.exec( jQuery.css( elem, prop ) ); + + if ( initialInUnit && initialInUnit[ 3 ] !== unit ) { + + // Trust units reported by jQuery.css + unit = unit || initialInUnit[ 3 ]; + + // Make sure we update the tween properties later on + valueParts = valueParts || []; + + // Iteratively approximate from a nonzero starting point + initialInUnit = +initial || 1; + + do { + + // If previous iteration zeroed out, double until we get *something*. + // Use string for doubling so we don't accidentally see scale as unchanged below + scale = scale || ".5"; + + // Adjust and apply + initialInUnit = initialInUnit / scale; + jQuery.style( elem, prop, initialInUnit + unit ); + + // Update scale, tolerating zero or NaN from tween.cur() + // Break the loop if scale is unchanged or perfect, or if we've just had enough. + } while ( + scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations + ); + } + + if ( valueParts ) { + initialInUnit = +initialInUnit || +initial || 0; + + // Apply relative offset (+=/-=) if specified + adjusted = valueParts[ 1 ] ? + initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] : + +valueParts[ 2 ]; + if ( tween ) { + tween.unit = unit; + tween.start = initialInUnit; + tween.end = adjusted; + } + } + return adjusted; +} + + +// Multifunctional method to get and set values of a collection +// The value/s can optionally be executed if it's a function +var access = function( elems, fn, key, value, chainable, emptyGet, raw ) { + var i = 0, + length = elems.length, + bulk = key == null; + + // Sets many values + if ( jQuery.type( key ) === "object" ) { + chainable = true; + for ( i in key ) { + access( elems, fn, i, key[ i ], true, emptyGet, raw ); + } + + // Sets one value + } else if ( value !== undefined ) { + chainable = true; + + if ( !jQuery.isFunction( value ) ) { + raw = true; + } + + if ( bulk ) { + + // Bulk operations run against the entire set + if ( raw ) { + fn.call( elems, value ); + fn = null; + + // ...except when executing function values + } else { + bulk = fn; + fn = function( elem, key, value ) { + return bulk.call( jQuery( elem ), value ); + }; + } + } + + if ( fn ) { + for ( ; i < length; i++ ) { + fn( + elems[ i ], + key, + raw ? value : value.call( elems[ i ], i, fn( elems[ i ], key ) ) + ); + } + } + } + + return chainable ? + elems : + + // Gets + bulk ? + fn.call( elems ) : + length ? fn( elems[ 0 ], key ) : emptyGet; +}; +var rcheckableType = ( /^(?:checkbox|radio)$/i ); + +var rtagName = ( /<([\w:-]+)/ ); + +var rscriptType = ( /^$|\/(?:java|ecma)script/i ); + +var rleadingWhitespace = ( /^\s+/ ); + +var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|" + + "details|dialog|figcaption|figure|footer|header|hgroup|main|" + + "mark|meter|nav|output|picture|progress|section|summary|template|time|video"; + + + +function createSafeFragment( document ) { + var list = nodeNames.split( "|" ), + safeFrag = document.createDocumentFragment(); + + if ( safeFrag.createElement ) { + while ( list.length ) { + safeFrag.createElement( + list.pop() + ); + } + } + return safeFrag; +} + + +( function() { + var div = document.createElement( "div" ), + fragment = document.createDocumentFragment(), + input = document.createElement( "input" ); + + // Setup + div.innerHTML = "
    a"; + + // IE strips leading whitespace when .innerHTML is used + support.leadingWhitespace = div.firstChild.nodeType === 3; + + // Make sure that tbody elements aren't automatically inserted + // IE will insert them into empty tables + support.tbody = !div.getElementsByTagName( "tbody" ).length; + + // Make sure that link elements get serialized correctly by innerHTML + // This requires a wrapper element in IE + support.htmlSerialize = !!div.getElementsByTagName( "link" ).length; + + // Makes sure cloning an html5 element does not cause problems + // Where outerHTML is undefined, this still works + support.html5Clone = + document.createElement( "nav" ).cloneNode( true ).outerHTML !== "<:nav>"; + + // Check if a disconnected checkbox will retain its checked + // value of true after appended to the DOM (IE6/7) + input.type = "checkbox"; + input.checked = true; + fragment.appendChild( input ); + support.appendChecked = input.checked; + + // Make sure textarea (and checkbox) defaultValue is properly cloned + // Support: IE6-IE11+ + div.innerHTML = ""; + support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue; + + // #11217 - WebKit loses check when the name is after the checked attribute + fragment.appendChild( div ); + + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (#14901) + input = document.createElement( "input" ); + input.setAttribute( "type", "radio" ); + input.setAttribute( "checked", "checked" ); + input.setAttribute( "name", "t" ); + + div.appendChild( input ); + + // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3 + // old WebKit doesn't clone checked state correctly in fragments + support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked; + + // Support: IE<9 + // Cloned elements keep attachEvent handlers, we use addEventListener on IE9+ + support.noCloneEvent = !!div.addEventListener; + + // Support: IE<9 + // Since attributes and properties are the same in IE, + // cleanData must set properties to undefined rather than use removeAttribute + div[ jQuery.expando ] = 1; + support.attributes = !div.getAttribute( jQuery.expando ); +} )(); + + +// We have to close these tags to support XHTML (#13200) +var wrapMap = { + option: [ 1, "" ], + legend: [ 1, "
    ", "
    " ], + area: [ 1, "", "" ], + + // Support: IE8 + param: [ 1, "", "" ], + thead: [ 1, "", "
    " ], + tr: [ 2, "", "
    " ], + col: [ 2, "", "
    " ], + td: [ 3, "", "
    " ], + + // IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags, + // unless wrapped in a div with non-breaking characters in front of it. + _default: support.htmlSerialize ? [ 0, "", "" ] : [ 1, "X
    ", "
    " ] +}; + +// Support: IE8-IE9 +wrapMap.optgroup = wrapMap.option; + +wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead; +wrapMap.th = wrapMap.td; + + +function getAll( context, tag ) { + var elems, elem, + i = 0, + found = typeof context.getElementsByTagName !== "undefined" ? + context.getElementsByTagName( tag || "*" ) : + typeof context.querySelectorAll !== "undefined" ? + context.querySelectorAll( tag || "*" ) : + undefined; + + if ( !found ) { + for ( found = [], elems = context.childNodes || context; + ( elem = elems[ i ] ) != null; + i++ + ) { + if ( !tag || jQuery.nodeName( elem, tag ) ) { + found.push( elem ); + } else { + jQuery.merge( found, getAll( elem, tag ) ); + } + } + } + + return tag === undefined || tag && jQuery.nodeName( context, tag ) ? + jQuery.merge( [ context ], found ) : + found; +} + + +// Mark scripts as having already been evaluated +function setGlobalEval( elems, refElements ) { + var elem, + i = 0; + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + jQuery._data( + elem, + "globalEval", + !refElements || jQuery._data( refElements[ i ], "globalEval" ) + ); + } +} + + +var rhtml = /<|&#?\w+;/, + rtbody = / from table fragments + if ( !support.tbody ) { + + // String was a , *may* have spurious + elem = tag === "table" && !rtbody.test( elem ) ? + tmp.firstChild : + + // String was a bare or + wrap[ 1 ] === "
    " && !rtbody.test( elem ) ? + tmp : + 0; + + j = elem && elem.childNodes.length; + while ( j-- ) { + if ( jQuery.nodeName( ( tbody = elem.childNodes[ j ] ), "tbody" ) && + !tbody.childNodes.length ) { + + elem.removeChild( tbody ); + } + } + } + + jQuery.merge( nodes, tmp.childNodes ); + + // Fix #12392 for WebKit and IE > 9 + tmp.textContent = ""; + + // Fix #12392 for oldIE + while ( tmp.firstChild ) { + tmp.removeChild( tmp.firstChild ); + } + + // Remember the top-level container for proper cleanup + tmp = safe.lastChild; + } + } + } + + // Fix #11356: Clear elements from fragment + if ( tmp ) { + safe.removeChild( tmp ); + } + + // Reset defaultChecked for any radios and checkboxes + // about to be appended to the DOM in IE 6/7 (#8060) + if ( !support.appendChecked ) { + jQuery.grep( getAll( nodes, "input" ), fixDefaultChecked ); + } + + i = 0; + while ( ( elem = nodes[ i++ ] ) ) { + + // Skip elements already in the context collection (trac-4087) + if ( selection && jQuery.inArray( elem, selection ) > -1 ) { + if ( ignored ) { + ignored.push( elem ); + } + + continue; + } + + contains = jQuery.contains( elem.ownerDocument, elem ); + + // Append to fragment + tmp = getAll( safe.appendChild( elem ), "script" ); + + // Preserve script evaluation history + if ( contains ) { + setGlobalEval( tmp ); + } + + // Capture executables + if ( scripts ) { + j = 0; + while ( ( elem = tmp[ j++ ] ) ) { + if ( rscriptType.test( elem.type || "" ) ) { + scripts.push( elem ); + } + } + } + } + + tmp = null; + + return safe; +} + + +( function() { + var i, eventName, + div = document.createElement( "div" ); + + // Support: IE<9 (lack submit/change bubble), Firefox (lack focus(in | out) events) + for ( i in { submit: true, change: true, focusin: true } ) { + eventName = "on" + i; + + if ( !( support[ i ] = eventName in window ) ) { + + // Beware of CSP restrictions (https://developer.mozilla.org/en/Security/CSP) + div.setAttribute( eventName, "t" ); + support[ i ] = div.attributes[ eventName ].expando === false; + } + } + + // Null elements to avoid leaks in IE. + div = null; +} )(); + + +var rformElems = /^(?:input|select|textarea)$/i, + rkeyEvent = /^key/, + rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, + rfocusMorph = /^(?:focusinfocus|focusoutblur)$/, + rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +// Support: IE9 +// See #13393 for more info +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +function on( elem, types, selector, data, fn, one ) { + var origFn, type; + + // Types can be a map of types/handlers + if ( typeof types === "object" ) { + + // ( types-Object, selector, data ) + if ( typeof selector !== "string" ) { + + // ( types-Object, data ) + data = data || selector; + selector = undefined; + } + for ( type in types ) { + on( elem, type, selector, data, types[ type ], one ); + } + return elem; + } + + if ( data == null && fn == null ) { + + // ( types, fn ) + fn = selector; + data = selector = undefined; + } else if ( fn == null ) { + if ( typeof selector === "string" ) { + + // ( types, selector, fn ) + fn = data; + data = undefined; + } else { + + // ( types, data, fn ) + fn = data; + data = selector; + selector = undefined; + } + } + if ( fn === false ) { + fn = returnFalse; + } else if ( !fn ) { + return elem; + } + + if ( one === 1 ) { + origFn = fn; + fn = function( event ) { + + // Can use an empty set, since event contains the info + jQuery().off( event ); + return origFn.apply( this, arguments ); + }; + + // Use same guid so caller can remove using origFn + fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ ); + } + return elem.each( function() { + jQuery.event.add( this, types, fn, data, selector ); + } ); +} + +/* + * Helper functions for managing events -- not part of the public interface. + * Props to Dean Edwards' addEvent library for many of the ideas. + */ +jQuery.event = { + + global: {}, + + add: function( elem, types, handler, data, selector ) { + var tmp, events, t, handleObjIn, + special, eventHandle, handleObj, + handlers, type, namespaces, origType, + elemData = jQuery._data( elem ); + + // Don't attach events to noData or text/comment nodes (but allow plain objects) + if ( !elemData ) { + return; + } + + // Caller can pass in an object of custom data in lieu of the handler + if ( handler.handler ) { + handleObjIn = handler; + handler = handleObjIn.handler; + selector = handleObjIn.selector; + } + + // Make sure that the handler has a unique ID, used to find/remove it later + if ( !handler.guid ) { + handler.guid = jQuery.guid++; + } + + // Init the element's event structure and main handler, if this is the first + if ( !( events = elemData.events ) ) { + events = elemData.events = {}; + } + if ( !( eventHandle = elemData.handle ) ) { + eventHandle = elemData.handle = function( e ) { + + // Discard the second event of a jQuery.event.trigger() and + // when an event is called after a page has unloaded + return typeof jQuery !== "undefined" && + ( !e || jQuery.event.triggered !== e.type ) ? + jQuery.event.dispatch.apply( eventHandle.elem, arguments ) : + undefined; + }; + + // Add elem as a property of the handle fn to prevent a memory leak + // with IE non-native events + eventHandle.elem = elem; + } + + // Handle multiple events separated by a space + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // There *must* be a type, no attaching namespace-only handlers + if ( !type ) { + continue; + } + + // If event changes its type, use the special event handlers for the changed type + special = jQuery.event.special[ type ] || {}; + + // If selector defined, determine special event api type, otherwise given type + type = ( selector ? special.delegateType : special.bindType ) || type; + + // Update special based on newly reset type + special = jQuery.event.special[ type ] || {}; + + // handleObj is passed to all event handlers + handleObj = jQuery.extend( { + type: type, + origType: origType, + data: data, + handler: handler, + guid: handler.guid, + selector: selector, + needsContext: selector && jQuery.expr.match.needsContext.test( selector ), + namespace: namespaces.join( "." ) + }, handleObjIn ); + + // Init the event handler queue if we're the first + if ( !( handlers = events[ type ] ) ) { + handlers = events[ type ] = []; + handlers.delegateCount = 0; + + // Only use addEventListener/attachEvent if the special events handler returns false + if ( !special.setup || + special.setup.call( elem, data, namespaces, eventHandle ) === false ) { + + // Bind the global event handler to the element + if ( elem.addEventListener ) { + elem.addEventListener( type, eventHandle, false ); + + } else if ( elem.attachEvent ) { + elem.attachEvent( "on" + type, eventHandle ); + } + } + } + + if ( special.add ) { + special.add.call( elem, handleObj ); + + if ( !handleObj.handler.guid ) { + handleObj.handler.guid = handler.guid; + } + } + + // Add to the element's handler list, delegates in front + if ( selector ) { + handlers.splice( handlers.delegateCount++, 0, handleObj ); + } else { + handlers.push( handleObj ); + } + + // Keep track of which events have ever been used, for event optimization + jQuery.event.global[ type ] = true; + } + + // Nullify elem to prevent memory leaks in IE + elem = null; + }, + + // Detach an event or set of events from an element + remove: function( elem, types, handler, selector, mappedTypes ) { + var j, handleObj, tmp, + origCount, t, events, + special, handlers, type, + namespaces, origType, + elemData = jQuery.hasData( elem ) && jQuery._data( elem ); + + if ( !elemData || !( events = elemData.events ) ) { + return; + } + + // Once for each type.namespace in types; type may be omitted + types = ( types || "" ).match( rnotwhite ) || [ "" ]; + t = types.length; + while ( t-- ) { + tmp = rtypenamespace.exec( types[ t ] ) || []; + type = origType = tmp[ 1 ]; + namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort(); + + // Unbind all events (on this namespace, if provided) for the element + if ( !type ) { + for ( type in events ) { + jQuery.event.remove( elem, type + types[ t ], handler, selector, true ); + } + continue; + } + + special = jQuery.event.special[ type ] || {}; + type = ( selector ? special.delegateType : special.bindType ) || type; + handlers = events[ type ] || []; + tmp = tmp[ 2 ] && + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ); + + // Remove matching events + origCount = j = handlers.length; + while ( j-- ) { + handleObj = handlers[ j ]; + + if ( ( mappedTypes || origType === handleObj.origType ) && + ( !handler || handler.guid === handleObj.guid ) && + ( !tmp || tmp.test( handleObj.namespace ) ) && + ( !selector || selector === handleObj.selector || + selector === "**" && handleObj.selector ) ) { + handlers.splice( j, 1 ); + + if ( handleObj.selector ) { + handlers.delegateCount--; + } + if ( special.remove ) { + special.remove.call( elem, handleObj ); + } + } + } + + // Remove generic event handler if we removed something and no more handlers exist + // (avoids potential for endless recursion during removal of special event handlers) + if ( origCount && !handlers.length ) { + if ( !special.teardown || + special.teardown.call( elem, namespaces, elemData.handle ) === false ) { + + jQuery.removeEvent( elem, type, elemData.handle ); + } + + delete events[ type ]; + } + } + + // Remove the expando if it's no longer used + if ( jQuery.isEmptyObject( events ) ) { + delete elemData.handle; + + // removeData also checks for emptiness and clears the expando if empty + // so use it instead of delete + jQuery._removeData( elem, "events" ); + } + }, + + trigger: function( event, data, elem, onlyHandlers ) { + var handle, ontype, cur, + bubbleType, special, tmp, i, + eventPath = [ elem || document ], + type = hasOwn.call( event, "type" ) ? event.type : event, + namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : []; + + cur = tmp = elem = elem || document; + + // Don't do events on text and comment nodes + if ( elem.nodeType === 3 || elem.nodeType === 8 ) { + return; + } + + // focus/blur morphs to focusin/out; ensure we're not firing them right now + if ( rfocusMorph.test( type + jQuery.event.triggered ) ) { + return; + } + + if ( type.indexOf( "." ) > -1 ) { + + // Namespaced trigger; create a regexp to match event type in handle() + namespaces = type.split( "." ); + type = namespaces.shift(); + namespaces.sort(); + } + ontype = type.indexOf( ":" ) < 0 && "on" + type; + + // Caller can pass in a jQuery.Event object, Object, or just an event type string + event = event[ jQuery.expando ] ? + event : + new jQuery.Event( type, typeof event === "object" && event ); + + // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true) + event.isTrigger = onlyHandlers ? 2 : 3; + event.namespace = namespaces.join( "." ); + event.rnamespace = event.namespace ? + new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) : + null; + + // Clean up the event in case it is being reused + event.result = undefined; + if ( !event.target ) { + event.target = elem; + } + + // Clone any incoming data and prepend the event, creating the handler arg list + data = data == null ? + [ event ] : + jQuery.makeArray( data, [ event ] ); + + // Allow special events to draw outside the lines + special = jQuery.event.special[ type ] || {}; + if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) { + return; + } + + // Determine event propagation path in advance, per W3C events spec (#9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (#9724) + if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) { + + bubbleType = special.delegateType || type; + if ( !rfocusMorph.test( bubbleType + type ) ) { + cur = cur.parentNode; + } + for ( ; cur; cur = cur.parentNode ) { + eventPath.push( cur ); + tmp = cur; + } + + // Only add window if we got to document (e.g., not plain obj or detached DOM) + if ( tmp === ( elem.ownerDocument || document ) ) { + eventPath.push( tmp.defaultView || tmp.parentWindow || window ); + } + } + + // Fire handlers on the event path + i = 0; + while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) { + + event.type = i > 1 ? + bubbleType : + special.bindType || type; + + // jQuery handler + handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && + jQuery._data( cur, "handle" ); + + if ( handle ) { + handle.apply( cur, data ); + } + + // Native handler + handle = ontype && cur[ ontype ]; + if ( handle && handle.apply && acceptData( cur ) ) { + event.result = handle.apply( cur, data ); + if ( event.result === false ) { + event.preventDefault(); + } + } + } + event.type = type; + + // If nobody prevented the default action, do it now + if ( !onlyHandlers && !event.isDefaultPrevented() ) { + + if ( + ( !special._default || + special._default.apply( eventPath.pop(), data ) === false + ) && acceptData( elem ) + ) { + + // Call a native DOM method on the target with the same name name as the event. + // Can't use an .isFunction() check here because IE6/7 fails that test. + // Don't do default actions on window, that's where global variables be (#6170) + if ( ontype && elem[ type ] && !jQuery.isWindow( elem ) ) { + + // Don't re-trigger an onFOO event when we call its FOO() method + tmp = elem[ ontype ]; + + if ( tmp ) { + elem[ ontype ] = null; + } + + // Prevent re-triggering of the same event, since we already bubbled it above + jQuery.event.triggered = type; + try { + elem[ type ](); + } catch ( e ) { + + // IE<9 dies on focus/blur to hidden element (#1486,#12518) + // only reproducible on winXP IE8 native, not IE9 in IE8 mode + } + jQuery.event.triggered = undefined; + + if ( tmp ) { + elem[ ontype ] = tmp; + } + } + } + } + + return event.result; + }, + + dispatch: function( event ) { + + // Make a writable jQuery.Event from the native event object + event = jQuery.event.fix( event ); + + var i, j, ret, matched, handleObj, + handlerQueue = [], + args = slice.call( arguments ), + handlers = ( jQuery._data( this, "events" ) || {} )[ event.type ] || [], + special = jQuery.event.special[ event.type ] || {}; + + // Use the fix-ed jQuery.Event rather than the (read-only) native event + args[ 0 ] = event; + event.delegateTarget = this; + + // Call the preDispatch hook for the mapped type, and let it bail if desired + if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) { + return; + } + + // Determine handlers + handlerQueue = jQuery.event.handlers.call( this, event, handlers ); + + // Run delegates first; they may want to stop propagation beneath us + i = 0; + while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) { + event.currentTarget = matched.elem; + + j = 0; + while ( ( handleObj = matched.handlers[ j++ ] ) && + !event.isImmediatePropagationStopped() ) { + + // Triggered event must either 1) have no namespace, or 2) have namespace(s) + // a subset or equal to those in the bound event (both can have no namespace). + if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) { + + event.handleObj = handleObj; + event.data = handleObj.data; + + ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle || + handleObj.handler ).apply( matched.elem, args ); + + if ( ret !== undefined ) { + if ( ( event.result = ret ) === false ) { + event.preventDefault(); + event.stopPropagation(); + } + } + } + } + } + + // Call the postDispatch hook for the mapped type + if ( special.postDispatch ) { + special.postDispatch.call( this, event ); + } + + return event.result; + }, + + handlers: function( event, handlers ) { + var i, matches, sel, handleObj, + handlerQueue = [], + delegateCount = handlers.delegateCount, + cur = event.target; + + // Support (at least): Chrome, IE9 + // Find delegate handlers + // Black-hole SVG instance trees (#13180) + // + // Support: Firefox<=42+ + // Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343) + if ( delegateCount && cur.nodeType && + ( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) { + + /* jshint eqeqeq: false */ + for ( ; cur != this; cur = cur.parentNode || this ) { + /* jshint eqeqeq: true */ + + // Don't check non-elements (#13208) + // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764) + if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) { + matches = []; + for ( i = 0; i < delegateCount; i++ ) { + handleObj = handlers[ i ]; + + // Don't conflict with Object.prototype properties (#13203) + sel = handleObj.selector + " "; + + if ( matches[ sel ] === undefined ) { + matches[ sel ] = handleObj.needsContext ? + jQuery( sel, this ).index( cur ) > -1 : + jQuery.find( sel, this, null, [ cur ] ).length; + } + if ( matches[ sel ] ) { + matches.push( handleObj ); + } + } + if ( matches.length ) { + handlerQueue.push( { elem: cur, handlers: matches } ); + } + } + } + } + + // Add the remaining (directly-bound) handlers + if ( delegateCount < handlers.length ) { + handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } ); + } + + return handlerQueue; + }, + + fix: function( event ) { + if ( event[ jQuery.expando ] ) { + return event; + } + + // Create a writable copy of the event object and normalize some properties + var i, prop, copy, + type = event.type, + originalEvent = event, + fixHook = this.fixHooks[ type ]; + + if ( !fixHook ) { + this.fixHooks[ type ] = fixHook = + rmouseEvent.test( type ) ? this.mouseHooks : + rkeyEvent.test( type ) ? this.keyHooks : + {}; + } + copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props; + + event = new jQuery.Event( originalEvent ); + + i = copy.length; + while ( i-- ) { + prop = copy[ i ]; + event[ prop ] = originalEvent[ prop ]; + } + + // Support: IE<9 + // Fix target property (#1925) + if ( !event.target ) { + event.target = originalEvent.srcElement || document; + } + + // Support: Safari 6-8+ + // Target should not be a text node (#504, #13143) + if ( event.target.nodeType === 3 ) { + event.target = event.target.parentNode; + } + + // Support: IE<9 + // For mouse/key events, metaKey==false if it's undefined (#3368, #11328) + event.metaKey = !!event.metaKey; + + return fixHook.filter ? fixHook.filter( event, originalEvent ) : event; + }, + + // Includes some event props shared by KeyEvent and MouseEvent + props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " + + "metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ), + + fixHooks: {}, + + keyHooks: { + props: "char charCode key keyCode".split( " " ), + filter: function( event, original ) { + + // Add which for key events + if ( event.which == null ) { + event.which = original.charCode != null ? original.charCode : original.keyCode; + } + + return event; + } + }, + + mouseHooks: { + props: ( "button buttons clientX clientY fromElement offsetX offsetY " + + "pageX pageY screenX screenY toElement" ).split( " " ), + filter: function( event, original ) { + var body, eventDoc, doc, + button = original.button, + fromElement = original.fromElement; + + // Calculate pageX/Y if missing and clientX/Y available + if ( event.pageX == null && original.clientX != null ) { + eventDoc = event.target.ownerDocument || document; + doc = eventDoc.documentElement; + body = eventDoc.body; + + event.pageX = original.clientX + + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - + ( doc && doc.clientLeft || body && body.clientLeft || 0 ); + event.pageY = original.clientY + + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - + ( doc && doc.clientTop || body && body.clientTop || 0 ); + } + + // Add relatedTarget, if necessary + if ( !event.relatedTarget && fromElement ) { + event.relatedTarget = fromElement === event.target ? + original.toElement : + fromElement; + } + + // Add which for click: 1 === left; 2 === middle; 3 === right + // Note: button is not normalized, so don't use it + if ( !event.which && button !== undefined ) { + event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) ); + } + + return event; + } + }, + + special: { + load: { + + // Prevent triggered image.load events from bubbling to window.load + noBubble: true + }, + focus: { + + // Fire native event if possible so blur/focus sequence is correct + trigger: function() { + if ( this !== safeActiveElement() && this.focus ) { + try { + this.focus(); + return false; + } catch ( e ) { + + // Support: IE<9 + // If we error on focus to hidden element (#1486, #12518), + // let .trigger() run the handlers + } + } + }, + delegateType: "focusin" + }, + blur: { + trigger: function() { + if ( this === safeActiveElement() && this.blur ) { + this.blur(); + return false; + } + }, + delegateType: "focusout" + }, + click: { + + // For checkbox, fire native event so checked state will be right + trigger: function() { + if ( jQuery.nodeName( this, "input" ) && this.type === "checkbox" && this.click ) { + this.click(); + return false; + } + }, + + // For cross-browser consistency, don't fire native .click() on links + _default: function( event ) { + return jQuery.nodeName( event.target, "a" ); + } + }, + + beforeunload: { + postDispatch: function( event ) { + + // Support: Firefox 20+ + // Firefox doesn't alert if the returnValue field is not set. + if ( event.result !== undefined && event.originalEvent ) { + event.originalEvent.returnValue = event.result; + } + } + } + }, + + // Piggyback on a donor event to simulate a different one + simulate: function( type, elem, event ) { + var e = jQuery.extend( + new jQuery.Event(), + event, + { + type: type, + isSimulated: true + + // Previously, `originalEvent: {}` was set here, so stopPropagation call + // would not be triggered on donor event, since in our own + // jQuery.event.stopPropagation function we had a check for existence of + // originalEvent.stopPropagation method, so, consequently it would be a noop. + // + // Guard for simulated events was moved to jQuery.event.stopPropagation function + // since `originalEvent` should point to the original event for the + // constancy with other events and for more focused logic + } + ); + + jQuery.event.trigger( e, null, elem ); + + if ( e.isDefaultPrevented() ) { + event.preventDefault(); + } + } +}; + +jQuery.removeEvent = document.removeEventListener ? + function( elem, type, handle ) { + + // This "if" is needed for plain objects + if ( elem.removeEventListener ) { + elem.removeEventListener( type, handle ); + } + } : + function( elem, type, handle ) { + var name = "on" + type; + + if ( elem.detachEvent ) { + + // #8545, #7054, preventing memory leaks for custom events in IE6-8 + // detachEvent needed property on element, by name of that event, + // to properly expose it to GC + if ( typeof elem[ name ] === "undefined" ) { + elem[ name ] = null; + } + + elem.detachEvent( name, handle ); + } + }; + +jQuery.Event = function( src, props ) { + + // Allow instantiation without the 'new' keyword + if ( !( this instanceof jQuery.Event ) ) { + return new jQuery.Event( src, props ); + } + + // Event object + if ( src && src.type ) { + this.originalEvent = src; + this.type = src.type; + + // Events bubbling up the document may have been marked as prevented + // by a handler lower down the tree; reflect the correct value. + this.isDefaultPrevented = src.defaultPrevented || + src.defaultPrevented === undefined && + + // Support: IE < 9, Android < 4.0 + src.returnValue === false ? + returnTrue : + returnFalse; + + // Event type + } else { + this.type = src; + } + + // Put explicitly provided properties onto the event object + if ( props ) { + jQuery.extend( this, props ); + } + + // Create a timestamp if incoming event doesn't have one + this.timeStamp = src && src.timeStamp || jQuery.now(); + + // Mark it as fixed + this[ jQuery.expando ] = true; +}; + +// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding +// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html +jQuery.Event.prototype = { + constructor: jQuery.Event, + isDefaultPrevented: returnFalse, + isPropagationStopped: returnFalse, + isImmediatePropagationStopped: returnFalse, + + preventDefault: function() { + var e = this.originalEvent; + + this.isDefaultPrevented = returnTrue; + if ( !e ) { + return; + } + + // If preventDefault exists, run it on the original event + if ( e.preventDefault ) { + e.preventDefault(); + + // Support: IE + // Otherwise set the returnValue property of the original event to false + } else { + e.returnValue = false; + } + }, + stopPropagation: function() { + var e = this.originalEvent; + + this.isPropagationStopped = returnTrue; + + if ( !e || this.isSimulated ) { + return; + } + + // If stopPropagation exists, run it on the original event + if ( e.stopPropagation ) { + e.stopPropagation(); + } + + // Support: IE + // Set the cancelBubble property of the original event to true + e.cancelBubble = true; + }, + stopImmediatePropagation: function() { + var e = this.originalEvent; + + this.isImmediatePropagationStopped = returnTrue; + + if ( e && e.stopImmediatePropagation ) { + e.stopImmediatePropagation(); + } + + this.stopPropagation(); + } +}; + +// Create mouseenter/leave events using mouseover/out and event-time checks +// so that event delegation works in jQuery. +// Do the same for pointerenter/pointerleave and pointerover/pointerout +// +// Support: Safari 7 only +// Safari sends mouseenter too often; see: +// https://code.google.com/p/chromium/issues/detail?id=470258 +// for the description of the bug (it existed in older Chrome versions as well). +jQuery.each( { + mouseenter: "mouseover", + mouseleave: "mouseout", + pointerenter: "pointerover", + pointerleave: "pointerout" +}, function( orig, fix ) { + jQuery.event.special[ orig ] = { + delegateType: fix, + bindType: fix, + + handle: function( event ) { + var ret, + target = this, + related = event.relatedTarget, + handleObj = event.handleObj; + + // For mouseenter/leave call the handler if related is outside the target. + // NB: No relatedTarget if the mouse left/entered the browser window + if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) { + event.type = handleObj.origType; + ret = handleObj.handler.apply( this, arguments ); + event.type = fix; + } + return ret; + } + }; +} ); + +// IE submit delegation +if ( !support.submit ) { + + jQuery.event.special.submit = { + setup: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Lazy-add a submit handler when a descendant form may potentially be submitted + jQuery.event.add( this, "click._submit keypress._submit", function( e ) { + + // Node name check avoids a VML-related crash in IE (#9807) + var elem = e.target, + form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? + + // Support: IE <=8 + // We use jQuery.prop instead of elem.form + // to allow fixing the IE8 delegated submit issue (gh-2332) + // by 3rd party polyfills/workarounds. + jQuery.prop( elem, "form" ) : + undefined; + + if ( form && !jQuery._data( form, "submit" ) ) { + jQuery.event.add( form, "submit._submit", function( event ) { + event._submitBubble = true; + } ); + jQuery._data( form, "submit", true ); + } + } ); + + // return undefined since we don't need an event listener + }, + + postDispatch: function( event ) { + + // If form was submitted by the user, bubble the event up the tree + if ( event._submitBubble ) { + delete event._submitBubble; + if ( this.parentNode && !event.isTrigger ) { + jQuery.event.simulate( "submit", this.parentNode, event ); + } + } + }, + + teardown: function() { + + // Only need this for delegated form submit events + if ( jQuery.nodeName( this, "form" ) ) { + return false; + } + + // Remove delegated handlers; cleanData eventually reaps submit handlers attached above + jQuery.event.remove( this, "._submit" ); + } + }; +} + +// IE change delegation and checkbox/radio fix +if ( !support.change ) { + + jQuery.event.special.change = { + + setup: function() { + + if ( rformElems.test( this.nodeName ) ) { + + // IE doesn't fire change on a check/radio until blur; trigger it on click + // after a propertychange. Eat the blur-change in special.change.handle. + // This still fires onchange a second time for check/radio after blur. + if ( this.type === "checkbox" || this.type === "radio" ) { + jQuery.event.add( this, "propertychange._change", function( event ) { + if ( event.originalEvent.propertyName === "checked" ) { + this._justChanged = true; + } + } ); + jQuery.event.add( this, "click._change", function( event ) { + if ( this._justChanged && !event.isTrigger ) { + this._justChanged = false; + } + + // Allow triggered, simulated change events (#11500) + jQuery.event.simulate( "change", this, event ); + } ); + } + return false; + } + + // Delegated event; lazy-add a change handler on descendant inputs + jQuery.event.add( this, "beforeactivate._change", function( e ) { + var elem = e.target; + + if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "change" ) ) { + jQuery.event.add( elem, "change._change", function( event ) { + if ( this.parentNode && !event.isSimulated && !event.isTrigger ) { + jQuery.event.simulate( "change", this.parentNode, event ); + } + } ); + jQuery._data( elem, "change", true ); + } + } ); + }, + + handle: function( event ) { + var elem = event.target; + + // Swallow native change events from checkbox/radio, we already triggered them above + if ( this !== elem || event.isSimulated || event.isTrigger || + ( elem.type !== "radio" && elem.type !== "checkbox" ) ) { + + return event.handleObj.handler.apply( this, arguments ); + } + }, + + teardown: function() { + jQuery.event.remove( this, "._change" ); + + return !rformElems.test( this.nodeName ); + } + }; +} + +// Support: Firefox +// Firefox doesn't have focus(in | out) events +// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787 +// +// Support: Chrome, Safari +// focus(in | out) events fire after focus & blur events, +// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order +// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857 +if ( !support.focusin ) { + jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) { + + // Attach a single capturing handler on the document while someone wants focusin/focusout + var handler = function( event ) { + jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) ); + }; + + jQuery.event.special[ fix ] = { + setup: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ); + + if ( !attaches ) { + doc.addEventListener( orig, handler, true ); + } + jQuery._data( doc, fix, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this, + attaches = jQuery._data( doc, fix ) - 1; + + if ( !attaches ) { + doc.removeEventListener( orig, handler, true ); + jQuery._removeData( doc, fix ); + } else { + jQuery._data( doc, fix, attaches ); + } + } + }; + } ); +} + +jQuery.fn.extend( { + + on: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn ); + }, + one: function( types, selector, data, fn ) { + return on( this, types, selector, data, fn, 1 ); + }, + off: function( types, selector, fn ) { + var handleObj, type; + if ( types && types.preventDefault && types.handleObj ) { + + // ( event ) dispatched jQuery.Event + handleObj = types.handleObj; + jQuery( types.delegateTarget ).off( + handleObj.namespace ? + handleObj.origType + "." + handleObj.namespace : + handleObj.origType, + handleObj.selector, + handleObj.handler + ); + return this; + } + if ( typeof types === "object" ) { + + // ( types-object [, selector] ) + for ( type in types ) { + this.off( type, selector, types[ type ] ); + } + return this; + } + if ( selector === false || typeof selector === "function" ) { + + // ( types [, fn] ) + fn = selector; + selector = undefined; + } + if ( fn === false ) { + fn = returnFalse; + } + return this.each( function() { + jQuery.event.remove( this, types, fn, selector ); + } ); + }, + + trigger: function( type, data ) { + return this.each( function() { + jQuery.event.trigger( type, data, this ); + } ); + }, + triggerHandler: function( type, data ) { + var elem = this[ 0 ]; + if ( elem ) { + return jQuery.event.trigger( type, data, elem, true ); + } + } +} ); + + +var rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g, + rnoshimcache = new RegExp( "<(?:" + nodeNames + ")[\\s/>]", "i" ), + rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi, + + // Support: IE 10-11, Edge 10240+ + // In IE/Edge using regex groups here causes severe slowdowns. + // See https://connect.microsoft.com/IE/feedback/details/1736512/ + rnoInnerhtml = /\s*$/g, + safeFragment = createSafeFragment( document ), + fragmentDiv = safeFragment.appendChild( document.createElement( "div" ) ); + +// Support: IE<8 +// Manipulating tables requires a tbody +function manipulationTarget( elem, content ) { + return jQuery.nodeName( elem, "table" ) && + jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ? + + elem.getElementsByTagName( "tbody" )[ 0 ] || + elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) : + elem; +} + +// Replace/restore the type attribute of script elements for safe DOM manipulation +function disableScript( elem ) { + elem.type = ( jQuery.find.attr( elem, "type" ) !== null ) + "/" + elem.type; + return elem; +} +function restoreScript( elem ) { + var match = rscriptTypeMasked.exec( elem.type ); + if ( match ) { + elem.type = match[ 1 ]; + } else { + elem.removeAttribute( "type" ); + } + return elem; +} + +function cloneCopyEvent( src, dest ) { + if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) { + return; + } + + var type, i, l, + oldData = jQuery._data( src ), + curData = jQuery._data( dest, oldData ), + events = oldData.events; + + if ( events ) { + delete curData.handle; + curData.events = {}; + + for ( type in events ) { + for ( i = 0, l = events[ type ].length; i < l; i++ ) { + jQuery.event.add( dest, type, events[ type ][ i ] ); + } + } + } + + // make the cloned public data object a copy from the original + if ( curData.data ) { + curData.data = jQuery.extend( {}, curData.data ); + } +} + +function fixCloneNodeIssues( src, dest ) { + var nodeName, e, data; + + // We do not need to do anything for non-Elements + if ( dest.nodeType !== 1 ) { + return; + } + + nodeName = dest.nodeName.toLowerCase(); + + // IE6-8 copies events bound via attachEvent when using cloneNode. + if ( !support.noCloneEvent && dest[ jQuery.expando ] ) { + data = jQuery._data( dest ); + + for ( e in data.events ) { + jQuery.removeEvent( dest, e, data.handle ); + } + + // Event data gets referenced instead of copied if the expando gets copied too + dest.removeAttribute( jQuery.expando ); + } + + // IE blanks contents when cloning scripts, and tries to evaluate newly-set text + if ( nodeName === "script" && dest.text !== src.text ) { + disableScript( dest ).text = src.text; + restoreScript( dest ); + + // IE6-10 improperly clones children of object elements using classid. + // IE10 throws NoModificationAllowedError if parent is null, #12132. + } else if ( nodeName === "object" ) { + if ( dest.parentNode ) { + dest.outerHTML = src.outerHTML; + } + + // This path appears unavoidable for IE9. When cloning an object + // element in IE9, the outerHTML strategy above is not sufficient. + // If the src has innerHTML and the destination does not, + // copy the src.innerHTML into the dest.innerHTML. #10324 + if ( support.html5Clone && ( src.innerHTML && !jQuery.trim( dest.innerHTML ) ) ) { + dest.innerHTML = src.innerHTML; + } + + } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) { + + // IE6-8 fails to persist the checked state of a cloned checkbox + // or radio button. Worse, IE6-7 fail to give the cloned element + // a checked appearance if the defaultChecked value isn't also set + + dest.defaultChecked = dest.checked = src.checked; + + // IE6-7 get confused and end up setting the value of a cloned + // checkbox/radio button to an empty string instead of "on" + if ( dest.value !== src.value ) { + dest.value = src.value; + } + + // IE6-8 fails to return the selected option to the default selected + // state when cloning options + } else if ( nodeName === "option" ) { + dest.defaultSelected = dest.selected = src.defaultSelected; + + // IE6-8 fails to set the defaultValue to the correct value when + // cloning other types of input fields + } else if ( nodeName === "input" || nodeName === "textarea" ) { + dest.defaultValue = src.defaultValue; + } +} + +function domManip( collection, args, callback, ignored ) { + + // Flatten any nested arrays + args = concat.apply( [], args ); + + var first, node, hasScripts, + scripts, doc, fragment, + i = 0, + l = collection.length, + iNoClone = l - 1, + value = args[ 0 ], + isFunction = jQuery.isFunction( value ); + + // We can't cloneNode fragments that contain checked, in WebKit + if ( isFunction || + ( l > 1 && typeof value === "string" && + !support.checkClone && rchecked.test( value ) ) ) { + return collection.each( function( index ) { + var self = collection.eq( index ); + if ( isFunction ) { + args[ 0 ] = value.call( this, index, self.html() ); + } + domManip( self, args, callback, ignored ); + } ); + } + + if ( l ) { + fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored ); + first = fragment.firstChild; + + if ( fragment.childNodes.length === 1 ) { + fragment = first; + } + + // Require either new content or an interest in ignored elements to invoke the callback + if ( first || ignored ) { + scripts = jQuery.map( getAll( fragment, "script" ), disableScript ); + hasScripts = scripts.length; + + // Use the original fragment for the last item + // instead of the first because it can end up + // being emptied incorrectly in certain situations (#8070). + for ( ; i < l; i++ ) { + node = fragment; + + if ( i !== iNoClone ) { + node = jQuery.clone( node, true, true ); + + // Keep references to cloned scripts for later restoration + if ( hasScripts ) { + + // Support: Android<4.1, PhantomJS<2 + // push.apply(_, arraylike) throws on ancient WebKit + jQuery.merge( scripts, getAll( node, "script" ) ); + } + } + + callback.call( collection[ i ], node, i ); + } + + if ( hasScripts ) { + doc = scripts[ scripts.length - 1 ].ownerDocument; + + // Reenable scripts + jQuery.map( scripts, restoreScript ); + + // Evaluate executable scripts on first document insertion + for ( i = 0; i < hasScripts; i++ ) { + node = scripts[ i ]; + if ( rscriptType.test( node.type || "" ) && + !jQuery._data( node, "globalEval" ) && + jQuery.contains( doc, node ) ) { + + if ( node.src ) { + + // Optional AJAX dependency, but won't run scripts if not present + if ( jQuery._evalUrl ) { + jQuery._evalUrl( node.src ); + } + } else { + jQuery.globalEval( + ( node.text || node.textContent || node.innerHTML || "" ) + .replace( rcleanScript, "" ) + ); + } + } + } + } + + // Fix #11809: Avoid leaking memory + fragment = first = null; + } + } + + return collection; +} + +function remove( elem, selector, keepData ) { + var node, + elems = selector ? jQuery.filter( selector, elem ) : elem, + i = 0; + + for ( ; ( node = elems[ i ] ) != null; i++ ) { + + if ( !keepData && node.nodeType === 1 ) { + jQuery.cleanData( getAll( node ) ); + } + + if ( node.parentNode ) { + if ( keepData && jQuery.contains( node.ownerDocument, node ) ) { + setGlobalEval( getAll( node, "script" ) ); + } + node.parentNode.removeChild( node ); + } + } + + return elem; +} + +jQuery.extend( { + htmlPrefilter: function( html ) { + return html.replace( rxhtmlTag, "<$1>" ); + }, + + clone: function( elem, dataAndEvents, deepDataAndEvents ) { + var destElements, node, clone, i, srcElements, + inPage = jQuery.contains( elem.ownerDocument, elem ); + + if ( support.html5Clone || jQuery.isXMLDoc( elem ) || + !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) { + + clone = elem.cloneNode( true ); + + // IE<=8 does not properly clone detached, unknown element nodes + } else { + fragmentDiv.innerHTML = elem.outerHTML; + fragmentDiv.removeChild( clone = fragmentDiv.firstChild ); + } + + if ( ( !support.noCloneEvent || !support.noCloneChecked ) && + ( elem.nodeType === 1 || elem.nodeType === 11 ) && !jQuery.isXMLDoc( elem ) ) { + + // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2 + destElements = getAll( clone ); + srcElements = getAll( elem ); + + // Fix all IE cloning issues + for ( i = 0; ( node = srcElements[ i ] ) != null; ++i ) { + + // Ensure that the destination node is not null; Fixes #9587 + if ( destElements[ i ] ) { + fixCloneNodeIssues( node, destElements[ i ] ); + } + } + } + + // Copy the events from the original to the clone + if ( dataAndEvents ) { + if ( deepDataAndEvents ) { + srcElements = srcElements || getAll( elem ); + destElements = destElements || getAll( clone ); + + for ( i = 0; ( node = srcElements[ i ] ) != null; i++ ) { + cloneCopyEvent( node, destElements[ i ] ); + } + } else { + cloneCopyEvent( elem, clone ); + } + } + + // Preserve script evaluation history + destElements = getAll( clone, "script" ); + if ( destElements.length > 0 ) { + setGlobalEval( destElements, !inPage && getAll( elem, "script" ) ); + } + + destElements = srcElements = node = null; + + // Return the cloned set + return clone; + }, + + cleanData: function( elems, /* internal */ forceAcceptData ) { + var elem, type, id, data, + i = 0, + internalKey = jQuery.expando, + cache = jQuery.cache, + attributes = support.attributes, + special = jQuery.event.special; + + for ( ; ( elem = elems[ i ] ) != null; i++ ) { + if ( forceAcceptData || acceptData( elem ) ) { + + id = elem[ internalKey ]; + data = id && cache[ id ]; + + if ( data ) { + if ( data.events ) { + for ( type in data.events ) { + if ( special[ type ] ) { + jQuery.event.remove( elem, type ); + + // This is a shortcut to avoid jQuery.event.remove's overhead + } else { + jQuery.removeEvent( elem, type, data.handle ); + } + } + } + + // Remove cache only if it was not already removed by jQuery.event.remove + if ( cache[ id ] ) { + + delete cache[ id ]; + + // Support: IE<9 + // IE does not allow us to delete expando properties from nodes + // IE creates expando attributes along with the property + // IE does not have a removeAttribute function on Document nodes + if ( !attributes && typeof elem.removeAttribute !== "undefined" ) { + elem.removeAttribute( internalKey ); + + // Webkit & Blink performance suffers when deleting properties + // from DOM nodes, so set to undefined instead + // https://code.google.com/p/chromium/issues/detail?id=378607 + } else { + elem[ internalKey ] = undefined; + } + + deletedIds.push( id ); + } + } + } + } + } +} ); + +jQuery.fn.extend( { + + // Keep domManip exposed until 3.0 (gh-2225) + domManip: domManip, + + detach: function( selector ) { + return remove( this, selector, true ); + }, + + remove: function( selector ) { + return remove( this, selector ); + }, + + text: function( value ) { + return access( this, function( value ) { + return value === undefined ? + jQuery.text( this ) : + this.empty().append( + ( this[ 0 ] && this[ 0 ].ownerDocument || document ).createTextNode( value ) + ); + }, null, value, arguments.length ); + }, + + append: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.appendChild( elem ); + } + } ); + }, + + prepend: function() { + return domManip( this, arguments, function( elem ) { + if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) { + var target = manipulationTarget( this, elem ); + target.insertBefore( elem, target.firstChild ); + } + } ); + }, + + before: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this ); + } + } ); + }, + + after: function() { + return domManip( this, arguments, function( elem ) { + if ( this.parentNode ) { + this.parentNode.insertBefore( elem, this.nextSibling ); + } + } ); + }, + + empty: function() { + var elem, + i = 0; + + for ( ; ( elem = this[ i ] ) != null; i++ ) { + + // Remove element nodes and prevent memory leaks + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + } + + // Remove any remaining nodes + while ( elem.firstChild ) { + elem.removeChild( elem.firstChild ); + } + + // If this is a select, ensure that it displays empty (#12336) + // Support: IE<9 + if ( elem.options && jQuery.nodeName( elem, "select" ) ) { + elem.options.length = 0; + } + } + + return this; + }, + + clone: function( dataAndEvents, deepDataAndEvents ) { + dataAndEvents = dataAndEvents == null ? false : dataAndEvents; + deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents; + + return this.map( function() { + return jQuery.clone( this, dataAndEvents, deepDataAndEvents ); + } ); + }, + + html: function( value ) { + return access( this, function( value ) { + var elem = this[ 0 ] || {}, + i = 0, + l = this.length; + + if ( value === undefined ) { + return elem.nodeType === 1 ? + elem.innerHTML.replace( rinlinejQuery, "" ) : + undefined; + } + + // See if we can take a shortcut and just use innerHTML + if ( typeof value === "string" && !rnoInnerhtml.test( value ) && + ( support.htmlSerialize || !rnoshimcache.test( value ) ) && + ( support.leadingWhitespace || !rleadingWhitespace.test( value ) ) && + !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) { + + value = jQuery.htmlPrefilter( value ); + + try { + for ( ; i < l; i++ ) { + + // Remove element nodes and prevent memory leaks + elem = this[ i ] || {}; + if ( elem.nodeType === 1 ) { + jQuery.cleanData( getAll( elem, false ) ); + elem.innerHTML = value; + } + } + + elem = 0; + + // If using innerHTML throws an exception, use the fallback method + } catch ( e ) {} + } + + if ( elem ) { + this.empty().append( value ); + } + }, null, value, arguments.length ); + }, + + replaceWith: function() { + var ignored = []; + + // Make the changes, replacing each non-ignored context element with the new content + return domManip( this, arguments, function( elem ) { + var parent = this.parentNode; + + if ( jQuery.inArray( this, ignored ) < 0 ) { + jQuery.cleanData( getAll( this ) ); + if ( parent ) { + parent.replaceChild( elem, this ); + } + } + + // Force callback invocation + }, ignored ); + } +} ); + +jQuery.each( { + appendTo: "append", + prependTo: "prepend", + insertBefore: "before", + insertAfter: "after", + replaceAll: "replaceWith" +}, function( name, original ) { + jQuery.fn[ name ] = function( selector ) { + var elems, + i = 0, + ret = [], + insert = jQuery( selector ), + last = insert.length - 1; + + for ( ; i <= last; i++ ) { + elems = i === last ? this : this.clone( true ); + jQuery( insert[ i ] )[ original ]( elems ); + + // Modern browsers can apply jQuery collections as arrays, but oldIE needs a .get() + push.apply( ret, elems.get() ); + } + + return this.pushStack( ret ); + }; +} ); + + +var iframe, + elemdisplay = { + + // Support: Firefox + // We have to pre-define these values for FF (#10227) + HTML: "block", + BODY: "block" + }; + +/** + * Retrieve the actual display of a element + * @param {String} name nodeName of the element + * @param {Object} doc Document object + */ + +// Called only from within defaultDisplay +function actualDisplay( name, doc ) { + var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ), + + display = jQuery.css( elem[ 0 ], "display" ); + + // We don't have any data stored on the element, + // so use "detach" method as fast way to get rid of the element + elem.detach(); + + return display; +} + +/** + * Try to determine the default display value of an element + * @param {String} nodeName + */ +function defaultDisplay( nodeName ) { + var doc = document, + display = elemdisplay[ nodeName ]; + + if ( !display ) { + display = actualDisplay( nodeName, doc ); + + // If the simple way fails, read from inside an iframe + if ( display === "none" || !display ) { + + // Use the already-created iframe if possible + iframe = ( iframe || jQuery( " + +
    +
    +
    + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ABCDEF
    A1
    + + +
    Klavier +
    + + + + + + + + + + + + + + +
    K1 + + + + + + + + + + + + + + + + + + K1
    K2 + + + + + + + + + + + + + + + + + + K2
    K3 + + + + + + + + + + + + + + + + + + K3
    K4 + + + + + + + + + + + + + + + + + + K4
    K5 + + + + + + + + + + + + + + + + + + K5
    K6 + + + + + + + + + + + + + + + + + + K6
    K7 + + + + + + + + + + + + + + + + + + K7
    K8 + + + + + + + + + + + + + + + + + + K8
    K9 + + + + + + + + + + + + + + + + + + K9
    + + + + + + + + + K10
    K10 + + + + + + + + +
    D1 + + + D1
    M1 + + + + + + + + +
    F1 + + + + + + + + +
    E1 + + + + + + + + + + + + + + + + + + E1
    E2 + + + + + + + + + + + + + + + + + + E2
    E3 + + + + + + + + + + + + + + + + + + E3
    E4 + + + + + + + + + + + + + + + + + + E4
    E5 + + + + + + + + + +
    + + + + + + + + + E5
    ABCDEF
    +
    + + + + +
    +
    + + Sonntagschule + + +
    +
    +
    + + Vorsonntagschule + + +
    +
    +
    + Legende + + + + + +
    + A1 = Altarraum
    + K1-10 = Kirchenschiffreihen
    + D1 = Diakon
    + M1 = Mutter/Kind
    + F1 = Foyer
    + E1-5 Empore
    +
    + Sitzplatzuweisung für den aktuellen GD löschen
    + Standardsitzplatz zuweisen, für alle künftigen Registrierungen
    + Standardsitzplatz löschen, für alle künftigen Registrierungen
    +
    +
    +
    +
    +
    +
    +
    + {/if} + + + +   + + + + + +{/if} + diff --git a/templates/modern/admin/2022-01-12_unzugeordnet.html b/templates/modern/admin/2022-01-12_unzugeordnet.html new file mode 100644 index 0000000..f005a91 --- /dev/null +++ b/templates/modern/admin/2022-01-12_unzugeordnet.html @@ -0,0 +1,86 @@ + + + + + + + Sitzplan + + + + + + + + + + + + + + +
    + + Nicht zugeordnete Personen + +
    + + + + + + {section name=table_data1 loop=$table_data1} + + + + + {/section} +
    NameMögliche Sitzplätze
    {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} ({$table_data1[table_data1].Anz} {if $table_data1[table_data1].Anz == 1} Person{else} Personen{/if}) + + +
    +
    +
    + + diff --git a/templates/modern/admin/administration_frame.html b/templates/modern/admin/administration_frame.html new file mode 100644 index 0000000..699a71c --- /dev/null +++ b/templates/modern/admin/administration_frame.html @@ -0,0 +1,20 @@ + + +Deputatverwaltung + + + + + + + + + +<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> + +<p>To view this page correctly, you need a Web browser that supports frames.</p> + +</body> + + + \ No newline at end of file diff --git a/templates/modern/admin/gd_verwaltung.html b/templates/modern/admin/gd_verwaltung.html new file mode 100644 index 0000000..e23eaf3 --- /dev/null +++ b/templates/modern/admin/gd_verwaltung.html @@ -0,0 +1,681 @@ +{if $action == ''} + + + + + + + Sitzplan + + + + + + + + + + + + +
    + + Statistik / Verwaltung + + +

    + {if $verwaltung_error == '1'} + + + + + +
    + + Achtung!
    + {$verwaltung_error_text} +
    +
    + {/if} + + + + + + + + + + + + + + + + + + +
    Anzahl Anmeldungen:{$verwaltung_anzges}
    Anzahl Haushalte:{if $verwaltung_lfd_haushalte<$verwaltung_kritischemarke}{else}{/if} {$verwaltung_lfd_haushalte}
    Anmeldungen sperren: +
    + {if $verwaltung_sperrung ==0} + Gottesdienst sperren + {/if} + {if $verwaltung_sperrung ==1} + Gottesdienst öffnen (seit {$verwaltung_sperrdat} gesperrt) + {/if} +
    Standardsitzplätze: + Wiederherstellung +
    +
    +

    + + + + + + +
    Teilnehmer löschen: + +
    +
    +
    + Haushalt hinzufügen: +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + + Nachname + +   + + Vorname (vollständig ausgeschrieben) + +   +
    + 1 + + + + , + + + +   +
    + 2 + + + + , + + + +   +
    + 3 + + + + , + + + +   +
    + 4 + + + + , + + + +   +
    + 5 + + + + , + + + +   +
    +   + +   + +   + +   + +   +
    + + + Mailadresse: + + +   + + +
    +
    +
    + + +{/if} + +{if $action == 'del'} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    + {if $abmelde_error == 1} +
    Fehler bei der Abmeldung
    + {/if} + {if $abmelde_error == 0} +
    Abmeldung vom Gottesdienst am {$abmelde_termin} Uhr
    + {/if} +
    +
    +
    +

    + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} + + + + +
    + + + {if $abmelde_error == 1} + + + + +
    + + + + + + + + + + + + + + + + +
      + Es ist ein Fehler aufgetreten. Die Buchung konnte nicht gelöscht werden oder ist bereits gelöscht.
    +
    + Im Zweifel kontaktieren Sie den Administrator. +
     
       
      + +  
    + {/if} + {if $abmelde_error == 0} +
    + + + + + + + + + + + + + + + + +
      +

    + Sie möchten {$abmelde_vorname} {$abmelde_nachname} vom Gottesdienst am {$abmelde_termin} Uhr abmelden? +
    +
    +
    + Sind Sie sich sicher? +
    +
    + + +   + + + +

    +
     
       
      + +  
    + {/if} +
    +
    +

    +
    +   +
    + + + +{/if} +{if $action == 'del2'} + + + + + + + Abmeldung beendet + + + + + + + + + + + +
    +   + +
    +
    +
    Abmeldung beendet
    +
    +
    +
    +

    + {if $save_error == '1'} + + + + + +
    + + Achtung!
    + {$save_error_text} +
    +
    + {else} +
    +
    + + + + +
    + + + + + +
    +

    + {$abmelde_ausgabe} +

    +
    +
    +
    +
    +
    + {/if} +

    +
    +   +
    + + + +{/if} + +{if $action == 'save'} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $save_error == '1'} + + + + + +
    + + Achtung!
    + {$save_error_text} +
    +
    + {else} +
    +
    + + + + +
    + + + + + +
    +

    + Die Anmeldung zum Gottesdienst ist erfolgreich abgeschlossen.
    +
    + {if $iframe1 != ''}{/if} + {if $iframe2 != ''}{/if} + {if $iframe3 != ''}{/if} + {if $iframe4 != ''}{/if} + {if $iframe5 != ''}{/if} +

    +
    +
    +
    +
    +
    + {/if} +

    +
    +   +
    + + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/hauptframe.html b/templates/modern/admin/hauptframe.html new file mode 100644 index 0000000..60b4f2b --- /dev/null +++ b/templates/modern/admin/hauptframe.html @@ -0,0 +1,31 @@ + + +BPM Administration + + + + + +
    +
    +
    Willkommen
    +
    +
    + +
    +

    + + + + +
    + Willkommen bei der Administration JU & MI +
    +
    +
    + Wählen Sie oben einen Reiter aus, um den gewünschten Bereich zu administrieren. +
    +

    + + + \ No newline at end of file diff --git a/templates/modern/admin/index.html b/templates/modern/admin/index.html new file mode 100644 index 0000000..74c8177 --- /dev/null +++ b/templates/modern/admin/index.html @@ -0,0 +1,132 @@ + +{if $action == ''} + + + Willkommen zur Gottesdienstadministration + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Willkommen zur {$global_titel}
    +
    +
    +
    +

    + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} + + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + +
    + Benutzerkennung + +
    + Passwort: + +
    +   +
    +   + + +
    +
    +

    + +

    +
    +
    + + +
    +
    +   +
    + + + +{/if} + +{if $action == 'anmeld'} + {if $index_login == '1'} + + {/if} +{/if} \ No newline at end of file diff --git a/templates/modern/admin/indexframe.html b/templates/modern/admin/indexframe.html new file mode 100644 index 0000000..a11baeb --- /dev/null +++ b/templates/modern/admin/indexframe.html @@ -0,0 +1,23 @@ + + +{$titel_head_umfrage} + + + + + + + + + + + +<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> + +<p>To view this page correctly, you need a Web browser that supports frames.</p> + +</body> + + + \ No newline at end of file diff --git a/templates/modern/admin/liste_qr_name.html b/templates/modern/admin/liste_qr_name.html new file mode 100644 index 0000000..86f1371 --- /dev/null +++ b/templates/modern/admin/liste_qr_name.html @@ -0,0 +1,178 @@ +{if $action == ''} + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + QR-Codes nach Namen + +
    +
    +

    + +

    +
    +

    + + +
    +
    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + + +{if $action == 'ausgabe'} +{if $mailwindow == '1'} + + + + + + + Registrierung und Terminbuchung f�r Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Teilnehmerlistenversand
    +
    +
    +
    +

    +
    +
    + + + + +
    + + + + + +
    +

    + {$message} + + {if $kein_mailversand != ''} +
    +
    + Folgende Personen wurden nicht angeschrieben, die Mailadresse fehlerhaft ist:
    + {$kein_mailversand} + {/if} + + {if $keine_Mailadresse != ''} +
    +
    + Folgende Personen wurden nicht angeschrieben, da keine Mailadresse hinterlegt ist:
    + {$keine_Mailadresse} + {/if} +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + +{/if} +{/if} diff --git a/templates/modern/admin/liste_tn.html b/templates/modern/admin/liste_tn.html new file mode 100644 index 0000000..bad27d4 --- /dev/null +++ b/templates/modern/admin/liste_tn.html @@ -0,0 +1,164 @@ +{if $action == ''} + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Teilnehmerliste + +
    +
    +

    + +

    +
    +

    + + +
    +
    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + + +{if $action == 'ausgabe'} +{if $mailwindow == '1'} + + + + + + + Registrierung und Terminbuchung fr Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Teilnehmerlistenversand
    +
    +
    +
    +

    +
    +
    + + + + +
    + + + + + +
    +

    + {$message} +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + +{/if} +{/if} \ No newline at end of file diff --git a/templates/modern/admin/logout.html b/templates/modern/admin/logout.html new file mode 100644 index 0000000..82aa2d1 --- /dev/null +++ b/templates/modern/admin/logout.html @@ -0,0 +1,74 @@ +{if $action == ''} + + + {$logout_titel} + + + + + + + + + + + + +
    +   + +
    +
    +
    {$logout_titel}
    +
    +
    +
    +

    + + + + + +
    + + + + + + + + + + + + + + + +
    + {$logout_text} +
    +   +
    + Login +
    + +
    + +
    +
    +

    +
    +   + +
    + + + + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/menu_administration.html b/templates/modern/admin/menu_administration.html new file mode 100644 index 0000000..483d349 --- /dev/null +++ b/templates/modern/admin/menu_administration.html @@ -0,0 +1,47 @@ +{if $action == ''} + + + + +Menu + + + + + + + + +
    +
    +

    Voreinstellungen

    + + + + + + +
    + +
    + + + +{/if} diff --git a/templates/modern/admin/menu_qr.html b/templates/modern/admin/menu_qr.html new file mode 100644 index 0000000..b6d0da4 --- /dev/null +++ b/templates/modern/admin/menu_qr.html @@ -0,0 +1,48 @@ +{if $action == ''} + + + + +Menu + + + + + + + +
    +
    +

    QR Verwaltung

    + + + + + + + + +
    + +
    + + + +{/if} + diff --git a/templates/modern/admin/menu_survey.html b/templates/modern/admin/menu_survey.html new file mode 100644 index 0000000..540a7e3 --- /dev/null +++ b/templates/modern/admin/menu_survey.html @@ -0,0 +1,48 @@ +{if $action == ''} + + + + +Menu + + + + + + + +
    +
    +

    {$menu_survey_head1}

    + + + + + + + + +
    + +
    + + + +{/if} + + diff --git a/templates/modern/admin/menu_verwaltung.html b/templates/modern/admin/menu_verwaltung.html new file mode 100644 index 0000000..040085f --- /dev/null +++ b/templates/modern/admin/menu_verwaltung.html @@ -0,0 +1,50 @@ +{if $action == ''} + + + + +Menu + + + + + + + +
    +
    +

    Termine

    + + +

    Gottesdienst

    + + + + + + +
    + +
    + + + +{/if} diff --git a/templates/modern/admin/menu_youtube.html b/templates/modern/admin/menu_youtube.html new file mode 100644 index 0000000..2d46558 --- /dev/null +++ b/templates/modern/admin/menu_youtube.html @@ -0,0 +1,47 @@ +{if $action == ''} + + + + +Menu + + + + + + + +
    +
    +

    Termine

    + + + + + + + + +
    + +
    + + + +{/if} + diff --git a/templates/modern/admin/old/bewerber_daten.html b/templates/modern/admin/old/bewerber_daten.html new file mode 100644 index 0000000..3e20c37 --- /dev/null +++ b/templates/modern/admin/old/bewerber_daten.html @@ -0,0 +1,1705 @@ +{if $action == ''} + + + + + + + + + {literal} + + {/literal} + + +
    + {if $bewerber_error == '1'} + + + + + +
    + + Achtung!
    + {$bewerber_error_text} +
    +
    + {/if} +
    + + Bewerberdaten + +
    +
    +
    +
    +
    +
    + Suche + +
    +
    +
    +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'ausgabe'} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + + + + + + + + + + + + + + + + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Persönliche Angaben + + + + + + +
    + {$status_anrede}
    + {$status_vorname} {$status_nachname}
    + {$status_str}
    + {$status_plz} {$status_ort}
    + {$status_mail}
    +
    + + + + + + {if $status_tel != ''} + + + + + {/if} +
    Geburtstag:{$status_gebdat}
    Tel:{$status_tel}
    +
    + +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Testdatum: + + {$status_tm_datum_form} + +   +
    + Testlogin: + + {$status_login_dat_form} + + {if $status_login_dat_form != '-'} + Testdatum zurücksetzen Ermöglicht einen weiteren Testlogin im Hochschulsystem (nicht im Hogrefeportal) + {/if} +
    + ID: + + {$status_login_id} + +   +
    + TAN: + + {$status_login_tan} + +   +
    + zugeordnete Hochschule: + + +
    +
    +
    +
    +
    +
    + + Testergebnis im Detail + + {if $status_erg_vorhanden == 0} +
    + Es sind keine aktuellen Testergebnisse verfügbar! +
    + {/if} + {if $status_erg_vorhanden == 1} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Testmodul + + Erreichte Punkte +
    + Satzergänzung: + + {$status_erg_satzerg} / 20 +
    + Gemeinsamkeiten: + + {$status_erg_gemeinsamkeiten} / 20 +
    + Rechenaufgaben: + + {$status_erg_rechenaufgaben} / 20 +
    + Zahlenreihen: + + {$status_erg_zahlenreihen} / 20 +
    + Rechenzeichen: + + {$status_erg_rechenzeichen} / 20 +
    + Matrizen: + + {$status_erg_matrizen} / 20 +
    + Merkfähigkeit verbal: + + {$status_erg_merkf} / 10 +
    + Erreichte Punktzahl: + + {$status_erg_summe} / 130 +
    + Ergebnis: + + {$status_erg_bestanden_text} +
    + Einsicht in das Ergebnis Kandidat: + + {$status_erg_einsicht_dat} +
    + {/if} +
    + + {section name=table_data4 loop=$table_data4} +
    +
    Älteres Testergebnis vom {$table_data4[table_data4].status_erg_testdat} Uhr in {$table_data4[table_data4].status_erg_standort} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Testmodul + + Erreichte Punkte +
    + Satzergänzung: + + {$table_data4[table_data4].status_erg_satzerg} / 20 +
    + Gemeinsamkeiten: + + {$table_data4[table_data4].status_erg_gemeinsamkeiten} / 20 +
    + Rechenaufgaben: + + {$table_data4[table_data4].status_erg_rechenaufgaben} / 20 +
    + Zahlenreihen: + + {$table_data4[table_data4].status_erg_zahlenreihen} / 20 +
    + Rechenzeichen: + + {$table_data4[table_data4].status_erg_rechenzeichen} / 20 +
    + Matrizen: + + {$table_data4[table_data4].status_erg_matrizen} / 20 +
    + Merkfähigkeit verbal: + + {$table_data4[table_data4].status_erg_merkf} / 10 +
    + Erreichte Punktzahl: + + {$table_data4[table_data4].status_erg_summe} / 130 +
    + Ergebnis: + + {$table_data4[table_data4].status_erg_bestanden_text} +
    + Einsicht in das Ergebnis Kandidat: + + {$table_data4[table_data4].status_erg_einsicht_dat} +
    +
    + {/section} + + + + + + + + + + + +
    +
    +
    +
    + + Hochgeladene Dokumente + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $smarty.section.table_data1.rownum != ''} + + + + + + + + {/if} + {/section} + + + + + + +
    + Dok. Nr. + + Datei + + Dokumentenbeschreibung + + Hochladedatum + + Löschen +
    + {$table_data1[table_data1].up_id} + + {if $table_data1[table_data1].exists == 1} + {$table_data1[table_data1].basename} + {else} + {$table_data1[table_data1].basename} + {/if} + + + + + {$table_data1[table_data1].upload_dat} + + +
    +
    +
    + + +
    + + +
    +
    +
    +
    +
    + + + + +
    +
    +
    + + Erfasste Note + +
    +
    +

    + + + + + + + +
    + + + + + +
    +

    +

    + + + +
    +
    +
    + + + +
    + + Ausgewählte Ausbildungsstellen + + + + + + + + + + + + {section name=table_data2 loop=$table_data2} + {if $smarty.section.table_data2.rownum != ''} + + + + + + + + + {/if} + {/section} + + + +
    + lfd.Nr. + + Ausbildungsstelle + + Adresse + + Mailadresse + + Mail an Ausbildungsstelle anzeigen + + Status Mail
    Nachsendemöglichkeit
    +
    + {$smarty.section.table_data2.rownum} + + {$table_data2[table_data2].bez} + + {$table_data2[table_data2].str}, {$table_data2[table_data2].plz} {$table_data2[table_data2].ort} + + {$table_data2[table_data2].mail} + + Mail + + {$table_data2[table_data2].status} +
    +
    + Ausbildungsstelle hinzufügen +
    +
    +
    +
    + + + +
    +
    +
    + + Sonstige Mail an Kandidat + + + + + + + + + + + + {section name=table_data3 loop=$table_data3} + {if $smarty.section.table_data3.rownum != ''} + + + + + + + + + {/if} + {/section} +
    + lfd.Nr. + + Absender + + Datum + + Betreff + + Mail anzeigen + + Status Mail
    Nachsendemöglichkeit
    +
    + {$smarty.section.table_data3.rownum} + + {$table_data3[table_data3].sender} + + {$table_data3[table_data3].sendedat_form} + + {$table_data3[table_data3].mail_betreff} + + Mail + + {$table_data3[table_data3].status} +
    +
    + + +
    +
    + + + {/if} + {if $action == 'mail'} + + + + + +
    + + Mailtext + +
    +
    +

    + {$mail_text} +

    +
    +
    +
    +
    +
    +
    +
    + + + {/if} + + {if $action == 'mail_sonst'} + + + + + +
    + + Mailtext + +

    + Betreff: {$mail_betreff} +

    +
    +

    + Mailbody:
    + {$mail_text} +

    +
    +
    +
    +
    +
    + + + {/if} + + + {if $action == 'mailsenden'} + + + + + + + +
    + + E-Mail bearbeiten + +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + Ausbildungsstelle: + + {$mail_bez} +
    + Mailadresse: + + {$mail_mail} +
    + Betreff: + + +
    + Mailtext: + + + {literal} + + {/literal} + +
    +

    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + + {/if} + + {if $action == 'mailsenden_sonst'} + + + + + + + +
    + + E-Mail bearbeiten + +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + Absender: + + {$mail_sender} - {$mail_sendermail} + + +
    + Mailadresse: + + +
    + Betreff: + + +
    + Mailtext: + + + + {literal} + + {/literal} + +
    +

    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + + {/if} + + {if $action == 'mailsenden2'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    + Sie können das Fenster nun schließen. +
    +
    +
    +
    +
    + + + {/if} + + {if $action == 'mailsenden2_sonst'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    + Sie können das Fenster nun schließen. +
    +
    +
    +
    +
    + + + {/if} + + {if $action == 'deldok'} + + + + + +
    + + Löschbestätigung + +
    +
    +

    + Möchten sie die Datei {$deldok_dokument} wirklich löschen?

    + + +   + + + +
    +
    +

    +
    +
    +
    +
    + + + {/if} +{if $action == 'stelle'} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Hinweise + +
      + +
    • Nicht alle der hier aufgeführten Behörden bieten auch Ausbildungsstellen für diesen Studiengang an.
    • +
    • Die gewählten Ausbildungsstellen erhalten automatisch eine Bewerbung übermittelt.
    • +
    • Der Bewerber erhält gegebenenfalls von den ausgewählten Behörden eine Einladung zur Vorstellung.
    • +
    +
    +
    +
    +
    + + Schritt 1: Ausbildungsstellenwahl + + + + + + + + +
    +
      +
    1. Die erste Stelle im Dropdownfeld markieren.
    2. +
    3. Danach "Markierte Stelle auswählen..." klicken,
      so dass die Stelle unter Schritt 2 angezeigt wird
    4. +
    5. Ggf. die Schritte solange wiederholen. Maximal vier Stellen sind möglich.
    6. +
    +
    +
    + + + + + + + +
    +
    + +
    +
    +
    +
    + +
    +
    +
    +   +
    +
    + +
    +
    +
    + + Schritt 2: Ausgewählte Ausbildungsstellen + + +
    + + + + + + + + + {section name=table_data2 loop=$table_data2} + {if $smarty.section.table_data2.rownum != ''} + + + + + + + {/if} + {/section} +
    + lfd.Nr. + + Ausbildungsstelle + + Adresse + + Mailadresse +
    + {$smarty.section.table_data2.rownum} + + {$table_data2[table_data2].bez} + + {$table_data2[table_data2].str}, {$table_data2[table_data2].plz} {$table_data2[table_data2].ort} + + {$table_data2[table_data2].mail} +
    +
    + + + +{/if} + + + + {if $action == 'stammdaten_edit'} + + + + + + + + + + + + +
    + + Stammdaten bearbeiten + +
    +
    +
    + + +
    + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + {if $erf_hig_anrede == 1}* {/if}Anrede:{if $erf_hig_anrede == 1}{/if} + +
    + +
    + {if $erf_hig_vorname == 1}* {/if}Vornamen:{if $erf_hig_vorname == 1}{/if} +
    (wie im Personalausweis angegeben) +
    + +
    + {if $erf_hig_nachname == 1}* {/if}Nachname:{if $erf_hig_nachname == 1}{/if} + + +
    + {if $erf_hig_gebdat == 1}* {/if}Geburtsdatum:{if $erf_hig_gebdat == 1}{/if} + + + +
    + {if $erf_hig_str == 1}* {/if}Straße mit Hausnr:{if $erf_hig_str == 1}{/if} + + +
    + {if $erf_hig_plz == 1}* {/if}PLZ{if $erf_hig_plz == 1}{/if} / {if $erf_hig_ort == 1}* {/if}Ort{if $erf_hig_ort == 1}{/if} + +   +
    + {if $erf_hig_mail == 1}* {/if}E-Mail Adresse:{if $erf_hig_mail == 1}{/if} + + +
    + {if $erf_hig_tel == 1}* {/if}Telefon:{if $erf_hig_tel == 1}{/if} + + +
    +

    +
    +
    +

    + +

    +
    + + +
    + + + {/if} + + {if $action == 'stammdaten2_edit'} + + + + + +
    + + Ergebnis + +
    +
    + Daten gespeichert! +
    +
    + Sie können das Fenster nun schließen. +
    +
    +
    +
    +
    +
    +
    + + + {/if} diff --git a/templates/modern/admin/old/datencheck.html b/templates/modern/admin/old/datencheck.html new file mode 100644 index 0000000..e1e4dc0 --- /dev/null +++ b/templates/modern/admin/old/datencheck.html @@ -0,0 +1,228 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + {if $news_error == '1'} + + + + + +
    + + Achtung!
    + {$news_error_text} +
    +
    + {/if} + +
    + + Datencheck + +

    Matrix über vorhandene Daten

    +
    + + + + + + + + + + + + + + + + + +
    + Anzahl der getesteten Kandidaten: + + {$datenchk_anzget} +
    + Anzahl der Kandidaten mit ausstehendem Test : + + {$datenchk_aussttest} +
    + Anzahl aller Anmeldung: + + {$datenchk_alleranm} +
    + Anzahl Durchfaller: + + {$datenchk_anzdurchfaller} +
    +
    +
    + + + + + + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + + + + + + + + + {/section} +
    + Bew. Nr. ({$dokverw_anzdb}) + + Name + + Testdatum + + Testergebnis + + Verkürzung + + Schwerbehinderung + + PDF Upload HZB + + PDF Upload Zeugnisse + + Lebenslauf + + Note HZB + + Note Durchschnitt +
    + {$table_data1[table_data1].ka_id} + + {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} + + {$table_data1[table_data1].tm_datum} ({$table_data1[table_data1].tm_standort}) + + {$table_data1[table_data1].testergebnis} / 130 + + {if $table_data1[table_data1].verkuerzung == 'J'} Ja {/if} + + {if $table_data1[table_data1].behinderung == 'J'} Ja {/if} + + + +
    + {$table_data1[table_data1].anz_zeug} / 2 +
    + + + + + +
    +
    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/dokverw.html b/templates/modern/admin/old/dokverw.html new file mode 100644 index 0000000..571a301 --- /dev/null +++ b/templates/modern/admin/old/dokverw.html @@ -0,0 +1,184 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + {if $news_error == '1'} + + + + + +
    + + Achtung!
    + {$news_error_text} +
    +
    + {/if} + +
    + + Dokumentenverwaltung + +
    +
    +

    Dateien, die in der Datenbank sind, werden werden geprüft, ob sie auf dem Server vorhanden sind

    + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + {/section} +
    + Name + + Datei + + Existenz (Anzahl: {$dokverw_anzdb}) +
    + {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} + + {$table_data1[table_data1].file} + + {if $table_data1[table_data1].exists == 0} + Auf DB löschen + {/if} + {if $table_data1[table_data1].exists == 1} + vorhanden + {/if} +
    +

    + +

    Dateien, die auf dem Server liegen, werden geprüft, ob sie in der Datenbank bekannt sind

    + + + + + + + + {section name=table_data2 loop=$table_data2} + + + + + + {/section} +
    + Name + + Datei + + Existenz (Anzahl: {$dokverw_anzserver}) +
    + {$table_data2[table_data2].nachname}, {$table_data2[table_data2].vorname} + + {$table_data2[table_data2].file} + + {if $table_data2[table_data2].exists == 0} + Auf Server löschen + {/if} + {if $table_data2[table_data2].exists == 1} + vorhanden + {/if} +
    +
    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/ergebnisse.html b/templates/modern/admin/old/ergebnisse.html new file mode 100644 index 0000000..79bfef9 --- /dev/null +++ b/templates/modern/admin/old/ergebnisse.html @@ -0,0 +1,322 @@ +{if $action == ''} + + + + + + +
    + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Testergebnisse + +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'ausgabe'} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Testergebnisse: {$erg_datum} - {$erg_standort} + +
    + + + + + + + + + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + + + + + + + + + + + + + {/section} +
    + # + + TAN + + Name + + Satzergänzung + + Gemeinsamkeiten + + Rechenaufgaben + + Zahlenreihen + + Rechenzeichen + + Matrizen + + Merkfähigkeit verbal + + Summe Einzeltests + + Gesamtergebnis + + Manuell nicht bestanden +
    + {$smarty.section.table_data1.rownum} + + {$table_data1[table_data1].tan} + + {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} + + {$table_data1[table_data1].satzerg} + + {$table_data1[table_data1].gemeinsamkeiten} + + {$table_data1[table_data1].rechenaufgaben} + + {$table_data1[table_data1].zahlenreihen} + + {$table_data1[table_data1].rechenzeichen} + + {$table_data1[table_data1].matrizen} + + {$table_data1[table_data1].merkf} + + {$table_data1[table_data1].summe} + + {if $table_data1[table_data1].bestanden == 1} + bestanden + {else} + nicht bestanden + {/if} + + {if $table_data1[table_data1].bestanden == 1} + Als durchgefallen markieren + {/if} +
    +
    +
    +
    +
    +
    + + +{/if} + + {if $action == 'del'} + + + + + +
    + + Löschbestätigung + +
    +
    +

    + Möchten sie die Testergebnisse von {$del_name} wirklich löschen?

    + + +   + + + +
    +
    +

    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/kand_del.html b/templates/modern/admin/old/kand_del.html new file mode 100644 index 0000000..3e4535c --- /dev/null +++ b/templates/modern/admin/old/kand_del.html @@ -0,0 +1,142 @@ +{if $action == ''} + + + + + + + + + {literal} + + {/literal} + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Kandidat löschen + +
    +
    +

    Kandidaten können gelöscht werden, solange sie noch nicht am Test teilgenommen haben.

    +

    +

    +
    +
    +
    + Suche + +
    +
    +
    +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + + {if $action == 'nachfrage'} + + + + + +
    + + Löschbestätigung + +
    +
    +

    + Möchten sie Kandidat/in {$kand_name} wirklich löschen?

    + +   + + +
    +
    +

    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/liste_tn.html b/templates/modern/admin/old/liste_tn.html new file mode 100644 index 0000000..d7e6094 --- /dev/null +++ b/templates/modern/admin/old/liste_tn.html @@ -0,0 +1,55 @@ +{if $action == ''} + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Teilnehmerliste + +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/old/logout.html b/templates/modern/admin/old/logout.html new file mode 100644 index 0000000..82aa2d1 --- /dev/null +++ b/templates/modern/admin/old/logout.html @@ -0,0 +1,74 @@ +{if $action == ''} + + + {$logout_titel} + + + + + + + + + + + + +
    +   + +
    +
    +
    {$logout_titel}
    +
    +
    +
    +

    + + + + + +
    + + + + + + + + + + + + + + + +
    + {$logout_text} +
    +   +
    + Login +
    + +
    + +
    +
    +

    +
    +   + +
    + + + + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/old/mail_test.html b/templates/modern/admin/old/mail_test.html new file mode 100644 index 0000000..19d4eed --- /dev/null +++ b/templates/modern/admin/old/mail_test.html @@ -0,0 +1,215 @@ +{if $action == ''} + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Mail an Testteilnehmer + +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + +{if $action == 'mailsenden_test'} + + + + + + + +
    + + E-Mail bearbeiten + +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + Absender: + + {$mail_sender} - {$mail_sendermail} + +
    + Empfänger: + + +
    + Betreff: + + +
    + Mailtext: + + + + {literal} + + {/literal} + +
    +

    +
    +
    +

    +

    + Bitte nur einmal klicken. Rückmeldung dauert 30-60 Sekunden bis alle Mails verschickt wurden! +

    +
    +
    +
    +
    +
    +
    +
    + + + {/if} + + + {if $action == 'mailsenden2_test'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    + Sie können das Fenster nun schließen. +
    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/parameter.html b/templates/modern/admin/old/parameter.html new file mode 100644 index 0000000..dfcd233 --- /dev/null +++ b/templates/modern/admin/old/parameter.html @@ -0,0 +1,118 @@ +{if $action == ''} + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Systemparameter + +
    +
    + + {section name=table_data1 loop=$table_data1} + + + + + {/section} +
    + {$table_data1[table_data1].beschreibung}{if $table_data1[table_data1].pid == 1} Verfügbare Rest-TANs: {$parameter_anzahltan}{/if} + + +
    +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + +{if $action == 'save'} +{if $parameter_inserterr == '1'} + + + + + +
    + Fehler beim der Speicherung +
    +
    + Es traten folgende Fehler auf: +
    + {$parameter_reason} +
    +
    + +
    +
    +
    +
    + + +{/if} + +{if $parameter_inserterr == '2'} + + + + + +
    + Speicherung +
    +
    +

    + Die Daten wurden übernommen. +

    +
    +
    +
    + +
    +
    +
    +
    + + +{/if} +{/if} \ No newline at end of file diff --git a/templates/modern/admin/old/praxisstellen_edit.html b/templates/modern/admin/old/praxisstellen_edit.html new file mode 100644 index 0000000..aa13180 --- /dev/null +++ b/templates/modern/admin/old/praxisstellen_edit.html @@ -0,0 +1,514 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + {if $prxedit_error == '1'} + + + + + +
    + + Achtung!
    + {$prxedit_error_text} +
    +
    + {/if} +
    + + Ausbildungsstelle erfassen + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Art der Ausbildungsstelle: + + +
      +   +
    + Behördenname: + + +
      +   +
    + Straße: + + +
      +   +
    + PLZ / Ort: + + +
      +   +
    + Mail: + + +
      +   +
    + Gültig von: + + +
      +   +
    + Gültig bis: + + +
      +   +
    + Registrierung zurücksetzen: +
    + (Die Praxisstelle bekommt innerhalb 30 Min
    eine Mail mit einer neuen TAN) +
    + +
      +   +
    +
    +

    + + {if $prxedit_value_user != ''} +  zurück zu {$prxedit_value_username} + {/if} +

    +
    +
    +
    +
    +
    +
    + + Erfasste Ausbildungsstellen + + + + + + + + +
    + Suche: Mind 3 Zeichen: + + + + +
    +
    +
    +
    + +
    +
    +
    +
    + + +{/if} + + {if $action == 'mailsenden'} + + + + + + + +
    + + E-Mail bearbeiten + +
    +
    +
    + + + + + + + + + + + + + + + + + +
    + Absender: + + {$mail_sender} - {$mail_sendermail} + + +
    + Mailadresse: + + +
    + Betreff: + + +
    + Mailtext: + + + + {literal} + + {/literal} + +
    +

    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + + {/if} + + {if $action == 'mailsenden2'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    + Sie können das Fenster nun schließen. +
    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/praxisstellen_news.html b/templates/modern/admin/old/praxisstellen_news.html new file mode 100644 index 0000000..621f3c9 --- /dev/null +++ b/templates/modern/admin/old/praxisstellen_news.html @@ -0,0 +1,247 @@ +{if $action == ''} + + + + + + + + + + + + + + + + +
    + {if $news_error == '1'} + + + + + +
    + + Achtung!
    + {$news_error_text} +
    +
    + {/if} + +
    + + Ausbildungsstellen News + +
    +
    + + + + + + + + + +
    + Überschrift: + + +
    + Inhalt: + + + + {literal} + + {/literal} +
    +

    +
    +
    +

    + +

    +
    + +
    +
    +
    +
    +
    +
    + + Erfasste News + + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $smarty.section.table_data1.rownum != ''} + + + + + + + {/if} + {/section} +
    + Datum - Zeit + + Überschrift + + Anzeige + + Edit +
    + {$table_data1[table_data1].pn_date_form} + + {$table_data1[table_data1].pn_headline} + + Nachricht anzeigen + + +   + +
    +
    + +
    +
    +
    +
    + + + {/if} + +{if $action == 'show'} + + + + + +
    + + {$prx_show_headline} + + {$prx_show_text} +
    +
    +
    + +
    +
    +
    +
    +
    + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/old/rangliste2.html b/templates/modern/admin/old/rangliste2.html new file mode 100644 index 0000000..96c444e --- /dev/null +++ b/templates/modern/admin/old/rangliste2.html @@ -0,0 +1,171 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + {if $news_error == '1'} + + + + + +
    + + Achtung!
    + {$news_error_text} +
    +
    + {/if} + +
    + + Rangliste 2 + +
    +
    + + + + +
    + Export Rangliste 2: +   +
    +
    +
    + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + + + + {/section} +
    + Ranglistenplatz 2 ({$dokverw_anzdb}) + + Name + + Mail + + ID + + Testdatum + + Testergebnis +
    + {$table_data1[table_data1].rangliste} + + {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} + + {$table_data1[table_data1].mail} + + {$table_data1[table_data1].id} + + {$table_data1[table_data1].tm_datum} ({$table_data1[table_data1].tm_standort}) + + {$table_data1[table_data1].summe} / 130 +
    +
    +
    +
    +
    +
    + + + {/if} \ No newline at end of file diff --git a/templates/modern/admin/old/tanimport.html b/templates/modern/admin/old/tanimport.html new file mode 100644 index 0000000..d4c8c71 --- /dev/null +++ b/templates/modern/admin/old/tanimport.html @@ -0,0 +1,349 @@ +{if $action == ''} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Schritt 1: Dateien auswählen und hochladen + + + + + + + + +
    +
      +
    1. Roter Button anklicken, um HOGREFE TAN Liste auszuwählen
    2. +
    3. Danach "CSV-Hochladen..." klicken
    4. +
    5. Verfügbare Rest-TANs: {$tanimp_anzahltan}
    6. +
    7. Importvorlage Hogrefe: Import_CSV_Hogrefe.xlsx als CSV-Datei abspeichern.
    8. +
    +
    +
    + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +   +
    +
    +
    +
    + + +{/if} +{if $action == 'csvimp'} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Schritt 2: Daten prüfen + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + {/section} +
    + # + + TAN + + Kurzlink +
    + {$smarty.section.table_data1.rownum} + + {$table_data1[table_data1].tan} + + {$table_data1[table_data1].tinyurl} +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + Auswahl + + Markieren +
    Datensätze nicht importieren + +
    Datensätze importieren + +
    +   + +   +
    +   + + +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'csvimp2'} + + + + + + +
    + + Import beendet + +
    +
    +

    + Der Import wurde beendet! +
    +
    + {if $index_error == '1'} + + {section name=table_data2 loop=$table_data2} + + + + {/section} +
    + {$table_data2[table_data2].hinweis} +
    + {/if} +

    +
    +
    +
    + +
    +
    +
    +
    + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/old/termine.html_bcc b/templates/modern/admin/old/termine.html_bcc new file mode 100644 index 0000000..4c04fed --- /dev/null +++ b/templates/modern/admin/old/termine.html_bcc @@ -0,0 +1,439 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Termine erfassen + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Testdatum: + + +
      +   +
    + Uhrzeit: + + +
      +   +
    + Maximale Teilnehmerzahl: + + +
      +   +
    + Standort: + +
    + +
      +   +
    + Gebäude / Raum: + + +
      +   +
    + Verwendungszweck Überweisung: + + +
      +   +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    + + Erfasste Termine + + + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $smarty.section.table_data1.rownum != ''} + + + + + + + + + + + {/if} + {/section} +
    + lfd.Nr. + + Testdatum + + Uhrzeit + + Standort + + Freie Plätze + + Gebäude / Raum + + Verwendungszweck Überweisung + + Edit +
    + {$smarty.section.table_data1.rownum} + + {$table_data1[table_data1].datum} + + {$table_data1[table_data1].zeit} + + {$table_data1[table_data1].standort_form} + + {$table_data1[table_data1].restplatz} / {$table_data1[table_data1].tm_plaetze} + + {$table_data1[table_data1].tm_raum} + + {$table_data1[table_data1].tm_referenznr} + + +   + {if $table_data1[table_data1].tm_disable == 0} + + {else} + + {/if} +
    +
    + +
    +
    +
    +
    + + +{/if} + +{if $action == 'mailterminupdate'} + + + + + + +
    + + Mailtext + +
    +
    + Zu dem Termin haben sich bereits Kandidaten eingebucht. Ihnen muss die Veränderung mitgeteilt werden.
    + Sofern noch kein Test geschrieben wurde, kann der Kandidat auch wieder gelöscht werden. Dann wird die Hogrefe TAN wieder frei und die Gebühr muss nicht bezahlt werden. +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + Absender: + + +
    + Empfänger: + + {$mtupd_mailadressen_an} + +
    + Empfänger BCC: + + {$mtupd_mailadressen_bcc} + +
    + Betreff: + + +
    + Mailtext: + + + {literal} + + {/literal} +
    +

    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + + {if $action == 'mailsenden2'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    +
    +
    +
    +
    +
    + + + {/if} diff --git a/templates/modern/admin/old/termine_kandidat.html b/templates/modern/admin/old/termine_kandidat.html new file mode 100644 index 0000000..f68e535 --- /dev/null +++ b/templates/modern/admin/old/termine_kandidat.html @@ -0,0 +1,494 @@ +{if $action == ''} + + + + + + + + + {literal} + + {/literal} + + +
    + {if $bewerber_error == '1'} + + + + + +
    + + Achtung!
    + {$bewerber_error_text} +
    +
    + {/if} +
    + + Testtermin Kandidat anpassen + +
    +
    +
    +
    +
    +
    + Suche + +
    +
    +
    +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'ausgabe'} + + + + + + + + + + + + + + + + + + + + + + + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} + +
    +
    +
    + + Erfasste Termine + + Wählen Sie den neuen Termin für {$term_kand_anrede} {$term_kand_vorname} {$term_kand_nachname} aus!
    +
    + Bisheriger Testtermin: {$term_kand_datum} {$term_kand_zeit} Uhr in {$term_kand_standort} +
    +
    +
    + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $smarty.section.table_data1.rownum != ''} + + + + + + + + + + + {/if} + {/section} +
    + Auswahl + + Testdatum + + Uhrzeit + + Standort + + Freie Plätze + + Gebäude / Raum + + Verwendungszweck Überweisung +
    + {if $table_data1[table_data1].restplatz != 0} + {if $term_kand_tm_id != $table_data1[table_data1].tm_id} + + {/if} + {/if} + + + + + + + + + + + + +
    +
    +

    + +

    +
    +
    +
    + +
    +
    +
    +
    + + +{/if} + +{if $action == 'mail'} + + + + + + + +
    + + Mailtext + +
    +
    + Formulieren Sie ein Anschreiben an den Kandidaten, dass sein Termin verlegt wird. +
    +
    + +
    + + + + + + + + + + + + + + + + + +
    + Absender: + + +
    + Empfänger: + + {$mtupd_mailadressen_an} + +
    + Betreff: + + +
    + Mailtext: + + + {literal} + + {/literal} +
    +

    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + +{if $action == 'mailsenden2'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    +
    +
    +
    +
    +
    + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/old/upload.html b/templates/modern/admin/old/upload.html new file mode 100644 index 0000000..097de5a --- /dev/null +++ b/templates/modern/admin/old/upload.html @@ -0,0 +1,484 @@ +{if $action == ''} + + + + + + +
    + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Import Testdaten + +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'upload'} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Schritt 1: Dateien auswählen und hochladen + + + + + + + + +
    +
      +
    1. Die CSV-Dateien können nacheinander hochgeladen werden.
    2. +
    3. Roter Button anklicken, um die einzelne Datei vom PC auszuwählen
    4. +
    5. Danach "CSV-Hochladen..." klicken, so dass die Datei unter Schritt 2 angezeigt wird
    6. +
    +
    +
    + + + + + + + +
    +
    + + +
    + +
    + +
    +
    +
    +   +
    +
    +
    +
    + + +{/if} +{if $action == 'csvimp'} + + + + + Anlagenupload und Ausbildungsstellenwahl BPM (Bachelor of Arts - Public Management) der Hochschulen Ludwigsburg und Kehl. + + + + + + + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} +
    + + Schritt 2: Daten prüfen + + + + + + + + + + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + + + + + + + + + + + + + {/section} +
    + # + + TAN + + Name + + Datum + + Satzergänzung + + Gemeinsamkeiten + + Rechenaufgaben + + Zahlenreihen + + Rechenzeichen + + Matrizen + + Merkfähigkeit verbal + + Summe Einzeltests + + Gesamtergebnis +
    + {$smarty.section.table_data1.rownum} + + {$table_data1[table_data1].tan} + + {$table_data1[table_data1].name} + + {$table_data1[table_data1].datum} + + {$table_data1[table_data1].satzerg_raw} + + {$table_data1[table_data1].gemeinsamkeiten_raw} + + {$table_data1[table_data1].rechenaufgaben_raw} + + {$table_data1[table_data1].zahlenreihen_raw} + + {$table_data1[table_data1].rechenzeichen_raw} + + {$table_data1[table_data1].matrizen_raw} + + {$table_data1[table_data1].merkf_raw} + + {$table_data1[table_data1].summe} + + {if $table_data1[table_data1].bestanden == 1} + bestanden + {else} + nicht bestanden + {/if} +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + Auswahl + + Markieren +
    Datensätze nicht importieren + +
    Datensätze importieren + +
    +   + +   +
    +   + + +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'csvimp2'} + + + + + + +
    + + Import beendet + +
    +
    +

    + Der Import wurde beendet! +
    +
    + {if $index_error == '1'} + + {section name=table_data2 loop=$table_data2} + + + + {/section} +
    + {$table_data2[table_data2].hinweis} +
    + {/if} +

    +
    +
    +
    + +
    +
    +
    +
    + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/parameter.html b/templates/modern/admin/parameter.html new file mode 100644 index 0000000..766f76a --- /dev/null +++ b/templates/modern/admin/parameter.html @@ -0,0 +1,118 @@ +{if $action == ''} + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Systemparameter + +
    +
    + + {section name=table_data1 loop=$table_data1} + + + + + {/section} +
    + {$table_data1[table_data1].beschreibung} + + +
    +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + +{if $action == 'save'} +{if $parameter_inserterr == '1'} + + + + + +
    + Fehler beim der Speicherung +
    +
    + Es traten folgende Fehler auf: +
    + {$parameter_reason} +
    +
    + +
    +
    +
    +
    + + +{/if} + +{if $parameter_inserterr == '2'} + + + + + +
    + Speicherung +
    +
    +

    + Die Daten wurden übernommen. +

    +
    +
    +
    + +
    +
    +
    +
    + + +{/if} +{/if} \ No newline at end of file diff --git a/templates/modern/admin/qr_code.html b/templates/modern/admin/qr_code.html new file mode 100644 index 0000000..6f16060 --- /dev/null +++ b/templates/modern/admin/qr_code.html @@ -0,0 +1,276 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + + + + + + +
    + + {if $qrcode_error == '1'} + + + + + +
    + + Achtung!
    + {$qrcode_error_text} +
    +
    + {/if} +
    + + QR Code erfassen + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Vorname: + + +
      +   +
    + Nachname: + + +
      +   +
    + QR-Code: + + +
      +   +
    + Mail: + + +
      +   +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    + + Erfasste Links + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $smarty.section.table_data1.rownum != ''} + + + + + + + + + {/if} + {/section} +
    + lfd.Nr. + + Nachname + + Vorname + + QR-Code + + Mail + + Edit +
    + {$smarty.section.table_data1.rownum} + + {$table_data1[table_data1].nachname} + + {$table_data1[table_data1].vorname} + + {$table_data1[table_data1].qr} + + {$table_data1[table_data1].mail} + + +   + +
    +
    + +
    +
    +
    +
    + + +{/if} diff --git a/templates/modern/admin/qr_frame.html b/templates/modern/admin/qr_frame.html new file mode 100644 index 0000000..847082a --- /dev/null +++ b/templates/modern/admin/qr_frame.html @@ -0,0 +1,20 @@ + + +Youtube Links + + + + + + + + + +<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> + +<p>To view this page correctly, you need a Web browser that supports frames.</p> + +</body> + + + \ No newline at end of file diff --git a/templates/modern/admin/sitz_koord.html b/templates/modern/admin/sitz_koord.html new file mode 100644 index 0000000..f1f0131 --- /dev/null +++ b/templates/modern/admin/sitz_koord.html @@ -0,0 +1,34 @@ +{if $action == ''} + + + + + +
    + {section name=table_data1 loop=$table_data1} + {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname}  {if $table_data1[table_data1].favorit == 0} + {/if}{if $table_data1[table_data1].favorit == 1} + {/if}
    + {/section} +
    + + +{/if} + +{if $action == 'del'} + + + + + + + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/sitzplatz.html b/templates/modern/admin/sitzplatz.html new file mode 100644 index 0000000..9537ce0 --- /dev/null +++ b/templates/modern/admin/sitzplatz.html @@ -0,0 +1,936 @@ + {if $action == ''} + + + + + + +
    + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Sitzplätze + +
    +
    +

    + +

    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} +{if $action == 'edit'} + + + + + + + Sitzplan + + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Sitzplan: {$edit_value_datum}
    +
    +
    +
    +

    + {if $save_error == '1'} + + + + + +
    + + Achtung!
    + {$save_error_text} +
    +
    + {else} + + + +
    +
    + + + + +
    + + + + +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ABCDEF
    A1
    + + +
    Klavier +
    + + + + + + + + + + + + + + +
    K1 + + + + + + + + + + + + + + + + + + K1
    K2 + + + + + + + + + + + + + + + + + + K2
    K3 + + + + + + + + + + + + + + + + + + K3
    K4 + + + + + + + + + + + + + + + + + + K4
    K5 + + + + + + + + + + + + + + + + + + K5
    K6 + + + + + + + + + + + + + + + + + + K6
    K7 + + + + + + + + + + + + + + + + + + K7
    K8 + + + + + + + + + + + + + + + + + + K8
    K9 + + + + + + + + + + + + + + + + + + K9
    + + + + + + + + + K10
    K10 + + + + + + + + +
    D1 + + + D1
    M1 + + + + + + + + +
    F1 + + + + + + + + +
    E1 + + + + + + + + + + + + + + + + + + E1
    E2 + + + + + + + + + + + + + + + + + + E2
    E3 + + + + + + + + + + + + + + + + + + E3
    E4 + + + + + + + + + + + + + + + + + + E4
    E5 + + + + + + + + + +
    + + + + + + + + + E5
    ABCDEF
    +
    + + + + +
    +
    + + Sonntagschule + + +
    +
    +
    + + Vorsonntagschule + + +
    +
    +
    + Legende + + + + + +
    + A1 = Altarraum
    + K1-10 = Kirchenschiffreihen
    + D1 = Diakon
    + M1 = Mutter/Kind
    + F1 = Foyer
    + E1-5 Empore
    +
    + Sitzplatzuweisung für den aktuellen GD löschen
    + Standardsitzplatz zuweisen, für alle künftigen Registrierungen
    + Standardsitzplatz löschen, für alle künftigen Registrierungen
    +
    +
    +
    +
    +
    +
    +
    + {/if} +

    +
    +   +
    + + +{/if} + diff --git a/templates/modern/admin/survey_erfassen.html b/templates/modern/admin/survey_erfassen.html new file mode 100644 index 0000000..5b3c733 --- /dev/null +++ b/templates/modern/admin/survey_erfassen.html @@ -0,0 +1,420 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + + + + + + +
    + + {if $umfrageerf_error == '1'} + + + + + +
    + + Achtung!
    + {$umfrageerf_error_text} +
    +
    + {/if} +
    + + Zeitraum der Umfrage und Bezeichnung + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Link verfügbar ab Datum: + + +
      +   +
    + Link verfügbar ab Uhrzeit: + + +
      +   +
    + Link verfügbar bis Datum: + + +
      +   +
    + Link verfügbar bis Uhrzeit: + + +
      +   +
    + Headline der Umfrage: + + +
      +   +
    +
    +

    + +

    +
    +
    +
    + + + +{/if} +{if $action == 'fragen'} + + + + + + + + + +
    + + {if $umfrageerf_error == '1'} + + + + + +
    + + Achtung!
    + {$umfrageerf_error_text} +
    +
    + {/if} +
    + + Frage & Antworten erfassen + +
    +
    + + + + + + + + + + + + + + + +
    + Frage: + + +
      +   +
    + Antwort: + + +
    +
    +

    + +

    +
    +
    +
    +
    +
    + + Vorschau der Frage + + + + + + + + + Scrollable Tabs Bootstrap 5 + + + + + + +
    +
    +
    + +
    +
    + This is the content of Tab 1... +
    +
    + This is the content of Tab 2... +
    +
    + This is the content of Tab 3... +
    +
    + This is the content of Tab 4... +
    +
    + This is the content of Tab 5... +
    +
    + This is the content of Tab 6... +
    +
    + This is the content of Tab 7... +
    +
    + This is the content of Tab 8... +
    +
    + This is the content of Tab 9... +
    +
    + This is the content of Tab 10... +
    +
    + This is the content of Tab 11... +
    +
    + This is the content of Tab 12... +
    +
    + This is the content of Tab 13... +
    +
    + This is the content of Tab 14... +
    +
    + This is the content of Tab 15... +
    +
    + This is the content of Tab 16... +
    + +
    +
    + + + + + + +
    + + + + + +{/if} \ No newline at end of file diff --git a/templates/modern/admin/survey_frame.html b/templates/modern/admin/survey_frame.html new file mode 100644 index 0000000..755374f --- /dev/null +++ b/templates/modern/admin/survey_frame.html @@ -0,0 +1,20 @@ + + +Youtube Links + + + + + + + + + +<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> + +<p>To view this page correctly, you need a Web browser that supports frames.</p> + +</body> + + + \ No newline at end of file diff --git a/templates/modern/admin/termine.html b/templates/modern/admin/termine.html new file mode 100644 index 0000000..388bce4 --- /dev/null +++ b/templates/modern/admin/termine.html @@ -0,0 +1,457 @@ +{if $action == ''} + + + + + + + + + + + + + + + + + + + + + + +
    + + {if $termine_error == '1'} + + + + + +
    + + Achtung!
    + {$termine_error_text} +
    +
    + {/if} +
    + + Termine erfassen + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + Gottesdienstdatum: + + +
      +   +
    + Uhrzeit: + + +
      +   +
    + Hinweis: + + +
      +   +
    + Fellbach GD: + + +
      +   +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    + + Erfasste Termine + + + + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $smarty.section.table_data1.rownum != ''} + + + + + + + + + {/if} + {/section} +
    + lfd.Nr. + + Gottesdienstdatum + + Uhrzeit + + Anmeldungen + + Hinweis + + Edit +
    + {$smarty.section.table_data1.rownum} + + {$table_data1[table_data1].datum_form} + + {$table_data1[table_data1].zeit} + + {$table_data1[table_data1].anz_ges} Personen / {$table_data1[table_data1].anz_fam} Haushalte + + {$table_data1[table_data1].hinweis} + + +   + {if $table_data1[table_data1].tm_disable == 0} + + {else} + + {/if} +
    +
    + +
    +
    +
    +
    + + +{/if} + +{if $action == 'mailterminupdate'} + + + + + + + +
    + + Mailtext + +
    +
    + Zu dem Termin haben sich bereits Kandidaten eingebucht. Ihnen muss die Veränderung mitgeteilt werden.
    + Sofern noch kein Test geschrieben wurde, kann der Kandidat auch wieder gelöscht werden. Dann wird die Hogrefe TAN wieder frei und die Gebühr muss nicht bezahlt werden. +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    + Absender: + + +
    + Empfänger: + + {$mtupd_mailadressen_an} + +
    + Empfänger BCC: + + {$mtupd_mailadressen_bcc} + +
    + Betreff: + + +
    + Mailtext: + + + {literal} + + {/literal} +
    +

    +
    +
    +

    + +

    +
    +
    +
    +
    +
    +
    +
    + + +{/if} + + {if $action == 'mailsenden2'} + + + + + +
    + + Ergebnis + +
    +
    + {$mail_senderg} +
    +
    +
    +
    +
    +
    +
    + + + {/if} diff --git a/templates/modern/admin/titel.html b/templates/modern/admin/titel.html new file mode 100644 index 0000000..2032d13 --- /dev/null +++ b/templates/modern/admin/titel.html @@ -0,0 +1,62 @@ + + +{$global_titel} + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +

    {$global_titel}

    +
          +

    Logout

    +
     
    + + + + + + + + + \ No newline at end of file diff --git a/templates/modern/admin/unzugeordnet.html b/templates/modern/admin/unzugeordnet.html new file mode 100644 index 0000000..f005a91 --- /dev/null +++ b/templates/modern/admin/unzugeordnet.html @@ -0,0 +1,86 @@ + + + + + + + Sitzplan + + + + + + + + + + + + + + +
    + + Nicht zugeordnete Personen + +
    + + + + + + {section name=table_data1 loop=$table_data1} + + + + + {/section} +
    NameMögliche Sitzplätze
    {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} ({$table_data1[table_data1].Anz} {if $table_data1[table_data1].Anz == 1} Person{else} Personen{/if}) + + +
    +
    +
    + + diff --git a/templates/modern/admin/verwaltung_frame.html b/templates/modern/admin/verwaltung_frame.html new file mode 100644 index 0000000..4932dc8 --- /dev/null +++ b/templates/modern/admin/verwaltung_frame.html @@ -0,0 +1,20 @@ + + +Deputatverwaltung + + + + + + + + + +<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> + +<p>To view this page correctly, you need a Web browser that supports frames.</p> + +</body> + + + \ No newline at end of file diff --git a/templates/modern/admin/warteliste.html b/templates/modern/admin/warteliste.html new file mode 100644 index 0000000..ee334f0 --- /dev/null +++ b/templates/modern/admin/warteliste.html @@ -0,0 +1,121 @@ +{if $action == ''} + + + + + + + Sitzplan + + + + + + + + + + + + + + +
    + + Warteliste + +
    + + + + + + + + {section name=table_data1 loop=$table_data1} + + + + + + + {/section} +
    NameMögliche SitzplätzeEintragedatum auf WartelisteDringender Grund
    {$table_data1[table_data1].nachname}, {$table_data1[table_data1].vorname} ({$table_data1[table_data1].Anz} {if $table_data1[table_data1].Anz == 1} Person{else} Personen{/if}) + + {$table_data1[table_data1].save_date}{$table_data1[table_data1].warteliste_grund}
    +
    +
    +

    + Zugeteilt aus Warteliste +

    + + + + + + + + + {section name=table_data2 loop=$table_data2} + + + + + + + + {/section} +
    NameEintragedatum auf WartelisteDringender GrundMailMailversand
    {$table_data2[table_data2].nachname}, {$table_data2[table_data2].vorname} ({$table_data2[table_data2].reihe} / {$table_data2[table_data2].platz}){$table_data2[table_data2].save_date}{$table_data2[table_data2].warteliste_grund}{$table_data2[table_data2].mail} +

    + {if $table_data2[table_data2].warteliste_confirm == ''} + + {else} + Zusage verschickt: {$table_data2[table_data2].warteliste_confirm} + {/if} +

    + +
    + + +{/if} diff --git a/templates/modern/admin/youtube_frame.html b/templates/modern/admin/youtube_frame.html new file mode 100644 index 0000000..7f4f1cf --- /dev/null +++ b/templates/modern/admin/youtube_frame.html @@ -0,0 +1,20 @@ + + +Youtube Links + + + + + + + + + +<body bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000"> + +<p>To view this page correctly, you need a Web browser that supports frames.</p> + +</body> + + + \ No newline at end of file diff --git a/templates/modern/css/2022-01-12_styles_login.css b/templates/modern/css/2022-01-12_styles_login.css new file mode 100644 index 0000000..e0b7a61 --- /dev/null +++ b/templates/modern/css/2022-01-12_styles_login.css @@ -0,0 +1,121 @@ +body { + margin-top : 10px; + margin-bottom : 10px; + font-family : Arial; + font-size : 12px; + color : #000000; + +} + +td { + font-family : verdana, arial; + font-size : 9pt; + color : #000000; +} + +.Header { + background: url(../images/left.png) no-repeat; + font-family : Arial; + font-size : 12px; + font-weight : bold; + color : #FFFFFF; + + padding : 0px 0 0 14px; + margin : 0 10px 0 10px; /* Rand x rechts x links */ + + +} +.Header div { + background: url(../images/right.png) top right no-repeat; + padding-right: 13px; +} +.Header div div { + background: url(../images/center.png) repeat-x; + padding: 0; + +} + +.pat_list_box { + font-size : 14px; + + border : 1px solid gray; + /*border-top-color : transparent;*/ + background : url(../images/box-u.png) repeat-x left bottom; + margin : 0 10px 0 10px; /* Rand x rechts x links */ +} + + +/* Textfeldformatierung stammen von: http://www.web-toolbox.net/webtoolbox/css/css-formularfeld.htm#ixzz1EmDPi3Ti */ +.eingabe { + font-family : Verdana,Arial,Helvetica,sans-serif; + font-weight : bold; + color : #002276; + font-size : 11px; + border : none; + border-bottom : 1px dotted #0050A0; + background-color : #FFFFFF; + width : 250px; + padding : 3px; +} + +select { + font-family : Verdana,Arial,Helvetica,sans-serif; + font-weight : bold; + color : #002276; + font-size : 11px; +} + +.select1 { + width : 267px; +} + + +a.squarebutton_blue{ +background: transparent url('../images/button/square-blue-left.gif') no-repeat top left; +display: block; +font: normal 12px Arial; /* Change 12px as desired */ +line-height: 15px; /* This value + 4px + 4px (top and bottom padding of SPAN) must equal height of button background (default is 23px) */ +height: 23px; /* Height of button background height */ +padding-left: 9px; /* Width of left menu image */ +text-decoration: none; +} + +a:link.squarebutton_blue, a:visited.squarebutton_blue, a:active.squarebutton_blue{ +color: #494949; /*button text color*/ +} + +a.squarebutton_blue span{ +background: transparent url('../images/button/square-blue-right.gif') no-repeat top right; +display: block; +padding: 4px 9px 4px 0; /*Set 9px below to match value of 'padding-left' value above*/ +} + +a.squarebutton_blue:hover{ /* Hover state CSS */ +background-position: bottom left; +} + +a.squarebutton_blue:hover span{ /* Hover state CSS */ +background-position: bottom right; +color: black; +} + + +/* Pflichtfeldverletzung */ +.errorTable +{ + BORDER-RIGHT: #9F0004 1px solid; + BORDER-TOP: #9F0004 1px solid; + BORDER-LEFT: #9F0004 1px solid; + BORDER-BOTTOM: #9F0004 1px solid; + FONT-SIZE: 9px; + background-color: #E2E1E1; +} + +.errorField +{ + BORDER-RIGHT: #9F0004 1px solid; + BORDER-TOP: #9F0004 1px solid; + BORDER-LEFT: #9F0004 1px solid; + BORDER-BOTTOM: #9F0004 1px solid; + background-color: #FFFFCC; +} \ No newline at end of file diff --git a/templates/modern/css/ajaxtabs.css b/templates/modern/css/ajaxtabs.css new file mode 100644 index 0000000..1526fe4 --- /dev/null +++ b/templates/modern/css/ajaxtabs.css @@ -0,0 +1,3 @@ +.tabcontentiframe{ +height:2000px; +} \ No newline at end of file diff --git a/templates/modern/css/component.css b/templates/modern/css/component.css new file mode 100644 index 0000000..daf899f --- /dev/null +++ b/templates/modern/css/component.css @@ -0,0 +1,119 @@ +.js .inputfile { + width: 0.1px; + height: 0.1px; + opacity: 0; + overflow: hidden; + position: absolute; + z-index: -1; +} + +.inputfile + label { + max-width: 80%; + font-size: 1.25rem; + /* 20px */ + font-weight: 700; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + display: inline-block; + overflow: hidden; + padding: 0.625rem 1.25rem; + /* 10px 20px */ +} + +.inputfile_small { + max-width: 80%; + font-size: 0.6rem; + /* 20px */ + font-weight: 700; + text-overflow: ellipsis; + white-space: nowrap; + cursor: pointer; + display: inline-block; + overflow: hidden; + color: #d3394c; + /* 10px 20px */ +} +.no-js .inputfile + label { + display: none; +} + +.inputfile:focus + label, +.inputfile.has-focus + label { + outline: 1px dotted #000; + outline: -webkit-focus-ring-color auto 5px; +} + +.inputfile + label * { + /* pointer-events: none; */ + /* in case of FastClick lib use */ +} + +.inputfile + label svg { + width: 1em; + height: 1em; + vertical-align: middle; + fill: currentColor; + margin-top: -0.25em; + /* 4px */ + margin-right: 0.25em; + /* 4px */ +} + + + + +/* style 4 */ + +.inputfile-4 + label { + color: #d3394c; +} + +.inputfile-4:focus + label, +.inputfile-4.has-focus + label, +.inputfile-4 + label:hover { + color: #722040; +} + +.inputfile-4 + label figure { + width: 80px; + height: 80px; + border-radius: 50%; + background-color: #d3394c; + display: block; + padding: 20px; + margin: 0 auto 10px; +} + +.inputfile-5 + label figure { + width: 10px; + height: 10px; + border-radius: 50%; + background-color: #d3394c; + display: block; + padding: 9px; + margin: -5px auto 2px; +} + +.inputfile-5:focus + label figure, +.inputfile-5.has-focus + label figure, +.inputfile-5 + label:hover figure { + background-color: #722040; +} + +.inputfile-5 + label svg { + width: 100%; + height: 100%; + fill: #f1e5e6; +} +.inputfile-4:focus + label figure, +.inputfile-4.has-focus + label figure, +.inputfile-4 + label:hover figure { + background-color: #722040; +} + +.inputfile-4 + label svg { + width: 100%; + height: 100%; + fill: #f1e5e6; +} diff --git a/templates/modern/css/java-tooltip.css b/templates/modern/css/java-tooltip.css new file mode 100644 index 0000000..aaef2fa --- /dev/null +++ b/templates/modern/css/java-tooltip.css @@ -0,0 +1,9 @@ +* {margin:0; padding:0} +body {font:11px/1.5 Verdana, Arial, Helvetica, sans-serif; background:#FFF} +#text {margin:50px auto; width:500px} +.hotspot {color:#900; padding-bottom:1px; border-bottom:0px dotted #900; cursor:pointer} + +#tt {position:absolute; display:block; background:url(images/tt_left.gif) top left no-repeat} +#tttop {display:block; height:5px; margin-left:5px; background:url(images/tt_top.gif) top right no-repeat; overflow:hidden} +#ttcont {display:block; padding:2px 12px 3px 7px; margin-left:5px; background:#666; color:#FFF} +#ttbot {display:block; height:5px; margin-left:5px; background:url(images/tt_bottom.gif) top right no-repeat; overflow:hidden} \ No newline at end of file diff --git a/templates/modern/css/styles_login.css b/templates/modern/css/styles_login.css new file mode 100644 index 0000000..2af1783 --- /dev/null +++ b/templates/modern/css/styles_login.css @@ -0,0 +1,143 @@ +body { + margin-top : 10px; + margin-bottom : 10px; + font-family : Arial; + font-size : 12px; + color : #000000; + +} + +td { + font-family : verdana, arial; + font-size : 9pt; + color : #000000; +} + +.Header { + background: url(../images/left.png) no-repeat; + font-family : Arial; + font-size : 12px; + font-weight : bold; + color : #FFFFFF; + + padding : 0px 0 0 14px; + margin : 0 10px 0 10px; /* Rand x rechts x links */ + + +} +.Header div { + background: url(../images/right.png) top right no-repeat; + padding-right: 13px; +} +.Header div div { + background: url(../images/center.png) repeat-x; + padding: 0; + +} + +.Header2 { + background: url(../images/left2.png) no-repeat; + font-family : Arial; + font-size : 12px; + font-weight : bold; + color : #FFFFFF; + + padding : 0px 0 0 14px; + margin : 0 10px 0 10px; /* Rand x rechts x links */ + + +} +.Header2 div { + background: url(../images/right2.png) top right no-repeat; + padding-right: 13px; +} +.Header2 div div { + background: url(../images/center2.png) repeat-x; + padding: 0; + +} + +.pat_list_box { + font-size : 14px; + + border : 1px solid gray; + /*border-top-color : transparent;*/ + background : url(../images/box-u.png) repeat-x left bottom; + margin : 0 10px 0 10px; /* Rand x rechts x links */ +} + + +/* Textfeldformatierung stammen von: http://www.web-toolbox.net/webtoolbox/css/css-formularfeld.htm#ixzz1EmDPi3Ti */ +.eingabe { + font-family : Verdana,Arial,Helvetica,sans-serif; + font-weight : bold; + color : #002276; + font-size : 11px; + border : none; + border-bottom : 1px dotted #0050A0; + background-color : #FFFFFF; + width : 250px; + padding : 3px; +} + +select { + font-family : Verdana,Arial,Helvetica,sans-serif; + font-weight : bold; + color : #002276; + font-size : 11px; +} + +.select1 { + width : 267px; +} + + +a.squarebutton_blue{ +background: transparent url('../images/button/square-blue-left.gif') no-repeat top left; +display: block; +font: normal 12px Arial; /* Change 12px as desired */ +line-height: 15px; /* This value + 4px + 4px (top and bottom padding of SPAN) must equal height of button background (default is 23px) */ +height: 23px; /* Height of button background height */ +padding-left: 9px; /* Width of left menu image */ +text-decoration: none; +} + +a:link.squarebutton_blue, a:visited.squarebutton_blue, a:active.squarebutton_blue{ +color: #494949; /*button text color*/ +} + +a.squarebutton_blue span{ +background: transparent url('../images/button/square-blue-right.gif') no-repeat top right; +display: block; +padding: 4px 9px 4px 0; /*Set 9px below to match value of 'padding-left' value above*/ +} + +a.squarebutton_blue:hover{ /* Hover state CSS */ +background-position: bottom left; +} + +a.squarebutton_blue:hover span{ /* Hover state CSS */ +background-position: bottom right; +color: black; +} + + +/* Pflichtfeldverletzung */ +.errorTable +{ + BORDER-RIGHT: #9F0004 1px solid; + BORDER-TOP: #9F0004 1px solid; + BORDER-LEFT: #9F0004 1px solid; + BORDER-BOTTOM: #9F0004 1px solid; + FONT-SIZE: 9px; + background-color: #E2E1E1; +} + +.errorField +{ + BORDER-RIGHT: #9F0004 1px solid; + BORDER-TOP: #9F0004 1px solid; + BORDER-LEFT: #9F0004 1px solid; + BORDER-BOTTOM: #9F0004 1px solid; + background-color: #FFFFCC; +} \ No newline at end of file diff --git a/templates/modern/css/styles_refill.css b/templates/modern/css/styles_refill.css new file mode 100644 index 0000000..e2a91aa --- /dev/null +++ b/templates/modern/css/styles_refill.css @@ -0,0 +1,591 @@ +/* +http://jigsaw.w3.org/css-validator/validator +http://www.w3.org/TR/CSS21/syndata.html#color-units +*/ + +font.hd { /* berschrifteinstellungen */ + font-family : Verdana,Arial,Helvetica,sans-serif; + font-size : 17px; + font-weight : bold; + color : #002276; +} + +.sh { /* Subheader */ + font-weight : normal; + font-size : 12px; + color : rgb(101, 101, 101); + font-family : Arial,Helvetica,sans-serif; +} + +li { /* Aufzhlungen */ + font-weight : normal; + font-size : 12px; + font-family : Arial,Helvetica,sans-serif; +} + + +.formdesc { + padding-left : 10px; + width : 33%; + color : rgb(255, 255, 255); + background-color : rgb(146, 155, 171); + font-weight : bold; +} + +.login { + background-color : #f1f2f6; +} + + +a { + font-family : verdana, arial; + font-weight : normal; + color : #000066; +} + + + + + + +body { + margin-top : 10px; + margin-bottom : 10px; + font : 12px Arial; + color : #000000; + +} + + + +td { + font-family : verdana, arial; + font-size : 9pt; + color : #000000; +} + + +h1 { + font-family : verdana, arial; + font-size : 16pt; + font-weight : bold; +} + +h2 { + font-family : verdana, arial; + font-size : 16pt; + color : #0D7377; +} + + +.uberschrift { + font-family : verdana, arial; + font-size : 12pt; + font-weight : bold; + color : #006699; +} + + +.bemerkung { + font-family : verdana, arial; + font-size : 8pt; + font-weight : bold; + color : #FF0000; + text-transform : uppercase; /* Grobuchstaben */ +} + + +.farbe { /* Hintergrundsfarbe im Titel bei Export Word, Aushnge */ + background-color : #6487DC; +} + + +.contentfarbe { /* Hintergrundsfarbe in Tabellen bei Inhalten */ + background-color : #DEDEDE; +} + + +.titel { /* Kopfframe */ + font-weight : bold; + text-decoration : none; + font-family : verdana, arial; + font-size : 16pt; + color : #FFFFFF; +} + + +.footer { /* Fuzeile (Copyright) */ + text-decoration : none; + font-family : verdana, arial; + font-size : 8pt; +} + + +.nav_link { /* Hyperlinks in der Navigation */ + text-decoration : none; + font-family : verdana, arial; + font-size : 8pt; + height : 13pt; +} + + +.nav_head { /* berschriften in der Navigation */ + font-weight : bold; + text-decoration : none; + font-family : verdana, arial; + font-size : 9pt; +} + + + +.nextprev:link, .nextprev:visited { + background-color: #D6DFF7; + color: black; + font-weight:bold; + text-decoration: none; + display: block; + font-size: 8pt; + text-align: center; + padding: 20px 5px 20px 5px; +} +.nextprev:active, .nextprev:hover { + background-color: #6487DC; + color: #FFFFFF; + font-weight:bold; + text-decoration: none; + display: block; + font-size: 8pt; + text-align: center; + padding: 20px 5px 20px 5px; +} + +.nextprevdet:link, .nextprevdet:visited { + background-color: #D6DFF7; + color: black; + font-weight:bold; + text-decoration: none; + display: block; + font-size: 8pt; + text-align: center; + padding: 1px; +} +.nextprevdet:active, .nextprevdet:hover { + background-color: #6487DC; + color: #FFFFFF; + font-weight:bold; + text-decoration: none; + display: block; + font-size: 8pt; + text-align: center; + padding: 1px; +} + +.button_left:link, .button_left:visited { + background-color: #D6DFF7; + color: black; + text-decoration: none; + display: block; + font-size: 8pt; + text-align: left; + padding: 1px; +} +.button_left:active, .button_left:hover { + background-color: #6487DC; + color: #FFFFFF; + text-decoration: none; + display: block; + font-size: 8pt; + text-align: left; + padding: 1px; +} + + +/*++++++++++++++++++++++ Meine Eigenen CSS +++++++++++++++++++++++++++++*/ + +.navbar { /* Nav-Leiste in Titel-Frame */ + font-family : Verdana,Arial,Helvetica,sans-serif; + font-size : 16px; +} +.navbar:link { font-weight:normal; color:gray; text-decoration:none; } +.navbar:visited { font-weight:normal; color:gray; text-decoration:none; } +.navbar:focus { font-weight:normal; color:black; text-decoration:none; } +.navbar:hover { font-weight:normal; color:black; text-decoration:none; } +.navbar:active { font-weight:normal; color:gray; text-decoration:none; } + + +.leiste-o { + font-family : Verdana; + font-size : 18px; + font-weight : bold; + color : white; + height : 29px; /* Hhe des ../images * + padding : 0 0 0 5px; + margin : 0 10px 0 0px; /* Rand oben rechts unten links */ + background : url('../images/leiste-o.png') no-repeat; +} + +.leiste-o span { + display : block; + height : 29px; + /*margin-top:-5px;*/ + padding : 6px 0 0 15px; + background : url('../images/leiste-o-right.png') no-repeat right 0; +} + + + +/* Accordion Menu */ + +.accordion2 { + width: 225px; +} + +.accordion2 h3 { + width:250px; + height:30px; + padding:5px 0 0 15px; + margin:0 0 0 10px; + background:url('../images/accord/item.png') no-repeat; + font-size:12px; + font-weight:bold; + color:rgb(100,100,100); + cursor:pointer; +} + +.accordion2 > h3:hover { + background:url('../images/accord/mo-item.png') no-repeat; +} + +.accordion2 span { + display:block; + height:30px; + margin-top:-5px; + padding:6px 0 0 15px; + background:url('../images/accord/item-right.png') no-repeat right 0; +} + +.accordion2 span:hover { + background:url('../images/accord/mo-item-right.png') no-repeat right 0; +} + +.accordion2 ul{ /*CSS for UL of each sub menu*/ + list-style-type: none; + margin: 0; + display: none; +} + +.accordion2 ul li a { + width:230px; + display:block; + height:30px; + background:url('../images/accord/item.png') no-repeat; + padding:5px 0 0px 20px; /* Abstand Text Submen?> pading oben, rechts, unten, links*/ + font-size:12px; + font-weight:bold; + color: #A70303; + text-decoration: none; + cursor:pointer; +} + +.accordion2 ul li a:hover { + background:url('../images/accord/mo-item.png') no-repeat; +} + +.accordion2 ul li a span { + display:block; + height:30px; + margin-top:-5px; + padding:6px 0 0 0px; + background:url('../images/accord/item-right.png') no-repeat right 0; +} + +.accordion2 ul li a:hover span { + background:url('../images/accord/mo-item-right.png') no-repeat right 0; +} + +.accordion2 ul { + margin: 0; + padding: 10px 15px 20px; + display: none; +} + +li.abstand { + margin-left: 10px; +} + + + + +/*********************** Animated Tabs ************************/ +/*Credits: Dynamic Drive CSS Library */ +/*URL: http://www.dynamicdrive.com/style/ */ + + +.animatedtabs{ +/*border-bottom: 1px solid gray;*/ +overflow: hidden; +width: 100%; +font-size: 14px; /*font of menu text*/ +} + +.animatedtabs ul{ +list-style-type: none; +margin: 0; +margin-left: 10px; /*offset of first tab relative to page left edge*/ +padding: 0; +} + +.animatedtabs li{ +float: left; +margin: 0; +padding: 0; +} + +.animatedtabs a{ +float: left; +position: relative; +top: 5px; /* 1) Number of pixels to protrude up for selected tab. Should equal (3) MINUS (2) below */ +background: url(../images/tabs/tab-blue-left.gif) no-repeat left top; +margin: 0; +margin-right: 3px; /*Spacing between each tab*/ +padding: 0 0 0 9px; +text-decoration: none; +} + +.animatedtabs a span{ +float: left; +position: relative; +display: block; +background: url(../images/tabs/tab-blue-right.gif) no-repeat right top; +padding: 5px 14px 3px 5px; /* 2) Padding within each tab. The 3rd value, or 3px, should equal (1) MINUS (3) */ +font-weight: normal; +color: grey; +} + +/* Commented Backslash Hack hides rule from IE5-Mac \*/ +.animatedtabs a span {float:none;} +/* End IE5-Mac hack */ + + /* nderung hier by Ali */ +.animatedtabs a.selected { +background-position: 0 -125px; +top: 0; +} + + /* und hier by Ali*/ +/* Format fr ausgewaehlten Tab */ +.animatedtabs a.selected span{ +background-position: 100% -125px; +color: black; +font-weight: normal; +padding-bottom: 8px; /* 3) Bottom padding of selected tab. Should equal (1) PLUS (2) above */ +top: 0; +} + +.animatedtabs a:hover{ +background-position: 0% -125px; +top: 0; +} + +.animatedtabs a:hover span{ +background-position: 100% -125px; +padding-bottom: 8px; /* 3) Bottom padding of selected tab. Should equal (1) PLUS (2) above */ +top: 0; +} + + + +/******************* Feld in Patronenliste **********************/ +.pat_list_box { + font-size : 12px; + padding : 10px; + border : 1px solid gray; + /*border-top-color : transparent;*/ + border-top : none; + margin-top : 0px; + margin-left : 10px; + margin-right : 10px; + margin-bottom : 0px; + background : url(../images/box-u.png) repeat-x left bottom; +} + +.tab_box { + font-size : 12px; + height : 27px; + padding-top : 10px; + border : 1px solid gray; + border-top : none; + border-bottom : none; + margin-top : 0px; + margin-left : 10px; + margin-right : 10px; + margin-bottom : 0px; + background : url(../images/tab-box-u.png) repeat-x left bottom; +} + + + +/************************** Scuarebutton ********************************/ + +/*Credits: Dynamic Drive CSS Library */ +/*URL: http://www.dynamicdrive.com/style/ */ + +a.squarebutton_blue{ +background: transparent url('../images/button/square-blue-left.gif') no-repeat top left; +display: block; +font: normal 12px Arial; /* Change 12px as desired */ +line-height: 15px; /* This value + 4px + 4px (top and bottom padding of SPAN) must equal height of button background (default is 23px) */ +height: 23px; /* Height of button background height */ +padding-left: 9px; /* Width of left menu image */ +text-decoration: none; +} + +a:link.squarebutton_blue, a:visited.squarebutton_blue, a:active.squarebutton_blue{ +color: #494949; /*button text color*/ +} + +a.squarebutton_blue span{ +background: transparent url('../images/button/square-blue-right.gif') no-repeat top right; +display: block; +padding: 4px 9px 4px 0; /*Set 9px below to match value of 'padding-left' value above*/ +} + +a.squarebutton_blue:hover{ /* Hover state CSS */ +background-position: bottom left; +} + +a.squarebutton_blue:hover span{ /* Hover state CSS */ +background-position: bottom right; +color: black; +} + +.buttonwrapper{ /* Container you can use to surround a CSS button to clear float */ +overflow: hidden; /*See: http://www.quirksmode.org/css/clearing.html */ +width: 100%; +} + + + + + +/* by Ali */ + +#ajax_listOfOptions{ + position:absolute; + width:198px; + height:200px; + overflow:auto; + border:1px solid #6487DC; + background-color:#FFF; + text-align:left; + font-family : verdana, arial; + z-index:10000; + font-size : 11px; +} +#ajax_listOfOptions div{ + margin:1px; + padding:1px; + cursor:pointer; + font-size:0.9em; + +} +#ajax_listOfOptions .optionDiv{ // Div for each item in list + +} +#ajax_listOfOptions .optionDivSelected{ // Selected item in the list + background-color:#D6DFF7; + color:#002276; + font-weight : bold; +} +#ajax_listOfOptions_iframe{ + background-color:#F00; + position:absolute; + z-index:500; +} + + +/* Textfeldformatierung stammen von: http://www.web-toolbox.net/webtoolbox/css/css-formularfeld.htm#ixzz1EmDPi3Ti */ +.eingabe_search { + font-family : Verdana,Arial,Helvetica,sans-serif; + font-weight : bold; + color : #002276; + font-size : 11px; + border : none; + border-top : 1px dotted #0050A0; + border-bottom : 1px dotted #0050A0; + background-color : #FFFFFF; + width : 170px; + padding : 3px; +} + + +.header { + background: url(../images/left.png) no-repeat; + font-family : Verdana; + font-size : 18px; + font-weight : bold; + color : #FFFFFF; + padding : 0px 0 0 14px; + margin : 0 10px 0 10px; /* Rand x rechts x links */ +} + +.header div { + background: url(../images/right.png) top right no-repeat; + padding-right: 13px; +} + +.header div div { + background: url(../images/center.png) repeat-x; + padding: 0; +} + + +/* Pflichtfeldverletzung */ +.errorTable +{ + BORDER-RIGHT: #9F0004 1px solid; + BORDER-TOP: #9F0004 1px solid; + BORDER-LEFT: #9F0004 1px solid; + BORDER-BOTTOM: #9F0004 1px solid; + FONT-SIZE: 9px; + background-color: #E2E1E1; +} + +.errorField +{ + BORDER-RIGHT: #9F0004 1px solid; + BORDER-TOP: #9F0004 1px solid; + BORDER-LEFT: #9F0004 1px solid; + BORDER-BOTTOM: #9F0004 1px solid; + background-color: #FFFFCC; +} + + +.vvsuccess +{ + BORDER-RIGHT: #9F0004 2px solid; + BORDER-TOP: #9F0004 2px solid; + BORDER-LEFT: #9F0004 2px solid; + BORDER-BOTTOM: #9F0004 2px solid; + FONT-SIZE: 9px; + background-color: #E2E1E1; +} + + + +.gutachten_antwort +{ + BORDER-RIGHT: #dfec17 1px solid; + BORDER-TOP: #dfec17 1px solid; + BORDER-LEFT: #dfec17 1px solid; + BORDER-BOTTOM: #dfec17 1px solid; + FONT-SIZE: 9px; + background-color: #E2E1E1; +} + +.aformlink{ + text-decoration: none; + border-bottom: 1px dotted red; + background-image: none; + padding-left: 0; + } \ No newline at end of file diff --git a/templates/modern/images/Thumbs.db b/templates/modern/images/Thumbs.db new file mode 100644 index 0000000..3f96765 Binary files /dev/null and b/templates/modern/images/Thumbs.db differ diff --git a/templates/modern/images/accord/item-right.png b/templates/modern/images/accord/item-right.png new file mode 100644 index 0000000..810c135 Binary files /dev/null and b/templates/modern/images/accord/item-right.png differ diff --git a/templates/modern/images/accord/item.png b/templates/modern/images/accord/item.png new file mode 100644 index 0000000..b2a0b57 Binary files /dev/null and b/templates/modern/images/accord/item.png differ diff --git a/templates/modern/images/accord/mo-item-right.png b/templates/modern/images/accord/mo-item-right.png new file mode 100644 index 0000000..089f9a8 Binary files /dev/null and b/templates/modern/images/accord/mo-item-right.png differ diff --git a/templates/modern/images/accord/mo-item.png b/templates/modern/images/accord/mo-item.png new file mode 100644 index 0000000..2242295 Binary files /dev/null and b/templates/modern/images/accord/mo-item.png differ diff --git a/templates/modern/images/backgr/Thumbs.db b/templates/modern/images/backgr/Thumbs.db new file mode 100644 index 0000000..04bf10f Binary files /dev/null and b/templates/modern/images/backgr/Thumbs.db differ diff --git a/templates/modern/images/backgr/ground.png b/templates/modern/images/backgr/ground.png new file mode 100644 index 0000000..2372997 Binary files /dev/null and b/templates/modern/images/backgr/ground.png differ diff --git a/templates/modern/images/backgr/sprites_general_1.png b/templates/modern/images/backgr/sprites_general_1.png new file mode 100644 index 0000000..1f291c0 Binary files /dev/null and b/templates/modern/images/backgr/sprites_general_1.png differ diff --git a/templates/modern/images/backgr/sprites_general_2.png b/templates/modern/images/backgr/sprites_general_2.png new file mode 100644 index 0000000..f601cfb Binary files /dev/null and b/templates/modern/images/backgr/sprites_general_2.png differ diff --git a/templates/modern/images/backgr/sprites_general_home_2.png b/templates/modern/images/backgr/sprites_general_home_2.png new file mode 100644 index 0000000..9fb5f56 Binary files /dev/null and b/templates/modern/images/backgr/sprites_general_home_2.png differ diff --git a/templates/modern/images/box-u.png b/templates/modern/images/box-u.png new file mode 100644 index 0000000..68ae92c Binary files /dev/null and b/templates/modern/images/box-u.png differ diff --git a/templates/modern/images/button/square-blue-left.gif b/templates/modern/images/button/square-blue-left.gif new file mode 100644 index 0000000..cbbc1aa Binary files /dev/null and b/templates/modern/images/button/square-blue-left.gif differ diff --git a/templates/modern/images/button/square-blue-right.gif b/templates/modern/images/button/square-blue-right.gif new file mode 100644 index 0000000..7f5a467 Binary files /dev/null and b/templates/modern/images/button/square-blue-right.gif differ diff --git a/templates/modern/images/button/square-gray-left.gif b/templates/modern/images/button/square-gray-left.gif new file mode 100644 index 0000000..bd6523d Binary files /dev/null and b/templates/modern/images/button/square-gray-left.gif differ diff --git a/templates/modern/images/button/square-gray-right.gif b/templates/modern/images/button/square-gray-right.gif new file mode 100644 index 0000000..27ebea4 Binary files /dev/null and b/templates/modern/images/button/square-gray-right.gif differ diff --git a/templates/modern/images/button/square-green-left.gif b/templates/modern/images/button/square-green-left.gif new file mode 100644 index 0000000..98a6ad9 Binary files /dev/null and b/templates/modern/images/button/square-green-left.gif differ diff --git a/templates/modern/images/button/square-green-right.gif b/templates/modern/images/button/square-green-right.gif new file mode 100644 index 0000000..b1c6c38 Binary files /dev/null and b/templates/modern/images/button/square-green-right.gif differ diff --git a/templates/modern/images/button/square-orange-left.gif b/templates/modern/images/button/square-orange-left.gif new file mode 100644 index 0000000..81b3cf8 Binary files /dev/null and b/templates/modern/images/button/square-orange-left.gif differ diff --git a/templates/modern/images/button/square-orange-right.gif b/templates/modern/images/button/square-orange-right.gif new file mode 100644 index 0000000..9204af5 Binary files /dev/null and b/templates/modern/images/button/square-orange-right.gif differ diff --git a/templates/modern/images/button/square-red-left.gif b/templates/modern/images/button/square-red-left.gif new file mode 100644 index 0000000..14e4ad4 Binary files /dev/null and b/templates/modern/images/button/square-red-left.gif differ diff --git a/templates/modern/images/button/square-red-right.gif b/templates/modern/images/button/square-red-right.gif new file mode 100644 index 0000000..02cb76a Binary files /dev/null and b/templates/modern/images/button/square-red-right.gif differ diff --git a/templates/modern/images/center.png b/templates/modern/images/center.png new file mode 100644 index 0000000..692c8de Binary files /dev/null and b/templates/modern/images/center.png differ diff --git a/templates/modern/images/center2.png b/templates/modern/images/center2.png new file mode 100644 index 0000000..eb8312b Binary files /dev/null and b/templates/modern/images/center2.png differ diff --git a/templates/modern/images/cross.jpg b/templates/modern/images/cross.jpg new file mode 100644 index 0000000..49832ed Binary files /dev/null and b/templates/modern/images/cross.jpg differ diff --git a/templates/modern/images/deputat_icon.svg b/templates/modern/images/deputat_icon.svg new file mode 100644 index 0000000..78d4522 --- /dev/null +++ b/templates/modern/images/deputat_icon.svg @@ -0,0 +1,53 @@ + + + +image/svg+xml \ No newline at end of file diff --git a/templates/modern/images/drop.png b/templates/modern/images/drop.png new file mode 100644 index 0000000..6fc4d3b Binary files /dev/null and b/templates/modern/images/drop.png differ diff --git a/templates/modern/images/drop2.png b/templates/modern/images/drop2.png new file mode 100644 index 0000000..2126c96 Binary files /dev/null and b/templates/modern/images/drop2.png differ diff --git a/templates/modern/images/drop2_grey.png b/templates/modern/images/drop2_grey.png new file mode 100644 index 0000000..390c8b2 Binary files /dev/null and b/templates/modern/images/drop2_grey.png differ diff --git a/templates/modern/images/drop_grey.png b/templates/modern/images/drop_grey.png new file mode 100644 index 0000000..1a769f7 Binary files /dev/null and b/templates/modern/images/drop_grey.png differ diff --git a/templates/modern/images/edit.png b/templates/modern/images/edit.png new file mode 100644 index 0000000..05711a0 Binary files /dev/null and b/templates/modern/images/edit.png differ diff --git a/templates/modern/images/edit_grey.png b/templates/modern/images/edit_grey.png new file mode 100644 index 0000000..2a146c8 Binary files /dev/null and b/templates/modern/images/edit_grey.png differ diff --git a/templates/modern/images/excel.png b/templates/modern/images/excel.png new file mode 100644 index 0000000..d628df4 Binary files /dev/null and b/templates/modern/images/excel.png differ diff --git a/templates/modern/images/favorit.png b/templates/modern/images/favorit.png new file mode 100644 index 0000000..ef1ec67 Binary files /dev/null and b/templates/modern/images/favorit.png differ diff --git a/templates/modern/images/favorit_red.png b/templates/modern/images/favorit_red.png new file mode 100644 index 0000000..72467be Binary files /dev/null and b/templates/modern/images/favorit_red.png differ diff --git a/templates/modern/images/home.svg b/templates/modern/images/home.svg new file mode 100644 index 0000000..488e882 --- /dev/null +++ b/templates/modern/images/home.svg @@ -0,0 +1,5 @@ + + +Layer 1 + + \ No newline at end of file diff --git a/templates/modern/images/i.jpg b/templates/modern/images/i.jpg new file mode 100644 index 0000000..406b20b Binary files /dev/null and b/templates/modern/images/i.jpg differ diff --git a/templates/modern/images/ico_pdf.gif b/templates/modern/images/ico_pdf.gif new file mode 100644 index 0000000..d76e065 Binary files /dev/null and b/templates/modern/images/ico_pdf.gif differ diff --git a/templates/modern/images/ja.gif b/templates/modern/images/ja.gif new file mode 100644 index 0000000..d54c74b Binary files /dev/null and b/templates/modern/images/ja.gif differ diff --git a/templates/modern/images/left.png b/templates/modern/images/left.png new file mode 100644 index 0000000..1d67971 Binary files /dev/null and b/templates/modern/images/left.png differ diff --git a/templates/modern/images/left2.png b/templates/modern/images/left2.png new file mode 100644 index 0000000..9148730 Binary files /dev/null and b/templates/modern/images/left2.png differ diff --git a/templates/modern/images/leiste-u.cpt b/templates/modern/images/leiste-u.cpt new file mode 100644 index 0000000..33abb5c Binary files /dev/null and b/templates/modern/images/leiste-u.cpt differ diff --git a/templates/modern/images/mail_icon.jpg b/templates/modern/images/mail_icon.jpg new file mode 100644 index 0000000..3cb792f Binary files /dev/null and b/templates/modern/images/mail_icon.jpg differ diff --git a/templates/modern/images/message_login.gif b/templates/modern/images/message_login.gif new file mode 100644 index 0000000..a27692f Binary files /dev/null and b/templates/modern/images/message_login.gif differ diff --git a/templates/modern/images/message_login2.gif b/templates/modern/images/message_login2.gif new file mode 100644 index 0000000..1fd92ae Binary files /dev/null and b/templates/modern/images/message_login2.gif differ diff --git a/templates/modern/images/nein.gif b/templates/modern/images/nein.gif new file mode 100644 index 0000000..c5828cc Binary files /dev/null and b/templates/modern/images/nein.gif differ diff --git a/templates/modern/images/ok.gif b/templates/modern/images/ok.gif new file mode 100644 index 0000000..e2856f8 Binary files /dev/null and b/templates/modern/images/ok.gif differ diff --git a/templates/modern/images/pflichtfelder/achtung_gross.gif b/templates/modern/images/pflichtfelder/achtung_gross.gif new file mode 100644 index 0000000..6051186 Binary files /dev/null and b/templates/modern/images/pflichtfelder/achtung_gross.gif differ diff --git a/templates/modern/images/pflichtfelder/achtung_klein.gif b/templates/modern/images/pflichtfelder/achtung_klein.gif new file mode 100644 index 0000000..a392f8b Binary files /dev/null and b/templates/modern/images/pflichtfelder/achtung_klein.gif differ diff --git a/templates/modern/images/right.png b/templates/modern/images/right.png new file mode 100644 index 0000000..a5419a3 Binary files /dev/null and b/templates/modern/images/right.png differ diff --git a/templates/modern/images/right2.png b/templates/modern/images/right2.png new file mode 100644 index 0000000..ba5a8b8 Binary files /dev/null and b/templates/modern/images/right2.png differ diff --git a/templates/modern/images/tab-box-u.png b/templates/modern/images/tab-box-u.png new file mode 100644 index 0000000..dc01095 Binary files /dev/null and b/templates/modern/images/tab-box-u.png differ diff --git a/templates/modern/images/tabs/tab-blue-left.cpt b/templates/modern/images/tabs/tab-blue-left.cpt new file mode 100644 index 0000000..29cadcc Binary files /dev/null and b/templates/modern/images/tabs/tab-blue-left.cpt differ diff --git a/templates/modern/images/tabs/tab-blue-left.gif b/templates/modern/images/tabs/tab-blue-left.gif new file mode 100644 index 0000000..f8579db Binary files /dev/null and b/templates/modern/images/tabs/tab-blue-left.gif differ diff --git a/templates/modern/images/tabs/tab-blue-right.cpt b/templates/modern/images/tabs/tab-blue-right.cpt new file mode 100644 index 0000000..1e9902b Binary files /dev/null and b/templates/modern/images/tabs/tab-blue-right.cpt differ diff --git a/templates/modern/images/tabs/tab-blue-right.gif b/templates/modern/images/tabs/tab-blue-right.gif new file mode 100644 index 0000000..749e97d Binary files /dev/null and b/templates/modern/images/tabs/tab-blue-right.gif differ diff --git a/templates/modern/index - orig.html b/templates/modern/index - orig.html new file mode 100644 index 0000000..74b701d --- /dev/null +++ b/templates/modern/index - orig.html @@ -0,0 +1,1704 @@ + +{if $action == ''} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
     
    +
    +
    +
    +

    + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    +

    Registrierung und Terminbuchung für die Gottesdienste in Weinstadt-Beutelsbach

    +
    +
    + + + + + + + + + + + + + + + + +
     

     
       
      +

    Der Assistent begleitet Sie durch folgende Seiten:

    +
    +
      +
    1. Terminauswahl
    2. +
    3. Registrierung der Hausstände
    4. +
    5. Zusammenfassung und Speichern
    6. +
    +
    +
     
    +
    +

    + +

    +
    +
    +
    +

    +
    +   +
    + + + +{/if} +{if $action == 'terminwahl'} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $termin_error == '1'} + + + + + +
    + + Achtung!
    + {$termin_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    + + + + +
    +

    1) Terminwahl

    +
    + + + + + + + +
      + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $table_data1[table_data1].hinweis_gepserrt == 1} + + + + + + {else} + + + + + + {/if} + {/section} +
    + Auswahl + + Datum + + Hinweis +
    +   + + {$table_data1[table_data1].datum} + + Die Anmeldung zum Gottesdienst ist leider nicht mehr möglich.
    Bitte verwenden Sie stattdessen den Livestream http://www.nak-btb.de oder die Telefonübertrag über Perfon. +
    + + + + + +
    + +
     
    +
    +

    + +
    +
    + {if $warteliste == 1} + oder setzen Sie sich auf die Warteliste + {/if} +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} +{if $action == 'hausstand'} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $hausstand_error == '1'} + + + + + +
    + + Achtung!
    + {$hausstand_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    + + + + +
    +

    2) Namen der Personen, die im selben Haushalt gemeldet sind

    +
    + + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + + Sie können Ihre Mailadresse hinterlegen. Dadurch +
      +
    • bekommen Sie eine Bestätigung nach erfolgreicher Registrierung
    • +
    • haben Sie die Möglichkeit, sich oder einzlne Familienmitglieder vom Gottesdienst wieder abzumelden
    • +
    +
    +   + + E-Mail: + +   + + +
    +   + +   + +   + +   +
    +   + + Nachname + +   + + Vorname (vollständig ausgeschrieben) +
    + 1 + + + + , + + +
    + 2 + + + + , + + +
    + 3 + + + + , + + +
    + 4 + + + + , + + +
    + 5 + + + + , + + +
    +   + +   + +   + +   +
    +
     
    +
    +

    + Seite zurück +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} + +{if $action == 'overview'} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $persdat_error == '1'} + + + + + +
    + + Achtung!
    + {$persdat_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    + + + + +
    +

    3) Übersicht und verbindlich speichern

    +
    + + + + + + +
      + + + {if $overview_value_beginn != ''} + + + + + + + + + {/if} + + {if $overview_value_nachname1 != ''} + + + + + {/if} + + {if $overview_value_nachname2 != ''} + + + + + {/if} + + {if $overview_value_nachname3 != ''} + + + + + {/if} + + {if $overview_value_nachname4 != ''} + + + + + {/if} + + {if $overview_value_nachname5 != ''} + + + + + {/if} + + + {if $overview_value_mail != ''} + + + + + + + + + {/if} + + + + + + + + +
    + Gottesdienst: + + {section name=table_data1 loop=$table_data1} + {$table_data1[table_data1].beginn} ({$table_data1[table_data1].hinweis})
    + {/section} +
    +   + +   +
    + Person 1: + + {$overview_value_nachname1}, {$overview_value_vorname1} +
    + Person 2: + + {$overview_value_nachname2}, {$overview_value_vorname2} +
    + Person 3: + + {$overview_value_nachname3},{$overview_value_vorname3} +
    + Person 4: + + {$overview_value_nachname4}, {$overview_value_vorname4} +
    + Person 5: + + {$overview_value_nachname5}, {$overview_value_vorname5} +
    +   + +   +
    + Mailadresse: + + {$overview_value_mail} +
    +   + +   +
    + + + +
    +
     
    +
    +

    + Seite zurück +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} + +{if $action == 'save'} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $save_error == '1'} + + + + + +
    + + Achtung!
    + {$save_error_text} +
    +
    + {else} +
    +
    + + + + +
    + + + + + +
    +

    + Die Anmeldung zum Gottesdienst ist erfolgreich abgeschlossen.
    +
    + Sie können das Fenster nun schließen! +

    +
    +
    +
    +
    +
    + {/if} +

    +
    +   +
    + + + +{/if} + +{if $action == 'warteliste_terminwahl'} + + + + + + + Warteliste für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Warteliste für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $termin_error == '1'} + + + + + +
    + + Achtung!
    + {$termin_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    + + + + +
    +

    Warteliste für bereits gesperrte Gottesdienste

    +
    + + + + + + + +
      + + + + + + + + {section name=table_data1 loop=$table_data1} + {if $table_data1[table_data1].hinweis_gepserrt == 1} + + + + + + {/if} + {/section} +
    + Auswahl + + Datum + + Hinweis +
    + + + + + +
    + +
     
    +
    +

    + + +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} + + +{if $action == 'warteliste_hausstand'} + + + + + + + Warteliste für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Warteliste für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $hausstand_error == '1'} + + + + + +
    + + Achtung!
    + {$hausstand_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    + + + + +
    +

    2) Namen der Personen, die im selben Haushalt gemeldet sind

    +
    + + + + + + +
      + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + + Sie müssen Ihre Mailadresse hinterlegen. Dadurch +
      +
    • können wir Sie kontaktieren, falls Sie zum Gottesdienst eingebucht werden
    • +
    • bekommen Sie eine Bestätigung nach erfolgreicher Registrierung zur Warteliste
    • +
    • haben Sie die Möglichkeit, sich oder einzlne Familienmitglieder von der Warteliste bzw. vom Gottesdienst wieder abzumelden
    • +
    +
    +   + + E-Mail (Pflichtfeld): + +   + + +
    +   + +   + +   + +   +
    +   + + Nachname + +   + + Vorname (vollständig ausgeschrieben) +
    + 1 + + + + , + + +
    + 2 + + + + , + + +
    + 3 + + + + , + + +
    + 4 + + + + , + + +
    + 5 + + + + , + + +
    +   + +   + +   + +   +
    + Liegt ein dringender Grund für GD Besuch vor?
    + z.B. Dienstleiter, Lehrkraft, Instumentalist, sonstige Dienste:
    +
    + +
    +
     
    +
    +

    + Seite zurück +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} + + +{if $action == 'warteliste_overview'} + + + + + + + Warteliste für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Warteliste für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $persdat_error == '1'} + + + + + +
    + + Achtung!
    + {$persdat_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    + + + + +
    +

    3) Übersicht und verbindlich speichern

    +
    + + + + + + +
      + + + {if $overview_value_beginn != ''} + + + + + + + + + {/if} + + {if $overview_value_nachname1 != ''} + + + + + {/if} + + {if $overview_value_nachname2 != ''} + + + + + {/if} + + {if $overview_value_nachname3 != ''} + + + + + {/if} + + {if $overview_value_nachname4 != ''} + + + + + {/if} + + {if $overview_value_nachname5 != ''} + + + + + {/if} + + + {if $overview_value_mail != ''} + + + + + + + + + {/if} + + {if $overview_value_warteliste_grund != ''} + + + + + + + + + {/if} + + + + + + + + + +
    + Gottesdienst: + + {section name=table_data1 loop=$table_data1} + {$table_data1[table_data1].beginn} ({$table_data1[table_data1].hinweis})
    + {/section} +
    +   + +   +
    + Person 1: + + {$overview_value_nachname1}, {$overview_value_vorname1} +
    + Person 2: + + {$overview_value_nachname2}, {$overview_value_vorname2} +
    + Person 3: + + {$overview_value_nachname3},{$overview_value_vorname3} +
    + Person 4: + + {$overview_value_nachname4}, {$overview_value_vorname4} +
    + Person 5: + + {$overview_value_nachname5}, {$overview_value_vorname5} +
    +   + +   +
    + Mailadresse: + + {$overview_value_mail} +
    +   + +   +
    + Dringender Grund: + + {$overview_value_warteliste_grund} +
    +   + +   +
    + + + +
    +
     
    +
    +

    + Seite zurück +

    +
    +
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} + +{if $action == 'warteliste_save'} + + + + + + + Warteliste für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
    Warteliste für Gottesdienste in Weinstadt-Beutelsbach
    +
    +
    +
    +

    + {if $save_error == '1'} + + + + + +
    + + Achtung!
    + {$save_error_text} +
    +
    + {else} +
    +
    + + + + +
    + + + + + +
    +

    + Die Anmeldung auf die Warteliste ist erfolgreich abgeschlossen.
    +
    + Sie können das Fenster nun schließen! +

    +
    +
    +
    +
    +
    + {/if} +

    +
    +   +
    + + + +{/if} \ No newline at end of file diff --git a/templates/modern/index.html b/templates/modern/index.html new file mode 100644 index 0000000..cabd14f --- /dev/null +++ b/templates/modern/index.html @@ -0,0 +1,129 @@ + +{if $action == ''} + + + + + + + Registrierung und Terminbuchung für Gottesdienste in Weinstadt-Beutelsbach + + + + + + + + + + + + + + + + + + +
    +   + +
    +
    +
     
    +
    +
    +
    +

    + {if $index_error == '1'} + + + + + +
    + + Achtung!
    + {$index_error_text} +
    +
    + {/if} + + + + +
    + + + + + +
    +
    +
    + + + + + + + + + + + + + + + + +
     

     
       
      +

    + Eine Registrierung ist nicht mehr erforderlich! +
    +
    + +

     
    +
    +
    +
    +

    +
    +   +
    + + + +{/if} \ No newline at end of file diff --git a/templates/modern/js/.DS_Store b/templates/modern/js/.DS_Store new file mode 100644 index 0000000..07083ae Binary files /dev/null and b/templates/modern/js/.DS_Store differ diff --git a/templates/modern/js/accordion.js b/templates/modern/js/accordion.js new file mode 100644 index 0000000..04e9e7d --- /dev/null +++ b/templates/modern/js/accordion.js @@ -0,0 +1,13 @@ +$(document).ready(function(){ + + $(".accordion2 h3").eq(0).addClass("active"); + $(".accordion2 ul").eq(0).show(); + + $(".accordion2 h3").click(function(){ + $(this).next("ul").slideToggle(400) //auch "fast" und "slow" m?ich, oder den Wert in ms + .siblings("ul:visible").slideUp(400); //auch "fast" und "slow" m?ich, oder den Wert in ms + $(this).toggleClass("active"); + $(this).siblings("h3").removeClass("active"); + }); + +}); \ No newline at end of file diff --git a/templates/modern/js/ajaxtabs.js b/templates/modern/js/ajaxtabs.js new file mode 100644 index 0000000..bff4403 --- /dev/null +++ b/templates/modern/js/ajaxtabs.js @@ -0,0 +1,230 @@ +//** Ajax Tabs Content script v2.0- Dynamic Drive DHTML code library (http://www.dynamicdrive.com) +//** Updated Oct 21st, 07 to version 2.0. Contains numerous improvements +//** Updated Feb 18th, 08 to version 2.1: Adds a public "tabinstance.cycleit(dir)" method to cycle forward or backward between tabs dynamically. Only .js file changed from v2.0. +//** Updated April 8th, 08 to version 2.2: +// -Adds support for expanding a tab using a URL parameter (ie: http://mysite.com/tabcontent.htm?tabinterfaceid=0) +// -Modified Ajax routine so testing the script out locally in IE7 now works + +var ddajaxtabssettings={} +ddajaxtabssettings.bustcachevar=1 //bust potential caching of external pages after initial request? (1=yes, 0=no) +ddajaxtabssettings.loadstatustext="" + + +////NO NEED TO EDIT BELOW//////////////////////// + + + +function ddajaxtabs(tabinterfaceid, contentdivid){ + this.tabinterfaceid=tabinterfaceid //ID of Tab Menu main container + this.tabs=document.getElementById(tabinterfaceid).getElementsByTagName("a") //Get all tab links within container + this.enabletabpersistence=true + this.hottabspositions=[] //Array to store position of tabs that have a "rel" attr defined, relative to all tab links, within container + this.currentTabIndex=0 //Index of currently selected hot tab (tab with sub content) within hottabspositions[] array + this.contentdivid=contentdivid + + this.defaultHTML="" + this.defaultIframe='' + this.defaultIframe=this.defaultIframe.replace(/