$this->checkwriteaccessconfigfolder(), "configfile" => $this->checkwriteaccessconfigfile(), "customerfolder" => $this->checkwritecustomerfolder(), "speisekarte" => $this->checkwritespeisekarte() ); echo json_encode($retArray); } } class ConfigWriter { function getConfigVals() { if (is_readable("../php/config.php")) { include( "../php/config.php" ); $retArray = array( "host" => MYSQL_HOST, "db" => MYSQL_DB, "user" => MYSQL_USER, "password" => MYSQL_PASSWORD, "tabprefix" => TAB_PREFIX); echo json_encode(array("status" => "OK","result" => $retArray)); } else { echo json_encode(array("status" => "Failed")); } } } class Admin { var $prefix = ""; var $pdo; function setPrefix($pre) { $this->prefix = $pre; } function setPdo($pdo) { $this->pdo = $pdo; } function openDbAndReturnPdo ($host,$db,$user,$password) { $dsn = 'mysql:host=' . $host . ';dbname=' . $db; $pdo = null; try { $pdo = new PDO($dsn, $user, $password); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } catch (PDOException $e) { echo 'Verbindungsproblem: ' . $e->getMessage(); $pdo = null; } return $pdo; } function createTables() { $pdo = $this->pdo; $this->doSQLcatch($pdo, "DROP TABLE `%hist%`"); $this->doSQLcatch($pdo, "DROP TABLE `%histprod%`"); $this->doSQLcatch($pdo, "DROP TABLE `%histconfig%`"); $this->doSQLcatch($pdo, "DROP TABLE `%histuser%`"); $this->doSQLcatch($pdo, "DROP TABLE `%histactions%`"); $this->doSQLcatch($pdo, "drop TABLE `%billproducts%`"); $this->doSQLcatch($pdo, "drop TABLE `%queue%`"); $this->doSQLcatch($pdo, "drop TABLE `%printjobs%`"); $this->doSQLcatch($pdo, "drop TABLE `%bill%`"); $this->doSQLcatch($pdo, "drop TABLE `%user%`"); $this->doSQLcatch($pdo, "drop TABLE `%closing%`"); $this->doSQLcatch($pdo, "drop TABLE `%config%`"); $this->doSQLcatch($pdo, "drop TABLE `%products%`"); $this->doSQLcatch($pdo, "drop TABLE `%prodtype%`"); $this->doSQLcatch($pdo, "drop TABLE `%pricelevel%`"); $this->doSQLcatch($pdo, "drop TABLE `%resttables%`"); $this->doSQLcatch($pdo, "drop TABLE `%room%`"); $this->doSQLcatch($pdo, "drop TABLE `%payment%`"); $this->createPaymentTable($pdo); $this->createUserTable($pdo); $this->createRoomTable($pdo); $this->createRestTables($pdo); $this->createConfigTable($pdo); $this->createProdTypeTable($pdo); $this->createProductTable($pdo); $this->createPriceLevelTable($pdo); $this->createClosingTable($pdo); $this->createBillTable($pdo); $this->createQueueTable($pdo); $this->createBillProductsTable($pdo); $this->createHistTables($pdo); $this->createPrintJobsTable($pdo); $this->doSQL($pdo,"INSERT INTO `%pricelevel%` (`id` , `name`,`info`) VALUES ('1', 'A', 'Normale Preisstufe')"); $this->doSQL($pdo,"INSERT INTO `%pricelevel%` (`id` , `name`,`info`) VALUES ('2', 'B', 'Wochenendtarif')"); $this->doSQL($pdo,"INSERT INTO `%pricelevel%` (`id` , `name`,`info`) VALUES ('3', 'C', 'Happy Hour')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'pricelevel', '1')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'tax', '19,0')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'togotax', '7,0')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'stornocode', '123')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'printpass', 'printen')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'companyinfo', 'Musterrestaurant\nBeispielstrasse 123\n12345 Musterort')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'serverurl', '')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'email', '')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'logourl', 'customer/logo.png')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'payprinttype', 'l')"); $this->doSQL($pdo,"INSERT INTO `%config%` (`id` , `name`, `setting`) VALUES (NULL , 'version', '1.0')"); $this->readConfigTableAndSendToHist($pdo); return; } function doSQL($pdo,$sql) { $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } function doSQLcatch($pdo,$sql) { try { $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } catch (Exception $e) { // nothing - table not present or whatever... } } function readConfigTableAndSendToHist($pdo) { $sql_query = "SELECT * FROM %config%"; $sql_insert_histconfig = "INSERT INTO %histconfig% (id,configid,setting) VALUES ( NULL,?,?)"; $stmt_query = $pdo->prepare($this->resolveTablenamesInSqlString($sql_query)); $stmt_insert_histconfig = $pdo->prepare($this->resolveTablenamesInSqlString($sql_insert_histconfig)); $stmt_query->execute(); $result = $stmt_query->fetchAll(); foreach($result as $row){ $stmt_insert_histconfig->execute(array($row['id'],$row['setting'])); $newRefIdForHist = $pdo->lastInsertId(); $this->insertIntoHist($pdo, '2', $newRefIdForHist); } } private function insertIntoHist($pdo,$action,$refIdForHist) { date_default_timezone_set('Europe/Berlin'); $currentTime = date('Y-m-d H:i:s'); $sql_insert_hist = "INSERT INTO %hist% (id,date,action,refid) VALUES (NULL,?,?,?)"; $stmt_insert_hist = $pdo->prepare($this->resolveTablenamesInSqlString($sql_insert_hist)); $stmt_insert_hist->execute(array($currentTime, $action, $refIdForHist)); } function insertAdminUser($adminpass) { $md5adminpass = md5($adminpass); $pdo = $this->pdo; $userInsertSql = "INSERT INTO `%user%` (`id` , `username` , `userpassword`, `is_admin`, `right_waiter`,`right_kitchen`,`right_bar`,`right_supply`,`right_paydesk`,`right_statistics`,`right_bill`,`right_products`,`right_manager`,`active`) VALUES (NULL,?,?,?,?,?,?,?,?,?,?,?,?,'1')"; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($userInsertSql)); $stmt->execute(array('admin',$md5adminpass,1,0,0,0,0,0,0,0,0,1)); $newUserIdForHist = $pdo->lastInsertId(); // now insert into hist $sql_insert_histuser = "INSERT INTO %histuser% (`id` , `userid`, `username` , `is_admin`, `right_waiter`,`right_kitchen`,`right_bar`,`right_supply`,`right_paydesk`, `right_statistics`,`right_bill`,`right_products`,`right_manager`,`active`) VALUES ( NULL,?,?,?,?,?,?,?,?,?,?,?,?,?)"; $stmt_insert_histuser = $pdo->prepare($this->resolveTablenamesInSqlString($sql_insert_histuser)); $stmt_insert_histuser->execute(array($newUserIdForHist,'admin',1,0,0,0,0,0,0,0,0,1,1)); $newRefIdForHist = $pdo->lastInsertId(); $this->insertIntoHist($pdo, '3', $newRefIdForHist); } function createBillProductsTable($pdo) { $sql = " CREATE TABLE `%billproducts%` ( `queueid` INT( 10 ) NOT NULL, `billid` INT(10) NOT NULL, FOREIGN KEY (queueid) REFERENCES %queue%(id), FOREIGN KEY (billid) REFERENCES %bill%(id) ) ENGINE = InnoDb ; "; $this->doSQL($pdo,$sql); } /* * Create the queue table: * action: P=Pay, S=Storno */ function createQueueTable($pdo) { $sql = " CREATE TABLE `%queue%` ( `id` INT( 10 ) NOT NULL AUTO_INCREMENT PRIMARY KEY , `tablenr` INT( 3 ) NOT NULL , `productid` INT( 10 ) NULL , `pricelevel` INT( 3 ) NOT NULL , `price` DECIMAL (5,2) NOT NULL, `productname` VARCHAR( 150 ) NULL, `ordertime` DATETIME NULL , `anoption` VARCHAR( 150 ) NULL , `readytime` DATETIME NOT NULL, `delivertime` DATETIME NULL, `payinprogress` INT(3) NOT NULL, `paidtime` DATETIME NULL, `billid` INT(10), `toremove` INT(3) NOT NULL, `cooking` INT(10) NULL, `workprinted` INT(2) NOT NULL, `action` VARCHAR(3) NOT NULL, FOREIGN KEY (tablenr) REFERENCES %resttables%(id), FOREIGN KEY (pricelevel) REFERENCES %pricelevel%(id), FOREIGN KEY (productid) REFERENCES %products%(id), FOREIGN KEY (billid) REFERENCES %bill%(id), FOREIGN KEY (cooking) REFERENCES %user%(id) ) ENGINE = InnoDb ; "; $this->doSQL($pdo,$sql); } function createProdTypeTable($pdo) { $sql = " CREATE TABLE `%prodtype%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR ( 150 ) NOT NULL, `usekitchen` INT(1) NOT NULL, `usesupplydesk` INT(1) NOT NULL, `kind` INT(2) NOT NULL, `sorting` INT(2) NULL, `reference` INT (10) NULL, `removed` INT(1) NULL, FOREIGN KEY (reference) REFERENCES %prodtype%(id) ) ENGINE = InnoDb ; "; $this->doSQL($pdo,$sql); } function createProductTable($pdo) { $sql = " CREATE TABLE `%products%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `shortname` VARCHAR ( 150 ) NOT NULL, `longname` VARCHAR ( 150 ) NOT NULL, `priceA` DECIMAL (5,2) NULL, `priceB` DECIMAL (5,2) NULL, `priceC` DECIMAL (5,2) NULL, `category` INT(3) NULL, `sorting` INT(2) NULL, `available` INT(2) NOT NULL, `audio` VARCHAR ( 150 ) NULL, `removed` INT(1) NULL, FOREIGN KEY (category) REFERENCES %prodtype%(id) ) ENGINE = InnoDb ; "; $this->doSQL($pdo,$sql); } function createUserTable($pdo) { $sql = " CREATE TABLE `%user%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `username` VARCHAR ( 150 ) NOT NULL, `userpassword` VARCHAR ( 150 ) NOT NULL, `is_admin` INT (2) NOT NULL, `right_waiter` INT (2) NOT NULL, `right_kitchen` INT (2) NOT NULL, `right_bar` INT (2) NOT NULL, `right_supply` INT (2) NOT NULL, `right_paydesk` INT (2) NOT NULL, `right_statistics` INT (2) NOT NULL, `right_bill` INT (2) NOT NULL, `right_products` INT (2) NOT NULL, `right_manager` INT (2) NOT NULL, `lastmodule` VARCHAR ( 30 ) NULL, `ordervolume` INT (2) NULL, `active` INT (2) NOT NULL ) ENGINE = InnoDb ; "; $this->doSQL($pdo,$sql); } function createPaymentTable($pdo) { $sql = " CREATE TABLE `%payment%` ( `id` INT (3) NOT NULL UNIQUE, `name` VARCHAR ( 20 ) NOT NULL ) ENGINE = InnoDb "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); $sql = "INSERT INTO %payment% (id,name) VALUES (?,?)"; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('1', 'Barzahlung')); $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('2', 'EC-Kartenzahlung')); $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('3', 'Kreditkartenzahlung')); $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('4', 'Rechnung')); $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('5', 'Ueberweisung')); $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('6', 'Lastschrift')); } function createHistTables($pdo) { $sql = " CREATE TABLE `%hist%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `date` DATETIME NOT NULL , `action` INT ( 2 ) NOT NULL, `refid` INT (10) NOT NULL ) ENGINE = InnoDb "; $this->doSQL($pdo,$sql); $sql = " CREATE TABLE `%histprod%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `prodid` INT (10) NOT NULL, `shortname` VARCHAR ( 150 ) NOT NULL, `longname` VARCHAR ( 150 ) NOT NULL, `priceA` DECIMAL (5,2) NULL, `priceB` DECIMAL (5,2) NULL, `priceC` DECIMAL (5,2) NULL, `sorting` INT(2) NULL, `available` INT(2) NOT NULL, `audio` VARCHAR ( 150 ) NULL, FOREIGN KEY (prodid) REFERENCES %products%(id) ) ENGINE = InnoDb "; $this->doSQL($pdo,$sql); $sql = " CREATE TABLE `%histconfig%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `configid` INT (10) , `setting` VARCHAR ( 10000 ), FOREIGN KEY (configid) REFERENCES %config%(id) ) ENGINE = InnoDb "; $this->doSQL($pdo,$sql); $sql = " CREATE TABLE `%histuser%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `userid` INT (10) , `username` VARCHAR ( 150 ) NOT NULL, `is_admin` INT (2) NOT NULL, `right_waiter` INT (2) NOT NULL, `right_kitchen` INT (2) NOT NULL, `right_bar` INT (2) NOT NULL, `right_supply` INT (2) NOT NULL, `right_paydesk` INT (2) NOT NULL, `right_statistics` INT (2) NOT NULL, `right_bill` INT (2) NOT NULL, `right_products` INT (2) NOT NULL, `right_manager` INT (2) NOT NULL, `active` INT (2) NOT NULL, FOREIGN KEY (userid) REFERENCES %user%(id) ) ENGINE = InnoDb "; $this->doSQL($pdo,$sql); $sql = " CREATE TABLE `%histactions%` ( `id` INT (3) NOT NULL, `name` VARCHAR ( 20 ) NOT NULL, `description` VARCHAR ( 150 ) NULL ) ENGINE = InnoDb "; $this->doSQL($pdo,$sql); $this->defineHistActions($pdo); } public function defineHistActions ($pdo) { $sql = "INSERT INTO %histactions% (id,name,description) VALUES (?,?,?)"; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('1', 'ProdInit', 'Initiales Befuellen der Produkttabelle')); $stmt->execute(array('2', 'ConfigInit', 'Initiales Befuellen der Konfigurationstabelle')); $stmt->execute(array('3', 'UserInit', 'Initiales Befuellen der Benutzertabelle')); $stmt->execute(array('4', 'ProdChange', 'Modifikation der Produktdaten')); $stmt->execute(array('5', 'ProdCreation', 'Neues Produkt')); $stmt->execute(array('6', 'ConfigChange', 'Modifikation der Konfiguration')); $stmt->execute(array('7', 'UserCreation', 'Neuer Benutzer')); $stmt->execute(array('8', 'UserChange', 'Modifikation eines Benutzers')); } function createRoomTable($pdo) { $sql = " CREATE TABLE `%room%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `roomname` VARCHAR ( 150 ) NOT NULL, `removed` INT(2) NULL, `sorting` INT(2) NULL ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } function createRestTables($pdo) { $sql = " CREATE TABLE `%resttables%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `tableno` VARCHAR ( 150 ) NOT NULL, `roomid` INT ( 10 ) NOT NULL, `removed` INT(2) NULL, `sorting` INT(2) NULL, FOREIGN KEY (roomid) REFERENCES %room%(id) ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); $sql = "INSERT INTO `%room%` (`id`, `roomname`) VALUES (NULL,?)"; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('Raum 1')); $roomId = $pdo->lastInsertId(); $sql = "INSERT INTO `%resttables%` (`id` , `tableno`, `roomid`) VALUES (NULL ,?,?)"; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('Tisch 1',$roomId)); $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(array('Tisch 2',$roomId)); } function createBillTable($pdo) { $sql = " CREATE TABLE `%bill%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `billdate` DATETIME NOT NULL , `content` VARCHAR ( 50000 ) , `brutto` DECIMAL (5,2) NULL, `netto` DECIMAL (5,2) NULL, `tableid` VARCHAR ( 150 ) NOT NULL, `closingid` INT(4) NULL, `status` VARCHAR(2) NULL, `paymentid` INT(2) NULL, `userid` INT(3) NULL, `ref` INT(10) NULL, `tax` DECIMAL (5,2) NOT NULL, FOREIGN KEY (closingid) REFERENCES %closing%(id), FOREIGN KEY (paymentid) REFERENCES %payment%(id), FOREIGN KEY (userid) REFERENCES %user%(id), FOREIGN KEY (ref) REFERENCES %bill%(id) ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); // insert dummy entry so that select query with closing works date_default_timezone_set('Europe/Berlin'); $currentTime = date('Y-m-d H:i:s'); $billInsertSql = "INSERT INTO `%bill%` (`id` , `billdate`,`content`,`brutto`,`tableid`,`paymentid`,`tax`) VALUES ( '0', '$currentTime' , '', '', '-1', NULL, '0.00')"; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($billInsertSql)); $stmt->execute(); } function createPriceLevelTable($pdo) { $sql = " CREATE TABLE `%pricelevel%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR ( 10000 ) , `info` VARCHAR ( 10000 ) ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } function createConfigTable($pdo) { $sql = " CREATE TABLE `%config%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR ( 1000 ) , `setting` VARCHAR ( 10000 ) ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } function createClosingTable($pdo) { $sql = " CREATE TABLE `%closing%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `closingdate` DATETIME NOT NULL , `remark` VARCHAR ( 10000 ) ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } function createPrintJobsTable($pdo) { $sql = " CREATE TABLE `%printjobs%` ( `id` INT (10) NOT NULL AUTO_INCREMENT PRIMARY KEY , `content` VARCHAR ( 50000 ) NOT NULL , `type` INT (2) NOT NULL ) ENGINE = InnoDb ; "; $stmt = $pdo->prepare($this->resolveTablenamesInSqlString($sql)); $stmt->execute(); } function resolveTablenamesInSqlString($sqlString) { $out = str_replace("%queue%",$this->prefix . "queue",$sqlString); $out = str_replace("%products%",$this->prefix . "products",$out); $out = str_replace("%user%",$this->prefix . "user",$out); $out = str_replace("%room%",$this->prefix . "room",$out); $out = str_replace("%resttables%",$this->prefix . "resttables",$out); $out = str_replace("%bill%",$this->prefix . "bill",$out); $out = str_replace("%pricelevel%",$this->prefix . "pricelevel",$out); $out = str_replace("%config%",$this->prefix . "config",$out); $out = str_replace("%closing%",$this->prefix . "closing",$out); $out = str_replace("%printjobs%",$this->prefix . "printjob",$out); $out = str_replace("%hist%",$this->prefix . "hist",$out); $out = str_replace("%histprod%",$this->prefix . "histprod",$out); $out = str_replace("%histconfig%",$this->prefix . "histconfig",$out); $out = str_replace("%histuser%",$this->prefix . "histuser",$out); $out = str_replace("%histactions%",$this->prefix . "histactions",$out); $out = str_replace("%payment%",$this->prefix . "payment",$out); $out = str_replace("%billproducts%",$this->prefix . "billproducts",$out); return (str_replace("%prodtype%",$this->prefix . "prodtype",$out)); } function testDbConnection($host,$dbname,$user,$pass) { $pdo = $this->openDbAndReturnPdo($host,$dbname,$user,$pass); if (!is_null($pdo)) { echo json_encode("OK"); } else { echo json_encode("ERROR"); } } function writeConfigFile($host,$db,$user,$password,$prefix) { $errorlevel = ""; file_put_contents("../php/config.php", $configText); } } $command = $_GET["command"]; if ($command == 'checkWriteAccess') { $checker = new Installer(); $checker->checkWriteAccess(); } else if ($command == 'testDbConnection') { $admin = new Admin(); try { if (isset($_POST['host']) && isset($_POST['dbname']) && isset($_POST['user']) && isset($_POST['pass'])) { $admin->testDbConnection($_POST['host'],$_POST['dbname'],$_POST['user'],$_POST['pass']); } else { echo json_encode("ERROR"); } } catch (Exception $e) { echo json_encode("ERROR"); } } else if ($command == 'getConfig') { $configWriter = new ConfigWriter(); $configWriter->getConfigVals(); } else if ($command == 'install') { $admin = new Admin(); $pdo = $admin->openDbAndReturnPdo($_POST['host'],$_POST['db'],$_POST['user'],$_POST['password']); $admin->setPdo($pdo); $admin->setPrefix($_POST['prefix']); $admin->createTables(); $admin->insertAdminUser($_POST['adminpass']); $admin->writeConfigFile($_POST['host'],$_POST['db'],$_POST['user'],$_POST['password'],$_POST['prefix']); echo json_encode("OK"); } ?>