diff --git a/examples/GreetingBot/README.md b/examples/GreetingBot/README.md deleted file mode 100644 index 30b21fc..0000000 --- a/examples/GreetingBot/README.md +++ /dev/null @@ -1,36 +0,0 @@ - Copyright (c) 2016 by Botorabi. All rights reserved. - https://github.com/botorabi/TeamSpeakPHPBots - - License: MIT License (MIT) - Read the LICENSE text in main directory for more details. - - Created: 2st August 2016 - Author: Botorabi (botorabi AT gmx DOT net) - -# Greeting Bot: An Example Using TeamSpeakPHPBots -Here you find an example which demonstrates how to use the framework. It is a greeting bot which can be used as a starting point for your own bots. -It contains HTML and Javascript files and provides a full web interface for user management, bot server control, and bot configuration. - -# Setup - -- Adapt the file *config/Configuration.php* to your needs. - -- Create the necessary database and tables using the SQL script in *setup* directory. - -- Setup a web server (e.g. Apache or the Built-In server of PHP) for serving this directory (index.php should be the entry). - -- Visit the web interface, the default user name and password is admin/admin if you have used the SQL script in *setup* directory. Create a GreetingBot in the bot configuration page. - -- Go to *src* directory and start the bot server by using the script *start_botserver.sh*. Alternatively, you can start/stop the bot server using the web interface. - -- If everything works fine, then every user connecting to your TS3 server should get a greeting message, which you can fine-tune in bot configuration page of the web interface. - -- Play with the bot configuration, the changes are immediately reflected in the bot while the bot server is running (see the console output of the bot server). - -# Special Thanks -We want to thank the team behind [TeamSpeak3 PHP Framework] for their great work. Furthermore, we thank [Plainicon] for the images we have used for the web pages in this example. Last but not least, we thank [jQuery] and [jQuery UI] which gave the web pages a good look&feel. - -[TeamSpeak3 PHP Framework]: https://github.com/planetteamspeak/ts3phpframework -[Plainicon]: http://plainicon.com -[jQuery]: http://www.jquery.com -[jQuery UI]: http://www.jqueryui.com diff --git a/examples/GreetingBot/config/Configuration.php b/examples/GreetingBot/config/Configuration.php deleted file mode 100644 index 449e6b7..0000000 --- a/examples/GreetingBot/config/Configuration.php +++ /dev/null @@ -1,78 +0,0 @@ - "localhost", - "userName" => "serveradmin", // TODO put your TS3 user name here - "password" => "exffRAo3", // TODO put your TS3 user password here - "hostPort" => 10011, - "vServerPort" => 9987, - "pollInterval" => 2, // intervall of bot control steps in seconds - "nickName" => "TS3 PHP Bot" // this is the name displayed in TS3 clients - ]; - - //! Databank account info (MySQL) - public static $TSPHPBOT_CONFIG_DB = [ - "host" => "localhost", - "hostPort" => 3306, - "dbName" => "tsphpbots", - "userName" => "tsphpbotserver", - "password" => "tsphpbotserver", - "tablePrefix" => "tsphpbots_" - ]; - - //! Web interface related info - public static $TSPHPBOT_CONFIG_WEB_INTERFACE = [ - // Web service version. - "version" => "0.1.0", - // Timeout for automatic logout while inactive (in minutes) - "sessionTimeout" => 30, - // App's main source directory. This path is relative to executing path (you should see the directory structure 'com/examples/...' there). - "appSrc" => "./src", - // TeamSpeakPHPBots library's main source directory. You may have put it to /usr/local/share/TeamSpeakPHPBots, though. Who knows? - "libSrc" => "../../libraries/TeamSpeakPHPBots/src", - // All web related assets are relative to this path - "dirBase" => "src", - "dirTemplates" => "web/templates", - "dirJs" => "web/js", - "dirStyles" => "web/styles", - "dirImages" => "web/images", - "dirLibs" => "web/libs" - ]; - - //! Bot service related config - public static $TSPHPBOT_CONFIG_BOT_SERVICE = [ - // Bot serivce version - "version" => "0.1.0", - // Bot service query IP - "host" => "127.0.0.1", - // Bot service query port - "hostPort" => 12000, - // Command line for starting the bot service, used by web service - "cmdStart" => "cd src; php botserver.php > botserver.log 2>&1 & echo $! > botserver.pid", - // App's main source directory. This path is relative to executing path (you should see the directory structure 'com/examples/...' there). - "appSrc" => "./", - // TeamSpeakPHPBots library's main source directory. You may have put it to /usr/local/share/TeamSpeakPHPBots, though. Who knows? - "libSrc" => "../../../libraries/TeamSpeakPHPBots/src" - ]; -} diff --git a/examples/GreetingBot/favicon.ico b/examples/GreetingBot/favicon.ico deleted file mode 100644 index 43a028f..0000000 Binary files a/examples/GreetingBot/favicon.ico and /dev/null differ diff --git a/examples/GreetingBot/index.php b/examples/GreetingBot/index.php deleted file mode 100644 index d667f7c..0000000 --- a/examples/GreetingBot/index.php +++ /dev/null @@ -1,122 +0,0 @@ -init(); - } - - /** - * Initialize the application - */ - protected function init() { - //! Main source directory used in autoloader - $this->SEARCH_PATHS[] = Configuration::$TSPHPBOT_CONFIG_WEB_INTERFACE["appSrc"]; - //! The path of TS3PHPBots library - $this->SEARCH_PATHS[] = Configuration::$TSPHPBOT_CONFIG_WEB_INTERFACE["libSrc"]; - - - //! Setup our class file loader - spl_autoload_register(function ($name) { - //echo "**** loading: " . $name ."\n"; - // exclude the ts3 lib namespace, it has an own loader - $pos = strpos($name, "TeamSpeak3"); - if ($pos === false) { - $file = $this->findPath($name); - if (!is_null($file)) { - include $file; - } - else { - Log::error("AUTOLOAD", "Module does not exist: " . $name); - /* - Log::error("AUTOLOAD", "Backtrace:"); - foreach(debug_backtrace() as $depth => $trace) { - Log::raw(" [" . $depth . "]: " . $trace["file"] . ", line: " . $trace["line"] . ", function: " . $trace["function"]); - } - */ - throw new Exception("Could not find the requested file: " . $name . ".php"); - } - } - }); - } - - /** - * Try to find the given module in search paths. Return null if it could not be found. - * - * @param string $moduleName Module name - * @return string Full path of php file, or null if it could not be found. - */ - protected function findPath($moduleName) { - foreach($this->SEARCH_PATHS as $path) { - $fullpath = $path . "/" . $moduleName; - $fullpath = str_replace("\\", "/", $fullpath); - if (file_exists($fullpath . ".php")) { - return $fullpath . ".php"; - } - } - return null; - } - - /** - * Start processing the request. - */ - public function start() { - // start a session - session_start(); - try { - $pageloader = new PageLoader(); - - // add the app's web controller directory to page loader's search paths. - $paths = ['com/examples/web/controller']; - $pageloader->setModuleSearchPaths($paths); - - if (!$pageloader->load($_GET, $_POST)) { - $pageloader->load(["page" => "PageNotFound"], []); - } - } - catch(Exception $e) { - Log::error("INDEX", "An error occured: " . $e->getMessage()); - } - } -} - -$app = new App(); -$app->start(); diff --git a/examples/GreetingBot/setup/create-database.sql b/examples/GreetingBot/setup/create-database.sql deleted file mode 100644 index e88b90c..0000000 --- a/examples/GreetingBot/setup/create-database.sql +++ /dev/null @@ -1,73 +0,0 @@ -/** - * Copyright (c) 2016 by Botorabi. All rights reserved. - * https://github.com/botorabi/TeamSpeakPHPBots - * - * License: MIT License (MIT), read the LICENSE text in - * main directory for more details. - */ - - -/** - * This SQL script creates the tables for the example application GreetingBot. - * - * Created: 2nd August 2016 - * Author: Botorabi - */ - - -/** - * Create the user table. - * - * NOTE: The table name prefix 'tsphpbots_' is defined in Configuration.php - * All our table names must have this prefix. - */ - -/*DROP TABLE IF EXISTS `tsphpbots_user`;*/ -CREATE TABLE IF NOT EXISTS `tsphpbots_user` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `name` varchar(45) NOT NULL, - `description` varchar(256) DEFAULT '', - `active` TINYINT(1) DEFAULT '1', - `email` varchar(45) DEFAULT NULL, - `login` varchar(45) NOT NULL, - `password` varchar(45) DEFAULT NULL, - `lastLogin` int(11) DEFAULT '0', - `roles` int(11) DEFAULT '0', - PRIMARY KEY (`id`), - UNIQUE KEY `id_UNIQUE` (`id`), - UNIQUE KEY `login_UNIQUE` (`login`), - UNIQUE KEY `email_UNIQUE` (`email`) -) -ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='TeamSpeakPHPBot: User Table'; - -/* Create a default Admin user (un: admin, pw: admin) */ -INSERT INTO `tsphpbots_user` (`id`, `name`, `description`, `active`, `email`, `login`, `password`, `lastLogin`, `roles`) VALUES ('1', 'Admin', 'Administrator', '1', '', 'admin', '21232f297a57a5a743894a0e4a801fc3', '0', '1'); - - -/* - * Create a table for GreetingBot. - * - * The following fields are needed by the framework and must exsit in every bot table: - * - * id - * botTye - * name - * description - * active - * - * The field 'greetingText' is bot specific. - */ - -/*DROP TABLE IF EXISTS `tsphpbots_greetingbot`;*/ -CREATE TABLE IF NOT EXISTS `tsphpbots_greetingbot` ( - `id` int(11) unsigned NOT NULL AUTO_INCREMENT, - `botType` varchar(45) NOT NULL, - `name` varchar(45) NOT NULL, - `description` varchar(256) DEFAULT '', - `active` TINYINT(1) DEFAULT '1', - `greetingText` varchar(256) DEFAULT '', - PRIMARY KEY (`id`), - UNIQUE KEY `id_UNIQUE` (`id`) -) -ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='TeamSpeakPHPBot: GreetingBot table'; - diff --git a/examples/GreetingBot/src/botserver.php b/examples/GreetingBot/src/botserver.php deleted file mode 100644 index 7e3f135..0000000 --- a/examples/GreetingBot/src/botserver.php +++ /dev/null @@ -1,352 +0,0 @@ -init(); - } - - /** - * Initialize the application - */ - protected function init() { - - // start a session - session_start(); - - $this->appVersion = Configuration::$TSPHPBOT_CONFIG_BOT_SERVICE["version"]; - - //! Main source directory used in autoloader for finding php files - $this->SEARCH_PATHS[] = Configuration::$TSPHPBOT_CONFIG_BOT_SERVICE["appSrc"]; - //! The path of TS3PHPBots library - $this->SEARCH_PATHS[] = Configuration::$TSPHPBOT_CONFIG_BOT_SERVICE["libSrc"]; - - //! Setup our class file loader - spl_autoload_register(function ($name) { - //echo "**** loading: " . $name ."\n"; - // exclude the ts3 lib namespace, it has an own loader - $pos = strpos($name, "TeamSpeak3"); - if ($pos === false) { - $file = $this->findPath($name); - if (!is_null($file)) { - include $file; - } - else { - Log::error("AUTOLOAD", "Module does not exist: " . $name); - /* - Log::error("AUTOLOAD", "Backtrace:"); - foreach(debug_backtrace() as $depth => $trace) { - Log::raw(" [" . $depth . "]: " . $trace["file"] . ", line: " . $trace["line"] . ", function: " . $trace["function"]); - } - */ - throw new Exception("Could not find the requested file: " . $name . ".php"); - } - } - }); - } - - /** - * Try to find the given module in search paths. Return null if it could not be found. - * - * @param string $moduleName Module name - * @return string Full path of php file, or null if it could not be found. - */ - protected function findPath($moduleName) { - foreach($this->SEARCH_PATHS as $path) { - $fullpath = $path . "/" . $moduleName; - $fullpath = str_replace("\\", "/", $fullpath); - if (file_exists($fullpath . ".php")) { - return $fullpath . ".php"; - } - } - return null; - } - - /** - * Start the application - */ - public function start() { - - // use echo for logs - Log::useErrorLog(false); - - Log::raw("********************************************"); - Log::raw("* Greeting Bot Service"); - Log::raw("* Copyright 2016"); - Log::raw("* All Rights Reserved by TeamSpeakPHPBots"); - Log::raw("* https://github.com/botorabi/TeamSpeakPHPBots"); - Log::raw("*"); - Log::raw("* Version: " . $this->appVersion); - Log::raw("* Author: Botorabi (boto)"); - Log::raw("*"); - Log::raw("* Date: " . date('D, d M Y H:i:s')); - Log::raw("********************************************"); - Log::raw(""); - - Log::info(self::$TAG, "starting the bot service"); - - $terminate = false; - while(!$terminate) { - try { - Log::info(self::$TAG, "starting bots"); - $terminate = $this->mainLoop(); - } - catch(Exception $e) { - Log::error(self::$TAG, "*** An exception occurred. Reason: " . $e->getMessage()); - Log::error(self::$TAG, "*** Try to recover in a few seconds..."); - sleep(5); - } - } - } - - /** - * Connect TS3 server. - * @return TS3 Server - */ - protected function connectTS3Server() { - - $nickname = str_replace(" ", "%20", Config::getTS3ServerQuery("nickName")); - // connect to local server, authenticate and spawn an object for the virtual server on port 9987 - $querytext = "serverquery://". Config::getTS3ServerQuery("userName") . ":" . - Config::getTS3ServerQuery("password") . "@" . - Config::getTS3ServerQuery("host") . ":" . - Config::getTS3ServerQuery("hostPort") . "/?server_port=" . - Config::getTS3ServerQuery("vServerPort") . - "&blocking=0&timeout=" . Config::getTS3ServerQuery("pollInterval") . - "&nickname=" . $nickname; - $server = TeamSpeak3::factory($querytext); - return $server; - } - - //! Start the main loop for monitoring. - protected function mainLoop() { - // initialize - TeamSpeak3::init(); - - try - { - /* subscribe to various events */ - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryConnected", "App::onConnect"); - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryCommandStarted", "App::onCommand"); - TeamSpeak3_Helper_Signal::getInstance()->subscribe("serverqueryWaitTimeout", "App::onTimeout"); - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyLogin", "App::onLogin"); - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyEvent", "App::onEvent"); - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyTextmessage", "App::onTextmessage"); - TeamSpeak3_Helper_Signal::getInstance()->subscribe("notifyServerselected", "App::onSelect"); - - /* connect to server, login and get TeamSpeak3_Node_Host object by URI */ - Log::debug(self::$TAG, "connecting the TS3 server..."); - $vserver = $this->connectTS3Server(); - $this->ts3Server = $vserver; - - /* register for interested events */ - - /* NOTE: If you register for both, "server" and "channel", then take into account that you might get - * alot of notifications twice! We better take one of them. - */ - $vserver->notifyRegister("channel"); - //$vserver->notifyRegister("server"); - //$vserver->notifyRegister("textserver"); - //$vserver->notifyRegister("textchannel"); - //$vserver->notifyRegister("textprivate"); - } - catch(Exception $e) - { - Log::error(self::$TAG, "error occurred during initializing the ts3 server query interface, reason: " . $e->getMessage()); - return true; - } - - Log::debug(self::$TAG, "setup the bot manager"); - $this->botManager = new BotManager($vserver); - - // register our GreetingBot, perfere to use forward slashes in order to avoid specifying special chars by accident - $this->botManager->registerBotClass("com/examples/bots/greetingbot/GreetingBot"); - - // load and setup bots from database - $this->botManager->loadBots(); - - Log::debug(self::$TAG, "setup the service query"); - - // this allows communication between the bot and web service (e.g. query server status or notify about bot update in database) - $this->botSrvQuery = new ServerQuery; - $this->botSrvQuery->initialize($this->botManager); - - // app's main loop - while(!$this->botSrvQuery->terminate()) { - try { - // wait for events - //Log::verbose(self::$TAG, "wait for events"); - $vserver->getAdapter()->wait(); - } - catch(Exception $e) { - // an exception during shutdown is not currently not useful, ignore it! - if (!$this->botSrvQuery->terminate()) { - Log::warning(self::$TAG, "an exception occured: " . $e->getMessage()); - Log::warning(self::$TAG, " backtrance: " . $e->getTraceAsString()); - } - } - } - - Log::info(self::$TAG, "shutting down the service"); - $this->botSrvQuery->shutdown(); - return true; - } - - /** - * Update the application. Call this periodically. - */ - protected function update() { - $this->botManager->update(); - $this->botSrvQuery->update(); - - if ($this->botSrvQuery->terminate()) { - try { - $this->ts3Server->request("quit"); - } - catch(Exception $e) {} - } - } - - // ================= [ BEGIN OF TS3Teamspeak CALLBACK FUNCTION DEFINITIONS ] ================= - - /** - * Callback method for 'serverqueryConnected' signals. - * - * @param TeamSpeak3_Adapter_ServerQuery $adapter - * @return void - */ - public static function onConnect(TeamSpeak3_Adapter_ServerQuery $adapter) { - Log::info(self::$TAG, "connected to TeamSpeak 3 Server on " . $adapter->getHost()); - $version = $adapter->getHost()->version(); - Log::info(self::$TAG, " server is running with version " . $version["version"] . " on " . $version["platform"]); - } - - /** - * Callback method for 'serverqueryCommandStarted' signals. - * - * @param string $cmd - * @return void - */ - public static function onCommand($cmd) { - // the login command unveils the user name / password, avoid this! - /* - if (strcmp("login", substr($cmd, 0, 5)) === 0) { - $cmd = "login..."; - } - Log::verbose(self::$TAG, "starting command " . $cmd); - */ - } - - /** - * Callback method for 'serverqueryWaitTimeout' signals. - * - * @param integer $seconds - * @return void - */ - public static function onTimeout($seconds, TeamSpeak3_Adapter_ServerQuery $adapter) { - if($adapter->getQueryLastTimestamp() < time()-300) { - Log::debug(self::$TAG, "sending keep-alive command"); - $adapter->request("clientupdate"); - } - self::$theApp->update(); - } - - /** - * Callback method for 'notifyLogin' signals. - * - * @param TeamSpeak3_Node_Host $host - * @return void - */ - public static function onLogin(TeamSpeak3_Node_Host $host) { - Log::debug(self::$TAG, "authenticated as user " . $host->whoamiGet("client_login_name")); - } - - /** - * Callback method for 'notifyEvent' signals. - * - * @param TeamSpeak3_Adapter_ServerQuery_Event $event - * @param TeamSpeak3_Node_Host $host - * @return void - */ - public static function onEvent(TeamSpeak3_Adapter_ServerQuery_Event $event, TeamSpeak3_Node_Host $host) { - self::$theApp->botManager->notifyServerEvent($event, $host); - } - - /** - * Callback method for 'notifyTextmessage' signals. - * - * @param TeamSpeak3_Adapter_ServerQuery_Event $event - * @param TeamSpeak3_Node_Host $host - * @return void - */ - public static function onTextmessage(TeamSpeak3_Adapter_ServerQuery_Event $event, TeamSpeak3_Node_Host $host) { - //Log::debug(self::$TAG, "client " . $event["invokername"] . " sent textmessage: " . $event["msg"]); - } - - /** - * Callback method for 'notifyServerselected' signals. - * - * @param string $host - * @return void - */ - public static function onSelect(TeamSpeak3_Node_Host $host) { - Log::verbose(self::$TAG, "selected virtual server with ID " . $host->serverSelectedId()); - } -} - -// let's go -$app = new App(); -$app->start(); diff --git a/examples/GreetingBot/src/com/examples/bots/greetingbot/GreetingBot.php b/examples/GreetingBot/src/com/examples/bots/greetingbot/GreetingBot.php deleted file mode 100644 index 18b69cb..0000000 --- a/examples/GreetingBot/src/com/examples/bots/greetingbot/GreetingBot.php +++ /dev/null @@ -1,212 +0,0 @@ -model = new GreetingBotModel; - } - - /** - * Get all available bot IDs. - * This is used by bot manager for loading all available bots from database. - * - * @implements base class method - * - * @return array Array of all available bot IDs, or null if there is no corresponding table in database. - */ - static public function getAllIDs() { - return (new GreetingBotModel)->getAllObjectIDs(); - } - - /** - * Create a new bot instance. - * - * @implements base class method - * - * @param $server TS3 Server object - * @return New instance of the bot. - */ - public static function create($server) { - return new GreetingBot($server); - } - - /** - * Load the bot from database and check its data. - * - * @implements base class method - * - * @param int $botId Bot ID (database table row ID) - * @return boolean Return true if the bot was initialized successfully, otherwise false. - */ - public function initialize($botId) { - - Log::debug(self::$TAG, "loading bot type: " . $this->getType() . ", id " . $botId); - - if ($this->model->loadObject($botId) === false) { - Log::warning(self::$TAG, "could not load bot from database: id " . $botId); - return false; - } - - Log::debug(self::$TAG, " bot succesfully loaded, name: '" . $this->getName() . "'"); - - if (strlen($this->model->greetingText) === 0) { - Log::warning(self::$TAG, "empty greeting text detected, deactivating the bot!"); - $this->model->active = 0; - } - - return true; - } - - /** - * Get the bot type. - * - * @implements base class method - * - * @return string The bot type - */ - public function getType() { - return $this->model->botType; - } - - /** - * Get the bot name. - * - * @implements base class method - * - * @return string The bot name, may be empty if the bot is still not initialized. - */ - public function getName() { - return $this->model->name; - } - - /** - * Get the unique bot ID. - * - * @implements base class method - * - * @return int The unique bot ID > 0, or 0 if the bot is not setup - * or loaded from database yet. - */ - public function getID() { - return $this->model->id; - } - - /** - * Return the database model. - * - * @implements base class method - * - * @return GreetingBotModel The database model of this bot. - */ - public function getModel() { - return $this->model; - } - - /** - * The bot configuration was changed. - * - * @implements base class method - */ - public function onConfigUpdate() { - - // this is just for being on the safe side - if ($this->getID() > 0) { - Log::debug(self::$TAG, "reloading bot configuration, type: " . $this->getType() . ", name: " . - $this->getName() . ", id: " . $this->getID()); - - $this->initialize($this->getID()); - } - else { - Log::warning(self::$TAG, "the bot was not loaded before, cannot handle its config update!"); - } - } - - /** - * This method is called whenever a server event was received. - * - * @implements base class method - * - * @param Object $event Event received from ts3 server - * @param Object $host Server host - */ - public function onServerEvent($event, $host) { - - // skip updating if the bot is not active - if ($this->model->active == 0) { - return; - } - - if (strcmp($event->getType(), "cliententerview") === 0) { - - $data = $event->getData(); - $clid = $data["clid"]; - $clnick = $data["client_nickname"]; - - Log::verbose(self::$TAG, "going to greet a new client: " . $clnick); - - try { - // get the client - $client = $this->ts3Server->clientGetById($clid); - // assemble the final greeting - $text = str_replace("", $clnick, $this->model->greetingText); - // send the text to the client - $client->message($text); - } - catch (Exception $ex) { - Log::debug(self::$TAG, "Hmm, I did not have the possibility to greet the new client :-/"); - } - } - } - - /** - * Update the bot. - * - * @implements base class method - */ - public function update() { - - // skip updating if the bot is not active - if ($this->model->active == 0) { - return; - } - - //Log::verbose(self::$TAG, "bot " . $this->getName() . " was updated"); - } -} diff --git a/examples/GreetingBot/src/com/examples/bots/greetingbot/GreetingBotModel.php b/examples/GreetingBot/src/com/examples/bots/greetingbot/GreetingBotModel.php deleted file mode 100644 index de288d2..0000000 --- a/examples/GreetingBot/src/com/examples/bots/greetingbot/GreetingBotModel.php +++ /dev/null @@ -1,77 +0,0 @@ -objectFields["botType"] = self::$BOT_TYPE_NAME; - $this->objectFields["name"] = ""; - $this->objectFields["description"] = ""; - $this->objectFields["active"] = 0; - $this->objectFields["greetingText"] = ""; - } - - /** - * Load the object fields from database and do the proper preparation. - * - * @override base class method - * - * @param int $id Object ID - * @return boolean true if an object with given ID could be loaded, otherwise false. - */ - public function loadObject($id) { - - if (DBObject::loadObject($id) === false) { - return false; - } - return true; - } - - /** - * Return the table name. - * - * @return string Database table name - */ - static public function getTableName() { - return Config::getDB("tablePrefix") . self::$DB_TABLE_NAME_BOT; - } -} diff --git a/examples/GreetingBot/src/com/examples/web/controller/BotConfigGB.php b/examples/GreetingBot/src/com/examples/web/controller/BotConfigGB.php deleted file mode 100644 index 66e0946..0000000 --- a/examples/GreetingBot/src/com/examples/web/controller/BotConfigGB.php +++ /dev/null @@ -1,166 +0,0 @@ -setFieldValue("name", $this->getParamString($params, "name", "New Bot")); - $obj->setFieldValue("description", $this->getParamString($params, "description", "")); - $obj->setFieldValue("active", 1); - - // bot specific parameters - $obj->setFieldValue("greetingText", $this->getParamString($params, "greetingText", "")); - } - - /** - * Update the bot parameters. - * - * @param Object $obj The object which is updated - * @param array $params Service call parameters (GET or POST) - */ - protected function updateObjectParameters($obj, $params) { - // common bot parameters - if (isset($params["name"])) { - $obj->setFieldValue("name", $this->getParamString($params, "name", "")); - } - if (isset($params["description"])) { - $obj->setFieldValue("description", $this->getParamString($params, "description", "")); - } - if (isset($params["active"])) { - $obj->setFieldValue("active", ($this->getParamNummeric($params, "active", 1) === 1) ? 1 : 0); - } - - // bot specific parameters - if (isset($params["greetingText"])) { - $obj->setFieldValue("greetingText", $this->getParamString($params, "greetingText", "")); - } - } - - /** - * Return which data fields should be used for summary displays. - * Here is a standard compilation, derived classes can return their specific fields. - * - * @overrides BaseRESTController - * - * @return array Array with data field names used for summary displays. - */ - protected function getSummaryFields() { - return $this->botSummaryFields; - } - - /** - * Create a view for bot configuration. - * - * @param array $parameters URL parameters such as GET or POST - */ - public function view($parameters) { - - if (!Auth::isLoggedIn()) { - $this->redirectView($this->renderMainClass); - return; - } - - // get the combined params - $params = $this->combineRequestParameters($parameters); - - // first check for a REST request - if (!$this->handleRestRequest($params)) { - $this->renderView($this->renderClassName); - } - } -} diff --git a/examples/GreetingBot/src/com/examples/web/controller/BotServer.php b/examples/GreetingBot/src/com/examples/web/controller/BotServer.php deleted file mode 100644 index 44598e1..0000000 --- a/examples/GreetingBot/src/com/examples/web/controller/BotServer.php +++ /dev/null @@ -1,282 +0,0 @@ -redirectView($this->renderMainClass); - return; - } - - // check the params - if (isset($parameters["POST"])) { - foreach($parameters["POST"] as $param => $val) { - $params[$param] = $val; - } - } - if (isset($parameters["GET"])) { - foreach($parameters["GET"] as $param => $val) { - $params[$param] = $val; - } - } - - $this->loggedInUser = new User(Auth::getUserID()); - if (is_null($this->loggedInUser)) { - Log::printEcho(json_encode(["result" => "nok", "reason" => "internal error, user not found!"])); - return; - } - - if (isset($params["status"])) { - $this->createRespJsonStatus(); - } - else if (isset($params["start"])) { - $this->cmdStartBotServer(); - } - else if (isset($params["stop"])) { - $this->cmdStopBotServer(); - } - else if (isset($params["add"])) { - $this->cmdBotAdd($params["botType"], $params["add"]); - } - else if (isset($params["update"])) { - $this->cmdBotUpdate($params["botType"], $params["update"]); - } - else if (isset($params["delete"])) { - $this->cmdBotDelete($params["botType"], $params["delete"]); - } - else { - $this->renderView($this->renderClassName, null); - } - } - - /** - * Create a JSON response for the bot server state. - */ - protected function createRespJsonStatus() { - - //Log::debug(self::$TAG, "get bot service status..."); - - $servicequery = new ClientQuery; - if ($servicequery->connect() === false) { - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - $state = $servicequery->getStatus(); - $servicequery->shutdown(); - - if ($state) { - $res = ["result" => "ok", "data" => json_decode($state)]; - Log::printEcho(json_encode($res)); - } - else { - Log::printEcho(json_encode(["result" => "nok"])); - } - } - - /** - * Start the bot server. Ignores the call if the server is already running. - */ - protected function cmdStartBotServer() { - - Log::debug(self::$TAG, "starting the bot service..."); - - $servicequery = new ClientQuery; - $servicequery->connect(); - if ($servicequery->connect() !== false) { - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - $state = $servicequery->getStatus(); - // check if the server is already running - if (!is_null($state)) { - Log::debug(self::$TAG, "bot service is already running!"); - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - $startcmd = Config::getBotService("cmdStart"); - Log::debug(self::$TAG, "starting: " . $startcmd); - // on ms windows - if (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') { - $out = ""; - $ret = 0; - exec("'" . $startcmd . "'", $out, $ret); - } - else { - // on linux or mac - shell_exec($startcmd); - } - Log::printEcho(json_encode(["result" => "ok"])); - } - - /** - * Stop the bot server. - */ - protected function cmdStopBotServer() { - - Log::debug(self::$TAG, "stopping the bot service..."); - - $servicequery = new ClientQuery; - $servicequery->connect(); - if ($servicequery->connect() === false) { - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - $state = $servicequery->stopService(); - - if (is_null($state)) { - Log::debug(self::$TAG, "bot service seems not running!"); - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - Log::printEcho(json_encode(["result" => "ok"])); - } - - /** - * Add a bot given its type and ID. - * - * @param string $botType Bot type - * @param int $id Bot ID - */ - protected function cmdBotAdd($botType, $id) { - - Log::debug(self::$TAG, "adding bot, id: " . $id); - - $servicequery = new ClientQuery; - $servicequery->connect(); - if ($servicequery->connect() === false) { - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - $result = $servicequery->botAdd($botType, $id); - - if (is_null($result)) { - Log::debug(self::$TAG, " could not add bot"); - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - Log::printEcho(json_encode(["result" => "ok"])); - } - - /** - * Update the bot given its ID and type. - * - * @param string $botType Bot type - * @param int $id Bot ID - */ - protected function cmdBotUpdate($botType, $id) { - - Log::debug(self::$TAG, "updating bot, id: " . $id); - - $servicequery = new ClientQuery; - $servicequery->connect(); - if ($servicequery->connect() === false) { - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - $result = $servicequery->botUpdate($botType, $id); - - if (is_null($result)) { - Log::debug(self::$TAG, " could not update bot"); - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - Log::printEcho(json_encode(["result" => "ok"])); - } - - /** - * Delete the bot given its ID and type. - * - * @param string $botType Bot type - * @param int $id Bot ID - */ - protected function cmdBotDelete($botType, $id) { - - Log::debug(self::$TAG, "deleting bot, id: " . $id); - - $servicequery = new ClientQuery; - $servicequery->connect(); - if ($servicequery->connect() === false) { - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - $result = $servicequery->botDelete($botType, $id); - - if (is_null($result)) { - Log::debug(self::$TAG, " could not delete bot"); - Log::printEcho(json_encode(["result" => "nok"])); - return; - } - - Log::printEcho(json_encode(["result" => "ok"])); - } -} diff --git a/examples/GreetingBot/src/com/examples/web/controller/UserAdministration.php b/examples/GreetingBot/src/com/examples/web/controller/UserAdministration.php deleted file mode 100644 index d9ac5a6..0000000 --- a/examples/GreetingBot/src/com/examples/web/controller/UserAdministration.php +++ /dev/null @@ -1,36 +0,0 @@ -setRenderClassName("UserAdministration"); - parent::view($parameters); - } -} \ No newline at end of file diff --git a/examples/GreetingBot/src/start_botserver.sh b/examples/GreetingBot/src/start_botserver.sh deleted file mode 100644 index 4e07e5e..0000000 --- a/examples/GreetingBot/src/start_botserver.sh +++ /dev/null @@ -1,23 +0,0 @@ -#!/bin/sh - -# Copyright (c) 2016 by Botorabi. All rights reserved. -# https://github.com/botorabi/TeamSpeakPHPBots -# -# License: MIT License (MIT) -# Read the LICENSE text in main directory for more details. -# -# Created: 1st August 2016 -# Author: Botorabi (botorabi AT gmx DOT net) - - -# Shell script for starting the GreetingBot example - -# Make sure that php is in your path or adapt the line below. -PHP_BIN=php - -# Start the service in background and create a pid and log file -#$PHP_BIN greetingbot.php > botserver.log 2>&1 & echo $! > botserver.pid - -#Start the service in foreground -$PHP_BIN botserver.php 2>&1 - diff --git a/examples/GreetingBot/src/web/images/bot.png b/examples/GreetingBot/src/web/images/bot.png deleted file mode 100644 index 6563577..0000000 Binary files a/examples/GreetingBot/src/web/images/bot.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/bot_add.png b/examples/GreetingBot/src/web/images/bot_add.png deleted file mode 100644 index 94f9f6e..0000000 Binary files a/examples/GreetingBot/src/web/images/bot_add.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/bot_delete.png b/examples/GreetingBot/src/web/images/bot_delete.png deleted file mode 100644 index e6ccaa2..0000000 Binary files a/examples/GreetingBot/src/web/images/bot_delete.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/bot_edit.png b/examples/GreetingBot/src/web/images/bot_edit.png deleted file mode 100644 index 413ace1..0000000 Binary files a/examples/GreetingBot/src/web/images/bot_edit.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/login.png b/examples/GreetingBot/src/web/images/login.png deleted file mode 100644 index c6252aa..0000000 Binary files a/examples/GreetingBot/src/web/images/login.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/logo.png b/examples/GreetingBot/src/web/images/logo.png deleted file mode 100644 index 09cfa5b..0000000 Binary files a/examples/GreetingBot/src/web/images/logo.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/menu.png b/examples/GreetingBot/src/web/images/menu.png deleted file mode 100644 index c4d8123..0000000 Binary files a/examples/GreetingBot/src/web/images/menu.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/menuback.png b/examples/GreetingBot/src/web/images/menuback.png deleted file mode 100644 index d3099ae..0000000 Binary files a/examples/GreetingBot/src/web/images/menuback.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/progress.png b/examples/GreetingBot/src/web/images/progress.png deleted file mode 100644 index 07a3dd9..0000000 Binary files a/examples/GreetingBot/src/web/images/progress.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/server.png b/examples/GreetingBot/src/web/images/server.png deleted file mode 100644 index 237cae0..0000000 Binary files a/examples/GreetingBot/src/web/images/server.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/serverdown.png b/examples/GreetingBot/src/web/images/serverdown.png deleted file mode 100644 index b5a6904..0000000 Binary files a/examples/GreetingBot/src/web/images/serverdown.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/serverstat.png b/examples/GreetingBot/src/web/images/serverstat.png deleted file mode 100644 index 5115274..0000000 Binary files a/examples/GreetingBot/src/web/images/serverstat.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/serverup.png b/examples/GreetingBot/src/web/images/serverup.png deleted file mode 100644 index 49d5fc3..0000000 Binary files a/examples/GreetingBot/src/web/images/serverup.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/user.png b/examples/GreetingBot/src/web/images/user.png deleted file mode 100644 index bc07d1b..0000000 Binary files a/examples/GreetingBot/src/web/images/user.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/user_add.png b/examples/GreetingBot/src/web/images/user_add.png deleted file mode 100644 index 5f3d968..0000000 Binary files a/examples/GreetingBot/src/web/images/user_add.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/user_delete.png b/examples/GreetingBot/src/web/images/user_delete.png deleted file mode 100644 index 9fe90f8..0000000 Binary files a/examples/GreetingBot/src/web/images/user_delete.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/images/user_edit.png b/examples/GreetingBot/src/web/images/user_edit.png deleted file mode 100644 index 413ace1..0000000 Binary files a/examples/GreetingBot/src/web/images/user_edit.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/js/layout.js b/examples/GreetingBot/src/web/js/layout.js deleted file mode 100644 index 20f65fd..0000000 --- a/examples/GreetingBot/src/web/js/layout.js +++ /dev/null @@ -1,293 +0,0 @@ -/** - * Copyright (c) 2016 by Botorabi. All rights reserved. - * https://github.com/botorabi/TeamSpeakPHPBots - * - * License: MIT License (MIT), read the LICENSE text in - * main directory for more details. - */ -/* - * Created on : 2nd July, 2016 - * Author : Botorabi (boto) - */ - -var LAYOUT = LAYOUT || {}; - - -function initLAYOUT(logger) { - - LAYOUT.logger = logger; - - /** - * Put the bot list into given table. - * - * @param botCtrlPage Bot type - * @param tableID ID of table containig the bots - * @param bots Bot configuration array. - * @param onClickHandler Handler for onClick events - */ - LAYOUT.putBotList = function(botCtrlPage, tableID, bots, onClickHandler) { - - var elem = document.getElementById(tableID); - if (!elem) - return; - - // are there any eventy at all? - if (!bots || !bots.length) - return; - - renderBots(elem, botCtrlPage, bots, onClickHandler); - }; - - /** - * Put the user list into given table. - * - * @param tableID ID of table containig the bots - * @param users User data array. - * @param onClickHandler Handler for onClick events - */ - LAYOUT.putUserList = function(tableID, users, onClickHandler) { - - var elem = document.getElementById(tableID); - if (!elem) - return; - - // are there any eventy at all? - if (!users || !users.length) - return; - - renderUsers(elem, users, onClickHandler); - }; - - /** - * Animate a given element by rotating it. - * - * @param elemId Element ID - * @param timeInterval Time interval for animation - * @param step Angle step of every tick - * @returns Animation timer object - */ - LAYOUT.animateRoation = function (elemId, timeInterval, step) { - var elem = $("#" + elemId); - var degree = 0; - function anim() { - setTimeout(function() { - degree += step; - elem.css({ WebkitTransform: 'rotate(' + degree + 'deg)'}); - elem.css({ '-moz-transform': 'rotate(' + degree + 'deg)'}); - anim(); - }, timeInterval); - } - anim(); - }; - - //! Private functions - function renderBots(table, botCtrlPage, bots, onClickHandler) { - - if (table.tBodies.length === 0) - return; - - var tbody = table.tBodies[0]; - - var tr = null; - var td = null; - - if (bots.length === 0) { - return; - } - - for (var i in bots) { - - tr = document.createElement("tr"); - tbody.appendChild(tr); - - td = document.createElement("td"); - tr.appendChild(td); - td.innerHTML = bots[i].name; - - td = document.createElement("td"); - tr.appendChild(td); - td.innerHTML = bots[i].botType; - - td = document.createElement("td"); - tr.appendChild(td); - td.innerHTML = bots[i].description; - - td = document.createElement("td"); - td.setAttribute("class", "active"); - tr.appendChild(td); - chbox = document.createElement("input"); - chbox.id = "chboxactiveId"; - chbox.type = "checkbox"; - chbox.botId = bots[i].id; - chbox.botCtrlPage = botCtrlPage; - chbox.botType = bots[i].botType; - if (bots[i].active === "1") { - chbox.setAttribute("checked", true); - } - chbox.setAttribute("title", "On / Off"); - chbox.onclick = function() { if (onClickHandler) onClickHandler((this.checked === true)? 'enableBot' : 'disableBot', this.botCtrlPage, this.botType, this.botId); }; - td.appendChild(chbox); - - td = document.createElement("td"); - tr.appendChild(td); - td.setAttribute("class", "mods"); - img = document.createElement("img"); - img.botId = bots[i].id; - img.botCtrlPage = botCtrlPage; - img.botType = bots[i].botType; - img.setAttribute("class", "imgClickable"); - img.setAttribute("src", "src/web/images/bot_edit.png"); - img.setAttribute("title", "Modify"); - img.onclick = function() { if (onClickHandler) onClickHandler('modify', this.botCtrlPage, this.botType, this.botId); }; - td.appendChild(img); - br = document.createElement("br"); - td.appendChild(br); - img = document.createElement("img"); - img.botId = bots[i].id; - img.botCtrlPage = botCtrlPage; - img.botType = bots[i].botType; - img.setAttribute("class", "imgClickable"); - img.setAttribute("src", "src/web/images/bot_delete.png"); - img.setAttribute("title", "Delete"); - img.onclick = function() { if (onClickHandler) onClickHandler('delete', this.botCtrlPage, this.botType, this.botId); }; - td.appendChild(img); - } - } - - function formatTimeDate(date) { - var datestr = date.getDate() + "." + (date.getMonth() + 1) + "." + date.getFullYear(); - var minutes = date.getMinutes(); - minutes = minutes < 10 ? "0" + minutes : minutes; - datestr += " - " + date.getHours() + ":" + minutes; - return datestr; - } - - function renderUsers(table, users, onClickHandler) { - - if (table.tBodies.length === 0) - return; - - var tbody = table.tBodies[0]; - - var tr = null; - var td = null; - - if (users.length === 0) { - return; - } - - for (var i in users) { - - tr = document.createElement("tr"); - tbody.appendChild(tr); - - td = document.createElement("td"); - tr.appendChild(td); - td.innerHTML = users[i].name; - - td = document.createElement("td"); - tr.appendChild(td); - td.innerHTML = users[i].login; - - td = document.createElement("td"); - tr.appendChild(td); - td.innerHTML = users[i].description; - - td = document.createElement("td"); - tr.appendChild(td); - var date = "-"; - if (parseInt(users[i].lastLogin) !== 0) { - date = formatTimeDate(new Date(users[i].lastLogin * 1000)); - } - td.innerHTML = date; - - td = document.createElement("td"); - td.setAttribute("class", "status"); - tr.appendChild(td); - label = document.createElement("label"); - label.setAttribute("for", "chboxactiveId"); - label.innerHTML = "aktiv: "; - td.appendChild(label); - chbox = document.createElement("input"); - chbox.type = "checkbox"; - chbox.userId = users[i].id; - if (users[i].active === "1") { - chbox.setAttribute("checked", true); - } - chbox.setAttribute("title", "On / Off"); - chbox.onclick = function() { if (onClickHandler) onClickHandler((this.checked === true)? 'enableUser' : 'disableUser', this.userId); }; - if ((parseInt(users[i].ops) & 4) === 0) { - chbox.disabled = true; - } - td.appendChild(chbox); - - br = document.createElement("br"); - td.appendChild(br); - br = document.createElement("br"); - td.appendChild(br); - - label = document.createElement("label"); - label.setAttribute("for", "cmborolesId"); - label.innerHTML = "Rolle: "; - td.appendChild(label); - sel = document.createElement("select"); - sel.id = "cmborolesId"; - sel.userId = users[i].id; - sel.onchange = function() { - if (onClickHandler) { - if (this.value === "1") { - onClickHandler("setRoleAdmin", this.userId); - } - else if (this.value === "2") { - onClickHandler("setRoleBotMaster", this.userId); - } - } - }; - if ((parseInt(users[i].ops) & 8) === 0) { - sel.disabled = true; - } - - td.appendChild(sel); - - opt = document.createElement("option"); - sel.appendChild(opt); - opt.setAttribute("value", "1"); - opt.innerHTML = "Admin"; - if (users[i].roles & 1) { - opt.setAttribute("selected", true); - } - - opt = document.createElement("option"); - sel.appendChild(opt); - opt.setAttribute("value", "2"); - opt.innerHTML = "Bot Master"; - if (users[i].roles & 2) { - opt.setAttribute("selected", true); - } - - td = document.createElement("td"); - tr.appendChild(td); - td.setAttribute("class", "mods"); - if ((parseInt(users[i].ops) & 2) === 2) { - img = document.createElement("img"); - img.userId = users[i].id; - img.setAttribute("class", "imgClickable"); - img.setAttribute("src", "src/web/images/user_edit.png"); - img.setAttribute("title", "Modify"); - img.onclick = function() { if (onClickHandler) onClickHandler('modify', this.userId); }; - td.appendChild(img); - br = document.createElement("br"); - td.appendChild(br); - } - if ((parseInt(users[i].ops) & 1) === 1) { - img = document.createElement("img"); - img.userId = users[i].id; - img.setAttribute("class", "imgClickable"); - img.setAttribute("src", "src/web/images/user_delete.png"); - img.setAttribute("title", "Delete"); - img.onclick = function() { if (onClickHandler) onClickHandler('delete', this.userId); }; - td.appendChild(img); - } - } - } -} \ No newline at end of file diff --git a/examples/GreetingBot/src/web/js/logger.js b/examples/GreetingBot/src/web/js/logger.js deleted file mode 100644 index 49a8092..0000000 --- a/examples/GreetingBot/src/web/js/logger.js +++ /dev/null @@ -1,61 +0,0 @@ -/** - * Copyright (c) 2016 by Botorabi. All rights reserved. - * https://github.com/botorabi/TeamSpeakPHPBots - * - * License: MIT License (MIT), read the LICENSE text in - * main directory for more details. - */ -/* - * Created on : 2nd July, 2016 - * Author : Botorabi (boto) -*/ - -// Various log levels which can be used as filter in initLOG. -var LOG_VERBOSE = 1; -var LOG_DEBUG = 2; -var LOG_ERROR = 4; -var LOG_INFO = 8; -var LOG_ALL = LOG_VERBOSE | LOG_DEBUG | LOG_ERROR | LOG_INFO; - -/** - Create a logger instance. Pass the desired log levels as logical OR. Pass 0 to - enable all log level. The returned logger instance has the following functions: - - v(text): log a verbose message - d(text): log a debug message - e(text): log an error message - i(text): log an info message - - @param filter Logical OR of desired loglevels, or LOG_ALL for enabling all levels. - @param prefix This prefix appears on all messages of the logger instance. - @return Logger instance -*/ -function createLogger(filter, prefix) { - - var logger = {}; - logger.filter = filter; - logger.prefix = prefix; - - // Log verbose message - logger.v = function(text) { - if (logger.filter & LOG_VERBOSE) - console.log(logger.prefix + "(v): " + text); - }; - // Log debug message - logger.d = function(text) { - if (logger.filter & LOG_DEBUG) - console.log(logger.prefix + "(d): " + text); - }; - // Log error message - logger.e = function(text) { - if (logger.filter & LOG_ERROR) - console.log(logger.prefix + "(e): " + text); - }; - // Log info message - logger.i = function(text) { - if (logger.filter & LOG_INFO) - console.log(logger.prefix + "(i): " + text); - }; - - return logger; -} diff --git a/examples/GreetingBot/src/web/js/rest.js b/examples/GreetingBot/src/web/js/rest.js deleted file mode 100644 index 1a7ab67..0000000 --- a/examples/GreetingBot/src/web/js/rest.js +++ /dev/null @@ -1,275 +0,0 @@ -/** - * Copyright (c) 2016 by Botorabi. All rights reserved. - * https://github.com/botorabi/TeamSpeakPHPBots - * - * License: MIT License (MIT), read the LICENSE text in - * main directory for more details. - */ -/* - * Created on : 29th July, 2016 - * Author : Botorabi (boto) - */ - -var REST = REST || {}; - -function initREST(logger) { - - REST.logger = logger; - - /** - * Asynchronous request which uses POST and expects JSON as response. - * - * @param requestUrl Request URL - * @param requestData Request data (e.g. form data) - * @param responseCallback Callback for reponse notification. - * The response is parsed as JSON and a corresponding - * java object is used for the callback. - */ - function requestJSON(requestUrl, requestData, responseCallback) { - $.ajax({ - type: "POST", - url: requestUrl, - data: requestData, - success: function(data) { - if (responseCallback !== null) { - var res = null; - try { - res = $.parseJSON(data); - } - catch(e) { - REST.logger.e("Exception occurred while parsing JSON response: " + e + " data: '" + data + "'"); - } - responseCallback(res); - } - } - }); - } - - /** - * Get the time left before automatic logout. - * - * @param callback Callback function used when the results are ready. - */ - REST.getTimeLeft = function(callback) { - requestJSON("?page=timeLeft", null, callback); - }; - - /** - * Get a list of bots. - * - * @param ctrlName Bot controller name - * @param callback Callback function used when the results are ready. - */ - REST.getBotList = function(ctrlName, callback) { - requestJSON("?page=" + ctrlName + "&list=0", null, callback); - }; - - /** - * Get the bot with given ID. - * - * @param ctrlName Bot controller name - * @param id Bot ID - * @param callback Callback function used when the results are ready. - */ - REST.getBot = function(ctrlName, id, callback) { - requestJSON("?page=" + ctrlName + "&id=" + id, null, callback); - }; - - /** - * Create a new bot with specified parameters in given formular. - * - * @param ctrlName Bot controller name - * @param formID Forumular ID, the formular contains the bot data. - * @param callback Callback function used when the results are ready. - */ - REST.createBot = function(ctrlName, formID, callback) { - var formdata = $("#" + formID).serializeArray(); - formdata.push({name: "create", value : "0"}); - requestJSON("?page=" + ctrlName, formdata, callback); - }; - - /** - * Update a bot with specified parameters in given formular. - * - * @param ctrlName Bot controller name - * @param id Bot ID - * @param formID Forumular ID, the formular contains the bot data. - * @param callback Callback function used when the results are ready. - */ - REST.updateBot = function(ctrlName, id, formID, callback) { - var formdata = $("#" + formID).serializeArray(); - formdata.push({name: "update", value : id}); - requestJSON("?page=" + ctrlName, formdata, callback); - }; - - /** - * Enable/disable a bot with given ID. - * - * @param ctrlName Bot controller name - * @param id Bot ID - * @param enable true for enabling the bot, false for disabling it. - * @param callback Callback function used when the results are ready. - */ - REST.enableBot = function(ctrlName, id, enable, callback) { - var reqdata = []; - reqdata.push({name: "update", value : id}); - reqdata.push({name: "active", value: enable ? "1" : "0"}); - requestJSON("?page=" + ctrlName, reqdata, callback); - }; - - /** - * Delete the bot with given ID. - * - * @param ctrlName Bot controller name - * @param id Bot ID - * @param callback Callback function used when the results are ready. - */ - REST.deleteBot = function(ctrlName, id, callback) { - requestJSON("?page=" + ctrlName + "&delete=" + id, null, callback); - }; - - /** - * Get a list of users. - * - * @param callback Callback function used when the results are ready. - */ - REST.getUserList = function(callback) { - requestJSON("?page=UserAdmin&list=0", null, callback); - }; - - /** - * Get the user with given ID. - * - * @param id User ID - * @param callback Callback function used when the results are ready. - */ - REST.getUser = function(id, callback) { - requestJSON("?page=UserAdmin&id=" + id, null, callback); - }; - - /** - * Create a new user with specified parameters. - * - * @param fields Array containing the user data. - * @param callback Callback function used when the results are ready. - */ - REST.createUser = function(fields, callback) { - var formdata = fields; - formdata.push({name: "create", value : "0"}); - requestJSON("?page=UserAdmin", formdata, callback); - }; - - /** - * Update an user with specified parameters in given formular. - * - * @param id User ID - * @param fields Array containing the user data. - * @param callback Callback function used when the results are ready. - */ - REST.updateUser = function(id, fields, callback) { - var formdata = fields; - formdata.push({name: "update", value : id}); - requestJSON("?page=UserAdmin", formdata, callback); - }; - - /** - * Enable/disable an user with given ID. - * - * @param id user ID - * @param enable true for enabling the bot, false for disabling it. - * @param callback Callback function used when the results are ready. - */ - REST.enableUser = function(id, enable, callback) { - var reqdata = []; - reqdata.push({name: "update", value : id}); - reqdata.push({name: "active", value: enable ? "1" : "0"}); - requestJSON("?page=UserAdmin", reqdata, callback); - }; - - /** - * Set the user role. - * - * @param id user ID - * @param roleFlag One of role flags. - * @param callback Callback function used when the results are ready. - */ - REST.setRole = function(id, roleFlag, callback) { - var reqdata = []; - reqdata.push({name: "update", value : id}); - reqdata.push({name: "roles", value: roleFlag}); - requestJSON("?page=UserAdmin", reqdata, callback); - }; - - /** - * Delete the user with given ID. - * - * @param id User ID - * @param callback Callback function used when the results are ready. - */ - REST.deleteUser = function(id, callback) { - requestJSON("?page=UserAdmin&delete=" + id, null, callback); - }; - - /** - * Request for bot server status. - * - * @param callback Callback function used when the results are ready. - */ - REST.getBotServiceStatus = function(callback) { - requestJSON("?page=BotServer&status=", null, callback); - }; - - /** - * Request for starting the bot server. - * - * @param callback Callback function used when the results are ready. - */ - REST.botServiceStart = function(callback) { - requestJSON("?page=BotServer&start=", null, callback); - }; - - /** - * Request for stopping the bot server. - * - * @param callback Callback function used when the results are ready. - */ - REST.botServiceStop = function(callback) { - requestJSON("?page=BotServer&stop=", null, callback); - }; - - /** - * Request for adding a bot with given type and id. This is used in order to let changes - * in a bot take place without restarting the bot service. - * - * @param botType Bot type - * @param id Bot ID - * @param callback Callback function used when the results are ready. - */ - REST.botServiceAddBot = function(botType, id, callback) { - requestJSON("?page=BotServer&add=" + id + "&botType=" + botType, null, callback); - }; - - /** - * Request for updating a bot with given type and id. This is used in order to let changes - * in a bot take place without restarting the bot service. - * - * @param botType Bot type - * @param id Bot ID - * @param callback Callback function used when the results are ready. - */ - REST.botServiceUpdateBot = function(botType, id, callback) { - requestJSON("?page=BotServer&update=" + id + "&botType=" + botType, null, callback); - }; - - /** - * Request for deleting a bot with given type and id. This is used in order to let changes - * in a bot take place without restarting the bot service. - * - * @param botType Bot type - * @param id Bot ID - * @param callback Callback function used when the results are ready. - */ - REST.botServiceDeleteBot = function(botType, id, callback) { - requestJSON("?page=BotServer&delete=" + id + "&botType=" + botType, null, callback); - }; -} \ No newline at end of file diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png deleted file mode 100644 index c48d9a5..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_diagonals-thick_18_b81900_40x40.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png deleted file mode 100644 index 1cfdca7..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_diagonals-thick_20_666666_40x40.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png deleted file mode 100644 index b624279..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_100_f6f6f6_1x400.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png deleted file mode 100644 index 208adef..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_100_fdf5ce_1x400.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png deleted file mode 100644 index ccc2c89..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_glass_65_ffffff_1x400.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png deleted file mode 100644 index 93f0889..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_gloss-wave_35_f6a828_500x100.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png deleted file mode 100644 index efb8363..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_highlight-soft_100_eeeeee_1x100.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png deleted file mode 100644 index 0f96c5b..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-bg_highlight-soft_75_ffe45c_1x100.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_222222_256x240.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_222222_256x240.png deleted file mode 100644 index e9c8e16..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_222222_256x240.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_228ef1_256x240.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_228ef1_256x240.png deleted file mode 100644 index 8d68c54..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_228ef1_256x240.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ef8c08_256x240.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ef8c08_256x240.png deleted file mode 100644 index 18bbfe8..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ef8c08_256x240.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ffd27a_256x240.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ffd27a_256x240.png deleted file mode 100644 index 4435b49..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ffd27a_256x240.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ffffff_256x240.png b/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ffffff_256x240.png deleted file mode 100644 index 4d66f59..0000000 Binary files a/examples/GreetingBot/src/web/libs/jquery-ui/images/ui-icons_ffffff_256x240.png and /dev/null differ diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/index.html b/examples/GreetingBot/src/web/libs/jquery-ui/index.html deleted file mode 100644 index b878272..0000000 --- a/examples/GreetingBot/src/web/libs/jquery-ui/index.html +++ /dev/null @@ -1,513 +0,0 @@ - - - - - jQuery UI Example Page - - - - - -

Welcome to jQuery UI!

- -
-

This page demonstrates the widgets and theme you selected in Download Builder. Please make sure you are using them with a compatible jQuery version.

-
- -

YOUR COMPONENTS:

- - - -

Accordion

-
-

First

-
Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet. Lorem ipsum dolor sit amet.
-

Second

-
Phasellus mattis tincidunt nibh.
-

Third

-
Nam dui erat, auctor a, dignissim quis.
-
- - - - -

Autocomplete

-
- -
- - - - -

Button

- -
-
- - - -
-
- - - - -

Tabs

-
- -
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
-
Phasellus mattis tincidunt nibh. Cras orci urna, blandit id, pretium vel, aliquet ornare, felis. Maecenas scelerisque sem non nisl. Fusce sed lorem in enim dictum bibendum.
-
Nam dui erat, auctor a, dignissim quis, sollicitudin eu, felis. Pellentesque nisi urna, interdum eget, sagittis et, consequat vestibulum, lacus. Mauris porttitor ullamcorper augue.
-
- - - - -

Dialog

-

Open Dialog

- -

Overlay and Shadow Classes (not currently used in UI widgets)

-
-

Lorem ipsum dolor sit amet, Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci.

Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat.

Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante. Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam.

Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi. Aliquam ante.

Suspendisse scelerisque dui nec velit. Duis augue augue, gravida euismod, vulputate ac, facilisis id, sem. Morbi in orci. Nulla purus lacus, pulvinar vel, malesuada ac, mattis nec, quam. Nam molestie scelerisque quam. Nullam feugiat cursus lacus.orem ipsum dolor sit amet, consectetur adipiscing elit. Donec libero risus, commodo vitae, pharetra mollis, posuere eu, pede. Nulla nec tortor. Donec id elit quis purus consectetur consequat. Nam congue semper tellus. Sed erat dolor, dapibus sit amet, venenatis ornare, ultrices ut, nisi.

- - -
-
-
-

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

-
-
- -
- - -
-

Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

-
- - - -

Framework Icons (content color preview)

- - - - -

Slider

-
- - - - -

Datepicker

-
- - - - -

Progressbar

-
- - - - -

Selectmenu

- - - - - -

Spinner

- - - - - -

Menu

- - - - - -

Tooltip

-

- Tooltips can be attached to any element. When you hover -the element with your mouse, the title attribute is displayed in a little box next to the element, just like a native tooltip. -

- - - -

Highlight / Error

-
-
-

- Hey! Sample ui-state-highlight style.

-
-
-
-
-
-

- Alert: Sample ui-state-error style.

-
-
- - - - - - diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui-sliderAccess.js b/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui-sliderAccess.js deleted file mode 100644 index a54cf4a..0000000 --- a/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui-sliderAccess.js +++ /dev/null @@ -1,89 +0,0 @@ -/* - * jQuery UI Slider Access - * By: Trent Richardson [http://trentrichardson.com] - * Version 0.3 - * Last Modified: 10/20/2012 - * - * Copyright 2011 Trent Richardson - * Dual licensed under the MIT and GPL licenses. - * http://trentrichardson.com/Impromptu/GPL-LICENSE.txt - * http://trentrichardson.com/Impromptu/MIT-LICENSE.txt - * - */ - (function($){ - - $.fn.extend({ - sliderAccess: function(options){ - options = options || {}; - options.touchonly = options.touchonly !== undefined? options.touchonly : true; // by default only show it if touch device - - if(options.touchonly === true && !("ontouchend" in document)) - return $(this); - - return $(this).each(function(i,obj){ - var $t = $(this), - o = $.extend({},{ - where: 'after', - step: $t.slider('option','step'), - upIcon: 'ui-icon-plus', - downIcon: 'ui-icon-minus', - text: false, - upText: '+', - downText: '-', - buttonset: true, - buttonsetTag: 'span', - isRTL: false - }, options), - $buttons = $('<'+ o.buttonsetTag +' class="ui-slider-access">'+ - ''+ - ''+ - ''); - - $buttons.children('button').each(function(j, jobj){ - var $jt = $(this); - $jt.button({ - text: o.text, - icons: { primary: $jt.data('icon') } - }) - .click(function(e){ - var step = $jt.data('step'), - curr = $t.slider('value'), - newval = curr += step*1, - minval = $t.slider('option','min'), - maxval = $t.slider('option','max'), - slidee = $t.slider("option", "slide") || function(){}, - stope = $t.slider("option", "stop") || function(){}; - - e.preventDefault(); - - if(newval < minval || newval > maxval) - return; - - $t.slider('value', newval); - - slidee.call($t, null, { value: newval }); - stope.call($t, null, { value: newval }); - }); - }); - - // before or after - $t[o.where]($buttons); - - if(o.buttonset){ - $buttons.removeClass('ui-corner-right').removeClass('ui-corner-left').buttonset(); - $buttons.eq(0).addClass('ui-corner-left'); - $buttons.eq(1).addClass('ui-corner-right'); - } - - // adjust the width so we don't break the original layout - var bOuterWidth = $buttons.css({ - marginLeft: ((o.where == 'after' && !o.isRTL) || (o.where == 'before' && o.isRTL)? 10:0), - marginRight: ((o.where == 'before' && !o.isRTL) || (o.where == 'after' && o.isRTL)? 10:0) - }).outerWidth(true) + 5; - var tOuterWidth = $t.outerWidth(true); - $t.css('display','inline-block').width(tOuterWidth-bOuterWidth); - }); - } - }); - -})(jQuery); \ No newline at end of file diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui.css b/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui.css deleted file mode 100644 index 98d2e8f..0000000 --- a/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui.css +++ /dev/null @@ -1,1225 +0,0 @@ -/*! jQuery UI - v1.11.4 - 2016-05-04 -* http://jqueryui.com -* Includes: core.css, draggable.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, button.css, datepicker.css, dialog.css, menu.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css -* To view and modify this theme, visit http://jqueryui.com/themeroller/?ffDefault=Trebuchet%20MS%2CTahoma%2CVerdana%2CArial%2Csans-serif&fwDefault=bold&fsDefault=1.1em&cornerRadius=4px&bgColorHeader=f6a828&bgTextureHeader=gloss_wave&bgImgOpacityHeader=35&borderColorHeader=e78f08&fcHeader=ffffff&iconColorHeader=ffffff&bgColorContent=eeeeee&bgTextureContent=highlight_soft&bgImgOpacityContent=100&borderColorContent=dddddd&fcContent=333333&iconColorContent=222222&bgColorDefault=f6f6f6&bgTextureDefault=glass&bgImgOpacityDefault=100&borderColorDefault=cccccc&fcDefault=1c94c4&iconColorDefault=ef8c08&bgColorHover=fdf5ce&bgTextureHover=glass&bgImgOpacityHover=100&borderColorHover=fbcb09&fcHover=c77405&iconColorHover=ef8c08&bgColorActive=ffffff&bgTextureActive=glass&bgImgOpacityActive=65&borderColorActive=fbd850&fcActive=eb8f00&iconColorActive=ef8c08&bgColorHighlight=ffe45c&bgTextureHighlight=highlight_soft&bgImgOpacityHighlight=75&borderColorHighlight=fed22f&fcHighlight=363636&iconColorHighlight=228ef1&bgColorError=b81900&bgTextureError=diagonals_thick&bgImgOpacityError=18&borderColorError=cd0a0a&fcError=ffffff&iconColorError=ffd27a&bgColorOverlay=666666&bgTextureOverlay=diagonals_thick&bgImgOpacityOverlay=20&opacityOverlay=50&bgColorShadow=000000&bgTextureShadow=flat&bgImgOpacityShadow=10&opacityShadow=20&thicknessShadow=5px&offsetTopShadow=-5px&offsetLeftShadow=-5px&cornerRadiusShadow=5px -* Copyright jQuery Foundation and other contributors; Licensed MIT */ - -/* Layout helpers -----------------------------------*/ -.ui-helper-hidden { - display: none; -} -.ui-helper-hidden-accessible { - border: 0; - clip: rect(0 0 0 0); - height: 1px; - margin: -1px; - overflow: hidden; - padding: 0; - position: absolute; - width: 1px; -} -.ui-helper-reset { - margin: 0; - padding: 0; - border: 0; - outline: 0; - line-height: 1.3; - text-decoration: none; - font-size: 100%; - list-style: none; -} -.ui-helper-clearfix:before, -.ui-helper-clearfix:after { - content: ""; - display: table; - border-collapse: collapse; -} -.ui-helper-clearfix:after { - clear: both; -} -.ui-helper-clearfix { - min-height: 0; /* support: IE7 */ -} -.ui-helper-zfix { - width: 100%; - height: 100%; - top: 0; - left: 0; - position: absolute; - opacity: 0; - filter:Alpha(Opacity=0); /* support: IE8 */ -} - -.ui-front { - z-index: 100; -} - - -/* Interaction Cues -----------------------------------*/ -.ui-state-disabled { - cursor: default !important; -} - - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - display: block; - text-indent: -99999px; - overflow: hidden; - background-repeat: no-repeat; -} - - -/* Misc visuals -----------------------------------*/ - -/* Overlays */ -.ui-widget-overlay { - position: fixed; - top: 0; - left: 0; - width: 100%; - height: 100%; -} -.ui-draggable-handle { - -ms-touch-action: none; - touch-action: none; -} -.ui-resizable { - position: relative; -} -.ui-resizable-handle { - position: absolute; - font-size: 0.1px; - display: block; - -ms-touch-action: none; - touch-action: none; -} -.ui-resizable-disabled .ui-resizable-handle, -.ui-resizable-autohide .ui-resizable-handle { - display: none; -} -.ui-resizable-n { - cursor: n-resize; - height: 7px; - width: 100%; - top: -5px; - left: 0; -} -.ui-resizable-s { - cursor: s-resize; - height: 7px; - width: 100%; - bottom: -5px; - left: 0; -} -.ui-resizable-e { - cursor: e-resize; - width: 7px; - right: -5px; - top: 0; - height: 100%; -} -.ui-resizable-w { - cursor: w-resize; - width: 7px; - left: -5px; - top: 0; - height: 100%; -} -.ui-resizable-se { - cursor: se-resize; - width: 12px; - height: 12px; - right: 1px; - bottom: 1px; -} -.ui-resizable-sw { - cursor: sw-resize; - width: 9px; - height: 9px; - left: -5px; - bottom: -5px; -} -.ui-resizable-nw { - cursor: nw-resize; - width: 9px; - height: 9px; - left: -5px; - top: -5px; -} -.ui-resizable-ne { - cursor: ne-resize; - width: 9px; - height: 9px; - right: -5px; - top: -5px; -} -.ui-selectable { - -ms-touch-action: none; - touch-action: none; -} -.ui-selectable-helper { - position: absolute; - z-index: 100; - border: 1px dotted black; -} -.ui-sortable-handle { - -ms-touch-action: none; - touch-action: none; -} -.ui-accordion .ui-accordion-header { - display: block; - cursor: pointer; - position: relative; - margin: 2px 0 0 0; - padding: .5em .5em .5em .7em; - min-height: 0; /* support: IE7 */ - font-size: 100%; -} -.ui-accordion .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-icons .ui-accordion-icons { - padding-left: 2.2em; -} -.ui-accordion .ui-accordion-header .ui-accordion-header-icon { - position: absolute; - left: .5em; - top: 50%; - margin-top: -8px; -} -.ui-accordion .ui-accordion-content { - padding: 1em 2.2em; - border-top: 0; - overflow: auto; -} -.ui-autocomplete { - position: absolute; - top: 0; - left: 0; - cursor: default; -} -.ui-button { - display: inline-block; - position: relative; - padding: 0; - line-height: normal; - margin-right: .1em; - cursor: pointer; - vertical-align: middle; - text-align: center; - overflow: visible; /* removes extra width in IE */ -} -.ui-button, -.ui-button:link, -.ui-button:visited, -.ui-button:hover, -.ui-button:active { - text-decoration: none; -} -/* to make room for the icon, a width needs to be set here */ -.ui-button-icon-only { - width: 2.2em; -} -/* button elements seem to need a little more width */ -button.ui-button-icon-only { - width: 2.4em; -} -.ui-button-icons-only { - width: 3.4em; -} -button.ui-button-icons-only { - width: 3.7em; -} - -/* button text element */ -.ui-button .ui-button-text { - display: block; - line-height: normal; -} -.ui-button-text-only .ui-button-text { - padding: .4em 1em; -} -.ui-button-icon-only .ui-button-text, -.ui-button-icons-only .ui-button-text { - padding: .4em; - text-indent: -9999999px; -} -.ui-button-text-icon-primary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 1em .4em 2.1em; -} -.ui-button-text-icon-secondary .ui-button-text, -.ui-button-text-icons .ui-button-text { - padding: .4em 2.1em .4em 1em; -} -.ui-button-text-icons .ui-button-text { - padding-left: 2.1em; - padding-right: 2.1em; -} -/* no icon support for input elements, provide padding by default */ -input.ui-button { - padding: .4em 1em; -} - -/* button icon element(s) */ -.ui-button-icon-only .ui-icon, -.ui-button-text-icon-primary .ui-icon, -.ui-button-text-icon-secondary .ui-icon, -.ui-button-text-icons .ui-icon, -.ui-button-icons-only .ui-icon { - position: absolute; - top: 50%; - margin-top: -8px; -} -.ui-button-icon-only .ui-icon { - left: 50%; - margin-left: -8px; -} -.ui-button-text-icon-primary .ui-button-icon-primary, -.ui-button-text-icons .ui-button-icon-primary, -.ui-button-icons-only .ui-button-icon-primary { - left: .5em; -} -.ui-button-text-icon-secondary .ui-button-icon-secondary, -.ui-button-text-icons .ui-button-icon-secondary, -.ui-button-icons-only .ui-button-icon-secondary { - right: .5em; -} - -/* button sets */ -.ui-buttonset { - margin-right: 7px; -} -.ui-buttonset .ui-button { - margin-left: 0; - margin-right: -.3em; -} - -/* workarounds */ -/* reset extra padding in Firefox, see h5bp.com/l */ -input.ui-button::-moz-focus-inner, -button.ui-button::-moz-focus-inner { - border: 0; - padding: 0; -} -.ui-datepicker { - width: 17em; - padding: .2em .2em 0; - display: none; -} -.ui-datepicker .ui-datepicker-header { - position: relative; - padding: .2em 0; -} -.ui-datepicker .ui-datepicker-prev, -.ui-datepicker .ui-datepicker-next { - position: absolute; - top: 2px; - width: 1.8em; - height: 1.8em; -} -.ui-datepicker .ui-datepicker-prev-hover, -.ui-datepicker .ui-datepicker-next-hover { - top: 1px; -} -.ui-datepicker .ui-datepicker-prev { - left: 2px; -} -.ui-datepicker .ui-datepicker-next { - right: 2px; -} -.ui-datepicker .ui-datepicker-prev-hover { - left: 1px; -} -.ui-datepicker .ui-datepicker-next-hover { - right: 1px; -} -.ui-datepicker .ui-datepicker-prev span, -.ui-datepicker .ui-datepicker-next span { - display: block; - position: absolute; - left: 50%; - margin-left: -8px; - top: 50%; - margin-top: -8px; -} -.ui-datepicker .ui-datepicker-title { - margin: 0 2.3em; - line-height: 1.8em; - text-align: center; -} -.ui-datepicker .ui-datepicker-title select { - font-size: 1em; - margin: 1px 0; -} -.ui-datepicker select.ui-datepicker-month, -.ui-datepicker select.ui-datepicker-year { - width: 45%; -} -.ui-datepicker table { - width: 100%; - font-size: .9em; - border-collapse: collapse; - margin: 0 0 .4em; -} -.ui-datepicker th { - padding: .7em .3em; - text-align: center; - font-weight: bold; - border: 0; -} -.ui-datepicker td { - border: 0; - padding: 1px; -} -.ui-datepicker td span, -.ui-datepicker td a { - display: block; - padding: .2em; - text-align: right; - text-decoration: none; -} -.ui-datepicker .ui-datepicker-buttonpane { - background-image: none; - margin: .7em 0 0 0; - padding: 0 .2em; - border-left: 0; - border-right: 0; - border-bottom: 0; -} -.ui-datepicker .ui-datepicker-buttonpane button { - float: right; - margin: .5em .2em .4em; - cursor: pointer; - padding: .2em .6em .3em .6em; - width: auto; - overflow: visible; -} -.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current { - float: left; -} - -/* with multiple calendars */ -.ui-datepicker.ui-datepicker-multi { - width: auto; -} -.ui-datepicker-multi .ui-datepicker-group { - float: left; -} -.ui-datepicker-multi .ui-datepicker-group table { - width: 95%; - margin: 0 auto .4em; -} -.ui-datepicker-multi-2 .ui-datepicker-group { - width: 50%; -} -.ui-datepicker-multi-3 .ui-datepicker-group { - width: 33.3%; -} -.ui-datepicker-multi-4 .ui-datepicker-group { - width: 25%; -} -.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header { - border-left-width: 0; -} -.ui-datepicker-multi .ui-datepicker-buttonpane { - clear: left; -} -.ui-datepicker-row-break { - clear: both; - width: 100%; - font-size: 0; -} - -/* RTL support */ -.ui-datepicker-rtl { - direction: rtl; -} -.ui-datepicker-rtl .ui-datepicker-prev { - right: 2px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next { - left: 2px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-prev:hover { - right: 1px; - left: auto; -} -.ui-datepicker-rtl .ui-datepicker-next:hover { - left: 1px; - right: auto; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane { - clear: right; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button { - float: left; -} -.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current, -.ui-datepicker-rtl .ui-datepicker-group { - float: right; -} -.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header, -.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header { - border-right-width: 0; - border-left-width: 1px; -} -.ui-dialog { - overflow: hidden; - position: absolute; - top: 0; - left: 0; - padding: .2em; - outline: 0; -} -.ui-dialog .ui-dialog-titlebar { - padding: .4em 1em; - position: relative; -} -.ui-dialog .ui-dialog-title { - float: left; - margin: .1em 0; - white-space: nowrap; - width: 90%; - overflow: hidden; - text-overflow: ellipsis; -} -.ui-dialog .ui-dialog-titlebar-close { - position: absolute; - right: .3em; - top: 50%; - width: 20px; - margin: -10px 0 0 0; - padding: 1px; - height: 20px; -} -.ui-dialog .ui-dialog-content { - position: relative; - border: 0; - padding: .5em 1em; - background: none; - overflow: auto; -} -.ui-dialog .ui-dialog-buttonpane { - text-align: left; - border-width: 1px 0 0 0; - background-image: none; - margin-top: .5em; - padding: .3em 1em .5em .4em; -} -.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset { - float: right; -} -.ui-dialog .ui-dialog-buttonpane button { - margin: .5em .4em .5em 0; - cursor: pointer; -} -.ui-dialog .ui-resizable-se { - width: 12px; - height: 12px; - right: -5px; - bottom: -5px; - background-position: 16px 16px; -} -.ui-draggable .ui-dialog-titlebar { - cursor: move; -} -.ui-menu { - list-style: none; - padding: 0; - margin: 0; - display: block; - outline: none; -} -.ui-menu .ui-menu { - position: absolute; -} -.ui-menu .ui-menu-item { - position: relative; - margin: 0; - padding: 3px 1em 3px .4em; - cursor: pointer; - min-height: 0; /* support: IE7 */ - /* support: IE10, see #8844 */ - list-style-image: url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7"); -} -.ui-menu .ui-menu-divider { - margin: 5px 0; - height: 0; - font-size: 0; - line-height: 0; - border-width: 1px 0 0 0; -} -.ui-menu .ui-state-focus, -.ui-menu .ui-state-active { - margin: -1px; -} - -/* icon support */ -.ui-menu-icons { - position: relative; -} -.ui-menu-icons .ui-menu-item { - padding-left: 2em; -} - -/* left-aligned */ -.ui-menu .ui-icon { - position: absolute; - top: 0; - bottom: 0; - left: .2em; - margin: auto 0; -} - -/* right-aligned */ -.ui-menu .ui-menu-icon { - left: auto; - right: 0; -} -.ui-progressbar { - height: 2em; - text-align: left; - overflow: hidden; -} -.ui-progressbar .ui-progressbar-value { - margin: -1px; - height: 100%; -} -.ui-progressbar .ui-progressbar-overlay { - background: url("data:image/gif;base64,R0lGODlhKAAoAIABAAAAAP///yH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAQABACwAAAAAKAAoAAACkYwNqXrdC52DS06a7MFZI+4FHBCKoDeWKXqymPqGqxvJrXZbMx7Ttc+w9XgU2FB3lOyQRWET2IFGiU9m1frDVpxZZc6bfHwv4c1YXP6k1Vdy292Fb6UkuvFtXpvWSzA+HycXJHUXiGYIiMg2R6W459gnWGfHNdjIqDWVqemH2ekpObkpOlppWUqZiqr6edqqWQAAIfkECQEAAQAsAAAAACgAKAAAApSMgZnGfaqcg1E2uuzDmmHUBR8Qil95hiPKqWn3aqtLsS18y7G1SzNeowWBENtQd+T1JktP05nzPTdJZlR6vUxNWWjV+vUWhWNkWFwxl9VpZRedYcflIOLafaa28XdsH/ynlcc1uPVDZxQIR0K25+cICCmoqCe5mGhZOfeYSUh5yJcJyrkZWWpaR8doJ2o4NYq62lAAACH5BAkBAAEALAAAAAAoACgAAAKVDI4Yy22ZnINRNqosw0Bv7i1gyHUkFj7oSaWlu3ovC8GxNso5fluz3qLVhBVeT/Lz7ZTHyxL5dDalQWPVOsQWtRnuwXaFTj9jVVh8pma9JjZ4zYSj5ZOyma7uuolffh+IR5aW97cHuBUXKGKXlKjn+DiHWMcYJah4N0lYCMlJOXipGRr5qdgoSTrqWSq6WFl2ypoaUAAAIfkECQEAAQAsAAAAACgAKAAAApaEb6HLgd/iO7FNWtcFWe+ufODGjRfoiJ2akShbueb0wtI50zm02pbvwfWEMWBQ1zKGlLIhskiEPm9R6vRXxV4ZzWT2yHOGpWMyorblKlNp8HmHEb/lCXjcW7bmtXP8Xt229OVWR1fod2eWqNfHuMjXCPkIGNileOiImVmCOEmoSfn3yXlJWmoHGhqp6ilYuWYpmTqKUgAAIfkECQEAAQAsAAAAACgAKAAAApiEH6kb58biQ3FNWtMFWW3eNVcojuFGfqnZqSebuS06w5V80/X02pKe8zFwP6EFWOT1lDFk8rGERh1TTNOocQ61Hm4Xm2VexUHpzjymViHrFbiELsefVrn6XKfnt2Q9G/+Xdie499XHd2g4h7ioOGhXGJboGAnXSBnoBwKYyfioubZJ2Hn0RuRZaflZOil56Zp6iioKSXpUAAAh+QQJAQABACwAAAAAKAAoAAACkoQRqRvnxuI7kU1a1UU5bd5tnSeOZXhmn5lWK3qNTWvRdQxP8qvaC+/yaYQzXO7BMvaUEmJRd3TsiMAgswmNYrSgZdYrTX6tSHGZO73ezuAw2uxuQ+BbeZfMxsexY35+/Qe4J1inV0g4x3WHuMhIl2jXOKT2Q+VU5fgoSUI52VfZyfkJGkha6jmY+aaYdirq+lQAACH5BAkBAAEALAAAAAAoACgAAAKWBIKpYe0L3YNKToqswUlvznigd4wiR4KhZrKt9Upqip61i9E3vMvxRdHlbEFiEXfk9YARYxOZZD6VQ2pUunBmtRXo1Lf8hMVVcNl8JafV38aM2/Fu5V16Bn63r6xt97j09+MXSFi4BniGFae3hzbH9+hYBzkpuUh5aZmHuanZOZgIuvbGiNeomCnaxxap2upaCZsq+1kAACH5BAkBAAEALAAAAAAoACgAAAKXjI8By5zf4kOxTVrXNVlv1X0d8IGZGKLnNpYtm8Lr9cqVeuOSvfOW79D9aDHizNhDJidFZhNydEahOaDH6nomtJjp1tutKoNWkvA6JqfRVLHU/QUfau9l2x7G54d1fl995xcIGAdXqMfBNadoYrhH+Mg2KBlpVpbluCiXmMnZ2Sh4GBqJ+ckIOqqJ6LmKSllZmsoq6wpQAAAh+QQJAQABACwAAAAAKAAoAAAClYx/oLvoxuJDkU1a1YUZbJ59nSd2ZXhWqbRa2/gF8Gu2DY3iqs7yrq+xBYEkYvFSM8aSSObE+ZgRl1BHFZNr7pRCavZ5BW2142hY3AN/zWtsmf12p9XxxFl2lpLn1rseztfXZjdIWIf2s5dItwjYKBgo9yg5pHgzJXTEeGlZuenpyPmpGQoKOWkYmSpaSnqKileI2FAAACH5BAkBAAEALAAAAAAoACgAAAKVjB+gu+jG4kORTVrVhRlsnn2dJ3ZleFaptFrb+CXmO9OozeL5VfP99HvAWhpiUdcwkpBH3825AwYdU8xTqlLGhtCosArKMpvfa1mMRae9VvWZfeB2XfPkeLmm18lUcBj+p5dnN8jXZ3YIGEhYuOUn45aoCDkp16hl5IjYJvjWKcnoGQpqyPlpOhr3aElaqrq56Bq7VAAAOw=="); - height: 100%; - filter: alpha(opacity=25); /* support: IE8 */ - opacity: 0.25; -} -.ui-progressbar-indeterminate .ui-progressbar-value { - background-image: none; -} -.ui-selectmenu-menu { - padding: 0; - margin: 0; - position: absolute; - top: 0; - left: 0; - display: none; -} -.ui-selectmenu-menu .ui-menu { - overflow: auto; - /* Support: IE7 */ - overflow-x: hidden; - padding-bottom: 1px; -} -.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup { - font-size: 1em; - font-weight: bold; - line-height: 1.5; - padding: 2px 0.4em; - margin: 0.5em 0 0 0; - height: auto; - border: 0; -} -.ui-selectmenu-open { - display: block; -} -.ui-selectmenu-button { - display: inline-block; - overflow: hidden; - position: relative; - text-decoration: none; - cursor: pointer; -} -.ui-selectmenu-button span.ui-icon { - right: 0.5em; - left: auto; - margin-top: -8px; - position: absolute; - top: 50%; -} -.ui-selectmenu-button span.ui-selectmenu-text { - text-align: left; - padding: 0.4em 2.1em 0.4em 1em; - display: block; - line-height: 1.4; - overflow: hidden; - text-overflow: ellipsis; - white-space: nowrap; -} -.ui-slider { - position: relative; - text-align: left; -} -.ui-slider .ui-slider-handle { - position: absolute; - z-index: 2; - width: 1.2em; - height: 1.2em; - cursor: default; - -ms-touch-action: none; - touch-action: none; -} -.ui-slider .ui-slider-range { - position: absolute; - z-index: 1; - font-size: .7em; - display: block; - border: 0; - background-position: 0 0; -} - -/* support: IE8 - See #6727 */ -.ui-slider.ui-state-disabled .ui-slider-handle, -.ui-slider.ui-state-disabled .ui-slider-range { - filter: inherit; -} - -.ui-slider-horizontal { - height: .8em; -} -.ui-slider-horizontal .ui-slider-handle { - top: -.3em; - margin-left: -.6em; -} -.ui-slider-horizontal .ui-slider-range { - top: 0; - height: 100%; -} -.ui-slider-horizontal .ui-slider-range-min { - left: 0; -} -.ui-slider-horizontal .ui-slider-range-max { - right: 0; -} - -.ui-slider-vertical { - width: .8em; - height: 100px; -} -.ui-slider-vertical .ui-slider-handle { - left: -.3em; - margin-left: 0; - margin-bottom: -.6em; -} -.ui-slider-vertical .ui-slider-range { - left: 0; - width: 100%; -} -.ui-slider-vertical .ui-slider-range-min { - bottom: 0; -} -.ui-slider-vertical .ui-slider-range-max { - top: 0; -} -.ui-spinner { - position: relative; - display: inline-block; - overflow: hidden; - padding: 0; - vertical-align: middle; -} -.ui-spinner-input { - border: none; - background: none; - color: inherit; - padding: 0; - margin: .2em 0; - vertical-align: middle; - margin-left: .4em; - margin-right: 22px; -} -.ui-spinner-button { - width: 16px; - height: 50%; - font-size: .5em; - padding: 0; - margin: 0; - text-align: center; - position: absolute; - cursor: default; - display: block; - overflow: hidden; - right: 0; -} -/* more specificity required here to override default borders */ -.ui-spinner a.ui-spinner-button { - border-top: none; - border-bottom: none; - border-right: none; -} -/* vertically center icon */ -.ui-spinner .ui-icon { - position: absolute; - margin-top: -8px; - top: 50%; - left: 0; -} -.ui-spinner-up { - top: 0; -} -.ui-spinner-down { - bottom: 0; -} - -/* TR overrides */ -.ui-spinner .ui-icon-triangle-1-s { - /* need to fix icons sprite */ - background-position: -65px -16px; -} -.ui-tabs { - position: relative;/* position: relative prevents IE scroll bug (element with position: relative inside container with overflow: auto appear as "fixed") */ - padding: .2em; -} -.ui-tabs .ui-tabs-nav { - margin: 0; - padding: .2em .2em 0; -} -.ui-tabs .ui-tabs-nav li { - list-style: none; - float: left; - position: relative; - top: 0; - margin: 1px .2em 0 0; - border-bottom-width: 0; - padding: 0; - white-space: nowrap; -} -.ui-tabs .ui-tabs-nav .ui-tabs-anchor { - float: left; - padding: .5em 1em; - text-decoration: none; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active { - margin-bottom: -1px; - padding-bottom: 1px; -} -.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor, -.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor, -.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor { - cursor: text; -} -.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor { - cursor: pointer; -} -.ui-tabs .ui-tabs-panel { - display: block; - border-width: 0; - padding: 1em 1.4em; - background: none; -} -.ui-tooltip { - padding: 8px; - position: absolute; - z-index: 9999; - max-width: 300px; - -webkit-box-shadow: 0 0 5px #aaa; - box-shadow: 0 0 5px #aaa; -} -body .ui-tooltip { - border-width: 2px; -} - -/* Component containers -----------------------------------*/ -.ui-widget { - font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; - font-size: 1.1em; -} -.ui-widget .ui-widget { - font-size: 1em; -} -.ui-widget input, -.ui-widget select, -.ui-widget textarea, -.ui-widget button { - font-family: Trebuchet MS,Tahoma,Verdana,Arial,sans-serif; - font-size: 1em; -} -.ui-widget-content { - border: 1px solid #dddddd; - background: #eeeeee url("images/ui-bg_highlight-soft_100_eeeeee_1x100.png") 50% top repeat-x; - color: #333333; -} -.ui-widget-content a { - color: #333333; -} -.ui-widget-header { - border: 1px solid #e78f08; - background: #f6a828 url("images/ui-bg_gloss-wave_35_f6a828_500x100.png") 50% 50% repeat-x; - color: #ffffff; - font-weight: bold; -} -.ui-widget-header a { - color: #ffffff; -} - -/* Interaction states -----------------------------------*/ -.ui-state-default, -.ui-widget-content .ui-state-default, -.ui-widget-header .ui-state-default { - border: 1px solid #cccccc; - background: #f6f6f6 url("images/ui-bg_glass_100_f6f6f6_1x400.png") 50% 50% repeat-x; - font-weight: bold; - color: #1c94c4; -} -.ui-state-default a, -.ui-state-default a:link, -.ui-state-default a:visited { - color: #1c94c4; - text-decoration: none; -} -.ui-state-hover, -.ui-widget-content .ui-state-hover, -.ui-widget-header .ui-state-hover, -.ui-state-focus, -.ui-widget-content .ui-state-focus, -.ui-widget-header .ui-state-focus { - border: 1px solid #fbcb09; - background: #fdf5ce url("images/ui-bg_glass_100_fdf5ce_1x400.png") 50% 50% repeat-x; - font-weight: bold; - color: #c77405; -} -.ui-state-hover a, -.ui-state-hover a:hover, -.ui-state-hover a:link, -.ui-state-hover a:visited, -.ui-state-focus a, -.ui-state-focus a:hover, -.ui-state-focus a:link, -.ui-state-focus a:visited { - color: #c77405; - text-decoration: none; -} -.ui-state-active, -.ui-widget-content .ui-state-active, -.ui-widget-header .ui-state-active { - border: 1px solid #fbd850; - background: #ffffff url("images/ui-bg_glass_65_ffffff_1x400.png") 50% 50% repeat-x; - font-weight: bold; - color: #eb8f00; -} -.ui-state-active a, -.ui-state-active a:link, -.ui-state-active a:visited { - color: #eb8f00; - text-decoration: none; -} - -/* Interaction Cues -----------------------------------*/ -.ui-state-highlight, -.ui-widget-content .ui-state-highlight, -.ui-widget-header .ui-state-highlight { - border: 1px solid #fed22f; - background: #ffe45c url("images/ui-bg_highlight-soft_75_ffe45c_1x100.png") 50% top repeat-x; - color: #363636; -} -.ui-state-highlight a, -.ui-widget-content .ui-state-highlight a, -.ui-widget-header .ui-state-highlight a { - color: #363636; -} -.ui-state-error, -.ui-widget-content .ui-state-error, -.ui-widget-header .ui-state-error { - border: 1px solid #cd0a0a; - background: #b81900 url("images/ui-bg_diagonals-thick_18_b81900_40x40.png") 50% 50% repeat; - color: #ffffff; -} -.ui-state-error a, -.ui-widget-content .ui-state-error a, -.ui-widget-header .ui-state-error a { - color: #ffffff; -} -.ui-state-error-text, -.ui-widget-content .ui-state-error-text, -.ui-widget-header .ui-state-error-text { - color: #ffffff; -} -.ui-priority-primary, -.ui-widget-content .ui-priority-primary, -.ui-widget-header .ui-priority-primary { - font-weight: bold; -} -.ui-priority-secondary, -.ui-widget-content .ui-priority-secondary, -.ui-widget-header .ui-priority-secondary { - opacity: .7; - filter:Alpha(Opacity=70); /* support: IE8 */ - font-weight: normal; -} -.ui-state-disabled, -.ui-widget-content .ui-state-disabled, -.ui-widget-header .ui-state-disabled { - opacity: .35; - filter:Alpha(Opacity=35); /* support: IE8 */ - background-image: none; -} -.ui-state-disabled .ui-icon { - filter:Alpha(Opacity=35); /* support: IE8 - See #6059 */ -} - -/* Icons -----------------------------------*/ - -/* states and images */ -.ui-icon { - width: 16px; - height: 16px; -} -.ui-icon, -.ui-widget-content .ui-icon { - background-image: url("images/ui-icons_222222_256x240.png"); -} -.ui-widget-header .ui-icon { - background-image: url("images/ui-icons_ffffff_256x240.png"); -} -.ui-state-default .ui-icon { - background-image: url("images/ui-icons_ef8c08_256x240.png"); -} -.ui-state-hover .ui-icon, -.ui-state-focus .ui-icon { - background-image: url("images/ui-icons_ef8c08_256x240.png"); -} -.ui-state-active .ui-icon { - background-image: url("images/ui-icons_ef8c08_256x240.png"); -} -.ui-state-highlight .ui-icon { - background-image: url("images/ui-icons_228ef1_256x240.png"); -} -.ui-state-error .ui-icon, -.ui-state-error-text .ui-icon { - background-image: url("images/ui-icons_ffd27a_256x240.png"); -} - -/* positioning */ -.ui-icon-blank { background-position: 16px 16px; } -.ui-icon-carat-1-n { background-position: 0 0; } -.ui-icon-carat-1-ne { background-position: -16px 0; } -.ui-icon-carat-1-e { background-position: -32px 0; } -.ui-icon-carat-1-se { background-position: -48px 0; } -.ui-icon-carat-1-s { background-position: -64px 0; } -.ui-icon-carat-1-sw { background-position: -80px 0; } -.ui-icon-carat-1-w { background-position: -96px 0; } -.ui-icon-carat-1-nw { background-position: -112px 0; } -.ui-icon-carat-2-n-s { background-position: -128px 0; } -.ui-icon-carat-2-e-w { background-position: -144px 0; } -.ui-icon-triangle-1-n { background-position: 0 -16px; } -.ui-icon-triangle-1-ne { background-position: -16px -16px; } -.ui-icon-triangle-1-e { background-position: -32px -16px; } -.ui-icon-triangle-1-se { background-position: -48px -16px; } -.ui-icon-triangle-1-s { background-position: -64px -16px; } -.ui-icon-triangle-1-sw { background-position: -80px -16px; } -.ui-icon-triangle-1-w { background-position: -96px -16px; } -.ui-icon-triangle-1-nw { background-position: -112px -16px; } -.ui-icon-triangle-2-n-s { background-position: -128px -16px; } -.ui-icon-triangle-2-e-w { background-position: -144px -16px; } -.ui-icon-arrow-1-n { background-position: 0 -32px; } -.ui-icon-arrow-1-ne { background-position: -16px -32px; } -.ui-icon-arrow-1-e { background-position: -32px -32px; } -.ui-icon-arrow-1-se { background-position: -48px -32px; } -.ui-icon-arrow-1-s { background-position: -64px -32px; } -.ui-icon-arrow-1-sw { background-position: -80px -32px; } -.ui-icon-arrow-1-w { background-position: -96px -32px; } -.ui-icon-arrow-1-nw { background-position: -112px -32px; } -.ui-icon-arrow-2-n-s { background-position: -128px -32px; } -.ui-icon-arrow-2-ne-sw { background-position: -144px -32px; } -.ui-icon-arrow-2-e-w { background-position: -160px -32px; } -.ui-icon-arrow-2-se-nw { background-position: -176px -32px; } -.ui-icon-arrowstop-1-n { background-position: -192px -32px; } -.ui-icon-arrowstop-1-e { background-position: -208px -32px; } -.ui-icon-arrowstop-1-s { background-position: -224px -32px; } -.ui-icon-arrowstop-1-w { background-position: -240px -32px; } -.ui-icon-arrowthick-1-n { background-position: 0 -48px; } -.ui-icon-arrowthick-1-ne { background-position: -16px -48px; } -.ui-icon-arrowthick-1-e { background-position: -32px -48px; } -.ui-icon-arrowthick-1-se { background-position: -48px -48px; } -.ui-icon-arrowthick-1-s { background-position: -64px -48px; } -.ui-icon-arrowthick-1-sw { background-position: -80px -48px; } -.ui-icon-arrowthick-1-w { background-position: -96px -48px; } -.ui-icon-arrowthick-1-nw { background-position: -112px -48px; } -.ui-icon-arrowthick-2-n-s { background-position: -128px -48px; } -.ui-icon-arrowthick-2-ne-sw { background-position: -144px -48px; } -.ui-icon-arrowthick-2-e-w { background-position: -160px -48px; } -.ui-icon-arrowthick-2-se-nw { background-position: -176px -48px; } -.ui-icon-arrowthickstop-1-n { background-position: -192px -48px; } -.ui-icon-arrowthickstop-1-e { background-position: -208px -48px; } -.ui-icon-arrowthickstop-1-s { background-position: -224px -48px; } -.ui-icon-arrowthickstop-1-w { background-position: -240px -48px; } -.ui-icon-arrowreturnthick-1-w { background-position: 0 -64px; } -.ui-icon-arrowreturnthick-1-n { background-position: -16px -64px; } -.ui-icon-arrowreturnthick-1-e { background-position: -32px -64px; } -.ui-icon-arrowreturnthick-1-s { background-position: -48px -64px; } -.ui-icon-arrowreturn-1-w { background-position: -64px -64px; } -.ui-icon-arrowreturn-1-n { background-position: -80px -64px; } -.ui-icon-arrowreturn-1-e { background-position: -96px -64px; } -.ui-icon-arrowreturn-1-s { background-position: -112px -64px; } -.ui-icon-arrowrefresh-1-w { background-position: -128px -64px; } -.ui-icon-arrowrefresh-1-n { background-position: -144px -64px; } -.ui-icon-arrowrefresh-1-e { background-position: -160px -64px; } -.ui-icon-arrowrefresh-1-s { background-position: -176px -64px; } -.ui-icon-arrow-4 { background-position: 0 -80px; } -.ui-icon-arrow-4-diag { background-position: -16px -80px; } -.ui-icon-extlink { background-position: -32px -80px; } -.ui-icon-newwin { background-position: -48px -80px; } -.ui-icon-refresh { background-position: -64px -80px; } -.ui-icon-shuffle { background-position: -80px -80px; } -.ui-icon-transfer-e-w { background-position: -96px -80px; } -.ui-icon-transferthick-e-w { background-position: -112px -80px; } -.ui-icon-folder-collapsed { background-position: 0 -96px; } -.ui-icon-folder-open { background-position: -16px -96px; } -.ui-icon-document { background-position: -32px -96px; } -.ui-icon-document-b { background-position: -48px -96px; } -.ui-icon-note { background-position: -64px -96px; } -.ui-icon-mail-closed { background-position: -80px -96px; } -.ui-icon-mail-open { background-position: -96px -96px; } -.ui-icon-suitcase { background-position: -112px -96px; } -.ui-icon-comment { background-position: -128px -96px; } -.ui-icon-person { background-position: -144px -96px; } -.ui-icon-print { background-position: -160px -96px; } -.ui-icon-trash { background-position: -176px -96px; } -.ui-icon-locked { background-position: -192px -96px; } -.ui-icon-unlocked { background-position: -208px -96px; } -.ui-icon-bookmark { background-position: -224px -96px; } -.ui-icon-tag { background-position: -240px -96px; } -.ui-icon-home { background-position: 0 -112px; } -.ui-icon-flag { background-position: -16px -112px; } -.ui-icon-calendar { background-position: -32px -112px; } -.ui-icon-cart { background-position: -48px -112px; } -.ui-icon-pencil { background-position: -64px -112px; } -.ui-icon-clock { background-position: -80px -112px; } -.ui-icon-disk { background-position: -96px -112px; } -.ui-icon-calculator { background-position: -112px -112px; } -.ui-icon-zoomin { background-position: -128px -112px; } -.ui-icon-zoomout { background-position: -144px -112px; } -.ui-icon-search { background-position: -160px -112px; } -.ui-icon-wrench { background-position: -176px -112px; } -.ui-icon-gear { background-position: -192px -112px; } -.ui-icon-heart { background-position: -208px -112px; } -.ui-icon-star { background-position: -224px -112px; } -.ui-icon-link { background-position: -240px -112px; } -.ui-icon-cancel { background-position: 0 -128px; } -.ui-icon-plus { background-position: -16px -128px; } -.ui-icon-plusthick { background-position: -32px -128px; } -.ui-icon-minus { background-position: -48px -128px; } -.ui-icon-minusthick { background-position: -64px -128px; } -.ui-icon-close { background-position: -80px -128px; } -.ui-icon-closethick { background-position: -96px -128px; } -.ui-icon-key { background-position: -112px -128px; } -.ui-icon-lightbulb { background-position: -128px -128px; } -.ui-icon-scissors { background-position: -144px -128px; } -.ui-icon-clipboard { background-position: -160px -128px; } -.ui-icon-copy { background-position: -176px -128px; } -.ui-icon-contact { background-position: -192px -128px; } -.ui-icon-image { background-position: -208px -128px; } -.ui-icon-video { background-position: -224px -128px; } -.ui-icon-script { background-position: -240px -128px; } -.ui-icon-alert { background-position: 0 -144px; } -.ui-icon-info { background-position: -16px -144px; } -.ui-icon-notice { background-position: -32px -144px; } -.ui-icon-help { background-position: -48px -144px; } -.ui-icon-check { background-position: -64px -144px; } -.ui-icon-bullet { background-position: -80px -144px; } -.ui-icon-radio-on { background-position: -96px -144px; } -.ui-icon-radio-off { background-position: -112px -144px; } -.ui-icon-pin-w { background-position: -128px -144px; } -.ui-icon-pin-s { background-position: -144px -144px; } -.ui-icon-play { background-position: 0 -160px; } -.ui-icon-pause { background-position: -16px -160px; } -.ui-icon-seek-next { background-position: -32px -160px; } -.ui-icon-seek-prev { background-position: -48px -160px; } -.ui-icon-seek-end { background-position: -64px -160px; } -.ui-icon-seek-start { background-position: -80px -160px; } -/* ui-icon-seek-first is deprecated, use ui-icon-seek-start instead */ -.ui-icon-seek-first { background-position: -80px -160px; } -.ui-icon-stop { background-position: -96px -160px; } -.ui-icon-eject { background-position: -112px -160px; } -.ui-icon-volume-off { background-position: -128px -160px; } -.ui-icon-volume-on { background-position: -144px -160px; } -.ui-icon-power { background-position: 0 -176px; } -.ui-icon-signal-diag { background-position: -16px -176px; } -.ui-icon-signal { background-position: -32px -176px; } -.ui-icon-battery-0 { background-position: -48px -176px; } -.ui-icon-battery-1 { background-position: -64px -176px; } -.ui-icon-battery-2 { background-position: -80px -176px; } -.ui-icon-battery-3 { background-position: -96px -176px; } -.ui-icon-circle-plus { background-position: 0 -192px; } -.ui-icon-circle-minus { background-position: -16px -192px; } -.ui-icon-circle-close { background-position: -32px -192px; } -.ui-icon-circle-triangle-e { background-position: -48px -192px; } -.ui-icon-circle-triangle-s { background-position: -64px -192px; } -.ui-icon-circle-triangle-w { background-position: -80px -192px; } -.ui-icon-circle-triangle-n { background-position: -96px -192px; } -.ui-icon-circle-arrow-e { background-position: -112px -192px; } -.ui-icon-circle-arrow-s { background-position: -128px -192px; } -.ui-icon-circle-arrow-w { background-position: -144px -192px; } -.ui-icon-circle-arrow-n { background-position: -160px -192px; } -.ui-icon-circle-zoomin { background-position: -176px -192px; } -.ui-icon-circle-zoomout { background-position: -192px -192px; } -.ui-icon-circle-check { background-position: -208px -192px; } -.ui-icon-circlesmall-plus { background-position: 0 -208px; } -.ui-icon-circlesmall-minus { background-position: -16px -208px; } -.ui-icon-circlesmall-close { background-position: -32px -208px; } -.ui-icon-squaresmall-plus { background-position: -48px -208px; } -.ui-icon-squaresmall-minus { background-position: -64px -208px; } -.ui-icon-squaresmall-close { background-position: -80px -208px; } -.ui-icon-grip-dotted-vertical { background-position: 0 -224px; } -.ui-icon-grip-dotted-horizontal { background-position: -16px -224px; } -.ui-icon-grip-solid-vertical { background-position: -32px -224px; } -.ui-icon-grip-solid-horizontal { background-position: -48px -224px; } -.ui-icon-gripsmall-diagonal-se { background-position: -64px -224px; } -.ui-icon-grip-diagonal-se { background-position: -80px -224px; } - - -/* Misc visuals -----------------------------------*/ - -/* Corner radius */ -.ui-corner-all, -.ui-corner-top, -.ui-corner-left, -.ui-corner-tl { - border-top-left-radius: 4px; -} -.ui-corner-all, -.ui-corner-top, -.ui-corner-right, -.ui-corner-tr { - border-top-right-radius: 4px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-left, -.ui-corner-bl { - border-bottom-left-radius: 4px; -} -.ui-corner-all, -.ui-corner-bottom, -.ui-corner-right, -.ui-corner-br { - border-bottom-right-radius: 4px; -} - -/* Overlays */ -.ui-widget-overlay { - background: #666666 url("images/ui-bg_diagonals-thick_20_666666_40x40.png") 50% 50% repeat; - opacity: .5; - filter: Alpha(Opacity=50); /* support: IE8 */ -} -.ui-widget-shadow { - margin: -5px 0 0 -5px; - padding: 5px; - background: #000000; - opacity: .2; - filter: Alpha(Opacity=20); /* support: IE8 */ - border-radius: 5px; -} diff --git a/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui.js b/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui.js deleted file mode 100644 index bad5927..0000000 --- a/examples/GreetingBot/src/web/libs/jquery-ui/jquery-ui.js +++ /dev/null @@ -1,16617 +0,0 @@ -/*! jQuery UI - v1.11.4 - 2016-05-01 -* http://jqueryui.com -* Includes: core.js, widget.js, mouse.js, position.js, draggable.js, droppable.js, resizable.js, selectable.js, sortable.js, accordion.js, autocomplete.js, button.js, datepicker.js, dialog.js, menu.js, progressbar.js, selectmenu.js, slider.js, spinner.js, tabs.js, tooltip.js, effect.js, effect-blind.js, effect-bounce.js, effect-clip.js, effect-drop.js, effect-explode.js, effect-fade.js, effect-fold.js, effect-highlight.js, effect-puff.js, effect-pulsate.js, effect-scale.js, effect-shake.js, effect-size.js, effect-slide.js, effect-transfer.js -* Copyright jQuery Foundation and other contributors; Licensed MIT */ - -(function( factory ) { - if ( typeof define === "function" && define.amd ) { - - // AMD. Register as an anonymous module. - define([ "jquery" ], factory ); - } else { - - // Browser globals - factory( jQuery ); - } -}(function( $ ) { -/*! - * jQuery UI Core 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/category/ui-core/ - */ - - -// $.ui might exist from components with no dependencies, e.g., $.ui.position -$.ui = $.ui || {}; - -$.extend( $.ui, { - version: "1.11.4", - - keyCode: { - BACKSPACE: 8, - COMMA: 188, - DELETE: 46, - DOWN: 40, - END: 35, - ENTER: 13, - ESCAPE: 27, - HOME: 36, - LEFT: 37, - PAGE_DOWN: 34, - PAGE_UP: 33, - PERIOD: 190, - RIGHT: 39, - SPACE: 32, - TAB: 9, - UP: 38 - } -}); - -// plugins -$.fn.extend({ - scrollParent: function( includeHidden ) { - var position = this.css( "position" ), - excludeStaticParent = position === "absolute", - overflowRegex = includeHidden ? /(auto|scroll|hidden)/ : /(auto|scroll)/, - scrollParent = this.parents().filter( function() { - var parent = $( this ); - if ( excludeStaticParent && parent.css( "position" ) === "static" ) { - return false; - } - return overflowRegex.test( parent.css( "overflow" ) + parent.css( "overflow-y" ) + parent.css( "overflow-x" ) ); - }).eq( 0 ); - - return position === "fixed" || !scrollParent.length ? $( this[ 0 ].ownerDocument || document ) : scrollParent; - }, - - uniqueId: (function() { - var uuid = 0; - - return function() { - return this.each(function() { - if ( !this.id ) { - this.id = "ui-id-" + ( ++uuid ); - } - }); - }; - })(), - - removeUniqueId: function() { - return this.each(function() { - if ( /^ui-id-\d+$/.test( this.id ) ) { - $( this ).removeAttr( "id" ); - } - }); - } -}); - -// selectors -function focusable( element, isTabIndexNotNaN ) { - var map, mapName, img, - nodeName = element.nodeName.toLowerCase(); - if ( "area" === nodeName ) { - map = element.parentNode; - mapName = map.name; - if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) { - return false; - } - img = $( "img[usemap='#" + mapName + "']" )[ 0 ]; - return !!img && visible( img ); - } - return ( /^(input|select|textarea|button|object)$/.test( nodeName ) ? - !element.disabled : - "a" === nodeName ? - element.href || isTabIndexNotNaN : - isTabIndexNotNaN) && - // the element and all of its ancestors must be visible - visible( element ); -} - -function visible( element ) { - return $.expr.filters.visible( element ) && - !$( element ).parents().addBack().filter(function() { - return $.css( this, "visibility" ) === "hidden"; - }).length; -} - -$.extend( $.expr[ ":" ], { - data: $.expr.createPseudo ? - $.expr.createPseudo(function( dataName ) { - return function( elem ) { - return !!$.data( elem, dataName ); - }; - }) : - // support: jQuery <1.8 - function( elem, i, match ) { - return !!$.data( elem, match[ 3 ] ); - }, - - focusable: function( element ) { - return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) ); - }, - - tabbable: function( element ) { - var tabIndex = $.attr( element, "tabindex" ), - isTabIndexNaN = isNaN( tabIndex ); - return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN ); - } -}); - -// support: jQuery <1.8 -if ( !$( "" ).outerWidth( 1 ).jquery ) { - $.each( [ "Width", "Height" ], function( i, name ) { - var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ], - type = name.toLowerCase(), - orig = { - innerWidth: $.fn.innerWidth, - innerHeight: $.fn.innerHeight, - outerWidth: $.fn.outerWidth, - outerHeight: $.fn.outerHeight - }; - - function reduce( elem, size, border, margin ) { - $.each( side, function() { - size -= parseFloat( $.css( elem, "padding" + this ) ) || 0; - if ( border ) { - size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0; - } - if ( margin ) { - size -= parseFloat( $.css( elem, "margin" + this ) ) || 0; - } - }); - return size; - } - - $.fn[ "inner" + name ] = function( size ) { - if ( size === undefined ) { - return orig[ "inner" + name ].call( this ); - } - - return this.each(function() { - $( this ).css( type, reduce( this, size ) + "px" ); - }); - }; - - $.fn[ "outer" + name] = function( size, margin ) { - if ( typeof size !== "number" ) { - return orig[ "outer" + name ].call( this, size ); - } - - return this.each(function() { - $( this).css( type, reduce( this, size, true, margin ) + "px" ); - }); - }; - }); -} - -// support: jQuery <1.8 -if ( !$.fn.addBack ) { - $.fn.addBack = function( selector ) { - return this.add( selector == null ? - this.prevObject : this.prevObject.filter( selector ) - ); - }; -} - -// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413) -if ( $( "" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) { - $.fn.removeData = (function( removeData ) { - return function( key ) { - if ( arguments.length ) { - return removeData.call( this, $.camelCase( key ) ); - } else { - return removeData.call( this ); - } - }; - })( $.fn.removeData ); -} - -// deprecated -$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() ); - -$.fn.extend({ - focus: (function( orig ) { - return function( delay, fn ) { - return typeof delay === "number" ? - this.each(function() { - var elem = this; - setTimeout(function() { - $( elem ).focus(); - if ( fn ) { - fn.call( elem ); - } - }, delay ); - }) : - orig.apply( this, arguments ); - }; - })( $.fn.focus ), - - disableSelection: (function() { - var eventType = "onselectstart" in document.createElement( "div" ) ? - "selectstart" : - "mousedown"; - - return function() { - return this.bind( eventType + ".ui-disableSelection", function( event ) { - event.preventDefault(); - }); - }; - })(), - - enableSelection: function() { - return this.unbind( ".ui-disableSelection" ); - }, - - zIndex: function( zIndex ) { - if ( zIndex !== undefined ) { - return this.css( "zIndex", zIndex ); - } - - if ( this.length ) { - var elem = $( this[ 0 ] ), position, value; - while ( elem.length && elem[ 0 ] !== document ) { - // Ignore z-index if position is set to a value where z-index is ignored by the browser - // This makes behavior of this function consistent across browsers - // WebKit always returns auto if the element is positioned - position = elem.css( "position" ); - if ( position === "absolute" || position === "relative" || position === "fixed" ) { - // IE returns 0 when zIndex is not specified - // other browsers return a string - // we ignore the case of nested elements with an explicit value of 0 - //
- value = parseInt( elem.css( "zIndex" ), 10 ); - if ( !isNaN( value ) && value !== 0 ) { - return value; - } - } - elem = elem.parent(); - } - } - - return 0; - } -}); - -// $.ui.plugin is deprecated. Use $.widget() extensions instead. -$.ui.plugin = { - add: function( module, option, set ) { - var i, - proto = $.ui[ module ].prototype; - for ( i in set ) { - proto.plugins[ i ] = proto.plugins[ i ] || []; - proto.plugins[ i ].push( [ option, set[ i ] ] ); - } - }, - call: function( instance, name, args, allowDisconnected ) { - var i, - set = instance.plugins[ name ]; - - if ( !set ) { - return; - } - - if ( !allowDisconnected && ( !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) ) { - return; - } - - for ( i = 0; i < set.length; i++ ) { - if ( instance.options[ set[ i ][ 0 ] ] ) { - set[ i ][ 1 ].apply( instance.element, args ); - } - } - } -}; - - -/*! - * jQuery UI Widget 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/jQuery.widget/ - */ - - -var widget_uuid = 0, - widget_slice = Array.prototype.slice; - -$.cleanData = (function( orig ) { - return function( elems ) { - var events, elem, i; - for ( i = 0; (elem = elems[i]) != null; i++ ) { - try { - - // Only trigger remove when necessary to save time - events = $._data( elem, "events" ); - if ( events && events.remove ) { - $( elem ).triggerHandler( "remove" ); - } - - // http://bugs.jquery.com/ticket/8235 - } catch ( e ) {} - } - orig( elems ); - }; -})( $.cleanData ); - -$.widget = function( name, base, prototype ) { - var fullName, existingConstructor, constructor, basePrototype, - // proxiedPrototype allows the provided prototype to remain unmodified - // so that it can be used as a mixin for multiple widgets (#8876) - proxiedPrototype = {}, - namespace = name.split( "." )[ 0 ]; - - name = name.split( "." )[ 1 ]; - fullName = namespace + "-" + name; - - if ( !prototype ) { - prototype = base; - base = $.Widget; - } - - // create selector for plugin - $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) { - return !!$.data( elem, fullName ); - }; - - $[ namespace ] = $[ namespace ] || {}; - existingConstructor = $[ namespace ][ name ]; - constructor = $[ namespace ][ name ] = function( options, element ) { - // allow instantiation without "new" keyword - if ( !this._createWidget ) { - return new constructor( options, element ); - } - - // allow instantiation without initializing for simple inheritance - // must use "new" keyword (the code above always passes args) - if ( arguments.length ) { - this._createWidget( options, element ); - } - }; - // extend with the existing constructor to carry over any static properties - $.extend( constructor, existingConstructor, { - version: prototype.version, - // copy the object used to create the prototype in case we need to - // redefine the widget later - _proto: $.extend( {}, prototype ), - // track widgets that inherit from this widget in case this widget is - // redefined after a widget inherits from it - _childConstructors: [] - }); - - basePrototype = new base(); - // we need to make the options hash a property directly on the new instance - // otherwise we'll modify the options hash on the prototype that we're - // inheriting from - basePrototype.options = $.widget.extend( {}, basePrototype.options ); - $.each( prototype, function( prop, value ) { - if ( !$.isFunction( value ) ) { - proxiedPrototype[ prop ] = value; - return; - } - proxiedPrototype[ prop ] = (function() { - var _super = function() { - return base.prototype[ prop ].apply( this, arguments ); - }, - _superApply = function( args ) { - return base.prototype[ prop ].apply( this, args ); - }; - return function() { - var __super = this._super, - __superApply = this._superApply, - returnValue; - - this._super = _super; - this._superApply = _superApply; - - returnValue = value.apply( this, arguments ); - - this._super = __super; - this._superApply = __superApply; - - return returnValue; - }; - })(); - }); - constructor.prototype = $.widget.extend( basePrototype, { - // TODO: remove support for widgetEventPrefix - // always use the name + a colon as the prefix, e.g., draggable:start - // don't prefix for widgets that aren't DOM-based - widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name - }, proxiedPrototype, { - constructor: constructor, - namespace: namespace, - widgetName: name, - widgetFullName: fullName - }); - - // If this widget is being redefined then we need to find all widgets that - // are inheriting from it and redefine all of them so that they inherit from - // the new version of this widget. We're essentially trying to replace one - // level in the prototype chain. - if ( existingConstructor ) { - $.each( existingConstructor._childConstructors, function( i, child ) { - var childPrototype = child.prototype; - - // redefine the child widget using the same prototype that was - // originally used, but inherit from the new version of the base - $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto ); - }); - // remove the list of existing child constructors from the old constructor - // so the old child constructors can be garbage collected - delete existingConstructor._childConstructors; - } else { - base._childConstructors.push( constructor ); - } - - $.widget.bridge( name, constructor ); - - return constructor; -}; - -$.widget.extend = function( target ) { - var input = widget_slice.call( arguments, 1 ), - inputIndex = 0, - inputLength = input.length, - key, - value; - for ( ; inputIndex < inputLength; inputIndex++ ) { - for ( key in input[ inputIndex ] ) { - value = input[ inputIndex ][ key ]; - if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) { - // Clone objects - if ( $.isPlainObject( value ) ) { - target[ key ] = $.isPlainObject( target[ key ] ) ? - $.widget.extend( {}, target[ key ], value ) : - // Don't extend strings, arrays, etc. with objects - $.widget.extend( {}, value ); - // Copy everything else by reference - } else { - target[ key ] = value; - } - } - } - } - return target; -}; - -$.widget.bridge = function( name, object ) { - var fullName = object.prototype.widgetFullName || name; - $.fn[ name ] = function( options ) { - var isMethodCall = typeof options === "string", - args = widget_slice.call( arguments, 1 ), - returnValue = this; - - if ( isMethodCall ) { - this.each(function() { - var methodValue, - instance = $.data( this, fullName ); - if ( options === "instance" ) { - returnValue = instance; - return false; - } - if ( !instance ) { - return $.error( "cannot call methods on " + name + " prior to initialization; " + - "attempted to call method '" + options + "'" ); - } - if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) { - return $.error( "no such method '" + options + "' for " + name + " widget instance" ); - } - methodValue = instance[ options ].apply( instance, args ); - if ( methodValue !== instance && methodValue !== undefined ) { - returnValue = methodValue && methodValue.jquery ? - returnValue.pushStack( methodValue.get() ) : - methodValue; - return false; - } - }); - } else { - - // Allow multiple hashes to be passed on init - if ( args.length ) { - options = $.widget.extend.apply( null, [ options ].concat(args) ); - } - - this.each(function() { - var instance = $.data( this, fullName ); - if ( instance ) { - instance.option( options || {} ); - if ( instance._init ) { - instance._init(); - } - } else { - $.data( this, fullName, new object( options, this ) ); - } - }); - } - - return returnValue; - }; -}; - -$.Widget = function( /* options, element */ ) {}; -$.Widget._childConstructors = []; - -$.Widget.prototype = { - widgetName: "widget", - widgetEventPrefix: "", - defaultElement: "
", - options: { - disabled: false, - - // callbacks - create: null - }, - _createWidget: function( options, element ) { - element = $( element || this.defaultElement || this )[ 0 ]; - this.element = $( element ); - this.uuid = widget_uuid++; - this.eventNamespace = "." + this.widgetName + this.uuid; - - this.bindings = $(); - this.hoverable = $(); - this.focusable = $(); - - if ( element !== this ) { - $.data( element, this.widgetFullName, this ); - this._on( true, this.element, { - remove: function( event ) { - if ( event.target === element ) { - this.destroy(); - } - } - }); - this.document = $( element.style ? - // element within the document - element.ownerDocument : - // element is window or document - element.document || element ); - this.window = $( this.document[0].defaultView || this.document[0].parentWindow ); - } - - this.options = $.widget.extend( {}, - this.options, - this._getCreateOptions(), - options ); - - this._create(); - this._trigger( "create", null, this._getCreateEventData() ); - this._init(); - }, - _getCreateOptions: $.noop, - _getCreateEventData: $.noop, - _create: $.noop, - _init: $.noop, - - destroy: function() { - this._destroy(); - // we can probably remove the unbind calls in 2.0 - // all event bindings should go through this._on() - this.element - .unbind( this.eventNamespace ) - .removeData( this.widgetFullName ) - // support: jquery <1.6.3 - // http://bugs.jquery.com/ticket/9413 - .removeData( $.camelCase( this.widgetFullName ) ); - this.widget() - .unbind( this.eventNamespace ) - .removeAttr( "aria-disabled" ) - .removeClass( - this.widgetFullName + "-disabled " + - "ui-state-disabled" ); - - // clean up events and states - this.bindings.unbind( this.eventNamespace ); - this.hoverable.removeClass( "ui-state-hover" ); - this.focusable.removeClass( "ui-state-focus" ); - }, - _destroy: $.noop, - - widget: function() { - return this.element; - }, - - option: function( key, value ) { - var options = key, - parts, - curOption, - i; - - if ( arguments.length === 0 ) { - // don't return a reference to the internal hash - return $.widget.extend( {}, this.options ); - } - - if ( typeof key === "string" ) { - // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } } - options = {}; - parts = key.split( "." ); - key = parts.shift(); - if ( parts.length ) { - curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] ); - for ( i = 0; i < parts.length - 1; i++ ) { - curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {}; - curOption = curOption[ parts[ i ] ]; - } - key = parts.pop(); - if ( arguments.length === 1 ) { - return curOption[ key ] === undefined ? null : curOption[ key ]; - } - curOption[ key ] = value; - } else { - if ( arguments.length === 1 ) { - return this.options[ key ] === undefined ? null : this.options[ key ]; - } - options[ key ] = value; - } - } - - this._setOptions( options ); - - return this; - }, - _setOptions: function( options ) { - var key; - - for ( key in options ) { - this._setOption( key, options[ key ] ); - } - - return this; - }, - _setOption: function( key, value ) { - this.options[ key ] = value; - - if ( key === "disabled" ) { - this.widget() - .toggleClass( this.widgetFullName + "-disabled", !!value ); - - // If the widget is becoming disabled, then nothing is interactive - if ( value ) { - this.hoverable.removeClass( "ui-state-hover" ); - this.focusable.removeClass( "ui-state-focus" ); - } - } - - return this; - }, - - enable: function() { - return this._setOptions({ disabled: false }); - }, - disable: function() { - return this._setOptions({ disabled: true }); - }, - - _on: function( suppressDisabledCheck, element, handlers ) { - var delegateElement, - instance = this; - - // no suppressDisabledCheck flag, shuffle arguments - if ( typeof suppressDisabledCheck !== "boolean" ) { - handlers = element; - element = suppressDisabledCheck; - suppressDisabledCheck = false; - } - - // no element argument, shuffle and use this.element - if ( !handlers ) { - handlers = element; - element = this.element; - delegateElement = this.widget(); - } else { - element = delegateElement = $( element ); - this.bindings = this.bindings.add( element ); - } - - $.each( handlers, function( event, handler ) { - function handlerProxy() { - // allow widgets to customize the disabled handling - // - disabled as an array instead of boolean - // - disabled class as method for disabling individual parts - if ( !suppressDisabledCheck && - ( instance.options.disabled === true || - $( this ).hasClass( "ui-state-disabled" ) ) ) { - return; - } - return ( typeof handler === "string" ? instance[ handler ] : handler ) - .apply( instance, arguments ); - } - - // copy the guid so direct unbinding works - if ( typeof handler !== "string" ) { - handlerProxy.guid = handler.guid = - handler.guid || handlerProxy.guid || $.guid++; - } - - var match = event.match( /^([\w:-]*)\s*(.*)$/ ), - eventName = match[1] + instance.eventNamespace, - selector = match[2]; - if ( selector ) { - delegateElement.delegate( selector, eventName, handlerProxy ); - } else { - element.bind( eventName, handlerProxy ); - } - }); - }, - - _off: function( element, eventName ) { - eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + - this.eventNamespace; - element.unbind( eventName ).undelegate( eventName ); - - // Clear the stack to avoid memory leaks (#10056) - this.bindings = $( this.bindings.not( element ).get() ); - this.focusable = $( this.focusable.not( element ).get() ); - this.hoverable = $( this.hoverable.not( element ).get() ); - }, - - _delay: function( handler, delay ) { - function handlerProxy() { - return ( typeof handler === "string" ? instance[ handler ] : handler ) - .apply( instance, arguments ); - } - var instance = this; - return setTimeout( handlerProxy, delay || 0 ); - }, - - _hoverable: function( element ) { - this.hoverable = this.hoverable.add( element ); - this._on( element, { - mouseenter: function( event ) { - $( event.currentTarget ).addClass( "ui-state-hover" ); - }, - mouseleave: function( event ) { - $( event.currentTarget ).removeClass( "ui-state-hover" ); - } - }); - }, - - _focusable: function( element ) { - this.focusable = this.focusable.add( element ); - this._on( element, { - focusin: function( event ) { - $( event.currentTarget ).addClass( "ui-state-focus" ); - }, - focusout: function( event ) { - $( event.currentTarget ).removeClass( "ui-state-focus" ); - } - }); - }, - - _trigger: function( type, event, data ) { - var prop, orig, - callback = this.options[ type ]; - - data = data || {}; - event = $.Event( event ); - event.type = ( type === this.widgetEventPrefix ? - type : - this.widgetEventPrefix + type ).toLowerCase(); - // the original event may come from any element - // so we need to reset the target on the new event - event.target = this.element[ 0 ]; - - // copy original event properties over to the new event - orig = event.originalEvent; - if ( orig ) { - for ( prop in orig ) { - if ( !( prop in event ) ) { - event[ prop ] = orig[ prop ]; - } - } - } - - this.element.trigger( event, data ); - return !( $.isFunction( callback ) && - callback.apply( this.element[0], [ event ].concat( data ) ) === false || - event.isDefaultPrevented() ); - } -}; - -$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) { - $.Widget.prototype[ "_" + method ] = function( element, options, callback ) { - if ( typeof options === "string" ) { - options = { effect: options }; - } - var hasOptions, - effectName = !options ? - method : - options === true || typeof options === "number" ? - defaultEffect : - options.effect || defaultEffect; - options = options || {}; - if ( typeof options === "number" ) { - options = { duration: options }; - } - hasOptions = !$.isEmptyObject( options ); - options.complete = callback; - if ( options.delay ) { - element.delay( options.delay ); - } - if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) { - element[ method ]( options ); - } else if ( effectName !== method && element[ effectName ] ) { - element[ effectName ]( options.duration, options.easing, callback ); - } else { - element.queue(function( next ) { - $( this )[ method ](); - if ( callback ) { - callback.call( element[ 0 ] ); - } - next(); - }); - } - }; -}); - -var widget = $.widget; - - -/*! - * jQuery UI Mouse 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/mouse/ - */ - - -var mouseHandled = false; -$( document ).mouseup( function() { - mouseHandled = false; -}); - -var mouse = $.widget("ui.mouse", { - version: "1.11.4", - options: { - cancel: "input,textarea,button,select,option", - distance: 1, - delay: 0 - }, - _mouseInit: function() { - var that = this; - - this.element - .bind("mousedown." + this.widgetName, function(event) { - return that._mouseDown(event); - }) - .bind("click." + this.widgetName, function(event) { - if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) { - $.removeData(event.target, that.widgetName + ".preventClickEvent"); - event.stopImmediatePropagation(); - return false; - } - }); - - this.started = false; - }, - - // TODO: make sure destroying one instance of mouse doesn't mess with - // other instances of mouse - _mouseDestroy: function() { - this.element.unbind("." + this.widgetName); - if ( this._mouseMoveDelegate ) { - this.document - .unbind("mousemove." + this.widgetName, this._mouseMoveDelegate) - .unbind("mouseup." + this.widgetName, this._mouseUpDelegate); - } - }, - - _mouseDown: function(event) { - // don't let more than one widget handle mouseStart - if ( mouseHandled ) { - return; - } - - this._mouseMoved = false; - - // we may have missed mouseup (out of window) - (this._mouseStarted && this._mouseUp(event)); - - this._mouseDownEvent = event; - - var that = this, - btnIsLeft = (event.which === 1), - // event.target.nodeName works around a bug in IE 8 with - // disabled inputs (#7620) - elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false); - if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) { - return true; - } - - this.mouseDelayMet = !this.options.delay; - if (!this.mouseDelayMet) { - this._mouseDelayTimer = setTimeout(function() { - that.mouseDelayMet = true; - }, this.options.delay); - } - - if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { - this._mouseStarted = (this._mouseStart(event) !== false); - if (!this._mouseStarted) { - event.preventDefault(); - return true; - } - } - - // Click event may never have fired (Gecko & Opera) - if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) { - $.removeData(event.target, this.widgetName + ".preventClickEvent"); - } - - // these delegates are required to keep context - this._mouseMoveDelegate = function(event) { - return that._mouseMove(event); - }; - this._mouseUpDelegate = function(event) { - return that._mouseUp(event); - }; - - this.document - .bind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) - .bind( "mouseup." + this.widgetName, this._mouseUpDelegate ); - - event.preventDefault(); - - mouseHandled = true; - return true; - }, - - _mouseMove: function(event) { - // Only check for mouseups outside the document if you've moved inside the document - // at least once. This prevents the firing of mouseup in the case of IE<9, which will - // fire a mousemove event if content is placed under the cursor. See #7778 - // Support: IE <9 - if ( this._mouseMoved ) { - // IE mouseup check - mouseup happened when mouse was out of window - if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) { - return this._mouseUp(event); - - // Iframe mouseup check - mouseup occurred in another document - } else if ( !event.which ) { - return this._mouseUp( event ); - } - } - - if ( event.which || event.button ) { - this._mouseMoved = true; - } - - if (this._mouseStarted) { - this._mouseDrag(event); - return event.preventDefault(); - } - - if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) { - this._mouseStarted = - (this._mouseStart(this._mouseDownEvent, event) !== false); - (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event)); - } - - return !this._mouseStarted; - }, - - _mouseUp: function(event) { - this.document - .unbind( "mousemove." + this.widgetName, this._mouseMoveDelegate ) - .unbind( "mouseup." + this.widgetName, this._mouseUpDelegate ); - - if (this._mouseStarted) { - this._mouseStarted = false; - - if (event.target === this._mouseDownEvent.target) { - $.data(event.target, this.widgetName + ".preventClickEvent", true); - } - - this._mouseStop(event); - } - - mouseHandled = false; - return false; - }, - - _mouseDistanceMet: function(event) { - return (Math.max( - Math.abs(this._mouseDownEvent.pageX - event.pageX), - Math.abs(this._mouseDownEvent.pageY - event.pageY) - ) >= this.options.distance - ); - }, - - _mouseDelayMet: function(/* event */) { - return this.mouseDelayMet; - }, - - // These are placeholder methods, to be overriden by extending plugin - _mouseStart: function(/* event */) {}, - _mouseDrag: function(/* event */) {}, - _mouseStop: function(/* event */) {}, - _mouseCapture: function(/* event */) { return true; } -}); - - -/*! - * jQuery UI Position 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/position/ - */ - -(function() { - -$.ui = $.ui || {}; - -var cachedScrollbarWidth, supportsOffsetFractions, - max = Math.max, - abs = Math.abs, - round = Math.round, - rhorizontal = /left|center|right/, - rvertical = /top|center|bottom/, - roffset = /[\+\-]\d+(\.[\d]+)?%?/, - rposition = /^\w+/, - rpercent = /%$/, - _position = $.fn.position; - -function getOffsets( offsets, width, height ) { - return [ - parseFloat( offsets[ 0 ] ) * ( rpercent.test( offsets[ 0 ] ) ? width / 100 : 1 ), - parseFloat( offsets[ 1 ] ) * ( rpercent.test( offsets[ 1 ] ) ? height / 100 : 1 ) - ]; -} - -function parseCss( element, property ) { - return parseInt( $.css( element, property ), 10 ) || 0; -} - -function getDimensions( elem ) { - var raw = elem[0]; - if ( raw.nodeType === 9 ) { - return { - width: elem.width(), - height: elem.height(), - offset: { top: 0, left: 0 } - }; - } - if ( $.isWindow( raw ) ) { - return { - width: elem.width(), - height: elem.height(), - offset: { top: elem.scrollTop(), left: elem.scrollLeft() } - }; - } - if ( raw.preventDefault ) { - return { - width: 0, - height: 0, - offset: { top: raw.pageY, left: raw.pageX } - }; - } - return { - width: elem.outerWidth(), - height: elem.outerHeight(), - offset: elem.offset() - }; -} - -$.position = { - scrollbarWidth: function() { - if ( cachedScrollbarWidth !== undefined ) { - return cachedScrollbarWidth; - } - var w1, w2, - div = $( "
" ), - innerDiv = div.children()[0]; - - $( "body" ).append( div ); - w1 = innerDiv.offsetWidth; - div.css( "overflow", "scroll" ); - - w2 = innerDiv.offsetWidth; - - if ( w1 === w2 ) { - w2 = div[0].clientWidth; - } - - div.remove(); - - return (cachedScrollbarWidth = w1 - w2); - }, - getScrollInfo: function( within ) { - var overflowX = within.isWindow || within.isDocument ? "" : - within.element.css( "overflow-x" ), - overflowY = within.isWindow || within.isDocument ? "" : - within.element.css( "overflow-y" ), - hasOverflowX = overflowX === "scroll" || - ( overflowX === "auto" && within.width < within.element[0].scrollWidth ), - hasOverflowY = overflowY === "scroll" || - ( overflowY === "auto" && within.height < within.element[0].scrollHeight ); - return { - width: hasOverflowY ? $.position.scrollbarWidth() : 0, - height: hasOverflowX ? $.position.scrollbarWidth() : 0 - }; - }, - getWithinInfo: function( element ) { - var withinElement = $( element || window ), - isWindow = $.isWindow( withinElement[0] ), - isDocument = !!withinElement[ 0 ] && withinElement[ 0 ].nodeType === 9; - return { - element: withinElement, - isWindow: isWindow, - isDocument: isDocument, - offset: withinElement.offset() || { left: 0, top: 0 }, - scrollLeft: withinElement.scrollLeft(), - scrollTop: withinElement.scrollTop(), - - // support: jQuery 1.6.x - // jQuery 1.6 doesn't support .outerWidth/Height() on documents or windows - width: isWindow || isDocument ? withinElement.width() : withinElement.outerWidth(), - height: isWindow || isDocument ? withinElement.height() : withinElement.outerHeight() - }; - } -}; - -$.fn.position = function( options ) { - if ( !options || !options.of ) { - return _position.apply( this, arguments ); - } - - // make a copy, we don't want to modify arguments - options = $.extend( {}, options ); - - var atOffset, targetWidth, targetHeight, targetOffset, basePosition, dimensions, - target = $( options.of ), - within = $.position.getWithinInfo( options.within ), - scrollInfo = $.position.getScrollInfo( within ), - collision = ( options.collision || "flip" ).split( " " ), - offsets = {}; - - dimensions = getDimensions( target ); - if ( target[0].preventDefault ) { - // force left top to allow flipping - options.at = "left top"; - } - targetWidth = dimensions.width; - targetHeight = dimensions.height; - targetOffset = dimensions.offset; - // clone to reuse original targetOffset later - basePosition = $.extend( {}, targetOffset ); - - // force my and at to have valid horizontal and vertical positions - // if a value is missing or invalid, it will be converted to center - $.each( [ "my", "at" ], function() { - var pos = ( options[ this ] || "" ).split( " " ), - horizontalOffset, - verticalOffset; - - if ( pos.length === 1) { - pos = rhorizontal.test( pos[ 0 ] ) ? - pos.concat( [ "center" ] ) : - rvertical.test( pos[ 0 ] ) ? - [ "center" ].concat( pos ) : - [ "center", "center" ]; - } - pos[ 0 ] = rhorizontal.test( pos[ 0 ] ) ? pos[ 0 ] : "center"; - pos[ 1 ] = rvertical.test( pos[ 1 ] ) ? pos[ 1 ] : "center"; - - // calculate offsets - horizontalOffset = roffset.exec( pos[ 0 ] ); - verticalOffset = roffset.exec( pos[ 1 ] ); - offsets[ this ] = [ - horizontalOffset ? horizontalOffset[ 0 ] : 0, - verticalOffset ? verticalOffset[ 0 ] : 0 - ]; - - // reduce to just the positions without the offsets - options[ this ] = [ - rposition.exec( pos[ 0 ] )[ 0 ], - rposition.exec( pos[ 1 ] )[ 0 ] - ]; - }); - - // normalize collision option - if ( collision.length === 1 ) { - collision[ 1 ] = collision[ 0 ]; - } - - if ( options.at[ 0 ] === "right" ) { - basePosition.left += targetWidth; - } else if ( options.at[ 0 ] === "center" ) { - basePosition.left += targetWidth / 2; - } - - if ( options.at[ 1 ] === "bottom" ) { - basePosition.top += targetHeight; - } else if ( options.at[ 1 ] === "center" ) { - basePosition.top += targetHeight / 2; - } - - atOffset = getOffsets( offsets.at, targetWidth, targetHeight ); - basePosition.left += atOffset[ 0 ]; - basePosition.top += atOffset[ 1 ]; - - return this.each(function() { - var collisionPosition, using, - elem = $( this ), - elemWidth = elem.outerWidth(), - elemHeight = elem.outerHeight(), - marginLeft = parseCss( this, "marginLeft" ), - marginTop = parseCss( this, "marginTop" ), - collisionWidth = elemWidth + marginLeft + parseCss( this, "marginRight" ) + scrollInfo.width, - collisionHeight = elemHeight + marginTop + parseCss( this, "marginBottom" ) + scrollInfo.height, - position = $.extend( {}, basePosition ), - myOffset = getOffsets( offsets.my, elem.outerWidth(), elem.outerHeight() ); - - if ( options.my[ 0 ] === "right" ) { - position.left -= elemWidth; - } else if ( options.my[ 0 ] === "center" ) { - position.left -= elemWidth / 2; - } - - if ( options.my[ 1 ] === "bottom" ) { - position.top -= elemHeight; - } else if ( options.my[ 1 ] === "center" ) { - position.top -= elemHeight / 2; - } - - position.left += myOffset[ 0 ]; - position.top += myOffset[ 1 ]; - - // if the browser doesn't support fractions, then round for consistent results - if ( !supportsOffsetFractions ) { - position.left = round( position.left ); - position.top = round( position.top ); - } - - collisionPosition = { - marginLeft: marginLeft, - marginTop: marginTop - }; - - $.each( [ "left", "top" ], function( i, dir ) { - if ( $.ui.position[ collision[ i ] ] ) { - $.ui.position[ collision[ i ] ][ dir ]( position, { - targetWidth: targetWidth, - targetHeight: targetHeight, - elemWidth: elemWidth, - elemHeight: elemHeight, - collisionPosition: collisionPosition, - collisionWidth: collisionWidth, - collisionHeight: collisionHeight, - offset: [ atOffset[ 0 ] + myOffset[ 0 ], atOffset [ 1 ] + myOffset[ 1 ] ], - my: options.my, - at: options.at, - within: within, - elem: elem - }); - } - }); - - if ( options.using ) { - // adds feedback as second argument to using callback, if present - using = function( props ) { - var left = targetOffset.left - position.left, - right = left + targetWidth - elemWidth, - top = targetOffset.top - position.top, - bottom = top + targetHeight - elemHeight, - feedback = { - target: { - element: target, - left: targetOffset.left, - top: targetOffset.top, - width: targetWidth, - height: targetHeight - }, - element: { - element: elem, - left: position.left, - top: position.top, - width: elemWidth, - height: elemHeight - }, - horizontal: right < 0 ? "left" : left > 0 ? "right" : "center", - vertical: bottom < 0 ? "top" : top > 0 ? "bottom" : "middle" - }; - if ( targetWidth < elemWidth && abs( left + right ) < targetWidth ) { - feedback.horizontal = "center"; - } - if ( targetHeight < elemHeight && abs( top + bottom ) < targetHeight ) { - feedback.vertical = "middle"; - } - if ( max( abs( left ), abs( right ) ) > max( abs( top ), abs( bottom ) ) ) { - feedback.important = "horizontal"; - } else { - feedback.important = "vertical"; - } - options.using.call( this, props, feedback ); - }; - } - - elem.offset( $.extend( position, { using: using } ) ); - }); -}; - -$.ui.position = { - fit: { - left: function( position, data ) { - var within = data.within, - withinOffset = within.isWindow ? within.scrollLeft : within.offset.left, - outerWidth = within.width, - collisionPosLeft = position.left - data.collisionPosition.marginLeft, - overLeft = withinOffset - collisionPosLeft, - overRight = collisionPosLeft + data.collisionWidth - outerWidth - withinOffset, - newOverRight; - - // element is wider than within - if ( data.collisionWidth > outerWidth ) { - // element is initially over the left side of within - if ( overLeft > 0 && overRight <= 0 ) { - newOverRight = position.left + overLeft + data.collisionWidth - outerWidth - withinOffset; - position.left += overLeft - newOverRight; - // element is initially over right side of within - } else if ( overRight > 0 && overLeft <= 0 ) { - position.left = withinOffset; - // element is initially over both left and right sides of within - } else { - if ( overLeft > overRight ) { - position.left = withinOffset + outerWidth - data.collisionWidth; - } else { - position.left = withinOffset; - } - } - // too far left -> align with left edge - } else if ( overLeft > 0 ) { - position.left += overLeft; - // too far right -> align with right edge - } else if ( overRight > 0 ) { - position.left -= overRight; - // adjust based on position and margin - } else { - position.left = max( position.left - collisionPosLeft, position.left ); - } - }, - top: function( position, data ) { - var within = data.within, - withinOffset = within.isWindow ? within.scrollTop : within.offset.top, - outerHeight = data.within.height, - collisionPosTop = position.top - data.collisionPosition.marginTop, - overTop = withinOffset - collisionPosTop, - overBottom = collisionPosTop + data.collisionHeight - outerHeight - withinOffset, - newOverBottom; - - // element is taller than within - if ( data.collisionHeight > outerHeight ) { - // element is initially over the top of within - if ( overTop > 0 && overBottom <= 0 ) { - newOverBottom = position.top + overTop + data.collisionHeight - outerHeight - withinOffset; - position.top += overTop - newOverBottom; - // element is initially over bottom of within - } else if ( overBottom > 0 && overTop <= 0 ) { - position.top = withinOffset; - // element is initially over both top and bottom of within - } else { - if ( overTop > overBottom ) { - position.top = withinOffset + outerHeight - data.collisionHeight; - } else { - position.top = withinOffset; - } - } - // too far up -> align with top - } else if ( overTop > 0 ) { - position.top += overTop; - // too far down -> align with bottom edge - } else if ( overBottom > 0 ) { - position.top -= overBottom; - // adjust based on position and margin - } else { - position.top = max( position.top - collisionPosTop, position.top ); - } - } - }, - flip: { - left: function( position, data ) { - var within = data.within, - withinOffset = within.offset.left + within.scrollLeft, - outerWidth = within.width, - offsetLeft = within.isWindow ? within.scrollLeft : within.offset.left, - collisionPosLeft = position.left - data.collisionPosition.marginLeft, - overLeft = collisionPosLeft - offsetLeft, - overRight = collisionPosLeft + data.collisionWidth - outerWidth - offsetLeft, - myOffset = data.my[ 0 ] === "left" ? - -data.elemWidth : - data.my[ 0 ] === "right" ? - data.elemWidth : - 0, - atOffset = data.at[ 0 ] === "left" ? - data.targetWidth : - data.at[ 0 ] === "right" ? - -data.targetWidth : - 0, - offset = -2 * data.offset[ 0 ], - newOverRight, - newOverLeft; - - if ( overLeft < 0 ) { - newOverRight = position.left + myOffset + atOffset + offset + data.collisionWidth - outerWidth - withinOffset; - if ( newOverRight < 0 || newOverRight < abs( overLeft ) ) { - position.left += myOffset + atOffset + offset; - } - } else if ( overRight > 0 ) { - newOverLeft = position.left - data.collisionPosition.marginLeft + myOffset + atOffset + offset - offsetLeft; - if ( newOverLeft > 0 || abs( newOverLeft ) < overRight ) { - position.left += myOffset + atOffset + offset; - } - } - }, - top: function( position, data ) { - var within = data.within, - withinOffset = within.offset.top + within.scrollTop, - outerHeight = within.height, - offsetTop = within.isWindow ? within.scrollTop : within.offset.top, - collisionPosTop = position.top - data.collisionPosition.marginTop, - overTop = collisionPosTop - offsetTop, - overBottom = collisionPosTop + data.collisionHeight - outerHeight - offsetTop, - top = data.my[ 1 ] === "top", - myOffset = top ? - -data.elemHeight : - data.my[ 1 ] === "bottom" ? - data.elemHeight : - 0, - atOffset = data.at[ 1 ] === "top" ? - data.targetHeight : - data.at[ 1 ] === "bottom" ? - -data.targetHeight : - 0, - offset = -2 * data.offset[ 1 ], - newOverTop, - newOverBottom; - if ( overTop < 0 ) { - newOverBottom = position.top + myOffset + atOffset + offset + data.collisionHeight - outerHeight - withinOffset; - if ( newOverBottom < 0 || newOverBottom < abs( overTop ) ) { - position.top += myOffset + atOffset + offset; - } - } else if ( overBottom > 0 ) { - newOverTop = position.top - data.collisionPosition.marginTop + myOffset + atOffset + offset - offsetTop; - if ( newOverTop > 0 || abs( newOverTop ) < overBottom ) { - position.top += myOffset + atOffset + offset; - } - } - } - }, - flipfit: { - left: function() { - $.ui.position.flip.left.apply( this, arguments ); - $.ui.position.fit.left.apply( this, arguments ); - }, - top: function() { - $.ui.position.flip.top.apply( this, arguments ); - $.ui.position.fit.top.apply( this, arguments ); - } - } -}; - -// fraction support test -(function() { - var testElement, testElementParent, testElementStyle, offsetLeft, i, - body = document.getElementsByTagName( "body" )[ 0 ], - div = document.createElement( "div" ); - - //Create a "fake body" for testing based on method used in jQuery.support - testElement = document.createElement( body ? "div" : "body" ); - testElementStyle = { - visibility: "hidden", - width: 0, - height: 0, - border: 0, - margin: 0, - background: "none" - }; - if ( body ) { - $.extend( testElementStyle, { - position: "absolute", - left: "-1000px", - top: "-1000px" - }); - } - for ( i in testElementStyle ) { - testElement.style[ i ] = testElementStyle[ i ]; - } - testElement.appendChild( div ); - testElementParent = body || document.documentElement; - testElementParent.insertBefore( testElement, testElementParent.firstChild ); - - div.style.cssText = "position: absolute; left: 10.7432222px;"; - - offsetLeft = $( div ).offset().left; - supportsOffsetFractions = offsetLeft > 10 && offsetLeft < 11; - - testElement.innerHTML = ""; - testElementParent.removeChild( testElement ); -})(); - -})(); - -var position = $.ui.position; - - -/*! - * jQuery UI Draggable 1.11.4 - * http://jqueryui.com - * - * Copyright jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - * - * http://api.jqueryui.com/draggable/ - */ - - -$.widget("ui.draggable", $.ui.mouse, { - version: "1.11.4", - widgetEventPrefix: "drag", - options: { - addClasses: true, - appendTo: "parent", - axis: false, - connectToSortable: false, - containment: false, - cursor: "auto", - cursorAt: false, - grid: false, - handle: false, - helper: "original", - iframeFix: false, - opacity: false, - refreshPositions: false, - revert: false, - revertDuration: 500, - scope: "default", - scroll: true, - scrollSensitivity: 20, - scrollSpeed: 20, - snap: false, - snapMode: "both", - snapTolerance: 20, - stack: false, - zIndex: false, - - // callbacks - drag: null, - start: null, - stop: null - }, - _create: function() { - - if ( this.options.helper === "original" ) { - this._setPositionRelative(); - } - if (this.options.addClasses){ - this.element.addClass("ui-draggable"); - } - if (this.options.disabled){ - this.element.addClass("ui-draggable-disabled"); - } - this._setHandleClassName(); - - this._mouseInit(); - }, - - _setOption: function( key, value ) { - this._super( key, value ); - if ( key === "handle" ) { - this._removeHandleClassName(); - this._setHandleClassName(); - } - }, - - _destroy: function() { - if ( ( this.helper || this.element ).is( ".ui-draggable-dragging" ) ) { - this.destroyOnClear = true; - return; - } - this.element.removeClass( "ui-draggable ui-draggable-dragging ui-draggable-disabled" ); - this._removeHandleClassName(); - this._mouseDestroy(); - }, - - _mouseCapture: function(event) { - var o = this.options; - - this._blurActiveElement( event ); - - // among others, prevent a drag on a resizable-handle - if (this.helper || o.disabled || $(event.target).closest(".ui-resizable-handle").length > 0) { - return false; - } - - //Quit if we're not on a valid handle - this.handle = this._getHandle(event); - if (!this.handle) { - return false; - } - - this._blockFrames( o.iframeFix === true ? "iframe" : o.iframeFix ); - - return true; - - }, - - _blockFrames: function( selector ) { - this.iframeBlocks = this.document.find( selector ).map(function() { - var iframe = $( this ); - - return $( "
" ) - .css( "position", "absolute" ) - .appendTo( iframe.parent() ) - .outerWidth( iframe.outerWidth() ) - .outerHeight( iframe.outerHeight() ) - .offset( iframe.offset() )[ 0 ]; - }); - }, - - _unblockFrames: function() { - if ( this.iframeBlocks ) { - this.iframeBlocks.remove(); - delete this.iframeBlocks; - } - }, - - _blurActiveElement: function( event ) { - var document = this.document[ 0 ]; - - // Only need to blur if the event occurred on the draggable itself, see #10527 - if ( !this.handleElement.is( event.target ) ) { - return; - } - - // support: IE9 - // IE9 throws an "Unspecified error" accessing document.activeElement from an