<?php

session_start();
ob_start();
//empty cash header
if (!empty($_SESSION['dbname']) && !empty($_SESSION['userid'])) {
    $fh = fopen('../temp__cashedheader/cashedheader_' . $_SESSION['dbname'] . '_' . $_SESSION['userid'] . '.html', 'w');
    fclose($fh);
}
// get the config file
include_once("../public/config.php");

//	//here the db files that include in the file
include("../public/include_dao.php");

//User
require_once('../models/dao/UserDAO.class.php');
require_once('../models/dto/User.class.php');
require_once('../models/mysql/UserMySqlDAO.class.php');
require_once('../models/mysql/ext/UserMySqlExtDAO.class.php');

//Usergroupadmin
require_once('../models/dao/UsergroupadminDAO.class.php');
require_once('../models/dto/Usergroupadmin.class.php');
require_once('../models/mysql/UsergroupadminMySqlDAO.class.php');
require_once('../models/mysql/ext/UsergroupadminMySqlExtDAO.class.php');
//Usergroup
require_once('../models/dao/UsergroupDAO.class.php');
require_once('../models/dto/Usergroup.class.php');
require_once('../models/mysql/UsergroupMySqlDAO.class.php');
require_once('../models/mysql/ext/UsergroupMySqlExtDAO.class.php');
//Newdbname
require_once('../models/dao/NewdbnameDAO.class.php');
require_once('../models/dto/Newdbname.class.php');
require_once('../models/mysql/NewdbnameMySqlDAO.class.php');
require_once('../models/mysql/ext/NewdbnameMySqlExtDAO.class.php');


//Menuurl
require_once('../models/dao/MenuurlDAO.class.php');
require_once('../models/dto/Menuurl.class.php');
require_once('../models/mysql/MenuurlMySqlDAO.class.php');
require_once('../models/mysql/ext/MenuurlMySqlExtDAO.class.php');

//Properties
require_once('../models/dao/PropertiesDAO.class.php');
require_once('../models/dto/Propertie.class.php');
require_once('../models/mysql/PropertiesMySqlDAO.class.php');
require_once('../models/mysql/ext/PropertiesMySqlExtDAO.class.php');

//Relusergrouppropertie
require_once('../models/dao/RelusergrouppropertiesDAO.class.php');
require_once('../models/dto/Relusergrouppropertie.class.php');
require_once('../models/mysql/RelusergrouppropertiesMySqlDAO.class.php');
require_once('../models/mysql/ext/RelusergrouppropertiesMySqlExtDAO.class.php');

require_once('../models/dao/SellbillDAO.class.php');
require_once('../models/dto/Sellbill.class.php');
require_once('../models/mysql/SellbillMySqlDAO.class.php');
require_once('../models/mysql/ext/SellbillMySqlExtDAO.class.php');

//Accountstree
require_once('../models/dao/AccountstreeDAO.class.php');
require_once('../models/dto/Accountstree.class.php');
require_once('../models/mysql/AccountstreeMySqlDAO.class.php');
require_once('../models/mysql/ext/AccountstreeMySqlExtDAO.class.php');

//Billproperty
require_once('../models/dao/BillpropertyDAO.class.php');
require_once('../models/dto/Billproperty.class.php');
require_once('../models/mysql/BillpropertyMySqlDAO.class.php');
require_once('../models/mysql/ext/BillpropertyMySqlExtDAO.class.php');
//Billname
require_once('../models/dao/BillnameDAO.class.php');
require_once('../models/dto/Billname.class.php');
require_once('../models/mysql/BillnameMySqlDAO.class.php');
require_once('../models/mysql/ext/BillnameMySqlExtDAO.class.php');
//Billsetting
require_once('../models/dao/BillsettingsDAO.class.php');
require_once('../models/dto/Billsetting.class.php');
require_once('../models/mysql/BillsettingsMySqlDAO.class.php');
require_once('../models/mysql/ext/BillsettingsMySqlExtDAO.class.php');

//Programsetting
require_once('../models/dao/ResturantcategoryDAO.class.php');
require_once('../models/dto/Resturantcategory.class.php');
require_once('../models/mysql/ResturantcategoryMySqlDAO.class.php');
require_once('../models/mysql/ext/ResturantcategoryMySqlExtDAO.class.php');
//
require_once('../models/dao/YoutubeLinkDAO.class.php');
require_once('../models/dto/YoutubeLink.class.php');
require_once('../models/mysql/YoutubeLinkMySqlDAO.class.php');
require_once('../models/mysql/ext/YoutubeLinkMySqlExtDAO.class.php');
//Assetscat
require_once('../models/dao/AssetscatDAO.class.php');
require_once('../models/dto/Assetscat.class.php');
require_once('../models/mysql/AssetscatMySqlDAO.class.php');
require_once('../models/mysql/ext/AssetscatMySqlExtDAO.class.php');
//Expensestype
require_once('../models/dao/ExpensestypeDAO.class.php');
require_once('../models/dto/Expensestype.class.php');
require_once('../models/mysql/ExpensestypeMySqlDAO.class.php');
require_once('../models/mysql/ext/ExpensestypeMySqlExtDAO.class.php');
//Incometype
require_once('../models/dao/IncometypeDAO.class.php');
require_once('../models/dto/Incometype.class.php');
require_once('../models/mysql/IncometypeMySqlDAO.class.php');
require_once('../models/mysql/ext/IncometypeMySqlExtDAO.class.php');

//lang
require_once('../models/dao/LanguagesDAO.class.php');
require_once('../models/dto/Language.class.php');
require_once('../models/mysql/LanguagesMySqlDAO.class.php');
require_once('../models/mysql/ext/LanguagesMySqlExtDAO.class.php');

//Maccontrol
require_once('../models/dao/MaccontrolDAO.class.php');
require_once('../models/dto/Maccontrol.class.php');
require_once('../models/mysql/MaccontrolMySqlDAO.class.php');
require_once('../models/mysql/ext/MaccontrolMySqlExtDAO.class.php');

//lang

$lang = $_COOKIE["lang_code"] ? $_COOKIE["lang_code"] : 'ar';
include_once("../views/languages/$lang/login/login.php");

//get the do the action
$do = filter_input(INPUT_GET, "do"); //$_GET['do'];



/* ======================

  Controller Name :- login

  OPERTATION in Controller

  1-
  2-
  3-
  4-

  ======================== */


//here goes the instances and general variables
//User
$user = new User();
$myUserRecord = new UserMySqlDAO();
$myUserEx = new UserMySqlExtDAO();

$userGroupAdminEX = new UsergroupadminMySqlExtDAO();

$myUserGroupEx = new UsergroupMySqlExtDAO();
$myUserGroupRecord = new UsergroupMySqlDAO();
$myUserGroup = new Usergroup();
//Newdbname
$newDbName = new Newdbname();
$newDbNameDAO = new NewdbnameMySqlDAO();
$newDbNameExt = new NewdbnameMySqlExtDAO();


//Properties
$myPropertiesRecord = new PropertiesMySqlDAO();
$myPropertiesExt = new PropertiesMySqlExtDAO();

//Relusergrouppropertie
$myRelusergrouppropertie = new Relusergrouppropertie();
$myRelusergrouppropertieRecord = new RelusergrouppropertiesMySqlDAO();
$myRelusergrouppropertieExt = new RelusergrouppropertiesMySqlExtDAO();


//Sellbill
$mySellbill = new Sellbill();
$mySellbillRecord = new SellbillMySqlDAO();
$mySellbillEx = new SellbillMySqlExtDAO();

$menuUrl = new Menuurl();
$menuUrlDAO = new MenuurlMySqlDAO();

//Accountstree
$accountsTree = new Accountstree();
$accountsTreeDAO = new AccountstreeMySqlDAO();
$accountsTreeEX = new AccountstreeMySqlExtDAO();

//Billproperty
$billProperty = new Billproperty();
$billPropertyDAO = new BillpropertyMySqlDAO();
$billPropertyEX = new BillpropertyMySqlExtDAO();

//Billname
$billName = new Billname();
$billNameDAO = new BillnameMySqlDAO();
$billNameEX = new BillnameMySqlExtDAO();
//Billsetting
$billSetting = new Billsetting();
$billSettingDAO = new BillsettingsMySqlDAO();
$billSettingEX = new BillsettingsMySqlExtDAO();
eval(base64_decode("ZnVuY3Rpb24gY2hlY2tBbGxvd2VkTGltaXRzKCkgewogICAgZ2xvYmFsICRteVVzZXJSZWNvcmQ7CiAgICBnbG9iYWwgJG15VXNlckV4OwogICAgZ2xvYmFsICRteVNlbGxiaWxsUmVjb3JkOwogICAgZ2xvYmFsICRteVNlbGxiaWxsRXg7CgogICAgJHVzZXJibG9ja251bSA9IGZpbGVfZ2V0X2NvbnRlbnRzKCIuLi92aWV3cy9kZWZhdWx0L2FyY2hpdmV2aWV3L3VzZXJibG9jay50eHQiKTsKICAgICRhbGx1c2Vyc0NvdW50ID0gJG15VXNlckV4LT5nZXRVc2VyQ291bnQoKTsKICAgICRhbGxiaWxsc0NvdW50ID0gJG15U2VsbGJpbGxFeC0+Z2V0U2VsbEJpbGxDb3VudCgpOwogICAgaWYgKCRhbGx1c2Vyc0NvdW50ID49ICR1c2VyYmxvY2tudW0gfHwgJGFsbGJpbGxzQ291bnQgPj0gJHVzZXJibG9ja251bSkgewogICAgICAgIGhlYWRlcigibG9jYXRpb246P2RvPWZpbmlzaGVkIik7CiAgICAgICAgZXhpdDsKICAgIH0KfQ=="));
eval(base64_decode("ZnVuY3Rpb24gY2hlY2tTb2Z0d2FyZUFjdGl2YXRpb24oKSB7CiAgICBnbG9iYWwgJFByb2dyYW1zZXR0aW5nREFPOwogICAgZ2xvYmFsICRteVVzZXJFeDsKCiAgICAkUHJvZ3JhbWVzZXR0aW5nID0gJFByb2dyYW1zZXR0aW5nREFPLT5sb2FkKDEpOwoKICAgIGlmIChlbXB0eSgkUHJvZ3JhbWVzZXR0aW5nLT5zZXJpYWwpICYmIGVtcHR5KCRQcm9ncmFtZXNldHRpbmctPnNlcmlhbDIpICYmIGVtcHR5KCRQcm9ncmFtZXNldHRpbmctPnNlcmlhbDMpKSB7CiAgICAgICAgaGVhZGVyKCJsb2NhdGlvbjo/ZG89YWN0aXZhdGUiKTsKICAgICAgICBleGl0OwogICAgfSBlbHNlIHsKICAgICAgICAkc2VyaWFsQ2FsID0gc2VyaWFsY2hlY2soKTsKICAgICAgICAvL3ByaW50X3IoJHNlcmlhbENhbCk7CiAgICAgICAgaWYgKCRQcm9ncmFtZXNldHRpbmctPnNlcmlhbCA9PSAkc2VyaWFsQ2FsIHx8ICRQcm9ncmFtZXNldHRpbmctPnNlcmlhbDIgPT0gJHNlcmlhbENhbCB8fCAkUHJvZ3JhbWVzZXR0aW5nLT5zZXJpYWwzID09ICRzZXJpYWxDYWwpIHsKICAgICAgICAgICAgJGxpY2VuY2UgPSBmaWxlX2dldF9jb250ZW50cygiLi4vdmlld3MvZGVmYXVsdC9hcmNoaXZldmlldy9saWNlbmNlLnR4dCIpOwogICAgICAgICAgICAkbGljZW5jZSA9IHJ0cmltKCRsaWNlbmNlKTsKCiAgICAgICAgICAgICRuZXdpZCA9IGV4cGxvZGUoJy0nLCAkbGljZW5jZSk7CiAgICAgICAgICAgICR1c2Vybm8gPSBkZWNyeXB0X1N0cigkbmV3aWRbMF0pOwogICAgICAgICAgICAkc3luY3VzZXJzID0gZGVjcnlwdF9TdHIoJG5ld2lkWzFdKTsKICAgICAgICAgICAgJHN5bmN0aW1lID0gZGVjcnlwdF9TdHIoJG5ld2lkWzJdKTsKICAgICAgICAgICAgJGNsaWVudG5hbWUgPSBkZWNyeXB0X1N0cigkbmV3aWRbM10pOwogICAgICAgICAgICAkZGF0ZXRvID0gZGVjcnlwdF9TdHIoJG5ld2lkWzRdKTsKCiAgICAgICAgICAgIGlmICgkZGF0ZXRvIDwgZGF0ZSgnWS1tLWQnKSkgewogICAgICAgICAgICAgICAgaGVhZGVyKCJsb2NhdGlvbjo/ZG89YWN0aXZhdGUiKTsKICAgICAgICAgICAgICAgIGV4aXQ7CiAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2xpY191c2Vybm8nXSA9ICR1c2Vybm87CiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2xpY19zeW5jdXNlcnMnXSA9ICRzeW5jdXNlcnM7CiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2xpY19zeW5jdGltZSddID0gJHN5bmN0aW1lOwogICAgICAgICAgICAgICAgJF9TRVNTSU9OWydsaWNfY2xpZW50bmFtZSddID0gJGNsaWVudG5hbWU7CiAgICAgICAgICAgICAgICAkX1NFU1NJT05bJ2xpY19kYXRldG8nXSA9ICRkYXRldG87CgoKICAgICAgICAgICAgICAgICMjaGFuZGxlIHVzZXJzIGJsb2NrZWQgYnkgc2VyaWFsCiAgICAgICAgICAgICAgICAkdXNlcmlkX2ZpcnN0VXNlclRvQmxvY2sgPSAkbXlVc2VyRXgtPmdldEZpcnN0VXNlckZvcmJpZGRlbkJ5VXNlckxpbWl0cygkdXNlcm5vKTsKICAgICAgICAgICAgICAgICRteVVzZXJFeC0+YWN0aXZhdGVBbGxVc2VycygpOwogICAgICAgICAgICAgICAgaWYgKGlzc2V0KCR1c2VyaWRfZmlyc3RVc2VyVG9CbG9jaykgJiYgIWVtcHR5KCR1c2VyaWRfZmlyc3RVc2VyVG9CbG9jaykpIHsKICAgICAgICAgICAgICAgICAgICAkbXlVc2VyRXgtPmhhbmRsZVVzZXJMaW1pcygkdXNlcmlkX2ZpcnN0VXNlclRvQmxvY2spOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgaGVhZGVyKCJsb2NhdGlvbjo/ZG89YWN0aXZhdGUiKTsKICAgICAgICAgICAgZXhpdDsKICAgICAgICB9CiAgICB9Cn0="));
eval(base64_decode("ZnVuY3Rpb24gZGVjcnlwdF9TdHIoJHN0cmluZykgewogICAgJGtleSA9ICJUcllfSWYtPllvdSUmRGFyZS0+MDE1OSI7IC8va2V5IHRvIGVuY3J5cHQgYW5kIGRlY3J5cHRzLgogICAgJHJlc3VsdCA9ICcnOwogICAgJHN0cmluZyA9IGJhc2U2NF9kZWNvZGUodXJsZGVjb2RlKCRzdHJpbmcpKTsKICAgIGZvciAoJGkgPSAwOyAkaSA8IHN0cmxlbigkc3RyaW5nKTsgJGkrKykgewogICAgICAgICRjaGFyID0gc3Vic3RyKCRzdHJpbmcsICRpLCAxKTsKICAgICAgICAka2V5Y2hhciA9IHN1YnN0cigka2V5LCAoJGkgJSBzdHJsZW4oJGtleSkpIC0gMSwgMSk7CiAgICAgICAgJGNoYXIgPSBjaHIob3JkKCRjaGFyKSAtIG9yZCgka2V5Y2hhcikpOwogICAgICAgICRyZXN1bHQgLj0gJGNoYXI7CiAgICB9CiAgICByZXR1cm4gJHJlc3VsdDsKfQ=="));
eval(base64_decode("ZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkgewogICAgJGhvc3RuYW1lID0gZXhwbG9kZSgnY29udHJvbGxlcnMnLCAkX1NFUlZFUlsnU0NSSVBUX1VSSSddKVswXTsgLy9nZXRob3N0bmFtZSgpOwogICAgJGhvc3RuYW1lID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHA6Ly8iLCAiaHR0cHM6Ly8iKSwgIiIsICRob3N0bmFtZSk7CgogICAgLy8gR2VuZXJhdGUgYW4gTUQ1IGhhc2ggb2YgdGhlIGlucHV0CiAgICAkZGF0YSA9IG1kNSgkaG9zdG5hbWUpOwogICAgLy8gRm9ybWF0IHRoZSBoYXNoIGFzIGEgVVVJRAogICAgJHV1aWQgPSBzcHJpbnRmKAogICAgICAgICAgICAnJTA4cy0lMDRzLSUwNHgtJTA0eC0lMTJzJywKICAgICAgICAgICAgc3Vic3RyKCRkYXRhLCAwLCA4KSwKICAgICAgICAgICAgc3Vic3RyKCRkYXRhLCA4LCA0KSwKICAgICAgICAgICAgKGhleGRlYyhzdWJzdHIoJGRhdGEsIDEyLCA0KSkgJiAweDBmZmYpIHwgMHg0MDAwLAogICAgICAgICAgICAoaGV4ZGVjKHN1YnN0cigkZGF0YSwgMTYsIDQpKSAmIDB4M2ZmZikgfCAweDgwMDAsCiAgICAgICAgICAgIHN1YnN0cigkZGF0YSwgMjAsIDEyKQogICAgKTsKICAgICR1dWlkID0gc3RyX3JlcGxhY2UoYXJyYXkoJy0nKSwgJycsICR1dWlkKTsKICAgIHJldHVybiAkdXVpZDsKfQ=="));
//eval(base64_decode("ZnVuY3Rpb24gZ2VuZXJhdGVVVUlEKCkgewogICRob3N0bmFtZSA9IGV4cGxvZGUoJ2NvbnRyb2xsZXJzJywgJF9TRVJWRVJbJ1NDUklQVF9VUkknXSlbMF07CiAgJGhvc3RuYW1lID0gc3RyX3JlcGxhY2UoYXJyYXkoImh0dHA6Ly8iLCAiaHR0cHM6Ly8iKSwgIiIsICRob3N0bmFtZSk7CgogIC8vIEN1c3RvbSBlbmNyeXB0aW9uIGxvZ2ljCiAgLy8gRXhhbXBsZTogQ29udmVydCBlYWNoIGNoYXJhY3RlciB0byBpdHMgcG9zaXRpb24gaW4gdGhlIGFscGhhYmV0CiAgJGVuY3J5cHRlZERhdGEgPSAnJzsKICBmb3IgKCRpID0gMDsgJGkgPCBzdHJsZW4oJGhvc3RuYW1lKTsgJGkrKykgewogICAgJGNoYXIgPSBzdHJ0b2xvd2VyKCRob3N0bmFtZVskaV0pOwogICAgaWYgKGN0eXBlX2FscGhhKCRjaGFyKSkgewogICAgICAkZW5jcnlwdGVkRGF0YSAuPSBvcmQoJGNoYXIpIC0gb3JkKCdhJykgKyAxOwogICAgfQogIH0KICAKICAkdXVpZCA9ICRlbmNyeXB0ZWREYXRhOwogIHJldHVybiAkdXVpZDsKfQ=="));
eval(base64_decode("ZnVuY3Rpb24gc2VyaWFsY2hlY2soKSB7CiAgICBpZiAoc3RydG91cHBlcihzdWJzdHIoUEhQX09TLCAwLCAzKSkgPT09ICdXSU4nKSB7CiAgICAgICAgLy91dWlkIG9mIHdpbmRvd3MKICAgICAgICBleGVjKCdDOlxXaW5kb3dzXFN5c3RlbTMyXHdiZW1cd21pYyBjc3Byb2R1Y3QgZ2V0ICJVVUlEIicsICRtYWNhZGRyZXNzLCAkaXNFeGVjdXRlZCk7CiAgICAgICAgJG1hY2FkZHJlc3MgPSAkbWFjYWRkcmVzc1sxXTsKICAgICAgICAkbWFjID0gc3RyX3JlcGxhY2UoYXJyYXkoJy0nKSwgJycsICRtYWNhZGRyZXNzKTsKICAgIH0gZWxzZSB7Ly9ub3Qgd2luZG93cyB1c2UgbGludXggbWFjCiAgICAgICAgJG1hYyA9IGdlbmVyYXRlVVVJRCgpOwogICAgfQoKICAgICRyYW5kb21fc2FsdCA9IGhhc2goJ3NoYTUxMicsICcxMzA1Jyk7CiAgICAvLyBDcmVhdGUgc2FsdGVkIHBhc3N3b3JkCiAgICAkaGFzaGVkTWFjID0gaGFzaCgnc2hhNTEyJywgJG1hYyAuICRyYW5kb21fc2FsdCk7CiAgICByZXR1cm4gJGhhc2hlZE1hYzsKfQ=="));
$ProgramsettingDAO = new ProgramsettingsMySqlDAO();
//check if there is a usergroup with id = 1
//billsproducts
$ResturantCategory = new Resturantcategory();
$ResturantCategoryDAO = new ResturantcategoryMySqlDAO();
$ResturantCategoryEXT = new ResturantcategoryMySqlExtDAO();

//
$youtubeLink = new YoutubeLink();
$youtubeLinkDAO = new YoutubeLinkMySqlDAO();
$youtubeLinkEX = new YoutubeLinkMySqlExtDAO();

//Assetscat
$Assetscat = new Assetscat();
$AssetscatDAO = new AssetscatMySqlDAO();
$AssetscatEX = new AssetscatMySqlExtDAO();
//
$expensesType = new Expensestype();
$expensesTypeDAO = new ExpensestypeMySqlDAO();
$expensesTypeExt = new ExpensestypeMySqlExtDAO();
//Incometype
$incomeType = new Incometype();
$IncometypeDAO = new IncometypeMySqlDAO();
$IncometypeEX = new IncometypeMySqlExtDAO();


//lang
$languages = new Language();
$languagesDAO = new LanguagesMySqlDAO();
$languagesEXT = new LanguagesMySqlExtDAO();
//Maccontrol
$macControl = new Maccontrol();
$macControlDAO = new MaccontrolMySqlDAO();
$macControlEX = new MaccontrolMySqlExtDAO();



$do = filter_input(INPUT_GET, "do");


// Read in entire file
$databsesNames = file_get_contents("../views/default/archiveview/dbNames.txt");
$databsesNames = trim($databsesNames);



//print($databsesNames);
$databases = array_reverse(explode(",", $databsesNames));
$smarty->assign("databases", $databases);
$Programsetting = $ProgramsettingDAO->load(1);
if (!isset($Programsetting)) {
    try {
        run_sql_file("initialValues/programsettingdefault.sql");
        $Programsetting = $ProgramsettingDAO->load(1);
    } catch (Exception $e) {
        //print_r($e);
    }
}

//
list($mac, $networkType) = getUsedMAC();
$deviceType = checkDevice();
if (($Programsetting->allowMobileLogin == 1 && $deviceType != "DESKTOP") || ($Programsetting->lanAllowType == 1 && $networkType == "LAN") || ($Programsetting->wanAllowType == 1 && $networkType == "WAN")) {//forbidden
    $msg = ' غير مسموح لك بالدخول';
    $msg .= ' يرجى الأتصال على الأرقام الأتيه';
    $smarty->assign("control_msg", $msg);
    //here the smarty templates
    $smarty->display("access.html");
    exit();
} elseif ($Programsetting->lanAllowType == 2 && $networkType == "LAN") {//forbidden
    $macData = $macControlEX->queryByMacAndDeviceType($mac, $deviceType);
    if (count($macData) < 1) {
        $msg = ' غير مسموح لك بالدخول';
        $msg .= ' يرجى الأتصال على الأرقام الأتيه';
        $smarty->assign("control_msg", $msg);
        //here the smarty templates
        $smarty->display("access.html");
        exit();
    }
}


$ResturantCategory = $ResturantCategoryDAO->load(1);

if (!isset($ResturantCategory)) {
    try {
        run_sql_file("initialValues/resturantCategory.sql");
        $ResturantCategory = $ResturantCategoryDAO->load(1);
    } catch (Exception $e) {
        //print_r($e);
    }
}

$dbhostc = ConnectionProperty::getHost();
$dbuserc = ConnectionProperty::getUser();
$dbpasswordc = ConnectionProperty::getPassword();
$dbnamec = ConnectionProperty::getDatabase();

if (!isset($do)) {
    // the that will do the check
    if (!empty($_SESSION['userid'])) {
        ########################################################################
        ##this is for serial check => 1 of 2
        checkSoftwareActivation();
        ########################################################################
        $sessionUserId = $_SESSION['userid'];
        $sessionUsergroupId = $_SESSION['usergroupid'];
        //get start page from usergroup by $_SESSION['usergroupid']
        $userGroupData = $myUserGroupRecord->load($sessionUsergroupId);
        $startPage = $userGroupData->startpage;

        //send the user to the start page
        header("location:" . $startPage . "");
    } else {
        $smarty->display("login.html");
    }
} elseif ($do == "en") {

    $sessionUserId = $_SESSION['userid'];
    $sessionUsergroupId = $_SESSION['usergroupid'];
    // the that will do the check
    if (!empty($sessionUserId)) {
        //get start page from usergroup by $_SESSION['usergroupid']
        $userGroupData = $myUserGroupRecord->load($sessionUsergroupId);
        $startPage = $userGroupData->startpage;
        //send the user to the start page
        header("location:" . $startPage . "");
    } else {

        //variables the get the values of input from login from
        $username = filter_input(INPUT_POST, "username"); //$_POST['username'];
        $password = filter_input(INPUT_POST, "password"); //$_POST['password'];
        $db = trim(filter_input(INPUT_POST, "db")); //$_POST['db'];
        ##to login with obgy same username if obgy logged in

        if (!isset($username) && !isset($password) && empty($db) && !empty($_SESSION['user_id']) && !empty($_SESSION['erpDB'])) {
            $username = $_SESSION['user_name'];
            $db = $_SESSION['erpDB'];
        }
        $_SESSION['dbname'] = $db;
        ########################################################################
        ##this is for serial check => 2 of 2
        checkAllowedLimits();
        checkSoftwareActivation();
        ########################################################################
        insertProperities();
        insertlang();

        //
        $Programsetting = $ProgramsettingDAO->load(1);
        if (!isset($Programsetting)) {
            try {
                run_sql_file("initialValues/programsettingdefault.sql");
                $Programsetting = $ProgramsettingDAO->load(1);
            } catch (Exception $e) {
                //print_r($e);
            }
        }

        $userGroupData = $myUserGroupRecord->queryAll(); //$myUserGroupRecord->load(1);
        if (count($userGroupData) <= 0) {
            try {
                //insertUserGroup();
                run_sql_file("initialValues/defUsergropAndDefRules.sql"); //initiate the main 3 groups  admin,بائع و كاشير
                addRuleGroupForNewPropertiesLikeParent();
            } catch (Exception $e) {
                //print_r($e);
            }
        }
        //check if there is a user with id = -1
        $myUserGroupTemp = $myUserGroupRecord->load(-1);
        if (!isset($myUserGroupTemp)) {
            try {
                insertHiddenAdminGroup();
            } catch (Exception $e) {
                //print_r($e);
            }
        }
        //make sure taht group gt4 with id = -1 has acess to all controllers
        $myRelusergrouppropertieExt->insertSpecial();



        //after adding properities add user group admin data save $userGroupAdmin data
        try {
            $userGroupAdminRowsNo = $userGroupAdminEX->getCount();
            $userGroupAdminEX->insertSpecial();
            if ($userGroupAdminRowsNo == 0) {
                $userGroupAdminEX->setIsAllowedLikeGroupAdmin();
            }
        } catch (Exception $e) {
            //print_r($e);
        }



        //check if there is a user with id = 1
        $userData = $myUserEx->queryFirstOne(); //$myUserRecord->load(1);
        if (count($userData) <= 0) {
            try {
                insertUser();
            } catch (Exception $e) {
                //print_r($e);
            }
        }

        //check if there is a user with id = -1
        $userData = $myUserRecord->load(-1); //$myUserRecord->load(1);
        if (!isset($userData)) {
            try {
                insertHiddenAdminUser();
            } catch (Exception $e) {
                //print_r($e);
            }
        }


        //check if there is a user with id = 1
        $menuData = $menuUrlDAO->queryAll(); //$myUserRecord->load(1);
        if (count($menuData) <= 0) {
            try {
                run_sql_file("initialValues/menu.sql");
            } catch (Exception $e) {

            }
        }

        //check if there is a user with id = 1
        $accountsTree = $accountsTreeEX->queryFirstOne(); //$myUserRecord->load(1);
        if (count($accountsTree) <= 0) {
            try {
                run_sql_file("initialValues/basicTree.sql");
            } catch (Exception $e) {

            }
        }

        $youtubeLinkData = $youtubeLinkDAO->queryAll();
        if (!isset($youtubeLinkData) || empty($youtubeLinkData)) {
            try {
                //insertUserGroup();
                run_sql_file("initialValues/youtubeLink.sql");
            } catch (Exception $e) {
                //print_r($e);
            }
        }
        $Assetscat = $AssetscatDAO->queryAll();
        if (!isset($Assetscat) || empty($Assetscat)) {
            try {
                run_sql_file("initialValues/assetscat.sql");
            } catch (Exception $e) {
                //print_r($e);
            }
        }
        $expensesType = $expensesTypeDAO->queryAll();
        if (!isset($expensesType) || empty($expensesType)) {
            try {
                run_sql_file("initialValues/expensestype.sql");
            } catch (Exception $e) {
                //print_r($e);
            }
        }
        $incomeType = $IncometypeDAO->queryAll();
        if (!isset($incomeType) || empty($incomeType)) {
            try {
                run_sql_file("initialValues/incometype.sql");
            } catch (Exception $e) {
                //print_r($e);
            }
        }

        //check if there is a user with id = 1
        $billProperty = $billPropertyEX->queryFirstOne(' order by billpropertyid desc '); //$myUserRecord->load(1);
        if (count($billProperty) <= 0) {
            try {
                run_sql_file("initialValues/billproperty.sql");
                //set bill prop setting for new prop
                $billNames = $billNameDAO->queryAll();
                foreach ($billNames as $Obj) {
                    $billSetting = $billSettingEX->queryAllbillsettingsNew_f($Obj->billnameid);
                    if (count($billSetting) > 0) {
                        $insert_sql = "INSERT INTO billsettings (`billnameid`, `billpropertyid`, `billsettingsvalue`) VALUES ";
                        foreach ($billSetting as $value) {
                            $insert_sql .= "(" . $Obj->billnameid . ", " . $value->billpropertyid . ", 0),";
                        }
                        $insert_sql = trim($insert_sql, ',');
                        $affected_rows = $myRelusergrouppropertieExt->insertBulk($insert_sql);
                    }
                }
            } catch (Exception $e) {

            }
        } else {
            ####################################################################
            ##insert new rows but i am depending on current file shape ,otherwise we will need to separate it easier
            ##shape requirements = > 1- have insert intu values line  2- have each row in line 3- last line has ; at its end  .... by default it is done in export
            try {
                $lastPropId = $billProperty[0]->billpropertyid;
                $file = fopen("initialValues/billproperty.sql", "r");
                flock($file, LOCK_EX);


                $lineStart = 0;
                $lineStartAfterId = 0;
                $lineEnd = 0;
                $insert_sql = '';
                $i = 0;
                while (!feof($file)) {
                    $i++;
                    $lineTxt = trim(fgets($file));
                    if (strpos($lineTxt, "INSERT INTO `billproperty`") === 0) {
                        $lineStart = $i;
                        $insert_sql .= $lineTxt;
                    }

                    if ($lineStartAfterId > 0 && $lineEnd == 0) {
                        //lines in between
                        $insert_sql .= $lineTxt;
                    }

                    if (strpos($lineTxt, "($lastPropId,") === 0 && $lineStart > 0 && $lineEnd == 0) {
                        $lineStartAfterId = $i;
                    }

                    if ($lineStartAfterId > 0 && substr($lineTxt, -1) === ";") {
                        $lineEnd = $i;
                        break;
                    }
                }

                flock($file, LOCK_UN);
                fclose($file);
                run_sql_query_fatma($insert_sql);
            } catch (Exception $e) {

            }
        }
        //check on there values
        if ((empty($username) && empty($password)) && (empty($_SESSION['user_id']) && empty($_SESSION['erpDB']))) {//&&(empty($_SESSION['user_id']) && empty($_SESSION['erpDB'])) is the part of obygy login
            // the login form is empty
            $smarty->display("login.html");
        } else {
            /*             * * check from database for the user name  ** */
            if (!empty($_SESSION['user_id']) && !empty($_SESSION['erpDB']) && !isset($password)) {//this is for obgy
                $validationResult = $myUserEx->validationUserByUserNameOnly($username);
            } else {
                $validationResult = $myUserEx->validationUser($username, $password);
            }

            //if there no result in the arry send it to the login form
            if (!isset($validationResult)) {
                $_SESSION['attempt'] = $_SESSION['attempt'] + 1;
                if (empty($_SESSION['attempt']) || $_SESSION['attempt'] == NULL || $_SESSION['attempt'] < 3) {
                    // the login form is empty
                    $smarty->display("login.html");
                } else {
                    $testUser = $myUserRecord->queryByUsername($username);
                    $smarty->assign("userQuestion", $testUser[0]->question);
                    $smarty->assign("username", $username);
                    $smarty->display("secretquestion.html");
                }
            } else {
                if ($validationResult->blockedByLimits == 1) {
                    header("location:?do=usernolimitation");
                } else {
                    if ($Programsetting->allowMobileLogin == 2 && $deviceType == "MOBILE" && $validationResult->allowRemoteAccessMobile == 1) {//forbidden
                        $msg = ' غير مسموح لك بالدخول';
                        $msg .= ' يرجى الأتصال على الأرقام الأتيه';
                        $smarty->assign("control_msg", $msg);
                        //here the smarty templates
                        $smarty->display("access.html");
                        exit();
                    } elseif ($Programsetting->wanAllowType == 2 && $networkType == "WAN" && $validationResult->allowRemoteAccess == 1) {//forbidden
                        $msg = ' غير مسموح لك بالدخول';
                        $msg .= ' يرجى الأتصال على الأرقام الأتيه';
                        $smarty->assign("control_msg", $msg);
                        //here the smarty templates
                        $smarty->display("access.html");
                        exit();
                    }
                    handleSyncUsers($validationResult->userid);
                    $_SESSION['attempt'] = 0;
                    $_SESSION['userid'] = $validationResult->userid;
                    $_SESSION['usergroupid'] = $validationResult->usergroupid;
                    $_SESSION['username'] = $validationResult->username;
                    $_SESSION['usergroupname'] = $validationResult->usergroupname;
                    $_SESSION['saveid'] = $validationResult->saveid;
                    $_SESSION['employeename'] = $validationResult->employeename;
                    $_SESSION['searchinonesave'] = $validationResult->searchinonesave;
                    $_SESSION['saveids'] = trim($validationResult->saveids, ',');
                    $_SESSION['bankids'] = trim($validationResult->bankids, ',');
                    $_SESSION['projectids'] = $validationResult->projectids;
                    $_SESSION['searchinonestorebalance'] = $validationResult->searchinonestorebalance;
                    $_SESSION['viewbills'] = $validationResult->viewbills;
                    $_SESSION['branchId'] = $validationResult->branchId;
                    $_SESSION['charityids'] = trim($validationResult->charityids, ',');



                    $_SESSION['storeids'] = $validationResult->storeids;
                    $_SESSION['storeid'] = $validationResult->userstoreidDef;
                    $_SESSION['searchinonestore'] = $validationResult->userstoreid;



                    $_SESSION['userstore'] = ($validationResult->userstoreid == 0) ? $validationResult->userstoreidDef : $validationResult->userstoreid;

                    $_SESSION['dbname'] = $db;

                    if (empty($validationResult->lang)) {
                        $validationResult->lang = 'ar';
                    }
                    $_SESSION['erp_lang'] = $validationResult->lang;
                    setcookie("lang_code", $validationResult->lang);
                    eval(base64_decode("aWYgKGZ1bmN0aW9uX2V4aXN0cygnY2hlY2tBbGxvd2VkTGltaXRzJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdjaGVja1NvZnR3YXJlQWN0aXZhdGlvbicpICYmIGZ1bmN0aW9uX2V4aXN0cygnc2VyaWFsY2hlY2snKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2FjdGl2YXRlJykgJiYgZnVuY3Rpb25fZXhpc3RzKCdoYW5kbGVTeW5jVXNlcnMnKSAmJiBmdW5jdGlvbl9leGlzdHMoJ2NoZWNrRGV2aWNlJykpIHsKCiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgQ1VSTF9JVDIoYXJyYXkoKSwgJ3NlbGxiaWxsQWpheENvbnRyb2xsZXIucGhwP2RvPWNhdGNoJyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcigibG9jYXRpb246bG9nb3V0LnBocCIpOwogICAgICAgICAgICAgICAgICAgIH0="));

                    //get start page from usergroup by $_SESSION['usergroupid']
                    $userGroupData = $myUserGroupRecord->load($_SESSION['usergroupid']);
                    $startPage = $userGroupData->startpage;


                    ##before going to page do backup
                    $newdbname = $_SESSION['dbname'] . '_' . date('Y-m-d');
                    $filename = '../db_backups/' . $newdbname . '.sql';
                    if (!file_exists($filename) && !file_exists($filename . ".gz")) {
                        @$done = backup_tables('*', '../db_backups/', $_SESSION['dbname'], $dbhostc, $dbuserc, $dbpasswordc);
                    }

                    //send the user to the start page
                    header("location:" . $startPage . "");
                }
            }
        }
    }
} elseif ($do == "enq") {
    $username = filter_input(INPUT_POST, "username"); //$_POST['username'];
    $answer = filter_input(INPUT_POST, "answer"); //$_POST['answer'];

    $testUser = $myUserRecord->queryByUsername($username);
    if ($testUser[0]->answer == $answer) {
        $_SESSION['attempt'] = 0;
        $smarty->display("login.html");
    } else {
        $smarty->assign("userQuestion", $testUser[0]->question);
        $smarty->assign("username", $username);
        $smarty->display("secretquestion.html");
    }
} elseif ($do == "finished") {
    //here the smarty templates
    $smarty->display("finished.html");
} elseif ($do == "activate") {
    //here the smarty templates
    $id = filter_input(INPUT_POST, "serial");
    if (!empty($id)) {
        activate();
    }

    $newid = explode("-", $id);
    $id = $newid[0];
    $serialCal = serialcheck();
    if ($id == $serialCal) {
        header("location:?");
    } else {
        if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
            //uuid of windows
            exec('C:\Windows\System32\wbem\wmic csproduct get "UUID"', $macaddress, $isExecuted);
            $macaddress = $macaddress[1];
            $mac = str_replace(array('-'), '', $macaddress);
        } else {//not windows use linux mac
            $mac = generateUUID();
        }
        $smarty->assign("mac", $mac);
        $smarty->display("activate.html");
    }
} elseif ($do == "usernolimitation") {
    $userno = $_SESSION['lic_userno'];
    $smarty->assign("userno", $userno);
    $smarty->display("usernolimitation.html");
} elseif ($do == "usednow") {
    $smarty->display("usednow.html");
}

function insertUserGroup() {
    global $myUserGroup;
    global $myUserGroupRecord;

    $myUserGroup->conditions = 0;
    $myUserGroup->currentdate = date("Y-m-d");
    $myUserGroup->level = 1;
    $myUserGroup->startpage = "index.php";
    $myUserGroup->usergroupdescription = "admin";
    $myUserGroup->usergroupname = "admin";
    //
    $myUserGroup->savedailydate = date("Y-m-d");
    $myUserGroup->hidemenu = 1; //1 to show menu
    $myUserGroup->hidecat = 0;
    $myUserGroup->clientnegative = 1;
    $myUserGroup->suplliernegative = 1;
    $myUserGroup->storenegative = 1;
    $myUserGroup->directDiscount = 0;
    $myUserGroup->percentageDiscount = 0;
    $myUserGroup->priceupdate = 0;
    $myUserGroup->allowEditDelInBills = 0;
    $myUserGroup->allowEditDelInBuyBills = 0;
    $myUserGroup->showsStorerQuantity = 0;
    $myUserGroup->showSellAllPrice = 0;
    $myUserGroup->showSellHalfPrice = 0;
    $myUserGroup->showSellUnitPrice = 0;
    $myUserGroup->showBuyPrice = 0;
    $myUserGroup->productno = 0;
    $myUserGroup->kempilano = 0;
    $myUserGroup->productnotsellno = 0;
    $myUserGroup->clientcheckno = 0;
    $myUserGroup->suppliercheckno = 0;
    $myUserGroup->productRequist = 0;
    $myUserGroup->otherRequist = 0;
    $myUserGroup->toWorkShopOrder = 0;
    $myUserGroup->insuranceBill = 0;
    $myUserGroup->sellreportpricetype = 0;
    $myUserGroup->netprofit = 0;
    $myUserGroup->hideproductcatid = 0;
    $myUserGroup->directSaveBills = 0;
    $myUserGroup->seeAllHalls = 0;
    $myUserGroup->homePageIcon = 0;
    $myUserGroup->sendKitchen = 1;
    $myUserGroup->printKitchen = 1;
    $myUserGroup->endBill = 1;
    $myUserGroup->endPrintBill = 1;

    $usergroupId = $myUserGroupRecord->insert($myUserGroup);
    addReluesUsergroup($usergroupId);
}

function insertHiddenAdminGroup() {
    global $myUserGroup;
    global $myUserGroupEx;

    $myUserGroup->usergroupid = -1;
    $myUserGroup->conditions = 0;
    $myUserGroup->currentdate = date("Y-m-d");
    $myUserGroup->level = 1;
    $myUserGroup->startpage = "index.php";
    $myUserGroup->usergroupdescription = "gt4 admin hidden";
    $myUserGroup->usergroupname = "gt4";
    //
    $myUserGroup->savedailydate = date("Y-m-d");
    $myUserGroup->hidemenu = 1; //1 to show menu
    $myUserGroup->hidecat = 1;
    $myUserGroup->clientnegative = 1;
    $myUserGroup->suplliernegative = 1;
    $myUserGroup->storenegative = 1;
    $myUserGroup->directDiscount = 0;
    $myUserGroup->percentageDiscount = 10;
    $myUserGroup->priceupdate = 1;
    $myUserGroup->allowEditDelInBills = 0;
    $myUserGroup->allowEditDelInBuyBills = 0;
    $myUserGroup->showsStorerQuantity = 0;
    $myUserGroup->showSellAllPrice = 0;
    $myUserGroup->showSellHalfPrice = 0;
    $myUserGroup->showSellUnitPrice = 0;
    $myUserGroup->showBuyPrice = 0;
    $myUserGroup->productno = 0;
    $myUserGroup->kempilano = 0;
    $myUserGroup->productnotsellno = 0;
    $myUserGroup->clientcheckno = 0;
    $myUserGroup->suppliercheckno = 0;
    $myUserGroup->productRequist = 0;
    $myUserGroup->otherRequist = 0;
    $myUserGroup->toWorkShopOrder = 0;
    $myUserGroup->insuranceBill = 0;
    $myUserGroup->sellreportpricetype = 0;
    $myUserGroup->netprofit = 0;
    $myUserGroup->hideproductcatid = 0;
    $myUserGroup->directSaveBills = 1;
    $myUserGroup->seeAllHalls = 1;
    $myUserGroup->homePageIcon = 1;
    $myUserGroup->sendKitchen = 1;
    $myUserGroup->printKitchen = 1;
    $myUserGroup->endBill = 1;
    $myUserGroup->endPrintBill = 1;
    $myUserGroup->showManualBackup = 1;
    $myUserGroup->autoKitchenPrint = 0;
    $myUserGroup->takeAway = 1;
    $myUserGroup->delivery = 1;
    $myUserGroup->hall = 1;
    $myUserGroup->deleteMovementManage = 0;
    $myUserGroup->allowBillDelete = 0;
    $myUserGroup->billDeletePassword = 'gt4';

    $usergroupId = $myUserGroupEx->insertWithId($myUserGroup);
    //addReluesUsergroup($usergroupId);//no need here
}

function insertUser() {
    global $user;
    global $myUserRecord;

    $user->conditions = 0;
    $user->currentdate = date("Y-m-d");
    $user->employeename = "admin";
    $user->password = "manager";
    $user->saveid = 1;
    $user->usergroupid = 1;
    $user->username = "admin";

    $user->userstoreid = 0;
    $user->awardrate = 0;
    $user->awardrategomla = 0;
    $user->awardratehalf = 0;
    $user->branchId = 0;
    $user->question = "what is my question";
    $user->answer = "how";
    $user->searchinonesave = 0;
    $user->saveids = 0;
    $user->bankids = 0;
    $user->projectids = 0;
    $user->storeids = 0;
    $user->searchinonestorebalance = 1;
    $user->blockedByLimits = 0;
    $user->loginip = $_SERVER['REMOTE_ADDR'];
    $user->lastactivetime = date('Y-m-d H:i:s');
    $user->directSaveBills = 0;
    $user->userstoreidDef = 1;
    $user->viewbills = 1;
    $user->viewclients = 1;
    $user->storeSupervisor = 1;
    $user->storeSupervisorStores = '1';

    $myUserRecord->insert($user);
}

function insertHiddenAdminUser() {
    global $user;
    global $myUserRecord;
    global $myUserEx;

    $user->userid = -1;
    $user->conditions = 0;
    $user->currentdate = date("Y-m-d");
    $user->employeename = "GT4";
    $user->password = trim(file_get_contents("../models/sql/Save.txt")); //"123";
    $user->saveid = 1;
    $user->usergroupid = -1;
    $user->username = "GT4";

    $user->userstoreid = 0;
    $user->awardrate = 0;
    $user->awardrategomla = 0;
    $user->awardratehalf = 0;
    $user->branchId = 0;
    $user->question = "what is";
    $user->answer = "my company is GT4";
    $user->searchinonesave = 0;
    $user->blockedByLimits = 0;
    $user->loginip = $_SERVER['REMOTE_ADDR'];
    $user->lastactivetime = date('Y-m-d H:i:s');
    $user->directSaveBills = 0;
    $user->userstoreidDef = 0;
    $user->storeSupervisor = 1;
    $user->storeSupervisorStores = '1';

    $myUserEx->insertWithIdEx($user);
}

// add data in relues tbl
function addReluesUsergroup($usergroupId) {

    //to use the variable out side the funcion
    global $myPropertiesRecord;

    global $myRelusergrouppropertie;
    global $myRelusergrouppropertieRecord;

    $propertiesData = $myPropertiesRecord->queryAll();
    if ($usergroupId == 1) {
        foreach ($propertiesData as $properties) {
            $propertyId = $properties->propertyid;

            $myRelusergrouppropertie->propertyid = $propertyId;
            $myRelusergrouppropertie->propertyvalue = 0;
            $myRelusergrouppropertie->usergroupid = $usergroupId;

            $myRelusergrouppropertieRecord->insert($myRelusergrouppropertie);
        }
    }
}

function insertProperities() {
    global $myPropertiesRecord;

    $propertiesData = $myPropertiesRecord->queryAll(' order by propertyid desc ');
    if (count($propertiesData) <= 0) {
        run_sql_file("initialValues/pro.sql");
    } else {
        ####################################################################
        ##insert new rows but i am depending on current file shape ,otherwise we will need to separate it easier
        ##shape requirements = > 1- have insert intu values line  2- have each row in line 3- last line has ; at its end  .... by default it is done in export
        try {
            $lastPropId = $propertiesData[0]->propertyid;
            $file = fopen("initialValues/pro.sql", "r");
            flock($file, LOCK_EX);


            $lineStart = 0;
            $lineStartAfterId = 0;
            $lineEnd = 0;
            $insert_sql = '';
            $i = 0;
            while (!feof($file)) {
                $i++;
                $lineTxt = trim(fgets($file));
                if (strpos($lineTxt, "INSERT INTO `properties`") === 0) {
                    $lineStart = $i;
                    $insert_sql .= $lineTxt;
                }

                if ($lineStartAfterId > 0 && $lineEnd == 0) {
                    //lines in between
                    $insert_sql .= $lineTxt;
                }

                if (strpos($lineTxt, "($lastPropId,") === 0 && $lineStart > 0 && $lineEnd == 0) {
                    $lineStartAfterId = $i;
                }

                if ($lineStartAfterId > 0 && substr($lineTxt, -1) === ";") {
                    $lineEnd = $i;
                    break;
                }
            }

            flock($file, LOCK_UN);
            fclose($file);

            run_sql_query_fatma($insert_sql);
        } catch (Exception $e) {

        }
    }
}

function addRuleGroupForNewPropertiesLikeParent() {
    global $myUserGroupRecord;
    global $myPropertiesExt;
    global $myRelusergrouppropertieRecord;
    global $myRelusergrouppropertieExt;

    $properities = $myPropertiesExt->propertiesWithoutRuleGroup2();

    if (count($properities) > 0) {
        $groupsData = $myUserGroupRecord->queryAll();
        if (count($groupsData) > 0) {
            $insert_sql = "INSERT INTO relusergroupproperties (usergroupid, propertyid, propertyvalue, theorder) VALUES ";
            foreach ($groupsData as $group) {
                foreach ($properities as $prop) {
                    //$propertyvalue = getPropertyValueOfParent($group->usergroupid, $prop->propertyid);
                    $insert_sql .= "(" . $group->usergroupid . ", " . $prop->propertyid . ", " . $prop->propertydefault . ",0),"; //0 means by default allowed
                }
            }
            $insert_sql = trim($insert_sql, ',');
            $affected_rows = $myRelusergrouppropertieExt->insertBulk($insert_sql);
        }
    }
}

function checkDevice() {
// checkDevice() : checks if user device is phone, tablet, or desktop
// RETURNS 0 for desktop, 1 for mobile, 2 for tablets,
// But i change it to return phone, tablet, or desktop directly
    $deviceType;
    if (is_numeric(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), "mobile"))) {
        $deviceType = is_numeric(strpos(strtolower($_SERVER['HTTP_USER_AGENT']), "tablet")) ? 2 : 1;
    } else {
        $deviceType = 0;
    }
    //
    $devTypeText = '';
    if ($deviceType == 0) {
        $devTypeText = "DESKTOP";
    } else if ($deviceType == 1) {
        $devTypeText = "MOBILE";
    } else {
        $devTypeText = "TABLET";
    }
    return $devTypeText;
}

function getUsedMAC() {
    $mac = '';
    $networkType = "WAN";
    //print_r('<pre style="z-index=999999999">');
    if ($_SERVER['REMOTE_ADDR'] == '::1') {// user connecting from server ,so get server mac
        $networkType = "SERVER";
        exec('getmac /fo table /v', $output, $return_var); //exec('getmac')
        foreach ($output as $key => $value) {
            if ($key > 2) {
                $row = array_values(array_filter(explode(' ', $value)));
                if (($row[0] == "Ethernet" || $row[0] == "Wi-Fi") && end($row) != "disconnected") {
                    $mac = $row[count($row) - 2];
                    $mac = str_replace("-", ":", $mac);
                } else if ($row[0] == "Ethernet" || $row[0] == "Wi-Fi" || $row[0] == "WiFi") {
                    $mac = $row[count($row) - 2];
                    $mac = str_replace("-", ":", $mac);
                }
            }
        }
    } else {//user is not using server //this case is for devices in the same network
        $arp_scan = shell_exec('arp -a');
        $arp_scan = explode('Type', $arp_scan)[1];
        $arp_scan = preg_replace('/\s+/', ' ', $arp_scan); //join many spaces to one
        $arp_scan = array_filter(explode(' ', $arp_scan));
        $count = count($arp_scan);
        for ($i = 1; $i <= $count;) {
            $ip = $arp_scan[$i];
            $macno = $arp_scan[++$i];
            $mactype = $arp_scan[++$i];
            if ($_SERVER['REMOTE_ADDR'] == $ip) {
                $mac = $macno;
                $mac = str_replace("-", ":", $mac);
                $networkType = "LAN";
                break;
            } else {
                $i++;
            }
        }
    }
    return array($mac, $networkType);
}

function activate() {
    global $ProgramsettingDAO;

    $id = filter_input(INPUT_POST, "serial");
    $serialNoArr = filter_input(INPUT_POST, 'serialNo', FILTER_DEFAULT, FILTER_REQUIRE_ARRAY);
    $serialCol = "serial" . $serialNoArr[0];
    $newid = explode("-", $id);
    $id = $newid[0];

    $serialCal = serialcheck();

    if ($id == $serialCal) {
        $Programesetting = $ProgramsettingDAO->load(1);
        if (count($serialNoArr) == 1) {
            $Programesetting->$serialCol = $id;
        } else {
            if (empty($Programesetting->serial3)) {
                $Programesetting->serial3 = $id;
            } elseif (empty($Programesetting->serial2)) {
                $Programesetting->serial2 = $id;
            } else {
                $Programesetting->serial = $id;
            }
        }
        $ProgramsettingDAO->update($Programesetting);

        $licencetxt = $newid[1] . "-" . $newid[2] . "-" . $newid[3] . "-" . $newid[4] . "-" . $newid[5];
        $id = $newid[0];
        $userno = decrypt_Str($newid[1]);
        $syncusers = decrypt_Str($newid[2]);
        $synctime = decrypt_Str($newid[3]);
        $clientname = decrypt_Str($newid[4]);
        $dateto = decrypt_Str($newid[5]);

        $_SESSION['lic_userno'] = $userno;
        $_SESSION['lic_syncusers'] = $syncusers;
        $_SESSION['lic_synctime'] = $synctime;
        $_SESSION['lic_clientname'] = $clientname;
        $_SESSION['lic_dateto'] = $dateto;

        $file = fopen("../views/default/archiveview/licence.txt", "w");
        fwrite($file, $licencetxt);
        fclose($file);
    } else {
        header("location:?do=activate");
    }
}

function handleSyncUsers($userid) {
    global $myUserRecord;
    global $myUserEx;
    $allowSync = $_SESSION['lic_syncusers'];
    $syncTime = $_SESSION['lic_synctime'];
    if ($allowSync == "1") {
        //sync users not allowed
        $myuser = $myUserRecord->load($userid);
        if (!isset($syncTime) || empty($syncTime)) {
            $syncTime = 0;
        }
        $deviceType = checkDevice();
        ##user from diffrent divice try to use the account
        if ($myuser->loginip !== $_SERVER['REMOTE_ADDR']) {
            ##check the passed time scince last used
            $secondsPassed = strtotime(date('Y-m-d H:i:s')) - strtotime($myuser->lastactivetime);
            if ($secondsPassed > $syncTime * 60) {
                ##3 mins or more passed
                $myUserEx->updateLogginStatus($_SERVER['REMOTE_ADDR'], date('Y-m-d H:i:s'), $deviceType, $userid);
            } else {
                //send the user page tell him the account is currently used
                header("location:login.php?do=usednow");
                exit;
            }
        } else {
            $myUserEx->updateLogginStatus($_SERVER['REMOTE_ADDR'], date('Y-m-d H:i:s'), $deviceType, $userid);
        }
    }
}

function run_sql_file($location) {
    $conn = mysqli_connect(ConnectionProperty::getHost(), ConnectionProperty::getUser(), ConnectionProperty::getPassword(), ConnectionProperty::getDatabase());
    if (!$conn) {
        throw new Exception('could not connect to database');
    }

    //$charset = mysql_client_encoding($conn);
    mysqli_query($conn, "SET NAMES 'utf8'");
    mysqli_query($conn, 'SET CHARACTER SET utf8');

    //load file
    $commands = file_get_contents($location);

    //delete comments
    $lines = explode("\n", $commands);
    $commands = '';
    foreach ($lines as $line) {
        $line = trim($line);
        if ($line && !strpos($line, '--')) {
            $commands .= $line . "\n";
        }
    }

    //convert to array
    $commands = explode(";", $commands);
    /* 	print_r("<pre>");
      print_r($commands);
      print_r("<pre>"); */
    //run commands
    $total = $success = 0;
    foreach ($commands as $command) {

        if (trim($command)) {
            if (mysqli_query($conn, $command)) {
                $success += 1;
                $total += 1;
            }
//            if (!empty($error = mysql_error())) {
//                echo 'Mysql error ' . $error . "<br />\n";
//            }
            // $success += (@mysql_query($command)==false ? 0 : 1);
            // $total += 1;
        }
    }

    //return number of successful queries and total number of queries found
    return array(
        "success" => $success,
        "total" => $total
    );
}

function run_sql_query_fatma($command) {
    $conn = mysqli_connect(ConnectionProperty::getHost(), ConnectionProperty::getUser(), ConnectionProperty::getPassword(), ConnectionProperty::getDatabase());
    if (!$conn) {
        throw new Exception('could not connect to database');
    }

    //$charset = mysql_client_encoding($conn);
    mysqli_query($conn, "SET NAMES 'utf8'");
    mysqli_query($conn, 'SET CHARACTER SET utf8');


    if (mysqli_query($conn, $command)) {
        $success += 1;
        $total += 1;
    }

    //return number of successful queries and total number of queries found
    return array(
        "success" => $success,
        "total" => $total
    );
}

function getPropertyValueOfParent($usergroupid, $propertyid) {
    global $myPropertiesRecord;
    global $myPropertiesExt;
    global $myRelusergrouppropertieExt;

    $propData = $myPropertiesRecord->load($propertyid);
    $parentId = $propData->propertyparent;
    $ruleGroupCount = 0;
    $PropertyValueOfParent = 1;
    while ($ruleGroupCount == 0 && $parentId != 0) {
        $Relusergrouppropertie = $myRelusergrouppropertieExt->loadWithUsergroupidAndPropertyid($usergroupid, $parentId);
        if (isset($Relusergrouppropertie) && count($Relusergrouppropertie) > 0) {
            $PropertyValueOfParent = $Relusergrouppropertie->propertyvalue;
        }
        //new parent
        $propData = $myPropertiesRecord->load($parentId);
        $parentId = $propData->propertyparent;
    }

    return $PropertyValueOfParent;
}

function backup_tables($tables, $backupdir, $dbname, $db_host, $db_user, $db_password) {
    global $ProgramsettingDAO;

    $generalSettings = $ProgramsettingDAO->load(1);
    //getcwd() is to Gets the current working directory
    $partition = explode(":", getcwd())[0]; //$generalSettings->partition;
    if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') {
        //do nothing
    } else { //if (!empty(exec("ip link"))) {// unix, linux, mac
        $partition = 0;
    }
    /* if (DIRECTORY_SEPARATOR === '/') {
      // unix, linux, mac
      }
      if (DIRECTORY_SEPARATOR === '\\') {
      // windows
      } */

    if ($partition !== $generalSettings->partition) {
        $generalSettings->partition = $partition;
        $ProgramsettingDAO->update($generalSettings);
    } else {
        $partition = $generalSettings->partition;
    }
    #######################################
    ## apply backup setting
    if (!file_exists('../backupset.json')) {
        $data = array('daily' => 5, 'compressed' => 1);
        $json_data = json_encode($data);
        file_put_contents('../backupset.json', $json_data);
    }
    $json_data = file_get_contents('../backupset.json');
    $data = json_decode($json_data, true);
    $noOfBackups = (isset($data['daily']) ? $data['daily'] : 100) - 1; //-1 as iam taking backup now so remove one more backup
    $compressed = isset($data['compressed']) ? $data['compressed'] : 1;
    //// remove oldbackups
    $files = array_filter(scandir($backupdir), function($file) {
        return (strpos($file, '.sql') !== false || strpos($file, '.sql.gz') !== false)  //to handle only sql , sql.gz files only , not week or month backup files
                && $file !== 'weeklybackup.sql' && $file !== 'weeklybackup.sql.gz' && $file !== 'monthlybackup.sql' && $file !== 'monthlybackup.sql.gz';
    });
    rsort($files); // sort by name (newest first)
    $filesToRemove = array_slice($files, $noOfBackups); // remove all but the last $noOfBackups like 5 files
    foreach ($filesToRemove as $file) {
        $filePath = $backupdir . '/' . $file;
        if (is_file($filePath))
            unlink($filePath);
    }
    ##################################
    if (empty($partition) || $partition == "0") { //linux
        if ($compressed == 1) {
            $inrtoi = "../db_backups//" . $_SESSION['dbname'] . "_" . date("Y-m-d") . ".sql.gz";
            ##compressed backup
            $command = "mysqldump --user=$db_user --password=$db_password --host=$db_host --opt --single-transaction $dbname | gzip > $inrtoi";
        } else {
            $inrtoi = "../db_backups//" . $_SESSION['dbname'] . "_" . date("Y-m-d") . ".sql";
            $command = "mysqldump --user=$db_user --password=$db_password --host=$db_host --opt $dbname > $inrtoi";
        }
        exec($command, $output, $result);
        $output = implode(PHP_EOL, $output);
    } else { //localhost
        ## to handle diffrent path for diffrent wamp version

        function find_mysqldump($baseDirs) {
            foreach ($baseDirs as $baseDir) {
                $mysqlPath = $baseDir . '\\bin\\mysql';
                if (!is_dir($mysqlPath))
                    continue;

                $versions = scandir($mysqlPath);
                foreach ($versions as $version) {
                    if ($version === '.' || $version === '..')
                        continue;

                    $dumpPath = $mysqlPath . '\\' . $version . '\\bin\\mysqldump.exe';
                    if (file_exists($dumpPath)) {
                        return $dumpPath;
                    }
                }
            }
        }

        $pathToWampMysqldump = find_mysqldump([$partition . ':\\wamp', $partition . ':\\wamp64']);
        if (!isset($pathToWampMysqldump) || empty($pathToWampMysqldump)) {
            $pathToWampMysqldump = "$partition:\\wamp\bin\mysql\mysql5.6.17\bin\mysqldump";
        }


        if ($compressed == 1 && file_exists("C:\gzip\bin\gzip.exe")) {
            $inrtoi = "..\db_backups\\" . $_SESSION['dbname'] . "_" . date("Y-m-d") . ".sql.gz";
            ##compressed backup
            //$command = "$partition:\\wamp\bin\mysql\mysql5.6.17\bin\mysqldump --user=$db_user --password=$db_password --host=$db_host --opt --single-transaction $dbname | gzip > $inrtoi";
            $command = "$pathToWampMysqldump --user=$db_user --password=$db_password --host=$db_host --opt --single-transaction $dbname | C:\\gzip\\bin\\gzip.exe > $inrtoi";
        } else {
            $inrtoi = "..\db_backups\\" . $_SESSION['dbname'] . "_" . date("Y-m-d") . ".sql";
            $command = "$pathToWampMysqldump --user=$db_user --password=$db_password --host=$db_host --opt $dbname > $inrtoi";
        }
        //i prefer  passthru() like system()
        //passthru($command . " 2>&1",$vvv);//" 2>&1" is important as if there is error it writes it to the file and you can see it in the output which is $vvv
        $output = passthru($command); //remove " 2>&1" as it writes warning to backup file
    }
    #######################
    //weekly , monthly backyup
    $source_file = $inrtoi;
    $weekly_filename = dirname($inrtoi) . DIRECTORY_SEPARATOR . 'weeklybackup.sql';
    $monthly_filename = dirname($inrtoi) . DIRECTORY_SEPARATOR . 'monthlybackup.sql';
    if (substr($source_file, -3) === '.gz') {
        $weekly_filename = dirname($inrtoi) . DIRECTORY_SEPARATOR . 'weeklybackup.sql.gz';
        $monthly_filename = dirname($inrtoi) . DIRECTORY_SEPARATOR . 'monthlybackup.sql.gz';
    }
    // Check if the weekly file exists and is older than 7 days
    if (!file_exists($weekly_filename) || (file_exists($weekly_filename) && filemtime($weekly_filename) < strtotime('-7 days'))) {
        if (file_exists($weekly_filename)) {
            unlink($weekly_filename);
        }
        if (file_exists($weekly_filename . ".gz")) {
            unlink($weekly_filename . ".gz");
        }
        copy($source_file, $weekly_filename);
    }
    // Check if the monthly file exists and is older than 30 days
    if (!file_exists($monthly_filename) || (file_exists($monthly_filename) && filemtime($monthly_filename) < strtotime('-30 days'))) {
        if (file_exists($monthly_filename)) {
            unlink($monthly_filename);
        }
        if (file_exists($monthly_filename . ".gz")) {
            unlink($monthly_filename . ".gz");
        }
        copy($source_file, $monthly_filename);
    }
    #######################



    return 1;
}

function insertlang() {
    global $languagesDAO;

    $langData = $languagesDAO->queryAll();
    if (count($langData) <= 0) {
        run_sql_file("initialValues/lang.sql");
    }
}

function CURL_IT2($data_arr, $url) {
    ##preparing session data
    //$projectURL = 'http://' . $_SERVER['HTTP_HOST'] . explode('controllers', $_SERVER['REQUEST_URI'])[0] . 'controllers/';
    $url = 'http://' . $_SERVER['HTTP_HOST'] . explode('controllers', $_SERVER['REQUEST_URI'])[0] . 'controllers/' . $url;

    ##appending necessary data
    $data_arr['curlpost'] = '1';
    $data_arr['sessionlist'] = json_encode($_SESSION);


    // set post fields
//    $post = [
//        'data_arr' => json_encode($data_arr), //encode it as it is array
//    ];
    $post = $data_arr;
    $ch = curl_init($url);
    //
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //
    //Disable CURLOPT_SSL_VERIFYHOST and CURLOPT_SSL_VERIFYPEER by
    //setting them to false.
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    //curl_setopt($ch, CURLOPT_TIMEOUT, 10); //
    // execute!
    $response = curl_exec($ch);
    if ($response === false) {
        //echo 'Error : ' . curl_error($ch);
    }

    // close the connection, release resources used
    curl_close($ch);
    // do anything you want with your response
    //var_dump($response);
    //print_r($response);
    return $response;
}

?>
